@jafreck/lore 0.2.4 → 0.3.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/README.md +63 -35
- package/dist/cli.js +41 -38
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/indexer/call-graph.d.ts +29 -8
- package/dist/indexer/call-graph.d.ts.map +1 -1
- package/dist/indexer/call-graph.js +232 -31
- package/dist/indexer/call-graph.js.map +1 -1
- package/dist/indexer/config-parser.js +6 -1
- package/dist/indexer/config-parser.js.map +1 -1
- package/dist/indexer/coverage.js +3 -1
- package/dist/indexer/coverage.js.map +1 -1
- package/dist/indexer/db.d.ts.map +1 -1
- package/dist/indexer/db.js +70 -1
- package/dist/indexer/db.js.map +1 -1
- package/dist/indexer/docs.d.ts.map +1 -1
- package/dist/indexer/docs.js +4 -0
- package/dist/indexer/docs.js.map +1 -1
- package/dist/indexer/embedder.d.ts.map +1 -1
- package/dist/indexer/embedder.js +5 -0
- package/dist/indexer/embedder.js.map +1 -1
- package/dist/indexer/extractors/bash.d.ts.map +1 -1
- package/dist/indexer/extractors/bash.js +29 -1
- package/dist/indexer/extractors/bash.js.map +1 -1
- package/dist/indexer/extractors/c.d.ts +5 -2
- package/dist/indexer/extractors/c.d.ts.map +1 -1
- package/dist/indexer/extractors/c.js +277 -8
- package/dist/indexer/extractors/c.js.map +1 -1
- package/dist/indexer/extractors/cpp.d.ts +5 -2
- package/dist/indexer/extractors/cpp.d.ts.map +1 -1
- package/dist/indexer/extractors/cpp.js +349 -3
- package/dist/indexer/extractors/cpp.js.map +1 -1
- package/dist/indexer/extractors/csharp.d.ts.map +1 -1
- package/dist/indexer/extractors/csharp.js +166 -1
- package/dist/indexer/extractors/csharp.js.map +1 -1
- package/dist/indexer/extractors/dart.d.ts.map +1 -1
- package/dist/indexer/extractors/dart.js +134 -1
- package/dist/indexer/extractors/dart.js.map +1 -1
- package/dist/indexer/extractors/elixir.d.ts.map +1 -1
- package/dist/indexer/extractors/elixir.js +45 -0
- package/dist/indexer/extractors/elixir.js.map +1 -1
- package/dist/indexer/extractors/elm.d.ts.map +1 -1
- package/dist/indexer/extractors/elm.js +33 -0
- package/dist/indexer/extractors/elm.js.map +1 -1
- package/dist/indexer/extractors/go.d.ts.map +1 -1
- package/dist/indexer/extractors/go.js +206 -1
- package/dist/indexer/extractors/go.js.map +1 -1
- package/dist/indexer/extractors/haskell.d.ts.map +1 -1
- package/dist/indexer/extractors/haskell.js +29 -0
- package/dist/indexer/extractors/haskell.js.map +1 -1
- package/dist/indexer/extractors/java.d.ts.map +1 -1
- package/dist/indexer/extractors/java.js +170 -1
- package/dist/indexer/extractors/java.js.map +1 -1
- package/dist/indexer/extractors/javascript.d.ts.map +1 -1
- package/dist/indexer/extractors/javascript.js +24 -2
- package/dist/indexer/extractors/javascript.js.map +1 -1
- package/dist/indexer/extractors/julia.d.ts.map +1 -1
- package/dist/indexer/extractors/julia.js +23 -1
- package/dist/indexer/extractors/julia.js.map +1 -1
- package/dist/indexer/extractors/kotlin.d.ts.map +1 -1
- package/dist/indexer/extractors/kotlin.js +122 -1
- package/dist/indexer/extractors/kotlin.js.map +1 -1
- package/dist/indexer/extractors/lua.d.ts.map +1 -1
- package/dist/indexer/extractors/lua.js +19 -1
- package/dist/indexer/extractors/lua.js.map +1 -1
- package/dist/indexer/extractors/objc.d.ts.map +1 -1
- package/dist/indexer/extractors/objc.js +171 -1
- package/dist/indexer/extractors/objc.js.map +1 -1
- package/dist/indexer/extractors/ocaml.d.ts.map +1 -1
- package/dist/indexer/extractors/ocaml.js +29 -0
- package/dist/indexer/extractors/ocaml.js.map +1 -1
- package/dist/indexer/extractors/php.d.ts.map +1 -1
- package/dist/indexer/extractors/php.js +137 -1
- package/dist/indexer/extractors/php.js.map +1 -1
- package/dist/indexer/extractors/python.d.ts.map +1 -1
- package/dist/indexer/extractors/python.js +24 -3
- package/dist/indexer/extractors/python.js.map +1 -1
- package/dist/indexer/extractors/ruby.d.ts.map +1 -1
- package/dist/indexer/extractors/ruby.js +23 -1
- package/dist/indexer/extractors/ruby.js.map +1 -1
- package/dist/indexer/extractors/rust.d.ts.map +1 -1
- package/dist/indexer/extractors/rust.js +139 -2
- package/dist/indexer/extractors/rust.js.map +1 -1
- package/dist/indexer/extractors/scala.d.ts.map +1 -1
- package/dist/indexer/extractors/scala.js +24 -1
- package/dist/indexer/extractors/scala.js.map +1 -1
- package/dist/indexer/extractors/swift.d.ts.map +1 -1
- package/dist/indexer/extractors/swift.js +129 -1
- package/dist/indexer/extractors/swift.js.map +1 -1
- package/dist/indexer/extractors/types.d.ts +78 -2
- package/dist/indexer/extractors/types.d.ts.map +1 -1
- package/dist/indexer/extractors/types.js +167 -8
- package/dist/indexer/extractors/types.js.map +1 -1
- package/dist/indexer/extractors/typescript.d.ts.map +1 -1
- package/dist/indexer/extractors/typescript.js +217 -1
- package/dist/indexer/extractors/typescript.js.map +1 -1
- package/dist/indexer/extractors/zig.d.ts.map +1 -1
- package/dist/indexer/extractors/zig.js +30 -0
- package/dist/indexer/extractors/zig.js.map +1 -1
- package/dist/indexer/git-history.d.ts.map +1 -1
- package/dist/indexer/git-history.js +4 -8
- package/dist/indexer/git-history.js.map +1 -1
- package/dist/indexer/git-hooks.js +1 -1
- package/dist/indexer/git-hooks.js.map +1 -1
- package/dist/indexer/index.d.ts +27 -52
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +146 -773
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/lsp/client.d.ts.map +1 -1
- package/dist/indexer/lsp/client.js +40 -15
- package/dist/indexer/lsp/client.js.map +1 -1
- package/dist/indexer/lsp/config.d.ts.map +1 -1
- package/dist/indexer/lsp/config.js +18 -4
- package/dist/indexer/lsp/config.js.map +1 -1
- package/dist/indexer/lsp/enrichment.d.ts +2 -0
- package/dist/indexer/lsp/enrichment.d.ts.map +1 -1
- package/dist/indexer/lsp/enrichment.js +67 -33
- package/dist/indexer/lsp/enrichment.js.map +1 -1
- package/dist/indexer/pipeline.d.ts +137 -0
- package/dist/indexer/pipeline.d.ts.map +1 -0
- package/dist/indexer/pipeline.js +84 -0
- package/dist/indexer/pipeline.js.map +1 -0
- package/dist/indexer/poller.d.ts +8 -0
- package/dist/indexer/poller.d.ts.map +1 -1
- package/dist/indexer/poller.js +3 -1
- package/dist/indexer/poller.js.map +1 -1
- package/dist/indexer/resolution-method.d.ts +40 -0
- package/dist/indexer/resolution-method.d.ts.map +1 -0
- package/dist/indexer/resolution-method.js +53 -0
- package/dist/indexer/resolution-method.js.map +1 -0
- package/dist/indexer/resolver.d.ts.map +1 -1
- package/dist/indexer/resolver.js +8 -4
- package/dist/indexer/resolver.js.map +1 -1
- package/dist/indexer/stages/dependency-api.d.ts +18 -0
- package/dist/indexer/stages/dependency-api.d.ts.map +1 -0
- package/dist/indexer/stages/dependency-api.js +174 -0
- package/dist/indexer/stages/dependency-api.js.map +1 -0
- package/dist/indexer/stages/docs-index.d.ts +20 -0
- package/dist/indexer/stages/docs-index.d.ts.map +1 -0
- package/dist/indexer/stages/docs-index.js +144 -0
- package/dist/indexer/stages/docs-index.js.map +1 -0
- package/dist/indexer/stages/embedding.d.ts +17 -0
- package/dist/indexer/stages/embedding.d.ts.map +1 -0
- package/dist/indexer/stages/embedding.js +217 -0
- package/dist/indexer/stages/embedding.js.map +1 -0
- package/dist/indexer/stages/import-resolution.d.ts +17 -0
- package/dist/indexer/stages/import-resolution.d.ts.map +1 -0
- package/dist/indexer/stages/import-resolution.js +47 -0
- package/dist/indexer/stages/import-resolution.js.map +1 -0
- package/dist/indexer/stages/index.d.ts +12 -0
- package/dist/indexer/stages/index.d.ts.map +1 -0
- package/dist/indexer/stages/index.js +12 -0
- package/dist/indexer/stages/index.js.map +1 -0
- package/dist/indexer/stages/lsp-enrichment.d.ts +48 -0
- package/dist/indexer/stages/lsp-enrichment.d.ts.map +1 -0
- package/dist/indexer/stages/lsp-enrichment.js +158 -0
- package/dist/indexer/stages/lsp-enrichment.js.map +1 -0
- package/dist/indexer/stages/source-index.d.ts +31 -0
- package/dist/indexer/stages/source-index.d.ts.map +1 -0
- package/dist/indexer/stages/source-index.js +314 -0
- package/dist/indexer/stages/source-index.js.map +1 -0
- package/dist/indexer/watcher.d.ts +8 -0
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +18 -1
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/lore-server/db.d.ts +51 -4
- package/dist/lore-server/db.d.ts.map +1 -1
- package/dist/lore-server/db.js +102 -93
- package/dist/lore-server/db.js.map +1 -1
- package/dist/lore-server/server.d.ts +5 -0
- package/dist/lore-server/server.d.ts.map +1 -1
- package/dist/lore-server/server.js +52 -273
- package/dist/lore-server/server.js.map +1 -1
- package/dist/lore-server/tool-registry.d.ts +101 -0
- package/dist/lore-server/tool-registry.d.ts.map +1 -0
- package/dist/lore-server/tool-registry.js +227 -0
- package/dist/lore-server/tool-registry.js.map +1 -0
- package/dist/lore-server/tools/graph.d.ts +11 -3
- package/dist/lore-server/tools/graph.d.ts.map +1 -1
- package/dist/lore-server/tools/graph.js +108 -13
- package/dist/lore-server/tools/graph.js.map +1 -1
- package/dist/lore-server/tools/lookup.d.ts +9 -3
- package/dist/lore-server/tools/lookup.d.ts.map +1 -1
- package/dist/lore-server/tools/lookup.js +9 -4
- package/dist/lore-server/tools/lookup.js.map +1 -1
- package/dist/lore-server/tools/notes.d.ts.map +1 -1
- package/dist/lore-server/tools/notes.js +6 -2
- package/dist/lore-server/tools/notes.js.map +1 -1
- package/dist/lore-server/tools/search.d.ts +4 -0
- package/dist/lore-server/tools/search.d.ts.map +1 -1
- package/dist/lore-server/tools/search.js +50 -14
- package/dist/lore-server/tools/search.js.map +1 -1
- package/dist/runtime.d.ts +88 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +153 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +12 -12
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tool-registry
|
|
3
|
+
*
|
|
4
|
+
* Single-source tool registration. Each MCP tool module exports a `toolDef`
|
|
5
|
+
* (or `writeToolDef` / `readToolDef`) object with its name, description, and
|
|
6
|
+
* JSON-schema. The registry converts those to Zod schemas and wires them into
|
|
7
|
+
* the `McpServer` automatically — no duplicate Zod definitions in server.ts.
|
|
8
|
+
*
|
|
9
|
+
* ## ToolModule contract
|
|
10
|
+
*
|
|
11
|
+
* Every tool file must export **at least**:
|
|
12
|
+
* - `toolDef` (or `writeToolDef` / `readToolDef`) containing `name`, `description`, and `inputSchema`
|
|
13
|
+
* - `handler(db, args, ...)` (or `writeHandler` / `readHandler` for notes)
|
|
14
|
+
*
|
|
15
|
+
* The registry iterates over a list of declared `ToolModule` descriptors and
|
|
16
|
+
* calls `server.tool()` for each, using a standard `loggedHandler` wrapper.
|
|
17
|
+
*/
|
|
18
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
19
|
+
import { type ZodType } from 'zod';
|
|
20
|
+
import type { Database } from './db.js';
|
|
21
|
+
import type { EmbeddingProvider } from '../indexer/embedder.js';
|
|
22
|
+
import type { LoreLogger } from '../logger.js';
|
|
23
|
+
import type { SearchObserver } from './tools/search.js';
|
|
24
|
+
/**
|
|
25
|
+
* JSON-schema → Zod bridge.
|
|
26
|
+
*
|
|
27
|
+
* We convert the plain JSON-schema style `inputSchema` that every tool file
|
|
28
|
+
* already declares into Zod objects that `McpServer.tool()` expects. This is
|
|
29
|
+
* the single authoritative conversion point — server.ts no longer needs its
|
|
30
|
+
* own Zod literals.
|
|
31
|
+
*/
|
|
32
|
+
/** Shape of a single property in a toolDef.inputSchema. */
|
|
33
|
+
interface JsonSchemaProperty {
|
|
34
|
+
type: string;
|
|
35
|
+
enum?: readonly string[];
|
|
36
|
+
description?: string;
|
|
37
|
+
items?: {
|
|
38
|
+
type: string;
|
|
39
|
+
};
|
|
40
|
+
/** JSON-Schema minimum (inclusive). */
|
|
41
|
+
minimum?: number;
|
|
42
|
+
/** JSON-Schema maximum (inclusive). */
|
|
43
|
+
maximum?: number;
|
|
44
|
+
}
|
|
45
|
+
/** The fragment of inputSchema that every toolDef carries. */
|
|
46
|
+
interface ToolInputSchema {
|
|
47
|
+
type: 'object';
|
|
48
|
+
properties: Record<string, JsonSchemaProperty>;
|
|
49
|
+
required?: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
/** The shape that every tool file exports as `toolDef`. */
|
|
52
|
+
export interface ToolDefinition {
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
inputSchema: ToolInputSchema;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Descriptor registered with the tool registry.
|
|
59
|
+
*
|
|
60
|
+
* `handlerFactory` is a function that produces the concrete handler from the
|
|
61
|
+
* shared session dependencies (db, dbPath, embedder, etc.).
|
|
62
|
+
*/
|
|
63
|
+
export interface ToolModule {
|
|
64
|
+
def: ToolDefinition;
|
|
65
|
+
/**
|
|
66
|
+
* Build and return the handler function for this tool.
|
|
67
|
+
* Receives session-level dependencies.
|
|
68
|
+
*/
|
|
69
|
+
handlerFactory: (deps: ToolDependencies) => (args: any) => unknown | Promise<unknown>;
|
|
70
|
+
}
|
|
71
|
+
/** Dependencies that handler factories may draw from. */
|
|
72
|
+
export interface ToolDependencies {
|
|
73
|
+
db: Database.Database;
|
|
74
|
+
dbPath: string;
|
|
75
|
+
embedder?: EmbeddingProvider;
|
|
76
|
+
searchObserver?: SearchObserver;
|
|
77
|
+
logger: LoreLogger;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convert an entire `toolDef.inputSchema` into a Zod shape suitable for
|
|
81
|
+
* passing to `server.tool()`.
|
|
82
|
+
*/
|
|
83
|
+
export declare function inputSchemaToZodShape(schema: ToolInputSchema): Record<string, ZodType>;
|
|
84
|
+
/**
|
|
85
|
+
* Register all tool modules onto the MCP server.
|
|
86
|
+
*
|
|
87
|
+
* This replaces the long hand-coded `server.tool(...)` block in
|
|
88
|
+
* `createLoreMcpServer()` with a data-driven loop.
|
|
89
|
+
*/
|
|
90
|
+
export declare function registerTools(server: McpServer, modules: ToolModule[], deps: ToolDependencies): void;
|
|
91
|
+
/**
|
|
92
|
+
* Builds the complete list of tool modules to register.
|
|
93
|
+
*
|
|
94
|
+
* Each entry pairs the existing `toolDef` with a handler factory that
|
|
95
|
+
* receives session dependencies. The handler factory closures mirror the
|
|
96
|
+
* existing `server.ts` call‐sites exactly — this is a lift-and-shift, not a
|
|
97
|
+
* rewrite.
|
|
98
|
+
*/
|
|
99
|
+
export declare function buildToolModules(): Promise<ToolModule[]>;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/lore-server/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD;;;;;;;GAOG;AAEH,2DAA2D;AAC3D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8DAA8D;AAC9D,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,cAAc,CAAC;IACpB;;;OAGG;IACH,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE,UAAU,CAAC;CACpB;AAgDD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBtF;AA2CD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EAAE,EACrB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAWN;AAID;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAsG9D"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tool-registry
|
|
3
|
+
*
|
|
4
|
+
* Single-source tool registration. Each MCP tool module exports a `toolDef`
|
|
5
|
+
* (or `writeToolDef` / `readToolDef`) object with its name, description, and
|
|
6
|
+
* JSON-schema. The registry converts those to Zod schemas and wires them into
|
|
7
|
+
* the `McpServer` automatically — no duplicate Zod definitions in server.ts.
|
|
8
|
+
*
|
|
9
|
+
* ## ToolModule contract
|
|
10
|
+
*
|
|
11
|
+
* Every tool file must export **at least**:
|
|
12
|
+
* - `toolDef` (or `writeToolDef` / `readToolDef`) containing `name`, `description`, and `inputSchema`
|
|
13
|
+
* - `handler(db, args, ...)` (or `writeHandler` / `readHandler` for notes)
|
|
14
|
+
*
|
|
15
|
+
* The registry iterates over a list of declared `ToolModule` descriptors and
|
|
16
|
+
* calls `server.tool()` for each, using a standard `loggedHandler` wrapper.
|
|
17
|
+
*/
|
|
18
|
+
import { z } from 'zod';
|
|
19
|
+
// ─── JSON-Schema → Zod conversion ────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Converts a single JSON-schema property definition into the corresponding Zod
|
|
22
|
+
* type. Handles the subset of JSON-Schema we actually use in tool definitions.
|
|
23
|
+
*/
|
|
24
|
+
function propertyToZod(prop) {
|
|
25
|
+
if (prop.enum && prop.enum.length > 0) {
|
|
26
|
+
const enumSchema = z.enum(prop.enum);
|
|
27
|
+
return prop.description ? enumSchema.describe(prop.description) : enumSchema;
|
|
28
|
+
}
|
|
29
|
+
let base;
|
|
30
|
+
switch (prop.type) {
|
|
31
|
+
case 'string':
|
|
32
|
+
base = z.string();
|
|
33
|
+
break;
|
|
34
|
+
case 'number': {
|
|
35
|
+
let num = z.number();
|
|
36
|
+
if (prop.minimum !== undefined)
|
|
37
|
+
num = num.min(prop.minimum);
|
|
38
|
+
if (prop.maximum !== undefined)
|
|
39
|
+
num = num.max(prop.maximum);
|
|
40
|
+
base = num;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'integer': {
|
|
44
|
+
let num = z.number().int();
|
|
45
|
+
if (prop.minimum !== undefined)
|
|
46
|
+
num = num.min(prop.minimum);
|
|
47
|
+
if (prop.maximum !== undefined)
|
|
48
|
+
num = num.max(prop.maximum);
|
|
49
|
+
base = num;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 'boolean':
|
|
53
|
+
base = z.boolean();
|
|
54
|
+
break;
|
|
55
|
+
case 'array':
|
|
56
|
+
base = z.array(prop.items?.type === 'number' ? z.number() : z.string());
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
base = z.any();
|
|
60
|
+
}
|
|
61
|
+
return prop.description ? base.describe(prop.description) : base;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Convert an entire `toolDef.inputSchema` into a Zod shape suitable for
|
|
65
|
+
* passing to `server.tool()`.
|
|
66
|
+
*/
|
|
67
|
+
export function inputSchemaToZodShape(schema) {
|
|
68
|
+
const shape = {};
|
|
69
|
+
const requiredSet = new Set(schema.required ?? []);
|
|
70
|
+
for (const [key, prop] of Object.entries(schema.properties)) {
|
|
71
|
+
const zodProp = propertyToZod(prop);
|
|
72
|
+
if (!requiredSet.has(key)) {
|
|
73
|
+
// In zod v4, .describe() before .optional() loses the description.
|
|
74
|
+
// We apply .optional() first then re-describe if needed.
|
|
75
|
+
const optProp = zodProp.optional();
|
|
76
|
+
shape[key] = prop.description ? optProp.describe(prop.description) : optProp;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
shape[key] = zodProp;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return shape;
|
|
83
|
+
}
|
|
84
|
+
// ─── Logged handler wrapper ───────────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Wrap an MCP tool handler with structured logging.
|
|
87
|
+
* Captures request args, response, timing, and success/error status.
|
|
88
|
+
*/
|
|
89
|
+
function loggedHandler(toolName, fn, log) {
|
|
90
|
+
return async (args) => {
|
|
91
|
+
const start = performance.now();
|
|
92
|
+
try {
|
|
93
|
+
const result = await fn(args);
|
|
94
|
+
const durationMs = Math.round((performance.now() - start) * 100) / 100;
|
|
95
|
+
log.toolCall({
|
|
96
|
+
tool: toolName,
|
|
97
|
+
requestBody: args,
|
|
98
|
+
responseBody: result,
|
|
99
|
+
status: 'success',
|
|
100
|
+
durationMs,
|
|
101
|
+
});
|
|
102
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const durationMs = Math.round((performance.now() - start) * 100) / 100;
|
|
106
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
107
|
+
log.toolCall({
|
|
108
|
+
tool: toolName,
|
|
109
|
+
requestBody: args,
|
|
110
|
+
status: 'error',
|
|
111
|
+
durationMs,
|
|
112
|
+
error: errorMessage,
|
|
113
|
+
});
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ─── Registry ─────────────────────────────────────────────────────────────────
|
|
119
|
+
/**
|
|
120
|
+
* Register all tool modules onto the MCP server.
|
|
121
|
+
*
|
|
122
|
+
* This replaces the long hand-coded `server.tool(...)` block in
|
|
123
|
+
* `createLoreMcpServer()` with a data-driven loop.
|
|
124
|
+
*/
|
|
125
|
+
export function registerTools(server, modules, deps) {
|
|
126
|
+
for (const mod of modules) {
|
|
127
|
+
const zodShape = inputSchemaToZodShape(mod.def.inputSchema);
|
|
128
|
+
const handler = mod.handlerFactory(deps);
|
|
129
|
+
server.tool(mod.def.name, mod.def.description, zodShape, loggedHandler(mod.def.name, handler, deps.logger));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ─── Tool module declarations (importers) ─────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* Builds the complete list of tool modules to register.
|
|
135
|
+
*
|
|
136
|
+
* Each entry pairs the existing `toolDef` with a handler factory that
|
|
137
|
+
* receives session dependencies. The handler factory closures mirror the
|
|
138
|
+
* existing `server.ts` call‐sites exactly — this is a lift-and-shift, not a
|
|
139
|
+
* rewrite.
|
|
140
|
+
*/
|
|
141
|
+
export async function buildToolModules() {
|
|
142
|
+
// Dynamic imports so the registry can be tree-shaken independently.
|
|
143
|
+
const [lookup, graph, search, docsMod, routes, notes, architecture, testMap, snippet, blame, metrics, coverage, writeback, history, annotationsMod,] = await Promise.all([
|
|
144
|
+
import('./tools/lookup.js'),
|
|
145
|
+
import('./tools/graph.js'),
|
|
146
|
+
import('./tools/search.js'),
|
|
147
|
+
import('./tools/docs.js'),
|
|
148
|
+
import('./tools/routes.js'),
|
|
149
|
+
import('./tools/notes.js'),
|
|
150
|
+
import('./tools/architecture.js'),
|
|
151
|
+
import('./tools/test-map.js'),
|
|
152
|
+
import('./tools/snippet.js'),
|
|
153
|
+
import('./tools/blame.js'),
|
|
154
|
+
import('./tools/metrics.js'),
|
|
155
|
+
import('./tools/coverage.js'),
|
|
156
|
+
import('./tools/writeback.js'),
|
|
157
|
+
import('./tools/history.js'),
|
|
158
|
+
import('./tools/annotations.js'),
|
|
159
|
+
]);
|
|
160
|
+
return [
|
|
161
|
+
{
|
|
162
|
+
def: lookup.toolDef,
|
|
163
|
+
handlerFactory: (deps) => (args) => lookup.handler(deps.db, args, deps.embedder),
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
def: graph.toolDef,
|
|
167
|
+
handlerFactory: (deps) => (args) => graph.handler(deps.db, args),
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
def: search.toolDef,
|
|
171
|
+
handlerFactory: (deps) => (args) => search.handler(deps.db, args, deps.embedder, deps.searchObserver),
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
def: docsMod.toolDef,
|
|
175
|
+
handlerFactory: (deps) => (args) => docsMod.handler(deps.db, args, deps.embedder),
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
def: routes.toolDef,
|
|
179
|
+
handlerFactory: (deps) => (args) => routes.handler(deps.db, args),
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
def: notes.writeToolDef,
|
|
183
|
+
handlerFactory: (deps) => (args) => notes.writeHandler(deps.dbPath, args),
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
def: notes.readToolDef,
|
|
187
|
+
handlerFactory: (deps) => (args) => notes.readHandler(deps.db, args),
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
def: architecture.toolDef,
|
|
191
|
+
handlerFactory: (deps) => (args) => architecture.handler(deps.db, args),
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
def: testMap.toolDef,
|
|
195
|
+
handlerFactory: (deps) => (args) => testMap.handler(deps.db, args),
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
def: snippet.toolDef,
|
|
199
|
+
handlerFactory: (deps) => (args) => snippet.handler(deps.db, args),
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
def: blame.toolDef,
|
|
203
|
+
handlerFactory: (deps) => (args) => blame.handler(deps.db, args),
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
def: metrics.toolDef,
|
|
207
|
+
handlerFactory: (deps) => (args) => metrics.handler(deps.db, args ?? {}),
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
def: coverage.toolDef,
|
|
211
|
+
handlerFactory: (deps) => (args) => coverage.handler(deps.db, args),
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
def: writeback.toolDef,
|
|
215
|
+
handlerFactory: (deps) => (args) => writeback.handler(deps.dbPath, args),
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
def: history.toolDef,
|
|
219
|
+
handlerFactory: (deps) => (args) => history.handler(deps.db, args, deps.embedder),
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
def: annotationsMod.toolDef,
|
|
223
|
+
handlerFactory: (deps) => (args) => annotationsMod.handler(deps.db, args),
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/lore-server/tool-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* traversals without additional round-trips.
|
|
8
8
|
*/
|
|
9
9
|
import type { Database } from '../db.js';
|
|
10
|
+
import type { ResolutionMethod } from '../../indexer/resolution-method.js';
|
|
10
11
|
export declare const toolDef: {
|
|
11
12
|
readonly name: "lore_graph";
|
|
12
13
|
readonly description: string;
|
|
@@ -15,7 +16,7 @@ export declare const toolDef: {
|
|
|
15
16
|
readonly properties: {
|
|
16
17
|
readonly kind: {
|
|
17
18
|
readonly type: "string";
|
|
18
|
-
readonly enum: readonly ["call", "import", "module", "inheritance"];
|
|
19
|
+
readonly enum: readonly ["call", "import", "module", "inheritance", "type_dependency"];
|
|
19
20
|
readonly description: string;
|
|
20
21
|
};
|
|
21
22
|
readonly source_id: {
|
|
@@ -54,7 +55,7 @@ export declare const toolDef: {
|
|
|
54
55
|
readonly required: readonly ["kind"];
|
|
55
56
|
};
|
|
56
57
|
};
|
|
57
|
-
type GraphKind = 'call' | 'import' | 'module' | 'inheritance';
|
|
58
|
+
type GraphKind = 'call' | 'import' | 'module' | 'inheritance' | 'type_dependency';
|
|
58
59
|
export interface GraphArgs {
|
|
59
60
|
kind: GraphKind;
|
|
60
61
|
source_id?: number;
|
|
@@ -66,12 +67,19 @@ export interface GraphArgs {
|
|
|
66
67
|
semantic_max_distance?: number;
|
|
67
68
|
}
|
|
68
69
|
export interface GraphEdge {
|
|
69
|
-
source_id: number;
|
|
70
|
+
source_id: number | null;
|
|
70
71
|
source_name: string;
|
|
71
72
|
source_branch: string;
|
|
72
73
|
target_id: number | null;
|
|
73
74
|
target_name: string;
|
|
74
75
|
callee_coverage_percent?: number | null;
|
|
76
|
+
ref_kind?: string;
|
|
77
|
+
line?: number;
|
|
78
|
+
character?: number | null;
|
|
79
|
+
resolution_method?: ResolutionMethod;
|
|
80
|
+
definition_path?: string | null;
|
|
81
|
+
definition_line?: number | null;
|
|
82
|
+
definition_character?: number | null;
|
|
75
83
|
}
|
|
76
84
|
export interface GraphResult {
|
|
77
85
|
edges: GraphEdge[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAI3E,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDV,CAAC;AAIX,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAElF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuSD,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,CAgF3E"}
|
|
@@ -10,17 +10,18 @@ import { getCoveragePercentBySymbolIds, semanticSearchSymbols } from '../db.js';
|
|
|
10
10
|
// ─── Tool definition ──────────────────────────────────────────────────────────
|
|
11
11
|
export const toolDef = {
|
|
12
12
|
name: 'lore_graph',
|
|
13
|
-
description: 'Query call, import, module, or
|
|
14
|
-
'Set `kind` to "call", "import", "module", or "
|
|
13
|
+
description: 'Query call, import, module, inheritance, or type dependency graph edges stored in the knowledge-base index. ' +
|
|
14
|
+
'Set `kind` to "call", "import", "module", "inheritance", or "type_dependency". ' +
|
|
15
15
|
'Optionally set mode="semantic" with query_vector to retrieve semantically related symbol/module nodes alongside edges.',
|
|
16
16
|
inputSchema: {
|
|
17
17
|
type: 'object',
|
|
18
18
|
properties: {
|
|
19
19
|
kind: {
|
|
20
20
|
type: 'string',
|
|
21
|
-
enum: ['call', 'import', 'module', 'inheritance'],
|
|
21
|
+
enum: ['call', 'import', 'module', 'inheritance', 'type_dependency'],
|
|
22
22
|
description: '"call" returns symbol → callee edges; "import" returns file → imported-file edges; ' +
|
|
23
|
-
'"module" returns module → imported-module edges; "inheritance" returns symbol → base-symbol edges
|
|
23
|
+
'"module" returns module → imported-module edges; "inheritance" returns symbol → base-symbol edges; ' +
|
|
24
|
+
'"type_dependency" returns symbol → referenced-type edges.',
|
|
24
25
|
},
|
|
25
26
|
source_id: {
|
|
26
27
|
type: 'number',
|
|
@@ -72,7 +73,17 @@ function getStructuralEdges(db, args, limit) {
|
|
|
72
73
|
s_caller.name AS source_name,
|
|
73
74
|
f_caller.branch AS source_branch,
|
|
74
75
|
sr.callee_id AS target_id,
|
|
75
|
-
sr.callee_name AS target_name
|
|
76
|
+
sr.callee_name AS target_name,
|
|
77
|
+
sr.call_kind AS call_kind,
|
|
78
|
+
sr.call_line + 1 AS line,
|
|
79
|
+
CASE
|
|
80
|
+
WHEN sr.call_character IS NULL THEN NULL
|
|
81
|
+
ELSE sr.call_character + 1
|
|
82
|
+
END AS character,
|
|
83
|
+
sr.resolution_method AS resolution_method,
|
|
84
|
+
sr.definition_path AS definition_path,
|
|
85
|
+
sr.definition_line AS definition_line,
|
|
86
|
+
sr.definition_character AS definition_character
|
|
76
87
|
FROM symbol_refs sr
|
|
77
88
|
JOIN symbols s_caller ON s_caller.id = sr.caller_id
|
|
78
89
|
JOIN files f_caller ON f_caller.id = s_caller.file_id
|
|
@@ -82,7 +93,17 @@ function getStructuralEdges(db, args, limit) {
|
|
|
82
93
|
s_caller.name AS source_name,
|
|
83
94
|
f_caller.branch AS source_branch,
|
|
84
95
|
sr.callee_id AS target_id,
|
|
85
|
-
sr.callee_name AS target_name
|
|
96
|
+
sr.callee_name AS target_name,
|
|
97
|
+
sr.call_kind AS call_kind,
|
|
98
|
+
sr.call_line + 1 AS line,
|
|
99
|
+
CASE
|
|
100
|
+
WHEN sr.call_character IS NULL THEN NULL
|
|
101
|
+
ELSE sr.call_character + 1
|
|
102
|
+
END AS character,
|
|
103
|
+
sr.resolution_method AS resolution_method,
|
|
104
|
+
sr.definition_path AS definition_path,
|
|
105
|
+
sr.definition_line AS definition_line,
|
|
106
|
+
sr.definition_character AS definition_character
|
|
86
107
|
FROM symbol_refs sr
|
|
87
108
|
JOIN symbols s_caller ON s_caller.id = sr.caller_id
|
|
88
109
|
JOIN files f_caller ON f_caller.id = s_caller.file_id
|
|
@@ -132,7 +153,10 @@ function getStructuralEdges(db, args, limit) {
|
|
|
132
153
|
return edges;
|
|
133
154
|
}
|
|
134
155
|
else if (args.kind === 'module') {
|
|
135
|
-
// Module-level: inferred from file_imports + file_modules
|
|
156
|
+
// Module-level: inferred from file_imports + file_modules.
|
|
157
|
+
// NOTE: No writer populates `modules`/`file_modules` — this query returns
|
|
158
|
+
// empty results until a module-detection writer is implemented.
|
|
159
|
+
// The INNER JOIN on file_modules ensures graceful empty results.
|
|
136
160
|
const hasFilter = args.source_id !== undefined;
|
|
137
161
|
const branchClause = args.branch !== undefined ? ' AND f_src.branch = ?' : '';
|
|
138
162
|
const sql = hasFilter
|
|
@@ -172,8 +196,8 @@ function getStructuralEdges(db, args, limit) {
|
|
|
172
196
|
const edges = db.prepare(sql).all(...edgeParams);
|
|
173
197
|
return edges;
|
|
174
198
|
}
|
|
175
|
-
else {
|
|
176
|
-
// Symbol-level inheritance edges (e.g., class extends)
|
|
199
|
+
else if (args.kind === 'inheritance') {
|
|
200
|
+
// Symbol-level inheritance edges (e.g., class extends, implements)
|
|
177
201
|
const hasFilter = args.source_id !== undefined;
|
|
178
202
|
const branchClause = args.branch !== undefined ? ' AND f_src.branch = ?' : '';
|
|
179
203
|
const sql = hasFilter
|
|
@@ -181,24 +205,95 @@ function getStructuralEdges(db, args, limit) {
|
|
|
181
205
|
s_src.name AS source_name,
|
|
182
206
|
f_src.branch AS source_branch,
|
|
183
207
|
rel.target_symbol_id AS target_id,
|
|
184
|
-
COALESCE(s_dst.name, rel.target_symbol_name) AS target_name
|
|
208
|
+
COALESCE(s_dst.name, rel.target_symbol_name) AS target_name,
|
|
209
|
+
rel.line + 1 AS line,
|
|
210
|
+
CASE
|
|
211
|
+
WHEN rel.character IS NULL THEN NULL
|
|
212
|
+
ELSE rel.character + 1
|
|
213
|
+
END AS character,
|
|
214
|
+
rel.resolution_method AS resolution_method,
|
|
215
|
+
rel.definition_path AS definition_path,
|
|
216
|
+
rel.definition_line AS definition_line,
|
|
217
|
+
rel.definition_character AS definition_character
|
|
185
218
|
FROM symbol_relationships rel
|
|
186
219
|
JOIN symbols s_src ON s_src.id = rel.source_symbol_id
|
|
187
220
|
JOIN files f_src ON f_src.id = s_src.file_id
|
|
188
221
|
LEFT JOIN symbols s_dst ON s_dst.id = rel.target_symbol_id
|
|
189
|
-
WHERE rel.relationship_type
|
|
222
|
+
WHERE rel.relationship_type IN ('extends', 'implements')
|
|
190
223
|
AND rel.source_symbol_id = ?${branchClause}
|
|
191
224
|
LIMIT ?`
|
|
192
225
|
: `SELECT rel.source_symbol_id AS source_id,
|
|
193
226
|
s_src.name AS source_name,
|
|
194
227
|
f_src.branch AS source_branch,
|
|
195
228
|
rel.target_symbol_id AS target_id,
|
|
196
|
-
COALESCE(s_dst.name, rel.target_symbol_name) AS target_name
|
|
229
|
+
COALESCE(s_dst.name, rel.target_symbol_name) AS target_name,
|
|
230
|
+
rel.line + 1 AS line,
|
|
231
|
+
CASE
|
|
232
|
+
WHEN rel.character IS NULL THEN NULL
|
|
233
|
+
ELSE rel.character + 1
|
|
234
|
+
END AS character,
|
|
235
|
+
rel.resolution_method AS resolution_method,
|
|
236
|
+
rel.definition_path AS definition_path,
|
|
237
|
+
rel.definition_line AS definition_line,
|
|
238
|
+
rel.definition_character AS definition_character
|
|
197
239
|
FROM symbol_relationships rel
|
|
198
240
|
JOIN symbols s_src ON s_src.id = rel.source_symbol_id
|
|
199
241
|
JOIN files f_src ON f_src.id = s_src.file_id
|
|
200
242
|
LEFT JOIN symbols s_dst ON s_dst.id = rel.target_symbol_id
|
|
201
|
-
WHERE rel.relationship_type
|
|
243
|
+
WHERE rel.relationship_type IN ('extends', 'implements')${branchClause}
|
|
244
|
+
LIMIT ?`;
|
|
245
|
+
const edgeParams = hasFilter
|
|
246
|
+
? (args.branch !== undefined ? [args.source_id, args.branch, limit] : [args.source_id, limit])
|
|
247
|
+
: (args.branch !== undefined ? [args.branch, limit] : [limit]);
|
|
248
|
+
const edges = db.prepare(sql).all(...edgeParams);
|
|
249
|
+
return edges;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// type_dependency: symbol → referenced type edges
|
|
253
|
+
const hasFilter = args.source_id !== undefined;
|
|
254
|
+
const branchClause = args.branch !== undefined ? ' AND f_src.branch = ?' : '';
|
|
255
|
+
const sql = hasFilter
|
|
256
|
+
? `SELECT tr.symbol_id AS source_id,
|
|
257
|
+
COALESCE(s_src.name, '') AS source_name,
|
|
258
|
+
f_src.branch AS source_branch,
|
|
259
|
+
tr.type_id AS target_id,
|
|
260
|
+
COALESCE(s_dst.name, tr.type_name) AS target_name,
|
|
261
|
+
tr.ref_kind AS ref_kind,
|
|
262
|
+
tr.ref_line + 1 AS line,
|
|
263
|
+
CASE
|
|
264
|
+
WHEN tr.ref_character IS NULL THEN NULL
|
|
265
|
+
ELSE tr.ref_character + 1
|
|
266
|
+
END AS character,
|
|
267
|
+
tr.resolution_method AS resolution_method,
|
|
268
|
+
tr.definition_path AS definition_path,
|
|
269
|
+
tr.definition_line AS definition_line,
|
|
270
|
+
tr.definition_character AS definition_character
|
|
271
|
+
FROM type_refs tr
|
|
272
|
+
JOIN files f_src ON f_src.id = tr.file_id
|
|
273
|
+
LEFT JOIN symbols s_src ON s_src.id = tr.symbol_id
|
|
274
|
+
LEFT JOIN symbols s_dst ON s_dst.id = tr.type_id
|
|
275
|
+
WHERE tr.symbol_id = ?${branchClause}
|
|
276
|
+
LIMIT ?`
|
|
277
|
+
: `SELECT tr.symbol_id AS source_id,
|
|
278
|
+
COALESCE(s_src.name, '') AS source_name,
|
|
279
|
+
f_src.branch AS source_branch,
|
|
280
|
+
tr.type_id AS target_id,
|
|
281
|
+
COALESCE(s_dst.name, tr.type_name) AS target_name,
|
|
282
|
+
tr.ref_kind AS ref_kind,
|
|
283
|
+
tr.ref_line + 1 AS line,
|
|
284
|
+
CASE
|
|
285
|
+
WHEN tr.ref_character IS NULL THEN NULL
|
|
286
|
+
ELSE tr.ref_character + 1
|
|
287
|
+
END AS character,
|
|
288
|
+
tr.resolution_method AS resolution_method,
|
|
289
|
+
tr.definition_path AS definition_path,
|
|
290
|
+
tr.definition_line AS definition_line,
|
|
291
|
+
tr.definition_character AS definition_character
|
|
292
|
+
FROM type_refs tr
|
|
293
|
+
JOIN files f_src ON f_src.id = tr.file_id
|
|
294
|
+
LEFT JOIN symbols s_src ON s_src.id = tr.symbol_id
|
|
295
|
+
LEFT JOIN symbols s_dst ON s_dst.id = tr.type_id
|
|
296
|
+
WHERE 1=1${branchClause}
|
|
202
297
|
LIMIT ?`;
|
|
203
298
|
const edgeParams = hasFilter
|
|
204
299
|
? (args.branch !== undefined ? [args.source_id, args.branch, limit] : [args.source_id, limit])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/lore-server/tools/graph.ts"],"names":[],"mappings":"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"}
|