@decispher/mcp-server 0.1.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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/dist/__tests__/file-reader.test.d.ts +2 -0
- package/dist/__tests__/file-reader.test.d.ts.map +1 -0
- package/dist/__tests__/file-reader.test.js +109 -0
- package/dist/__tests__/file-reader.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +198 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/decispher-client.d.ts +231 -0
- package/dist/decispher-client.d.ts.map +1 -0
- package/dist/decispher-client.js +219 -0
- package/dist/decispher-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-reader.d.ts +29 -0
- package/dist/lib/file-reader.d.ts.map +1 -0
- package/dist/lib/file-reader.js +126 -0
- package/dist/lib/file-reader.js.map +1 -0
- package/dist/tools.d.ts +41 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +314 -0
- package/dist/tools.js.map +1 -0
- package/package.json +44 -0
- package/src/__tests__/file-reader.test.ts +136 -0
- package/src/__tests__/tools.test.ts +225 -0
- package/src/decispher-client.ts +466 -0
- package/src/index.ts +42 -0
- package/src/lib/file-reader.ts +149 -0
- package/src/tools.ts +386 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-reader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/file-reader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { readFileForContext, detectLanguage, DEFAULT_FILE_READ_MAX_BYTES, } from '../lib/file-reader.js';
|
|
7
|
+
let workDir;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
workDir = join(tmpdir(), `decispher-file-reader-${randomUUID()}`);
|
|
10
|
+
await fs.mkdir(workDir, { recursive: true });
|
|
11
|
+
});
|
|
12
|
+
afterEach(async () => {
|
|
13
|
+
await fs.rm(workDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
describe('detectLanguage', () => {
|
|
16
|
+
it.each([
|
|
17
|
+
['src/auth.ts', 'typescript'],
|
|
18
|
+
['component.tsx', 'tsx'],
|
|
19
|
+
['legacy.cjs', 'javascript'],
|
|
20
|
+
['main.py', 'python'],
|
|
21
|
+
['cmd.go', 'go'],
|
|
22
|
+
['lib.rs', 'rust'],
|
|
23
|
+
['App.java', 'java'],
|
|
24
|
+
])('maps %s → %s', (path, lang) => {
|
|
25
|
+
expect(detectLanguage(path)).toBe(lang);
|
|
26
|
+
});
|
|
27
|
+
it('returns null for unknown extensions', () => {
|
|
28
|
+
expect(detectLanguage('README')).toBeNull();
|
|
29
|
+
expect(detectLanguage('config.yaml')).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('readFileForContext', () => {
|
|
33
|
+
it('reads small UTF-8 text files in full', async () => {
|
|
34
|
+
const path = join(workDir, 'a.ts');
|
|
35
|
+
await fs.writeFile(path, 'export const x = 1;\n', 'utf8');
|
|
36
|
+
const result = await readFileForContext(path);
|
|
37
|
+
expect(result).not.toBeNull();
|
|
38
|
+
expect(result.content).toBe('export const x = 1;\n');
|
|
39
|
+
expect(result.language).toBe('typescript');
|
|
40
|
+
expect(result.truncated).toBe(false);
|
|
41
|
+
expect(result.bytesRead).toBe(20);
|
|
42
|
+
});
|
|
43
|
+
it('strips a UTF-8 BOM if present', async () => {
|
|
44
|
+
const path = join(workDir, 'bom.ts');
|
|
45
|
+
await fs.writeFile(path, 'export const x = 1;', 'utf8');
|
|
46
|
+
const result = await readFileForContext(path);
|
|
47
|
+
expect(result.content.startsWith('')).toBe(false);
|
|
48
|
+
expect(result.content).toBe('export const x = 1;');
|
|
49
|
+
});
|
|
50
|
+
it('returns null when the path does not exist', async () => {
|
|
51
|
+
const result = await readFileForContext(join(workDir, 'missing.ts'));
|
|
52
|
+
expect(result).toBeNull();
|
|
53
|
+
});
|
|
54
|
+
it('returns null when the path points to a directory', async () => {
|
|
55
|
+
const result = await readFileForContext(workDir);
|
|
56
|
+
expect(result).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
it('refuses files that look binary (NUL byte in head)', async () => {
|
|
59
|
+
const path = join(workDir, 'image.bin');
|
|
60
|
+
const buf = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x00, 0x01, 0x02, 0x03]);
|
|
61
|
+
await fs.writeFile(path, buf);
|
|
62
|
+
const result = await readFileForContext(path);
|
|
63
|
+
expect(result).toBeNull();
|
|
64
|
+
});
|
|
65
|
+
it('truncates oversize files head + tail and flags truncated=true', async () => {
|
|
66
|
+
const path = join(workDir, 'big.ts');
|
|
67
|
+
const head = 'HEAD_MARKER\n' + 'a'.repeat(10_000) + '\n';
|
|
68
|
+
const tail = 'b'.repeat(10_000) + '\nTAIL_MARKER\n';
|
|
69
|
+
await fs.writeFile(path, head + 'x'.repeat(2_000) + tail);
|
|
70
|
+
const result = await readFileForContext(path, { maxBytes: 1024 });
|
|
71
|
+
expect(result).not.toBeNull();
|
|
72
|
+
expect(result.truncated).toBe(true);
|
|
73
|
+
expect(result.bytesRead).toBe(1024);
|
|
74
|
+
expect(result.content.startsWith('HEAD_MARKER')).toBe(true);
|
|
75
|
+
expect(result.content.endsWith('TAIL_MARKER\n')).toBe(true);
|
|
76
|
+
expect(result.content).toContain('truncated by MCP file-reader');
|
|
77
|
+
});
|
|
78
|
+
it('honors the default 256 KB cap when no override is provided', async () => {
|
|
79
|
+
const path = join(workDir, 'huge.ts');
|
|
80
|
+
// Just over the cap so we know it triggers truncation.
|
|
81
|
+
await fs.writeFile(path, 'x'.repeat(DEFAULT_FILE_READ_MAX_BYTES + 1024));
|
|
82
|
+
const result = await readFileForContext(path);
|
|
83
|
+
expect(result.truncated).toBe(true);
|
|
84
|
+
expect(result.bytesRead).toBe(DEFAULT_FILE_READ_MAX_BYTES);
|
|
85
|
+
});
|
|
86
|
+
it('emitted content (head + marker + tail) never exceeds maxBytes', async () => {
|
|
87
|
+
// Guards against the marker pushing payload past the server-side
|
|
88
|
+
// fileContent maxLength (262144 bytes). Regression test for the
|
|
89
|
+
// off-by-marker-length bug.
|
|
90
|
+
const path = join(workDir, 'cap.ts');
|
|
91
|
+
await fs.writeFile(path, 'x'.repeat(DEFAULT_FILE_READ_MAX_BYTES * 2));
|
|
92
|
+
const result = await readFileForContext(path);
|
|
93
|
+
expect(result.truncated).toBe(true);
|
|
94
|
+
expect(Buffer.byteLength(result.content, 'utf8')).toBeLessThanOrEqual(DEFAULT_FILE_READ_MAX_BYTES);
|
|
95
|
+
});
|
|
96
|
+
it('resolves relative paths against the supplied cwd', async () => {
|
|
97
|
+
await fs.writeFile(join(workDir, 'rel.ts'), 'export const y = 2;');
|
|
98
|
+
const result = await readFileForContext('rel.ts', { cwd: workDir });
|
|
99
|
+
expect(result.content).toBe('export const y = 2;');
|
|
100
|
+
});
|
|
101
|
+
it('returns language=null for unknown extensions but still reads content', async () => {
|
|
102
|
+
const path = join(workDir, 'notes.md');
|
|
103
|
+
await fs.writeFile(path, '# heading\nbody');
|
|
104
|
+
const result = await readFileForContext(path);
|
|
105
|
+
expect(result.language).toBeNull();
|
|
106
|
+
expect(result.content).toBe('# heading\nbody');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=file-reader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-reader.test.js","sourceRoot":"","sources":["../../src/__tests__/file-reader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { registerTools, TOOL_DEFINITIONS } from '../tools.js';
|
|
8
|
+
function makeClient(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
searchDecisions: vi.fn().mockResolvedValue([
|
|
11
|
+
{ id: 'd-1', title: 'Use Drizzle ORM', type: 'decision', decision: 'Use Drizzle', rationale: null, similarity: 0.92 },
|
|
12
|
+
]),
|
|
13
|
+
getConstraints: vi.fn().mockResolvedValue([
|
|
14
|
+
{ id: 'c-1', title: 'No raw SQL in business logic', decision: 'Always use the repository pattern', rationale: null, severity: 'HIGH' },
|
|
15
|
+
]),
|
|
16
|
+
getConventions: vi.fn().mockResolvedValue([
|
|
17
|
+
{ id: 'v-1', title: 'Pino for logging', decision: 'Use pino structured logging', rationale: null },
|
|
18
|
+
]),
|
|
19
|
+
ask: vi.fn().mockResolvedValue({
|
|
20
|
+
answer: 'We use Drizzle ORM for type safety.',
|
|
21
|
+
sources: [{ id: 's-1', title: 'ORM Decision', similarity: 0.88 }],
|
|
22
|
+
hadContext: true,
|
|
23
|
+
}),
|
|
24
|
+
getContextForFile: vi.fn().mockResolvedValue([
|
|
25
|
+
{ id: 'd-2', title: 'Auth middleware', type: 'convention', decision: 'Use jwt-auth', rationale: null, similarity: 0.75 },
|
|
26
|
+
]),
|
|
27
|
+
checkIntent: vi.fn().mockResolvedValue({
|
|
28
|
+
verdict: 'CLEAR', conflicts: [], relevant: [], latencyMs: 0, creditsConsumed: 0,
|
|
29
|
+
}),
|
|
30
|
+
getDecision: vi.fn().mockResolvedValue({
|
|
31
|
+
id: 'd-1', type: 'decision', title: 'Use Drizzle ORM', problem: null,
|
|
32
|
+
decision: 'We chose Drizzle over Prisma for type safety.',
|
|
33
|
+
rationale: 'Drizzle generates typed SQL at compile time.',
|
|
34
|
+
severity: 'HIGH', status: 'active',
|
|
35
|
+
alternatives: [{ option: 'Prisma', reasonRejected: 'Runtime schema overhead' }],
|
|
36
|
+
affectedFiles: ['src/db/index.ts'], tags: ['orm', 'database'],
|
|
37
|
+
sourceType: null, supersedes: null, supersededBy: null,
|
|
38
|
+
createdAt: '2024-01-01T00:00:00Z', updatedAt: '2024-01-01T00:00:00Z', lastReviewedAt: null,
|
|
39
|
+
}),
|
|
40
|
+
captureDecision: vi.fn().mockResolvedValue({
|
|
41
|
+
id: 'cap-1', alreadyExists: false, similarityToExisting: null,
|
|
42
|
+
fusionPending: false, status: 'active', latencyMs: 12,
|
|
43
|
+
}),
|
|
44
|
+
...overrides,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function getTools(server) {
|
|
48
|
+
return server._registeredTools;
|
|
49
|
+
}
|
|
50
|
+
describe('MCP tools registration', () => {
|
|
51
|
+
let server;
|
|
52
|
+
let client;
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
server = new McpServer({ name: 'test', version: '0.0.0' });
|
|
55
|
+
client = makeClient();
|
|
56
|
+
registerTools(server, client);
|
|
57
|
+
});
|
|
58
|
+
it('registers exactly 8 tools', () => {
|
|
59
|
+
const names = Object.keys(getTools(server)).sort();
|
|
60
|
+
expect(names).toEqual([
|
|
61
|
+
'ask_knowledge_base',
|
|
62
|
+
'capture_decision',
|
|
63
|
+
'check_conventions',
|
|
64
|
+
'check_intent',
|
|
65
|
+
'get_constraints',
|
|
66
|
+
'get_context_for_file',
|
|
67
|
+
'get_decision',
|
|
68
|
+
'search_decisions',
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
it('search_decisions calls client.searchDecisions with query and options', async () => {
|
|
72
|
+
await getTools(server)['search_decisions'].handler({ query: 'which ORM do we use?' });
|
|
73
|
+
expect(client.searchDecisions).toHaveBeenCalledWith('which ORM do we use?', { limit: undefined, types: undefined });
|
|
74
|
+
});
|
|
75
|
+
it('search_decisions passes limit and types to client', async () => {
|
|
76
|
+
await getTools(server)['search_decisions'].handler({ query: 'auth', limit: 3, types: ['constraint'] });
|
|
77
|
+
expect(client.searchDecisions).toHaveBeenCalledWith('auth', { limit: 3, types: ['constraint'] });
|
|
78
|
+
});
|
|
79
|
+
it('ask_knowledge_base formats answer with sources', async () => {
|
|
80
|
+
const result = await getTools(server)['ask_knowledge_base'].handler({ question: 'which ORM?' });
|
|
81
|
+
expect(result.content[0].text).toContain('We use Drizzle ORM');
|
|
82
|
+
expect(result.content[0].text).toContain('ORM Decision');
|
|
83
|
+
});
|
|
84
|
+
it('get_constraints calls client.getConstraints', async () => {
|
|
85
|
+
await getTools(server)['get_constraints'].handler({});
|
|
86
|
+
expect(client.getConstraints).toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
it('check_conventions calls client.getConventions', async () => {
|
|
89
|
+
await getTools(server)['check_conventions'].handler({});
|
|
90
|
+
expect(client.getConventions).toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it('get_decision formats the full decision body', async () => {
|
|
93
|
+
const result = await getTools(server)['get_decision'].handler({ decisionId: 'd-1' });
|
|
94
|
+
expect(client.getDecision).toHaveBeenCalledWith('d-1');
|
|
95
|
+
expect(result.content[0].text).toContain('Use Drizzle ORM');
|
|
96
|
+
expect(result.content[0].text).toContain('Prisma');
|
|
97
|
+
});
|
|
98
|
+
it('get_context_for_file reads the file and forwards content + language to client', async () => {
|
|
99
|
+
const dir = join(tmpdir(), `decispher-tool-${randomUUID()}`);
|
|
100
|
+
await fs.mkdir(dir, { recursive: true });
|
|
101
|
+
const path = join(dir, 'auth.ts');
|
|
102
|
+
try {
|
|
103
|
+
await fs.writeFile(path, 'export const handler = () => {};');
|
|
104
|
+
await getTools(server)['get_context_for_file'].handler({ filePath: path });
|
|
105
|
+
expect(client.getContextForFile).toHaveBeenCalledWith(path, {
|
|
106
|
+
fileContent: 'export const handler = () => {};',
|
|
107
|
+
language: 'typescript',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
it('get_context_for_file falls back to path-only when the file cannot be read', async () => {
|
|
115
|
+
const missing = join(tmpdir(), `decispher-missing-${randomUUID()}.ts`);
|
|
116
|
+
await getTools(server)['get_context_for_file'].handler({ filePath: missing });
|
|
117
|
+
expect(client.getContextForFile).toHaveBeenCalledWith(missing, undefined);
|
|
118
|
+
});
|
|
119
|
+
it('capture_decision forwards the input and reports a captured id', async () => {
|
|
120
|
+
const result = await getTools(server)['capture_decision'].handler({
|
|
121
|
+
type: 'convention',
|
|
122
|
+
title: 'Pino for logging',
|
|
123
|
+
decision: 'Use pino structured logging.',
|
|
124
|
+
rationale: 'Structured JSON gives us queryable logs.',
|
|
125
|
+
});
|
|
126
|
+
expect(client.captureDecision).toHaveBeenCalledWith(expect.objectContaining({
|
|
127
|
+
type: 'convention',
|
|
128
|
+
title: 'Pino for logging',
|
|
129
|
+
}));
|
|
130
|
+
expect(result.content[0].text).toContain('captured: cap-1');
|
|
131
|
+
});
|
|
132
|
+
it('capture_decision reports already-existing units distinctly', async () => {
|
|
133
|
+
client = makeClient({
|
|
134
|
+
captureDecision: vi.fn().mockResolvedValue({
|
|
135
|
+
id: 'cap-existing', alreadyExists: true, similarityToExisting: 0.973,
|
|
136
|
+
fusionPending: false, status: 'active', latencyMs: 7,
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
const localServer = new McpServer({ name: 'test', version: '0.0.0' });
|
|
140
|
+
registerTools(localServer, client);
|
|
141
|
+
const result = await getTools(localServer)['capture_decision'].handler({
|
|
142
|
+
type: 'decision',
|
|
143
|
+
title: 'duplicate',
|
|
144
|
+
decision: 'body',
|
|
145
|
+
rationale: 'why',
|
|
146
|
+
});
|
|
147
|
+
expect(result.content[0].text).toContain('already-known unit: cap-existing');
|
|
148
|
+
expect(result.content[0].text).toContain('0.973');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('WS-E — capabilities-driven registration', () => {
|
|
152
|
+
let client;
|
|
153
|
+
beforeEach(() => {
|
|
154
|
+
client = makeClient();
|
|
155
|
+
});
|
|
156
|
+
it('only registers tools the server advertised in enabledTools', () => {
|
|
157
|
+
const server = new McpServer({ name: 'test', version: '0.0.0' });
|
|
158
|
+
registerTools(server, client, {
|
|
159
|
+
enabledTools: new Set(['search_decisions', 'check_intent']),
|
|
160
|
+
});
|
|
161
|
+
expect(Object.keys(getTools(server)).sort()).toEqual(['check_intent', 'search_decisions']);
|
|
162
|
+
});
|
|
163
|
+
it('uses server-provided descriptions when supplied', () => {
|
|
164
|
+
const server = new McpServer({ name: 'test', version: '0.0.0' });
|
|
165
|
+
registerTools(server, client, {
|
|
166
|
+
descriptions: { search_decisions: 'OVERRIDDEN by server /capabilities' },
|
|
167
|
+
});
|
|
168
|
+
expect(getTools(server)['search_decisions'].description).toBe('OVERRIDDEN by server /capabilities');
|
|
169
|
+
});
|
|
170
|
+
it('falls back to embedded description when server omits it', () => {
|
|
171
|
+
const server = new McpServer({ name: 'test', version: '0.0.0' });
|
|
172
|
+
registerTools(server, client, { descriptions: {} });
|
|
173
|
+
const embedded = TOOL_DEFINITIONS.find((d) => d.name === 'get_constraints').defaultDescription;
|
|
174
|
+
expect(getTools(server)['get_constraints'].description).toBe(embedded);
|
|
175
|
+
});
|
|
176
|
+
it('TOOL_DEFINITIONS includes capture_decision', () => {
|
|
177
|
+
const def = TOOL_DEFINITIONS.find((d) => d.name === 'capture_decision');
|
|
178
|
+
expect(def).toBeDefined();
|
|
179
|
+
expect(def.defaultDescription).toContain('Write a new context unit');
|
|
180
|
+
expect(def.defaultDescription).toContain('decision');
|
|
181
|
+
expect(def.defaultDescription).toContain('convention');
|
|
182
|
+
expect(def.defaultDescription).toContain('constraint');
|
|
183
|
+
});
|
|
184
|
+
it('TOOL_DEFINITIONS covers every wire tool name', () => {
|
|
185
|
+
const definedNames = TOOL_DEFINITIONS.map((d) => d.name).sort();
|
|
186
|
+
expect(definedNames).toEqual([
|
|
187
|
+
'ask_knowledge_base',
|
|
188
|
+
'capture_decision',
|
|
189
|
+
'check_conventions',
|
|
190
|
+
'check_intent',
|
|
191
|
+
'get_constraints',
|
|
192
|
+
'get_context_for_file',
|
|
193
|
+
'get_decision',
|
|
194
|
+
'search_decisions',
|
|
195
|
+
]);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
export type FreshnessTier = 'fresh' | 'aging' | 'stale' | 'fossil';
|
|
2
|
+
export interface ConstraintSummary {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
decision: string;
|
|
6
|
+
rationale: string | null;
|
|
7
|
+
severity: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConventionSummary {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
decision: string;
|
|
13
|
+
rationale: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface AskResponse {
|
|
16
|
+
answer: string;
|
|
17
|
+
sources: Array<{
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
similarity: number;
|
|
21
|
+
lastReviewedAt?: string | null;
|
|
22
|
+
ageInDays?: number;
|
|
23
|
+
freshnessTier?: FreshnessTier;
|
|
24
|
+
}>;
|
|
25
|
+
hadContext: boolean;
|
|
26
|
+
contextUnits?: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
type: string;
|
|
30
|
+
lastReviewedAt?: string | null;
|
|
31
|
+
ageInDays?: number;
|
|
32
|
+
freshnessTier?: FreshnessTier;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
export interface ContextMatch {
|
|
36
|
+
id: string;
|
|
37
|
+
title: string;
|
|
38
|
+
type: string;
|
|
39
|
+
decision: string;
|
|
40
|
+
rationale: string | null;
|
|
41
|
+
similarity: number;
|
|
42
|
+
}
|
|
43
|
+
export type IntentVerdict = 'BLOCKED' | 'WARN' | 'CLEAR';
|
|
44
|
+
export interface ConflictSummary {
|
|
45
|
+
severity: string;
|
|
46
|
+
decisionId: string;
|
|
47
|
+
title: string;
|
|
48
|
+
explanation: string;
|
|
49
|
+
}
|
|
50
|
+
export interface RelevantSummary {
|
|
51
|
+
decisionId: string;
|
|
52
|
+
title: string;
|
|
53
|
+
type: string;
|
|
54
|
+
linkScore: number;
|
|
55
|
+
}
|
|
56
|
+
export interface IntentCheckResult {
|
|
57
|
+
verdict: IntentVerdict;
|
|
58
|
+
conflicts: ConflictSummary[];
|
|
59
|
+
relevant: RelevantSummary[];
|
|
60
|
+
latencyMs: number;
|
|
61
|
+
creditsConsumed: number;
|
|
62
|
+
}
|
|
63
|
+
export interface EnvelopeNotices {
|
|
64
|
+
truncated: boolean;
|
|
65
|
+
citationCount: number;
|
|
66
|
+
}
|
|
67
|
+
export interface DecisionDetail {
|
|
68
|
+
id: string;
|
|
69
|
+
type: string;
|
|
70
|
+
title: string;
|
|
71
|
+
problem: string | null;
|
|
72
|
+
decision: string;
|
|
73
|
+
rationale: string;
|
|
74
|
+
severity: string;
|
|
75
|
+
status: string;
|
|
76
|
+
alternatives: Array<{
|
|
77
|
+
option: string;
|
|
78
|
+
reasonRejected: string;
|
|
79
|
+
}> | null;
|
|
80
|
+
affectedFiles: string[];
|
|
81
|
+
tags: string[];
|
|
82
|
+
sourceType: string | null;
|
|
83
|
+
supersedes: string | null;
|
|
84
|
+
supersededBy: string | null;
|
|
85
|
+
createdAt: string;
|
|
86
|
+
updatedAt: string;
|
|
87
|
+
lastReviewedAt: string | null;
|
|
88
|
+
}
|
|
89
|
+
export type CaptureContextUnitType = 'decision' | 'convention' | 'constraint' | 'rationale' | 'ownership' | 'history' | 'plan';
|
|
90
|
+
export interface CaptureDecisionInput {
|
|
91
|
+
type: CaptureContextUnitType;
|
|
92
|
+
title: string;
|
|
93
|
+
decision: string;
|
|
94
|
+
rationale: string;
|
|
95
|
+
problem?: string;
|
|
96
|
+
severity?: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
97
|
+
affectedFiles?: string[];
|
|
98
|
+
tags?: string[];
|
|
99
|
+
alternatives?: Array<{
|
|
100
|
+
option: string;
|
|
101
|
+
reasonRejected: string;
|
|
102
|
+
}>;
|
|
103
|
+
/** Agent-reported tokens spent discovering this knowledge. Capped server-side at 100k. */
|
|
104
|
+
discoveryCostTokens?: number;
|
|
105
|
+
}
|
|
106
|
+
export interface CaptureDecisionResult {
|
|
107
|
+
id: string;
|
|
108
|
+
alreadyExists: boolean;
|
|
109
|
+
similarityToExisting: number | null;
|
|
110
|
+
fusionPending: boolean;
|
|
111
|
+
status: 'active';
|
|
112
|
+
latencyMs: number;
|
|
113
|
+
}
|
|
114
|
+
export interface TopicSummary {
|
|
115
|
+
readonly id: string;
|
|
116
|
+
readonly label: string;
|
|
117
|
+
readonly description: string | null;
|
|
118
|
+
readonly unitCount: number;
|
|
119
|
+
}
|
|
120
|
+
export interface TopicSpineUnit {
|
|
121
|
+
readonly id: string;
|
|
122
|
+
readonly type: string;
|
|
123
|
+
readonly title: string;
|
|
124
|
+
readonly severity: string;
|
|
125
|
+
readonly decision: string;
|
|
126
|
+
readonly rationale: string | null;
|
|
127
|
+
}
|
|
128
|
+
export interface TopicExpansionUnit {
|
|
129
|
+
readonly id: string;
|
|
130
|
+
readonly type: string;
|
|
131
|
+
readonly title: string;
|
|
132
|
+
readonly severity: string;
|
|
133
|
+
readonly decision?: string;
|
|
134
|
+
readonly rationale?: string | null;
|
|
135
|
+
}
|
|
136
|
+
export interface TopicContextResult {
|
|
137
|
+
readonly topicId: string;
|
|
138
|
+
readonly label: string;
|
|
139
|
+
readonly description: string | null;
|
|
140
|
+
readonly spine: readonly TopicSpineUnit[];
|
|
141
|
+
readonly expansion: readonly TopicExpansionUnit[];
|
|
142
|
+
readonly projectId: string | null;
|
|
143
|
+
readonly includeBodies: boolean;
|
|
144
|
+
readonly spineRequest: boolean;
|
|
145
|
+
}
|
|
146
|
+
export interface CapabilityTool {
|
|
147
|
+
name: string;
|
|
148
|
+
description: string;
|
|
149
|
+
costCredits?: number;
|
|
150
|
+
scopes?: string[];
|
|
151
|
+
defaultMaxTokens?: number;
|
|
152
|
+
projectScopedAware?: boolean;
|
|
153
|
+
status?: string;
|
|
154
|
+
}
|
|
155
|
+
export interface CapabilitiesResponse {
|
|
156
|
+
tools: CapabilityTool[];
|
|
157
|
+
apiKey: {
|
|
158
|
+
hasProjectScope: boolean;
|
|
159
|
+
projectId: string | null;
|
|
160
|
+
allowedScopes: string[];
|
|
161
|
+
};
|
|
162
|
+
apiVersion: string;
|
|
163
|
+
}
|
|
164
|
+
export interface HealthResponse {
|
|
165
|
+
status: string;
|
|
166
|
+
apiVersion: string;
|
|
167
|
+
commit: string;
|
|
168
|
+
}
|
|
169
|
+
export declare class DecispherClient {
|
|
170
|
+
private readonly baseUrl;
|
|
171
|
+
private readonly apiKey;
|
|
172
|
+
private readonly companyId;
|
|
173
|
+
private readonly sessionId;
|
|
174
|
+
/** Notices from the most recent envelope, surfaced by tools.ts in `_meta`. */
|
|
175
|
+
lastNotices: EnvelopeNotices | null;
|
|
176
|
+
constructor();
|
|
177
|
+
searchDecisions(query: string, options?: {
|
|
178
|
+
limit?: number;
|
|
179
|
+
types?: string[];
|
|
180
|
+
}): Promise<ContextMatch[]>;
|
|
181
|
+
getConstraints(options?: {
|
|
182
|
+
maxTokens?: number;
|
|
183
|
+
cursor?: string;
|
|
184
|
+
expand?: string[];
|
|
185
|
+
}): Promise<ConstraintSummary[]>;
|
|
186
|
+
getConventions(options?: {
|
|
187
|
+
maxTokens?: number;
|
|
188
|
+
cursor?: string;
|
|
189
|
+
expand?: string[];
|
|
190
|
+
}): Promise<ConventionSummary[]>;
|
|
191
|
+
ask(query: string): Promise<AskResponse>;
|
|
192
|
+
getDecision(decisionId: string): Promise<DecisionDetail>;
|
|
193
|
+
checkIntent(description: string, files?: string[]): Promise<IntentCheckResult>;
|
|
194
|
+
getContextForFiles(files: Array<{
|
|
195
|
+
filePath: string;
|
|
196
|
+
fileContent?: string;
|
|
197
|
+
language?: string;
|
|
198
|
+
}>, options?: {
|
|
199
|
+
limit?: number;
|
|
200
|
+
}): Promise<ContextMatch[]>;
|
|
201
|
+
getContextForFile(filePath: string, options?: {
|
|
202
|
+
fileContent?: string;
|
|
203
|
+
language?: string;
|
|
204
|
+
limit?: number;
|
|
205
|
+
}): Promise<ContextMatch[]>;
|
|
206
|
+
listTopics(): Promise<TopicSummary[]>;
|
|
207
|
+
getContextForTopic(topic: string, options?: {
|
|
208
|
+
includeBodies?: boolean;
|
|
209
|
+
maxTokens?: number;
|
|
210
|
+
}): Promise<TopicContextResult>;
|
|
211
|
+
captureDecision(input: CaptureDecisionInput): Promise<CaptureDecisionResult>;
|
|
212
|
+
/**
|
|
213
|
+
* Probe `/api/mcp/health` before the first tool call — no auth required.
|
|
214
|
+
* Returns null on any network/parse failure so the caller can fall through
|
|
215
|
+
* to the static tool list instead of crashing the MCP server at startup.
|
|
216
|
+
*/
|
|
217
|
+
fetchHealth(): Promise<HealthResponse | null>;
|
|
218
|
+
/**
|
|
219
|
+
* Pull the tool registry from the server. Returns null if the request fails
|
|
220
|
+
* or the response shape is unrecognised — caller falls back to the embedded
|
|
221
|
+
* static tool list so the MCP server still works offline / against an older
|
|
222
|
+
* API that does not yet expose `/capabilities`.
|
|
223
|
+
*/
|
|
224
|
+
fetchCapabilities(): Promise<CapabilitiesResponse | null>;
|
|
225
|
+
/** Parse an MCP envelope; transparently passes through legacy un-wrapped responses. */
|
|
226
|
+
private unwrap;
|
|
227
|
+
private isEnvelope;
|
|
228
|
+
private post;
|
|
229
|
+
private headers;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=decispher-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decispher-client.d.ts","sourceRoot":"","sources":["../src/decispher-client.ts"],"names":[],"mappings":"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"}
|