argustack 0.1.34 → 0.2.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 +29 -12
- package/dist/adapters/lmstudio/embedding-provider.d.ts +37 -0
- package/dist/adapters/lmstudio/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/lmstudio/embedding-provider.js +174 -0
- package/dist/adapters/lmstudio/embedding-provider.js.map +1 -0
- package/dist/adapters/lmstudio/index.d.ts +3 -0
- package/dist/adapters/lmstudio/index.d.ts.map +1 -0
- package/dist/adapters/lmstudio/index.js +2 -0
- package/dist/adapters/lmstudio/index.js.map +1 -0
- package/dist/adapters/lsp/index.d.ts +4 -0
- package/dist/adapters/lsp/index.d.ts.map +1 -0
- package/dist/adapters/lsp/index.js +3 -0
- package/dist/adapters/lsp/index.js.map +1 -0
- package/dist/adapters/lsp/jsonrpc.d.ts +12 -0
- package/dist/adapters/lsp/jsonrpc.d.ts.map +1 -0
- package/dist/adapters/lsp/jsonrpc.js +30 -0
- package/dist/adapters/lsp/jsonrpc.js.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts +25 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.js +131 -0
- package/dist/adapters/lsp/typescript-lsp.js.map +1 -0
- package/dist/adapters/neo4j/client.d.ts +11 -0
- package/dist/adapters/neo4j/client.d.ts.map +1 -0
- package/dist/adapters/neo4j/client.js +14 -0
- package/dist/adapters/neo4j/client.js.map +1 -0
- package/dist/adapters/neo4j/cypher.d.ts +23 -0
- package/dist/adapters/neo4j/cypher.d.ts.map +1 -0
- package/dist/adapters/neo4j/cypher.js +138 -0
- package/dist/adapters/neo4j/cypher.js.map +1 -0
- package/dist/adapters/neo4j/graph-store.d.ts +33 -0
- package/dist/adapters/neo4j/graph-store.d.ts.map +1 -0
- package/dist/adapters/neo4j/graph-store.js +282 -0
- package/dist/adapters/neo4j/graph-store.js.map +1 -0
- package/dist/adapters/neo4j/index.d.ts +4 -0
- package/dist/adapters/neo4j/index.d.ts.map +1 -0
- package/dist/adapters/neo4j/index.js +3 -0
- package/dist/adapters/neo4j/index.js.map +1 -0
- package/dist/adapters/neo4j/mapper.d.ts +5 -0
- package/dist/adapters/neo4j/mapper.d.ts.map +1 -0
- package/dist/adapters/neo4j/mapper.js +49 -0
- package/dist/adapters/neo4j/mapper.js.map +1 -0
- package/dist/adapters/postgres/code-meta.d.ts +21 -0
- package/dist/adapters/postgres/code-meta.d.ts.map +1 -0
- package/dist/adapters/postgres/code-meta.js +150 -0
- package/dist/adapters/postgres/code-meta.js.map +1 -0
- package/dist/adapters/postgres/index.d.ts +1 -0
- package/dist/adapters/postgres/index.d.ts.map +1 -1
- package/dist/adapters/postgres/index.js +1 -0
- package/dist/adapters/postgres/index.js.map +1 -1
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.js +38 -0
- package/dist/adapters/postgres/schema.js.map +1 -1
- package/dist/adapters/postgres/storage.d.ts +3 -3
- package/dist/adapters/postgres/storage.d.ts.map +1 -1
- package/dist/adapters/postgres/storage.js +4 -4
- package/dist/adapters/postgres/storage.js.map +1 -1
- package/dist/adapters/qdrant/client.d.ts +8 -0
- package/dist/adapters/qdrant/client.d.ts.map +1 -0
- package/dist/adapters/qdrant/client.js +12 -0
- package/dist/adapters/qdrant/client.js.map +1 -0
- package/dist/adapters/qdrant/index.d.ts +4 -0
- package/dist/adapters/qdrant/index.d.ts.map +1 -0
- package/dist/adapters/qdrant/index.js +3 -0
- package/dist/adapters/qdrant/index.js.map +1 -0
- package/dist/adapters/qdrant/mapper.d.ts +16 -0
- package/dist/adapters/qdrant/mapper.d.ts.map +1 -0
- package/dist/adapters/qdrant/mapper.js +52 -0
- package/dist/adapters/qdrant/mapper.js.map +1 -0
- package/dist/adapters/qdrant/vector-store.d.ts +19 -0
- package/dist/adapters/qdrant/vector-store.d.ts.map +1 -0
- package/dist/adapters/qdrant/vector-store.js +114 -0
- package/dist/adapters/qdrant/vector-store.js.map +1 -0
- package/dist/adapters/tree-sitter/index.d.ts +4 -0
- package/dist/adapters/tree-sitter/index.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/index.js +3 -0
- package/dist/adapters/tree-sitter/index.js.map +1 -0
- package/dist/adapters/tree-sitter/parser.d.ts +15 -0
- package/dist/adapters/tree-sitter/parser.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/parser.js +186 -0
- package/dist/adapters/tree-sitter/parser.js.map +1 -0
- package/dist/adapters/tree-sitter/queries.d.ts +14 -0
- package/dist/adapters/tree-sitter/queries.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/queries.js +14 -0
- package/dist/adapters/tree-sitter/queries.js.map +1 -0
- package/dist/adapters/voyage/embedding-provider.d.ts +25 -0
- package/dist/adapters/voyage/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/voyage/embedding-provider.js +105 -0
- package/dist/adapters/voyage/embedding-provider.js.map +1 -0
- package/dist/adapters/voyage/index.d.ts +3 -0
- package/dist/adapters/voyage/index.d.ts.map +1 -0
- package/dist/adapters/voyage/index.js +2 -0
- package/dist/adapters/voyage/index.js.map +1 -0
- package/dist/cli/code.d.ts +3 -0
- package/dist/cli/code.d.ts.map +1 -0
- package/dist/cli/code.js +565 -0
- package/dist/cli/code.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +5 -2
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +3 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/code-intel/chunker.d.ts +15 -0
- package/dist/code-intel/chunker.d.ts.map +1 -0
- package/dist/code-intel/chunker.js +39 -0
- package/dist/code-intel/chunker.js.map +1 -0
- package/dist/code-intel/file-discovery.d.ts +19 -0
- package/dist/code-intel/file-discovery.d.ts.map +1 -0
- package/dist/code-intel/file-discovery.js +80 -0
- package/dist/code-intel/file-discovery.js.map +1 -0
- package/dist/code-intel/hash.d.ts +2 -0
- package/dist/code-intel/hash.d.ts.map +1 -0
- package/dist/code-intel/hash.js +5 -0
- package/dist/code-intel/hash.js.map +1 -0
- package/dist/code-intel/index.d.ts +17 -0
- package/dist/code-intel/index.d.ts.map +1 -0
- package/dist/code-intel/index.js +11 -0
- package/dist/code-intel/index.js.map +1 -0
- package/dist/code-intel/indexer.d.ts +43 -0
- package/dist/code-intel/indexer.d.ts.map +1 -0
- package/dist/code-intel/indexer.js +234 -0
- package/dist/code-intel/indexer.js.map +1 -0
- package/dist/code-intel/job-lock.d.ts +7 -0
- package/dist/code-intel/job-lock.d.ts.map +1 -0
- package/dist/code-intel/job-lock.js +18 -0
- package/dist/code-intel/job-lock.js.map +1 -0
- package/dist/code-intel/layer-detector.d.ts +9 -0
- package/dist/code-intel/layer-detector.d.ts.map +1 -0
- package/dist/code-intel/layer-detector.js +31 -0
- package/dist/code-intel/layer-detector.js.map +1 -0
- package/dist/code-intel/lsp-resolver.d.ts +24 -0
- package/dist/code-intel/lsp-resolver.d.ts.map +1 -0
- package/dist/code-intel/lsp-resolver.js +125 -0
- package/dist/code-intel/lsp-resolver.js.map +1 -0
- package/dist/code-intel/ranker.d.ts +28 -0
- package/dist/code-intel/ranker.d.ts.map +1 -0
- package/dist/code-intel/ranker.js +69 -0
- package/dist/code-intel/ranker.js.map +1 -0
- package/dist/code-intel/resolver.d.ts +14 -0
- package/dist/code-intel/resolver.d.ts.map +1 -0
- package/dist/code-intel/resolver.js +59 -0
- package/dist/code-intel/resolver.js.map +1 -0
- package/dist/code-intel/tsconfig-paths.d.ts +11 -0
- package/dist/code-intel/tsconfig-paths.d.ts.map +1 -0
- package/dist/code-intel/tsconfig-paths.js +67 -0
- package/dist/code-intel/tsconfig-paths.js.map +1 -0
- package/dist/code-intel/watcher.d.ts +27 -0
- package/dist/code-intel/watcher.d.ts.map +1 -0
- package/dist/code-intel/watcher.js +93 -0
- package/dist/code-intel/watcher.js.map +1 -0
- package/dist/core/ports/code-embedding.d.ts +42 -0
- package/dist/core/ports/code-embedding.d.ts.map +1 -0
- package/dist/core/ports/code-embedding.js +2 -0
- package/dist/core/ports/code-embedding.js.map +1 -0
- package/dist/core/ports/code-graph.d.ts +56 -0
- package/dist/core/ports/code-graph.d.ts.map +1 -0
- package/dist/core/ports/code-graph.js +2 -0
- package/dist/core/ports/code-graph.js.map +1 -0
- package/dist/core/ports/code-meta.d.ts +33 -0
- package/dist/core/ports/code-meta.d.ts.map +1 -0
- package/dist/core/ports/code-meta.js +2 -0
- package/dist/core/ports/code-meta.js.map +1 -0
- package/dist/core/ports/code-parser.d.ts +13 -0
- package/dist/core/ports/code-parser.d.ts.map +1 -0
- package/dist/core/ports/code-parser.js +2 -0
- package/dist/core/ports/code-parser.js.map +1 -0
- package/dist/core/ports/code-vector-store.d.ts +37 -0
- package/dist/core/ports/code-vector-store.d.ts.map +1 -0
- package/dist/core/ports/code-vector-store.js +2 -0
- package/dist/core/ports/code-vector-store.js.map +1 -0
- package/dist/core/ports/index.d.ts +6 -0
- package/dist/core/ports/index.d.ts.map +1 -1
- package/dist/core/ports/lsp-client.d.ts +22 -0
- package/dist/core/ports/lsp-client.d.ts.map +1 -0
- package/dist/core/ports/lsp-client.js +2 -0
- package/dist/core/ports/lsp-client.js.map +1 -0
- package/dist/core/types/code.d.ts +153 -0
- package/dist/core/types/code.d.ts.map +1 -0
- package/dist/core/types/code.js +2 -0
- package/dist/core/types/code.js.map +1 -0
- package/dist/core/types/config.d.ts +1 -1
- package/dist/core/types/config.d.ts.map +1 -1
- package/dist/core/types/config.js +8 -1
- package/dist/core/types/config.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/mcp/helpers.d.ts +21 -0
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +157 -3
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +6 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/code-graph.d.ts +3 -0
- package/dist/mcp/tools/code-graph.d.ts.map +1 -0
- package/dist/mcp/tools/code-graph.js +295 -0
- package/dist/mcp/tools/code-graph.js.map +1 -0
- package/dist/mcp/tools/code-hybrid.d.ts +3 -0
- package/dist/mcp/tools/code-hybrid.d.ts.map +1 -0
- package/dist/mcp/tools/code-hybrid.js +118 -0
- package/dist/mcp/tools/code-hybrid.js.map +1 -0
- package/dist/mcp/tools/code-search.d.ts +3 -0
- package/dist/mcp/tools/code-search.d.ts.map +1 -0
- package/dist/mcp/tools/code-search.js +95 -0
- package/dist/mcp/tools/code-search.js.map +1 -0
- package/dist/mcp/tools/workspace.js +1 -1
- package/dist/mcp/tools/workspace.js.map +1 -1
- package/dist/use-cases/code-search.d.ts +36 -0
- package/dist/use-cases/code-search.d.ts.map +1 -0
- package/dist/use-cases/code-search.js +74 -0
- package/dist/use-cases/code-search.js.map +1 -0
- package/dist/use-cases/index-code.d.ts +24 -0
- package/dist/use-cases/index-code.d.ts.map +1 -0
- package/dist/use-cases/index-code.js +43 -0
- package/dist/use-cases/index-code.js.map +1 -0
- package/dist/use-cases/register-code-project.d.ts +21 -0
- package/dist/use-cases/register-code-project.d.ts.map +1 -0
- package/dist/use-cases/register-code-project.js +19 -0
- package/dist/use-cases/register-code-project.js.map +1 -0
- package/dist/use-cases/unregister-code-project.d.ts +11 -0
- package/dist/use-cases/unregister-code-project.d.ts.map +1 -0
- package/dist/use-cases/unregister-code-project.js +19 -0
- package/dist/use-cases/unregister-code-project.js.map +1 -0
- package/dist/use-cases/watch-code.d.ts +33 -0
- package/dist/use-cases/watch-code.d.ts.map +1 -0
- package/dist/use-cases/watch-code.js +52 -0
- package/dist/use-cases/watch-code.js.map +1 -0
- package/package.json +10 -3
- package/templates/code-docker-compose.yml +51 -0
- package/templates/env.example +16 -0
package/README.md
CHANGED
|
@@ -3,13 +3,10 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/argustack)
|
|
4
4
|
[](https://www.npmjs.com/package/argustack)
|
|
5
5
|
[](LICENSE)
|
|
6
|
-
[](https://app.paperlink.online/s/0aa7d2d6/argustack)
|
|
7
6
|
|
|
8
7
|
**Ask AI about your Jira, Git, and GitHub — powered by local data, not cloud APIs.**
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Argustack downloads your project data into local PostgreSQL, cross-references everything, and gives Claude direct access via 32 MCP tools. All data stays on your machine.
|
|
9
|
+
Argustack downloads your project data into local PostgreSQL, indexes your codebases into Neo4j + Qdrant, and gives Claude direct access via 46 MCP tools. All data stays on your machine.
|
|
13
10
|
|
|
14
11
|
> *Was ticket PROJ-123 implemented as described?*
|
|
15
12
|
> *Who reviewed the PR and what was the feedback?*
|
|
@@ -29,7 +26,8 @@ Argustack downloads your project data into local PostgreSQL, cross-references ev
|
|
|
29
26
|
- **Update & push** — modify issues locally, push changes back to Jira (Markdown descriptions auto-converted to rich ADF)
|
|
30
27
|
- **Global workspace registry** — `~/.argustack/workspaces.json`, switch between workspaces from any directory
|
|
31
28
|
- **Knowledge graph** — entity-relationship graph (issues, developers, modules, PRs) with impact analysis and code dependencies
|
|
32
|
-
- **
|
|
29
|
+
- **Code intelligence** — Cursor-style RAG: tree-sitter AST + Neo4j call graph + Qdrant semantic search over your codebases (TypeScript first). Local embeddings via LM Studio (Qwen3-Embedding-4B), no cloud APIs.
|
|
30
|
+
- **46 MCP tools** — Claude queries your data directly via SQL + Cypher + vector search
|
|
33
31
|
- **IDE Plugin** — kanban board for JetBrains IDEs where columns are Claude Code skills
|
|
34
32
|
- **100% local** — no cloud, no accounts, no telemetry
|
|
35
33
|
|
|
@@ -77,6 +75,12 @@ argustack status # workspace info
|
|
|
77
75
|
argustack workspaces # list all known workspaces
|
|
78
76
|
argustack graph build # build knowledge graph from synced data
|
|
79
77
|
argustack graph stats # show graph entity/relationship counts
|
|
78
|
+
argustack code init # generate ~/.argustack/code/docker-compose.yml + start Neo4j + Qdrant
|
|
79
|
+
argustack code register --name X # register a codebase for indexing
|
|
80
|
+
argustack code index # incremental index of registered project (--full / --status / --lsp)
|
|
81
|
+
argustack code watch # real-time re-index on file save (--daemon for background)
|
|
82
|
+
argustack code list # list registered code projects
|
|
83
|
+
argustack code stats <projectId> # symbols, vectors, last job
|
|
80
84
|
```
|
|
81
85
|
|
|
82
86
|
## MCP Tools
|
|
@@ -116,6 +120,20 @@ After sync, Claude queries your data through these tools:
|
|
|
116
120
|
| `build_business_graph` | Claude identifies business processes from issue data |
|
|
117
121
|
| `add_relationship` | Manually add semantic relationships (survives rebuild) |
|
|
118
122
|
| `add_observation` | Add knowledge notes to any entity |
|
|
123
|
+
| `find_symbol` | Locate functions, classes, methods, types by name fragment (with layer/kind filter) |
|
|
124
|
+
| `get_dependencies` | Files this file imports (transitive) |
|
|
125
|
+
| `get_dependents` | Files that import this file (upstream) |
|
|
126
|
+
| `get_callers` | Symbols that call this qualified name (transitively) |
|
|
127
|
+
| `get_callees` | Symbols called by this qualified name (transitively) |
|
|
128
|
+
| `get_call_path` | Shortest call path between two symbols |
|
|
129
|
+
| `find_arch_violations` | Clean Architecture violations (domain → infra, etc.) |
|
|
130
|
+
| `find_unused_exports` | Exported symbols with no incoming references |
|
|
131
|
+
| `get_implementers` | Classes implementing an interface |
|
|
132
|
+
| `get_layer_symbols` | All symbols in a layer (domain / application / infrastructure / presentation) |
|
|
133
|
+
| `search_semantic` | Code chunks by intent (embedding-based, layer/kind filter) |
|
|
134
|
+
| `find_similar_code` | Chunks similar to a given symbol |
|
|
135
|
+
| `explain_feature` | 4-stage pipeline (semantic → graph expand → rerank → cluster by layer) |
|
|
136
|
+
| `plan_feature_files` | Files Claude should consider when planning a new feature, grouped by layer |
|
|
119
137
|
|
|
120
138
|
## IDE Plugin
|
|
121
139
|
|
|
@@ -126,7 +144,7 @@ Kanban board inside JetBrains IDEs (IntelliJ, WebStorm, PyCharm, etc.) where col
|
|
|
126
144
|
- Workflows group skills into pipelines (plan, implement, test, review)
|
|
127
145
|
- Done column has configurable time filter
|
|
128
146
|
|
|
129
|
-
Download from [GitHub Releases](https://github.com/
|
|
147
|
+
Download from [GitHub Releases](https://github.com/CodeStreamly/argustack/releases) and install via Settings, Plugins, Install from Disk.
|
|
130
148
|
|
|
131
149
|
The CLI and IDE plugin are independent. The plugin works without the CLI. The CLI adds analytics when configured.
|
|
132
150
|
|
|
@@ -136,13 +154,12 @@ Argustack is a CLI tool with no backend, no cloud, no accounts. Credentials stay
|
|
|
136
154
|
|
|
137
155
|
## Documentation
|
|
138
156
|
|
|
139
|
-
|
|
157
|
+
- [`llms.txt`](./llms.txt) — full project summary for AI agents (read this if you're Claude)
|
|
158
|
+
- [`CLAUDE.md`](./CLAUDE.md) — architecture, tech stack, conventions for contributors
|
|
159
|
+
- [`AGENTS.md`](./AGENTS.md) — build commands, file map, debugging tips
|
|
160
|
+
- [`Docs/Tasks/`](./Docs/Tasks/) — business requirements (ARG-XXX) and technical plans
|
|
140
161
|
|
|
141
|
-
|
|
142
|
-
- **Use Cases & Examples** — real scenarios for PMs, team leads, developers, CTOs
|
|
143
|
-
- **MCP Tools Reference** — all 32 tools with parameters and examples
|
|
144
|
-
- **Estimate Tool Deep Dive** — algorithm, scoring, data sources
|
|
145
|
-
- **Architecture Guide** — hexagonal architecture, directory structure, extending
|
|
162
|
+
MCP tools are self-documenting — each `server.registerTool()` call in `src/mcp/tools/*.ts` includes a description that Claude reads at runtime.
|
|
146
163
|
|
|
147
164
|
## License
|
|
148
165
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ICodeEmbedding, EmbedChunkInput, RerankDoc, RerankResult } from '../../core/ports/code-embedding.js';
|
|
2
|
+
export interface LmStudioConfig {
|
|
3
|
+
url?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
dimensions?: number;
|
|
6
|
+
batchSize?: number;
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
/** When set, rerank() calls /v1/chat/completions with this model (e.g. Qwen3-Reranker). Omit for stub. */
|
|
9
|
+
rerankModel?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* LM Studio adapter — runs Qwen3-Embedding-4B (or any embedding GGUF) locally.
|
|
13
|
+
*
|
|
14
|
+
* Exposes the OpenAI-compatible `/v1/embeddings` endpoint on `http://localhost:1234`.
|
|
15
|
+
* Native Qwen3 output is 2560-d; we Matryoshka-slice client-side to `dimensions`
|
|
16
|
+
* (default 1024) so the Qdrant schema matches the original voyage-code-3 plan.
|
|
17
|
+
*
|
|
18
|
+
* The reranker stub returns documents in their original order — Qwen3-Reranker
|
|
19
|
+
* is a separate model and is deferred to v0.2.
|
|
20
|
+
*/
|
|
21
|
+
export declare class LmStudioCodeEmbeddingProvider implements ICodeEmbedding {
|
|
22
|
+
readonly name = "LmStudio";
|
|
23
|
+
readonly dimensions: number;
|
|
24
|
+
private readonly url;
|
|
25
|
+
private readonly model;
|
|
26
|
+
private readonly maxRetries;
|
|
27
|
+
private readonly rerankModel;
|
|
28
|
+
constructor(config?: LmStudioConfig);
|
|
29
|
+
embedCode(chunks: EmbedChunkInput[]): Promise<number[][]>;
|
|
30
|
+
embedQuery(query: string): Promise<number[]>;
|
|
31
|
+
rerank(query: string, docs: RerankDoc[], topK: number): Promise<RerankResult[]>;
|
|
32
|
+
private scoreRelevance;
|
|
33
|
+
private embedBatched;
|
|
34
|
+
private sliceMatryoshka;
|
|
35
|
+
private postWithRetry;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=embedding-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../../src/adapters/lmstudio/embedding-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,SAAS,EACT,YAAY,EACb,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0BD;;;;;;;;;GASG;AACH,qBAAa,6BAA8B,YAAW,cAAc;IAClE,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;gBAEhC,MAAM,GAAE,cAAmB;IAUjC,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAMzD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YA4BvE,cAAc;YAkCd,YAAY;IAe1B,OAAO,CAAC,eAAe;YAKT,aAAa;CAqC5B"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
const RERANK_SYSTEM_PROMPT = 'You are a relevance judge. Given a search query and a code document, output ONLY a single number between 0 and 1 indicating how relevant the document is to the query. 1.0 = highly relevant, 0.0 = irrelevant. No other text.';
|
|
2
|
+
const DEFAULT_URL = 'http://localhost:1234';
|
|
3
|
+
const DEFAULT_MODEL = 'text-embedding-qwen3-embedding-4b';
|
|
4
|
+
const DEFAULT_DIMENSIONS = 1024;
|
|
5
|
+
const DEFAULT_BATCH = 1;
|
|
6
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
7
|
+
const MAX_CHARS_PER_INPUT = 6000;
|
|
8
|
+
const QUERY_INSTRUCTION = 'Instruct: Given a code search query, retrieve relevant code snippets\nQuery: ';
|
|
9
|
+
/**
|
|
10
|
+
* LM Studio adapter — runs Qwen3-Embedding-4B (or any embedding GGUF) locally.
|
|
11
|
+
*
|
|
12
|
+
* Exposes the OpenAI-compatible `/v1/embeddings` endpoint on `http://localhost:1234`.
|
|
13
|
+
* Native Qwen3 output is 2560-d; we Matryoshka-slice client-side to `dimensions`
|
|
14
|
+
* (default 1024) so the Qdrant schema matches the original voyage-code-3 plan.
|
|
15
|
+
*
|
|
16
|
+
* The reranker stub returns documents in their original order — Qwen3-Reranker
|
|
17
|
+
* is a separate model and is deferred to v0.2.
|
|
18
|
+
*/
|
|
19
|
+
export class LmStudioCodeEmbeddingProvider {
|
|
20
|
+
name = 'LmStudio';
|
|
21
|
+
dimensions;
|
|
22
|
+
url;
|
|
23
|
+
model;
|
|
24
|
+
maxRetries;
|
|
25
|
+
rerankModel;
|
|
26
|
+
constructor(config = {}) {
|
|
27
|
+
this.url = (config.url ?? DEFAULT_URL).replace(/\/$/, '');
|
|
28
|
+
this.model = config.model ?? DEFAULT_MODEL;
|
|
29
|
+
this.dimensions = config.dimensions ?? DEFAULT_DIMENSIONS;
|
|
30
|
+
void config.batchSize;
|
|
31
|
+
void DEFAULT_BATCH;
|
|
32
|
+
this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
33
|
+
this.rerankModel = config.rerankModel ?? null;
|
|
34
|
+
}
|
|
35
|
+
async embedCode(chunks) {
|
|
36
|
+
if (chunks.length === 0) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const texts = chunks.map((c) => c.content);
|
|
40
|
+
return this.embedBatched(texts);
|
|
41
|
+
}
|
|
42
|
+
async embedQuery(query) {
|
|
43
|
+
const vectors = await this.embedBatched([QUERY_INSTRUCTION + query]);
|
|
44
|
+
return vectors[0] ?? [];
|
|
45
|
+
}
|
|
46
|
+
async rerank(query, docs, topK) {
|
|
47
|
+
if (docs.length === 0) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
if (!this.rerankModel) {
|
|
51
|
+
const limit = Math.min(topK, docs.length);
|
|
52
|
+
const results = [];
|
|
53
|
+
for (let i = 0; i < limit; i++) {
|
|
54
|
+
const doc = docs[i];
|
|
55
|
+
if (!doc) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
results.push({ id: doc.id, score: 1 - i / Math.max(1, docs.length) });
|
|
59
|
+
}
|
|
60
|
+
return results;
|
|
61
|
+
}
|
|
62
|
+
const scored = [];
|
|
63
|
+
for (const doc of docs) {
|
|
64
|
+
try {
|
|
65
|
+
const score = await this.scoreRelevance(query, doc.content);
|
|
66
|
+
scored.push({ id: doc.id, score });
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
scored.push({ id: doc.id, score: 0 });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
scored.sort((a, b) => b.score - a.score);
|
|
73
|
+
return scored.slice(0, topK);
|
|
74
|
+
}
|
|
75
|
+
async scoreRelevance(query, document) {
|
|
76
|
+
const truncated = document.length > MAX_CHARS_PER_INPUT
|
|
77
|
+
? document.slice(0, MAX_CHARS_PER_INPUT)
|
|
78
|
+
: document;
|
|
79
|
+
const body = {
|
|
80
|
+
model: this.rerankModel,
|
|
81
|
+
messages: [
|
|
82
|
+
{ role: 'system', content: RERANK_SYSTEM_PROMPT },
|
|
83
|
+
{ role: 'user', content: `Query: ${query}\n\nDocument:\n${truncated}\n\nRelevance score (0.0 to 1.0):` },
|
|
84
|
+
],
|
|
85
|
+
temperature: 0,
|
|
86
|
+
max_tokens: 8,
|
|
87
|
+
};
|
|
88
|
+
const response = await fetch(`${this.url}/v1/chat/completions`, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: { 'Content-Type': 'application/json' },
|
|
91
|
+
body: JSON.stringify(body),
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new LmStudioClientError(`LM Studio rerank error ${String(response.status)}`);
|
|
95
|
+
}
|
|
96
|
+
const json = (await response.json());
|
|
97
|
+
const text = json.choices[0]?.message.content ?? '';
|
|
98
|
+
const match = /([0-9]*\.?[0-9]+)/.exec(text);
|
|
99
|
+
if (!match) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
const parsed = Number(match[1]);
|
|
103
|
+
if (Number.isNaN(parsed)) {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
return Math.max(0, Math.min(1, parsed));
|
|
107
|
+
}
|
|
108
|
+
async embedBatched(texts) {
|
|
109
|
+
const out = [];
|
|
110
|
+
for (let i = 0; i < texts.length; i++) {
|
|
111
|
+
const raw = texts[i] ?? '';
|
|
112
|
+
const truncated = raw.length > MAX_CHARS_PER_INPUT ? raw.slice(0, MAX_CHARS_PER_INPUT) : raw;
|
|
113
|
+
const json = await this.postWithRetry(truncated);
|
|
114
|
+
const vec = json.data[0]?.embedding ?? [];
|
|
115
|
+
out.push(this.sliceMatryoshka(vec));
|
|
116
|
+
if (i % 25 === 0) {
|
|
117
|
+
process.stderr.write(`[embed] ${String(i + 1)}/${String(texts.length)}\n`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
sliceMatryoshka(vec) {
|
|
123
|
+
if (vec.length <= this.dimensions) {
|
|
124
|
+
return vec;
|
|
125
|
+
}
|
|
126
|
+
return vec.slice(0, this.dimensions);
|
|
127
|
+
}
|
|
128
|
+
async postWithRetry(input) {
|
|
129
|
+
let attempt = 0;
|
|
130
|
+
let lastError = null;
|
|
131
|
+
while (attempt <= this.maxRetries) {
|
|
132
|
+
try {
|
|
133
|
+
const response = await fetch(`${this.url}/v1/embeddings`, {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: { 'Content-Type': 'application/json' },
|
|
136
|
+
body: JSON.stringify({ model: this.model, input }),
|
|
137
|
+
});
|
|
138
|
+
if (response.ok) {
|
|
139
|
+
return (await response.json());
|
|
140
|
+
}
|
|
141
|
+
if (response.status >= 500) {
|
|
142
|
+
attempt += 1;
|
|
143
|
+
lastError = new Error(`LM Studio HTTP ${String(response.status)}`);
|
|
144
|
+
await sleep(500 * 2 ** attempt);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const text = await response.text();
|
|
148
|
+
throw new LmStudioClientError(`LM Studio error ${String(response.status)}: ${text}`);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error instanceof LmStudioClientError) {
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
if (attempt >= this.maxRetries) {
|
|
155
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
156
|
+
}
|
|
157
|
+
lastError = error;
|
|
158
|
+
attempt += 1;
|
|
159
|
+
await sleep(500 * 2 ** attempt);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
throw new Error(`LM Studio exhausted retries (${String(this.maxRetries)}): ${String(lastError)}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function sleep(ms) {
|
|
166
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
167
|
+
}
|
|
168
|
+
class LmStudioClientError extends Error {
|
|
169
|
+
constructor(message) {
|
|
170
|
+
super(message);
|
|
171
|
+
this.name = 'LmStudioClientError';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=embedding-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../../src/adapters/lmstudio/embedding-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/lmstudio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/lmstudio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/lsp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/lsp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP framing helpers (Content-Length + body).
|
|
3
|
+
* `vscode-jsonrpc` does the heavy lifting at runtime; this module is here
|
|
4
|
+
* for a low-level fallback / future migration off the dependency.
|
|
5
|
+
*/
|
|
6
|
+
export declare function encodeMessage(payload: unknown): Buffer;
|
|
7
|
+
export interface DecodedMessage {
|
|
8
|
+
payload: unknown;
|
|
9
|
+
consumed: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function tryDecodeMessage(buffer: Buffer): DecodedMessage | null;
|
|
12
|
+
//# sourceMappingURL=jsonrpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../../src/adapters/lsp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAKtD;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAiBtE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP framing helpers (Content-Length + body).
|
|
3
|
+
* `vscode-jsonrpc` does the heavy lifting at runtime; this module is here
|
|
4
|
+
* for a low-level fallback / future migration off the dependency.
|
|
5
|
+
*/
|
|
6
|
+
export function encodeMessage(payload) {
|
|
7
|
+
const json = JSON.stringify(payload);
|
|
8
|
+
const body = Buffer.from(json, 'utf8');
|
|
9
|
+
const header = `Content-Length: ${String(body.byteLength)}\r\n\r\n`;
|
|
10
|
+
return Buffer.concat([Buffer.from(header, 'utf8'), body]);
|
|
11
|
+
}
|
|
12
|
+
export function tryDecodeMessage(buffer) {
|
|
13
|
+
const headerEnd = buffer.indexOf('\r\n\r\n');
|
|
14
|
+
if (headerEnd === -1) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const header = buffer.subarray(0, headerEnd).toString('utf8');
|
|
18
|
+
const match = /Content-Length: (\d+)/i.exec(header);
|
|
19
|
+
if (!match?.[1]) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const length = Number(match[1]);
|
|
23
|
+
const bodyStart = headerEnd + 4;
|
|
24
|
+
if (buffer.length < bodyStart + length) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const body = buffer.subarray(bodyStart, bodyStart + length).toString('utf8');
|
|
28
|
+
return { payload: JSON.parse(body), consumed: bodyStart + length };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=jsonrpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../../src/adapters/lsp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,mBAAmB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IACpE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,MAAM,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ILspClient } from '../../core/ports/lsp-client.js';
|
|
2
|
+
import type { LspSymbol, LspLocation } from '../../core/types/code.js';
|
|
3
|
+
export interface TypeScriptLspOptions {
|
|
4
|
+
command?: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class TypeScriptLspClient implements ILspClient {
|
|
8
|
+
private process;
|
|
9
|
+
private connection;
|
|
10
|
+
private readonly command;
|
|
11
|
+
private readonly args;
|
|
12
|
+
constructor(options?: TypeScriptLspOptions);
|
|
13
|
+
start(projectRoot: string): Promise<void>;
|
|
14
|
+
stop(): Promise<void>;
|
|
15
|
+
didOpen(uri: string, text: string): Promise<void>;
|
|
16
|
+
didChange(uri: string, text: string): Promise<void>;
|
|
17
|
+
documentSymbols(uri: string): Promise<LspSymbol[]>;
|
|
18
|
+
references(uri: string, line: number, character: number): Promise<LspLocation[]>;
|
|
19
|
+
definition(uri: string, line: number, character: number): Promise<LspLocation[]>;
|
|
20
|
+
implementations(uri: string, line: number, character: number): Promise<LspLocation[]>;
|
|
21
|
+
typeDefinition(uri: string, line: number, character: number): Promise<LspLocation[]>;
|
|
22
|
+
private locationRequest;
|
|
23
|
+
private requireConnection;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=typescript-lsp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-lsp.d.ts","sourceRoot":"","sources":["../../../src/adapters/lsp/typescript-lsp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAwBvE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,mBAAoB,YAAW,UAAU;IACpD,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;gBAEpB,OAAO,GAAE,oBAAyB;IAKxC,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAerB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASlD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAahF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIhF,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIrF,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAI5E,eAAe;IAgB7B,OAAO,CAAC,iBAAiB;CAM1B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { createMessageConnection, StreamMessageReader, StreamMessageWriter, } from 'vscode-jsonrpc/node.js';
|
|
4
|
+
export class TypeScriptLspClient {
|
|
5
|
+
process = null;
|
|
6
|
+
connection = null;
|
|
7
|
+
command;
|
|
8
|
+
args;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.command = options.command ?? 'typescript-language-server';
|
|
11
|
+
this.args = options.args ?? ['--stdio'];
|
|
12
|
+
}
|
|
13
|
+
async start(projectRoot) {
|
|
14
|
+
if (this.process) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const child = spawn(this.command, this.args, { cwd: projectRoot });
|
|
18
|
+
this.process = child;
|
|
19
|
+
const reader = new StreamMessageReader(child.stdout);
|
|
20
|
+
const writer = new StreamMessageWriter(child.stdin);
|
|
21
|
+
const connection = createMessageConnection(reader, writer);
|
|
22
|
+
this.connection = connection;
|
|
23
|
+
connection.listen();
|
|
24
|
+
child.stderr.on('data', () => { });
|
|
25
|
+
await connection.sendRequest('initialize', {
|
|
26
|
+
processId: process.pid,
|
|
27
|
+
rootUri: pathToFileURL(projectRoot).toString(),
|
|
28
|
+
capabilities: {},
|
|
29
|
+
workspaceFolders: [
|
|
30
|
+
{ uri: pathToFileURL(projectRoot).toString(), name: 'workspace' },
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
await connection.sendNotification('initialized', {});
|
|
34
|
+
}
|
|
35
|
+
async stop() {
|
|
36
|
+
if (this.connection) {
|
|
37
|
+
try {
|
|
38
|
+
await this.connection.sendRequest('shutdown');
|
|
39
|
+
await this.connection.sendNotification('exit');
|
|
40
|
+
}
|
|
41
|
+
catch { /* server may already be dead */ }
|
|
42
|
+
this.connection.dispose();
|
|
43
|
+
this.connection = null;
|
|
44
|
+
}
|
|
45
|
+
if (this.process) {
|
|
46
|
+
this.process.kill();
|
|
47
|
+
this.process = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async didOpen(uri, text) {
|
|
51
|
+
const conn = this.requireConnection();
|
|
52
|
+
await conn.sendNotification('textDocument/didOpen', {
|
|
53
|
+
textDocument: { uri, languageId: 'typescript', version: 1, text },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async didChange(uri, text) {
|
|
57
|
+
const conn = this.requireConnection();
|
|
58
|
+
await conn.sendNotification('textDocument/didChange', {
|
|
59
|
+
textDocument: { uri, version: Date.now() },
|
|
60
|
+
contentChanges: [{ text }],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async documentSymbols(uri) {
|
|
64
|
+
const conn = this.requireConnection();
|
|
65
|
+
const result = await conn.sendRequest('textDocument/documentSymbol', { textDocument: { uri } });
|
|
66
|
+
return flattenSymbols(result ?? [], uri);
|
|
67
|
+
}
|
|
68
|
+
async references(uri, line, character) {
|
|
69
|
+
const conn = this.requireConnection();
|
|
70
|
+
const result = await conn.sendRequest('textDocument/references', {
|
|
71
|
+
textDocument: { uri },
|
|
72
|
+
position: { line, character },
|
|
73
|
+
context: { includeDeclaration: false },
|
|
74
|
+
});
|
|
75
|
+
return (result ?? []).map(toLspLocation);
|
|
76
|
+
}
|
|
77
|
+
async definition(uri, line, character) {
|
|
78
|
+
return this.locationRequest('textDocument/definition', uri, line, character);
|
|
79
|
+
}
|
|
80
|
+
async implementations(uri, line, character) {
|
|
81
|
+
return this.locationRequest('textDocument/implementation', uri, line, character);
|
|
82
|
+
}
|
|
83
|
+
async typeDefinition(uri, line, character) {
|
|
84
|
+
return this.locationRequest('textDocument/typeDefinition', uri, line, character);
|
|
85
|
+
}
|
|
86
|
+
async locationRequest(method, uri, line, character) {
|
|
87
|
+
const conn = this.requireConnection();
|
|
88
|
+
const result = await conn.sendRequest(method, { textDocument: { uri }, position: { line, character } });
|
|
89
|
+
if (!result) {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
const raw = Array.isArray(result) ? result : [result];
|
|
93
|
+
return raw.map(toLspLocation);
|
|
94
|
+
}
|
|
95
|
+
requireConnection() {
|
|
96
|
+
if (!this.connection) {
|
|
97
|
+
throw new Error('LSP client not started — call start() first');
|
|
98
|
+
}
|
|
99
|
+
return this.connection;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function toLspLocation(raw) {
|
|
103
|
+
return {
|
|
104
|
+
uri: raw.uri,
|
|
105
|
+
startLine: raw.range.start.line,
|
|
106
|
+
startChar: raw.range.start.character,
|
|
107
|
+
endLine: raw.range.end.line,
|
|
108
|
+
endChar: raw.range.end.character,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function flattenSymbols(symbols, uri, container) {
|
|
112
|
+
const out = [];
|
|
113
|
+
for (const sym of symbols) {
|
|
114
|
+
const lspSymbol = {
|
|
115
|
+
name: sym.name,
|
|
116
|
+
kind: sym.kind,
|
|
117
|
+
filePath: uri,
|
|
118
|
+
startLine: sym.range.start.line + 1,
|
|
119
|
+
endLine: sym.range.end.line + 1,
|
|
120
|
+
};
|
|
121
|
+
if (container) {
|
|
122
|
+
lspSymbol.containerName = container;
|
|
123
|
+
}
|
|
124
|
+
out.push(lspSymbol);
|
|
125
|
+
if (sym.children && sym.children.length > 0) {
|
|
126
|
+
out.push(...flattenSymbols(sym.children, uri, sym.name));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=typescript-lsp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-lsp.js","sourceRoot":"","sources":["../../../src/adapters/lsp/typescript-lsp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Driver, type Session } from 'neo4j-driver';
|
|
2
|
+
export interface Neo4jConfig {
|
|
3
|
+
uri: string;
|
|
4
|
+
user: string;
|
|
5
|
+
password: string;
|
|
6
|
+
database?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createDriver(config: Neo4jConfig): Driver;
|
|
9
|
+
export declare function openSession(driver: Driver, database?: string): Session;
|
|
10
|
+
export declare function verifyConnectivity(driver: Driver): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/adapters/neo4j/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAKxD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import neo4j from 'neo4j-driver';
|
|
2
|
+
export function createDriver(config) {
|
|
3
|
+
return neo4j.driver(config.uri, neo4j.auth.basic(config.user, config.password), {
|
|
4
|
+
maxConnectionPoolSize: 50,
|
|
5
|
+
connectionAcquisitionTimeout: 30_000,
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
export function openSession(driver, database) {
|
|
9
|
+
return database ? driver.session({ database }) : driver.session();
|
|
10
|
+
}
|
|
11
|
+
export async function verifyConnectivity(driver) {
|
|
12
|
+
await driver.verifyConnectivity();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/neo4j/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,cAAc,CAAC;AAShE,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC9E,qBAAqB,EAAE,EAAE;QACzB,4BAA4B,EAAE,MAAM;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAiB;IAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;AACpC,CAAC"}
|