@kernel.chat/kbot 1.3.1 → 2.3.1
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 +94 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +576 -119
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts +20 -35
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +224 -66
- package/dist/auth.js.map +1 -1
- package/dist/auth.test.d.ts +2 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +89 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/build-targets.d.ts +37 -0
- package/dist/build-targets.d.ts.map +1 -0
- package/dist/build-targets.js +507 -0
- package/dist/build-targets.js.map +1 -0
- package/dist/cli.js +1210 -130
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +72 -22
- package/dist/context.js.map +1 -1
- package/dist/hooks.d.ts +27 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +145 -0
- package/dist/hooks.js.map +1 -0
- package/dist/ide/acp-server.d.ts +6 -0
- package/dist/ide/acp-server.d.ts.map +1 -0
- package/dist/ide/acp-server.js +319 -0
- package/dist/ide/acp-server.js.map +1 -0
- package/dist/ide/bridge.d.ts +128 -0
- package/dist/ide/bridge.d.ts.map +1 -0
- package/dist/ide/bridge.js +185 -0
- package/dist/ide/bridge.js.map +1 -0
- package/dist/ide/index.d.ts +5 -0
- package/dist/ide/index.d.ts.map +1 -0
- package/dist/ide/index.js +11 -0
- package/dist/ide/index.js.map +1 -0
- package/dist/ide/lsp-bridge.d.ts +27 -0
- package/dist/ide/lsp-bridge.d.ts.map +1 -0
- package/dist/ide/lsp-bridge.js +267 -0
- package/dist/ide/lsp-bridge.js.map +1 -0
- package/dist/ide/mcp-server.d.ts +7 -0
- package/dist/ide/mcp-server.d.ts.map +1 -0
- package/dist/ide/mcp-server.js +451 -0
- package/dist/ide/mcp-server.js.map +1 -0
- package/dist/learning.d.ts +179 -0
- package/dist/learning.d.ts.map +1 -0
- package/dist/learning.js +829 -0
- package/dist/learning.js.map +1 -0
- package/dist/learning.test.d.ts +2 -0
- package/dist/learning.test.d.ts.map +1 -0
- package/dist/learning.test.js +115 -0
- package/dist/learning.test.js.map +1 -0
- package/dist/matrix.d.ts +49 -0
- package/dist/matrix.d.ts.map +1 -0
- package/dist/matrix.js +302 -0
- package/dist/matrix.js.map +1 -0
- package/dist/memory.d.ts +11 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +54 -2
- package/dist/memory.js.map +1 -1
- package/dist/multimodal.d.ts +57 -0
- package/dist/multimodal.d.ts.map +1 -0
- package/dist/multimodal.js +206 -0
- package/dist/multimodal.js.map +1 -0
- package/dist/permissions.d.ts +21 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +122 -0
- package/dist/permissions.js.map +1 -0
- package/dist/planner.d.ts +54 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +298 -0
- package/dist/planner.js.map +1 -0
- package/dist/plugins.d.ts +30 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +135 -0
- package/dist/plugins.js.map +1 -0
- package/dist/sessions.d.ts +38 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +177 -0
- package/dist/sessions.js.map +1 -0
- package/dist/streaming.d.ts +88 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +317 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools/background.d.ts +2 -0
- package/dist/tools/background.d.ts.map +1 -0
- package/dist/tools/background.js +163 -0
- package/dist/tools/background.js.map +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +26 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/browser.js +7 -7
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/build-matrix.d.ts +2 -0
- package/dist/tools/build-matrix.d.ts.map +1 -0
- package/dist/tools/build-matrix.js +463 -0
- package/dist/tools/build-matrix.js.map +1 -0
- package/dist/tools/computer.js +5 -5
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/fetch.d.ts +2 -0
- package/dist/tools/fetch.d.ts.map +1 -0
- package/dist/tools/fetch.js +106 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +112 -6
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/git.js +3 -3
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/github.d.ts +2 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +196 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/index.d.ts +29 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +136 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +162 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/matrix.d.ts +2 -0
- package/dist/tools/matrix.d.ts.map +1 -0
- package/dist/tools/matrix.js +79 -0
- package/dist/tools/matrix.js.map +1 -0
- package/dist/tools/mcp-client.d.ts +2 -0
- package/dist/tools/mcp-client.d.ts.map +1 -0
- package/dist/tools/mcp-client.js +295 -0
- package/dist/tools/mcp-client.js.map +1 -0
- package/dist/tools/notebook.d.ts +2 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +207 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/openclaw.d.ts +2 -0
- package/dist/tools/openclaw.d.ts.map +1 -0
- package/dist/tools/openclaw.js +187 -0
- package/dist/tools/openclaw.js.map +1 -0
- package/dist/tools/parallel.d.ts +2 -0
- package/dist/tools/parallel.d.ts.map +1 -0
- package/dist/tools/parallel.js +60 -0
- package/dist/tools/parallel.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +352 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +135 -28
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/subagent.d.ts +4 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +260 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/tasks.d.ts +14 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +210 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/worktree.d.ts +2 -0
- package/dist/tools/worktree.d.ts.map +1 -0
- package/dist/tools/worktree.js +223 -0
- package/dist/tools/worktree.js.map +1 -0
- package/dist/tui.d.ts +73 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +257 -0
- package/dist/tui.js.map +1 -0
- package/dist/ui.d.ts +11 -19
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +143 -171
- package/dist/ui.js.map +1 -1
- package/dist/updater.d.ts +3 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +70 -0
- package/dist/updater.js.map +1 -0
- package/install.sh +5 -7
- package/package.json +9 -5
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// K:BOT IDE Matrix — Protocol adapters for universal IDE integration
|
|
2
|
+
//
|
|
3
|
+
// Three protocols, every major IDE:
|
|
4
|
+
// MCP → VS Code, Cursor, Windsurf, Zed, Neovim
|
|
5
|
+
// ACP → JetBrains (IntelliJ, WebStorm, PyCharm, GoLand, Android Studio)
|
|
6
|
+
// LSP → All editors (diagnostics feedback loop)
|
|
7
|
+
export { startMcpServer } from './mcp-server.js';
|
|
8
|
+
export { startAcpServer } from './acp-server.js';
|
|
9
|
+
export { getDiagnostics, formatDiagnostics } from './lsp-bridge.js';
|
|
10
|
+
export { initBridge, chat, executeCommand, getContext, getTools, getToolList, getStatus, getAgents, getMemory, getSessions, getFileDiagnostics, remember, setAgent, refreshContext, train, } from './bridge.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ide/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,oCAAoC;AACpC,kDAAkD;AAClD,2EAA2E;AAC3E,mDAAmD;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAA0C,MAAM,iBAAiB,CAAA;AAC3G,OAAO,EACL,UAAU,EACV,IAAI,EACJ,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,KAAK,GAIN,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Diagnostic {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
severity: 'error' | 'warning' | 'info' | 'hint';
|
|
6
|
+
message: string;
|
|
7
|
+
source?: string;
|
|
8
|
+
code?: string | number;
|
|
9
|
+
}
|
|
10
|
+
export interface LspBridgeOptions {
|
|
11
|
+
/** Timeout in ms for LSP response (default: 10000) */
|
|
12
|
+
timeout?: number;
|
|
13
|
+
/** Custom LSP server commands by language */
|
|
14
|
+
servers?: Record<string, string[]>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get diagnostics for a file by spawning the appropriate LSP server.
|
|
18
|
+
*
|
|
19
|
+
* This is a one-shot operation: spawn LSP, initialize, open file,
|
|
20
|
+
* collect diagnostics, shut down. Not a persistent connection.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getDiagnostics(filePath: string, options?: LspBridgeOptions): Promise<Diagnostic[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Format diagnostics as a human-readable string for the agent loop.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatDiagnostics(diagnostics: Diagnostic[]): string;
|
|
27
|
+
//# sourceMappingURL=lsp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-bridge.d.ts","sourceRoot":"","sources":["../../src/ide/lsp-bridge.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAA;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACnC;AA4FD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,UAAU,EAAE,CAAC,CAqIvB;AAsCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAoBnE"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// K:BOT LSP Diagnostics Bridge
|
|
2
|
+
//
|
|
3
|
+
// Spawns language-specific LSP servers and collects diagnostics
|
|
4
|
+
// after kbot edits a file. Enables auto-correction loop:
|
|
5
|
+
// 1. kbot edits a file
|
|
6
|
+
// 2. LSP bridge sends textDocument/didOpen
|
|
7
|
+
// 3. Collects textDocument/publishDiagnostics
|
|
8
|
+
// 4. Returns errors/warnings to agent loop for self-correction
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { join, extname, resolve } from 'node:path';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
/** Map file extensions to LSP server commands */
|
|
14
|
+
const DEFAULT_SERVERS = {
|
|
15
|
+
'.ts': ['typescript-language-server', '--stdio'],
|
|
16
|
+
'.tsx': ['typescript-language-server', '--stdio'],
|
|
17
|
+
'.js': ['typescript-language-server', '--stdio'],
|
|
18
|
+
'.jsx': ['typescript-language-server', '--stdio'],
|
|
19
|
+
'.py': ['pyright-langserver', '--stdio'],
|
|
20
|
+
'.rs': ['rust-analyzer'],
|
|
21
|
+
'.go': ['gopls', 'serve'],
|
|
22
|
+
};
|
|
23
|
+
/** Detect which LSP server to use for a file */
|
|
24
|
+
function detectServer(filePath, options) {
|
|
25
|
+
const ext = extname(filePath).toLowerCase();
|
|
26
|
+
// Check custom overrides first
|
|
27
|
+
if (options?.servers?.[ext]) {
|
|
28
|
+
return options.servers[ext];
|
|
29
|
+
}
|
|
30
|
+
const serverCmd = DEFAULT_SERVERS[ext];
|
|
31
|
+
if (!serverCmd)
|
|
32
|
+
return null;
|
|
33
|
+
// Check if the server binary exists in PATH
|
|
34
|
+
try {
|
|
35
|
+
const { execSync } = require('node:child_process');
|
|
36
|
+
execSync(`which ${serverCmd[0]}`, { stdio: 'ignore', timeout: 3000 });
|
|
37
|
+
return serverCmd;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Encode a JSON-RPC message with Content-Length header */
|
|
44
|
+
function encodeMessage(msg) {
|
|
45
|
+
const body = JSON.stringify(msg);
|
|
46
|
+
return `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`;
|
|
47
|
+
}
|
|
48
|
+
/** Parse JSON-RPC messages from LSP server output */
|
|
49
|
+
function parseMessages(data) {
|
|
50
|
+
const messages = [];
|
|
51
|
+
let remaining = data;
|
|
52
|
+
while (remaining.length > 0) {
|
|
53
|
+
const headerEnd = remaining.indexOf('\r\n\r\n');
|
|
54
|
+
if (headerEnd === -1)
|
|
55
|
+
break;
|
|
56
|
+
const header = remaining.slice(0, headerEnd);
|
|
57
|
+
const lengthMatch = header.match(/Content-Length:\s*(\d+)/i);
|
|
58
|
+
if (!lengthMatch)
|
|
59
|
+
break;
|
|
60
|
+
const contentLength = parseInt(lengthMatch[1], 10);
|
|
61
|
+
const bodyStart = headerEnd + 4;
|
|
62
|
+
const body = remaining.slice(bodyStart, bodyStart + contentLength);
|
|
63
|
+
if (body.length < contentLength)
|
|
64
|
+
break;
|
|
65
|
+
try {
|
|
66
|
+
messages.push(JSON.parse(body));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Skip malformed messages
|
|
70
|
+
}
|
|
71
|
+
remaining = remaining.slice(bodyStart + contentLength);
|
|
72
|
+
}
|
|
73
|
+
return messages;
|
|
74
|
+
}
|
|
75
|
+
/** Map LSP severity number to string */
|
|
76
|
+
function mapSeverity(severity) {
|
|
77
|
+
switch (severity) {
|
|
78
|
+
case 1: return 'error';
|
|
79
|
+
case 2: return 'warning';
|
|
80
|
+
case 3: return 'info';
|
|
81
|
+
case 4: return 'hint';
|
|
82
|
+
default: return 'warning';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get diagnostics for a file by spawning the appropriate LSP server.
|
|
87
|
+
*
|
|
88
|
+
* This is a one-shot operation: spawn LSP, initialize, open file,
|
|
89
|
+
* collect diagnostics, shut down. Not a persistent connection.
|
|
90
|
+
*/
|
|
91
|
+
export async function getDiagnostics(filePath, options) {
|
|
92
|
+
const absPath = resolve(filePath);
|
|
93
|
+
if (!existsSync(absPath)) {
|
|
94
|
+
return [{ file: filePath, line: 0, column: 0, severity: 'error', message: 'File not found' }];
|
|
95
|
+
}
|
|
96
|
+
const serverCmd = detectServer(absPath, options);
|
|
97
|
+
if (!serverCmd) {
|
|
98
|
+
return []; // No LSP server available — not an error, just no diagnostics
|
|
99
|
+
}
|
|
100
|
+
const timeout = options?.timeout || 10000;
|
|
101
|
+
const fileUri = `file://${absPath}`;
|
|
102
|
+
const fileContent = readFileSync(absPath, 'utf-8');
|
|
103
|
+
const rootUri = `file://${findProjectRoot(absPath)}`;
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
const diagnostics = [];
|
|
106
|
+
let lsp = null;
|
|
107
|
+
let buffer = '';
|
|
108
|
+
let messageId = 0;
|
|
109
|
+
let initialized = false;
|
|
110
|
+
let timer = null;
|
|
111
|
+
const cleanup = () => {
|
|
112
|
+
if (timer)
|
|
113
|
+
clearTimeout(timer);
|
|
114
|
+
if (lsp) {
|
|
115
|
+
try {
|
|
116
|
+
// Send shutdown + exit
|
|
117
|
+
lsp.stdin?.write(encodeMessage({ jsonrpc: '2.0', id: ++messageId, method: 'shutdown', params: null }));
|
|
118
|
+
setTimeout(() => {
|
|
119
|
+
lsp?.stdin?.write(encodeMessage({ jsonrpc: '2.0', method: 'exit', params: null }));
|
|
120
|
+
lsp?.kill();
|
|
121
|
+
}, 200);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
lsp.kill();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
resolve(diagnostics);
|
|
128
|
+
};
|
|
129
|
+
// Timeout — return whatever we have
|
|
130
|
+
timer = setTimeout(cleanup, timeout);
|
|
131
|
+
try {
|
|
132
|
+
lsp = spawn(serverCmd[0], serverCmd.slice(1), {
|
|
133
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
134
|
+
cwd: findProjectRoot(absPath),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
resolve([]);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
lsp.on('error', () => {
|
|
142
|
+
resolve([]);
|
|
143
|
+
});
|
|
144
|
+
lsp.stdout?.on('data', (chunk) => {
|
|
145
|
+
buffer += chunk.toString();
|
|
146
|
+
const messages = parseMessages(buffer);
|
|
147
|
+
for (const msg of messages) {
|
|
148
|
+
// Initialize response — send didOpen
|
|
149
|
+
if (msg.id === 1 && msg.result) {
|
|
150
|
+
initialized = true;
|
|
151
|
+
// Send initialized notification
|
|
152
|
+
lsp.stdin?.write(encodeMessage({
|
|
153
|
+
jsonrpc: '2.0',
|
|
154
|
+
method: 'initialized',
|
|
155
|
+
params: {},
|
|
156
|
+
}));
|
|
157
|
+
// Open the file
|
|
158
|
+
lsp.stdin?.write(encodeMessage({
|
|
159
|
+
jsonrpc: '2.0',
|
|
160
|
+
method: 'textDocument/didOpen',
|
|
161
|
+
params: {
|
|
162
|
+
textDocument: {
|
|
163
|
+
uri: fileUri,
|
|
164
|
+
languageId: getLanguageId(absPath),
|
|
165
|
+
version: 1,
|
|
166
|
+
text: fileContent,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
// Diagnostics notification
|
|
172
|
+
if (msg.method === 'textDocument/publishDiagnostics') {
|
|
173
|
+
const params = msg.params;
|
|
174
|
+
if (params.uri === fileUri) {
|
|
175
|
+
for (const d of params.diagnostics) {
|
|
176
|
+
diagnostics.push({
|
|
177
|
+
file: filePath,
|
|
178
|
+
line: d.range.start.line + 1,
|
|
179
|
+
column: d.range.start.character + 1,
|
|
180
|
+
severity: mapSeverity(d.severity),
|
|
181
|
+
message: d.message,
|
|
182
|
+
source: d.source,
|
|
183
|
+
code: d.code,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Got diagnostics — we can clean up
|
|
187
|
+
cleanup();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
// Send initialize request
|
|
193
|
+
lsp.stdin?.write(encodeMessage({
|
|
194
|
+
jsonrpc: '2.0',
|
|
195
|
+
id: ++messageId,
|
|
196
|
+
method: 'initialize',
|
|
197
|
+
params: {
|
|
198
|
+
processId: process.pid,
|
|
199
|
+
capabilities: {
|
|
200
|
+
textDocument: {
|
|
201
|
+
publishDiagnostics: { relatedInformation: true },
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
rootUri,
|
|
205
|
+
workspaceFolders: [{ uri: rootUri, name: 'workspace' }],
|
|
206
|
+
},
|
|
207
|
+
}));
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/** Find the nearest project root (package.json, Cargo.toml, go.mod, etc.) */
|
|
211
|
+
function findProjectRoot(filePath) {
|
|
212
|
+
const markers = ['package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml', 'setup.py', '.git'];
|
|
213
|
+
let dir = filePath;
|
|
214
|
+
for (let i = 0; i < 20; i++) {
|
|
215
|
+
const parent = join(dir, '..');
|
|
216
|
+
if (parent === dir)
|
|
217
|
+
break;
|
|
218
|
+
dir = parent;
|
|
219
|
+
for (const marker of markers) {
|
|
220
|
+
if (existsSync(join(dir, marker)))
|
|
221
|
+
return dir;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return process.cwd();
|
|
225
|
+
}
|
|
226
|
+
/** Map file extension to LSP language ID */
|
|
227
|
+
function getLanguageId(filePath) {
|
|
228
|
+
const ext = extname(filePath).toLowerCase();
|
|
229
|
+
const map = {
|
|
230
|
+
'.ts': 'typescript',
|
|
231
|
+
'.tsx': 'typescriptreact',
|
|
232
|
+
'.js': 'javascript',
|
|
233
|
+
'.jsx': 'javascriptreact',
|
|
234
|
+
'.py': 'python',
|
|
235
|
+
'.rs': 'rust',
|
|
236
|
+
'.go': 'go',
|
|
237
|
+
'.json': 'json',
|
|
238
|
+
'.md': 'markdown',
|
|
239
|
+
'.css': 'css',
|
|
240
|
+
'.html': 'html',
|
|
241
|
+
};
|
|
242
|
+
return map[ext] || 'plaintext';
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Format diagnostics as a human-readable string for the agent loop.
|
|
246
|
+
*/
|
|
247
|
+
export function formatDiagnostics(diagnostics) {
|
|
248
|
+
if (diagnostics.length === 0)
|
|
249
|
+
return 'No diagnostics.';
|
|
250
|
+
const errors = diagnostics.filter(d => d.severity === 'error');
|
|
251
|
+
const warnings = diagnostics.filter(d => d.severity === 'warning');
|
|
252
|
+
const lines = [];
|
|
253
|
+
if (errors.length > 0) {
|
|
254
|
+
lines.push(`${errors.length} error(s):`);
|
|
255
|
+
for (const e of errors) {
|
|
256
|
+
lines.push(` ${e.file}:${e.line}:${e.column} — ${e.message}${e.source ? ` [${e.source}]` : ''}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (warnings.length > 0) {
|
|
260
|
+
lines.push(`${warnings.length} warning(s):`);
|
|
261
|
+
for (const w of warnings) {
|
|
262
|
+
lines.push(` ${w.file}:${w.line}:${w.column} — ${w.message}${w.source ? ` [${w.source}]` : ''}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return lines.join('\n');
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=lsp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-bridge.js","sourceRoot":"","sources":["../../src/ide/lsp-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type BridgeConfig } from './bridge.js';
|
|
2
|
+
/**
|
|
3
|
+
* Start the MCP server on stdio.
|
|
4
|
+
* This is the entry point called by `kbot ide mcp`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function startMcpServer(config?: BridgeConfig): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/ide/mcp-server.ts"],"names":[],"mappings":"AAwBA,OAAO,EAcL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAA;AAGpB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkd7E"}
|