create-merlin-brain 3.12.0 → 3.14.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/bin/install.cjs +10 -10
- package/dist/server/api/types.d.ts +7 -0
- package/dist/server/api/types.d.ts.map +1 -1
- package/dist/server/server.js +8 -8
- package/dist/server/server.js.map +1 -1
- package/dist/server/session-coach.js +9 -9
- package/dist/server/session-coach.js.map +1 -1
- package/dist/server/stats.js +7 -7
- package/dist/server/stats.js.map +1 -1
- package/dist/server/tools/__tests__/augmentation.test.d.ts +8 -0
- package/dist/server/tools/__tests__/augmentation.test.d.ts.map +1 -0
- package/dist/server/tools/__tests__/augmentation.test.js +76 -0
- package/dist/server/tools/__tests__/augmentation.test.js.map +1 -0
- package/dist/server/tools/__tests__/route-helpers.test.d.ts +5 -0
- package/dist/server/tools/__tests__/route-helpers.test.d.ts.map +1 -0
- package/dist/server/tools/__tests__/route-helpers.test.js +49 -0
- package/dist/server/tools/__tests__/route-helpers.test.js.map +1 -0
- package/dist/server/tools/agent-spawn.d.ts +25 -0
- package/dist/server/tools/agent-spawn.d.ts.map +1 -0
- package/dist/server/tools/agent-spawn.js +95 -0
- package/dist/server/tools/agent-spawn.js.map +1 -0
- package/dist/server/tools/augmentation.d.ts +45 -0
- package/dist/server/tools/augmentation.d.ts.map +1 -0
- package/dist/server/tools/augmentation.js +167 -0
- package/dist/server/tools/augmentation.js.map +1 -0
- package/dist/server/tools/project.js +1 -1
- package/dist/server/tools/project.js.map +1 -1
- package/dist/server/tools/route-helpers.d.ts +45 -0
- package/dist/server/tools/route-helpers.d.ts.map +1 -0
- package/dist/server/tools/route-helpers.js +93 -0
- package/dist/server/tools/route-helpers.js.map +1 -0
- package/dist/server/tools/route.d.ts +4 -3
- package/dist/server/tools/route.d.ts.map +1 -1
- package/dist/server/tools/route.js +63 -308
- package/dist/server/tools/route.js.map +1 -1
- package/files/CLAUDE.md +66 -5
- package/files/agents/merlin.md +21 -13
- package/files/hooks/config-change.sh +2 -2
- package/files/hooks/notify-desktop.sh +2 -2
- package/files/hooks/notify-webhook.sh +1 -1
- package/files/hooks/session-start-context.sh +1 -1
- package/files/hooks/task-completed-verify.sh +2 -2
- package/files/hooks/worktree-create.sh +1 -1
- package/files/hooks/worktree-remove.sh +1 -1
- package/package.json +5 -2
|
@@ -147,10 +147,10 @@ export function getProtocolNudge(currentTool) {
|
|
|
147
147
|
if (isContextTool) {
|
|
148
148
|
if (state.contextCheckCount <= 1) {
|
|
149
149
|
// First context check of the session
|
|
150
|
-
return '\n\n---\n
|
|
150
|
+
return '\n\n---\n**⟡🔮 MERLIN ›** Context loaded. Call `merlin_get_context` again before each new file modification.';
|
|
151
151
|
}
|
|
152
152
|
// Regular context check — brief confirmation
|
|
153
|
-
return '\n\n---\n
|
|
153
|
+
return '\n\n---\n**⟡🔮 MERLIN ›** ✓ Context fresh. Next check: before your next file edit.';
|
|
154
154
|
}
|
|
155
155
|
// For non-context tools, escalate based on drift
|
|
156
156
|
switch (driftLevel) {
|
|
@@ -178,9 +178,9 @@ export function getProtocolNudge(currentTool) {
|
|
|
178
178
|
*/
|
|
179
179
|
function getGreenNudge() {
|
|
180
180
|
const nudges = [
|
|
181
|
-
'
|
|
182
|
-
'
|
|
183
|
-
'
|
|
181
|
+
'**⟡🔮 MERLIN ›** `merlin_get_context` before modifying files.',
|
|
182
|
+
'**⟡🔮 MERLIN ›** Check Sights before creating new files to avoid duplicates.',
|
|
183
|
+
'**⟡🔮 MERLIN ›** Call `merlin_get_context("your task")` before each edit.',
|
|
184
184
|
];
|
|
185
185
|
const pick = nudges[state.totalCalls % nudges.length];
|
|
186
186
|
return `\n\n---\n${pick}`;
|
|
@@ -193,7 +193,7 @@ function getYellowNudge() {
|
|
|
193
193
|
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
194
194
|
: 0;
|
|
195
195
|
return `\n\n---\n` +
|
|
196
|
-
|
|
196
|
+
`**⟡🔮 MERLIN › REFRESH CONTEXT** — ${minutesSince}min since last check, ${state.callsSinceContext} calls without context refresh.\n` +
|
|
197
197
|
`Before your next file edit, run: \`merlin_get_context("what you're working on")\`\n` +
|
|
198
198
|
`This prevents duplicating existing code and catches recent changes.`;
|
|
199
199
|
}
|
|
@@ -205,7 +205,7 @@ function getOrangeNudge() {
|
|
|
205
205
|
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
206
206
|
: 0;
|
|
207
207
|
return `\n\n---\n` +
|
|
208
|
-
|
|
208
|
+
`**⟡🔮 MERLIN › ⚠️ PROTOCOL DRIFT DETECTED** — ${minutesSince}min and ${state.callsSinceContext} tool calls without checking Sights.\n\n` +
|
|
209
209
|
`**REQUIRED before continuing:** Call \`merlin_get_context("your current task")\` now.\n\n` +
|
|
210
210
|
`Without fresh context you risk:\n` +
|
|
211
211
|
`- Duplicating code that already exists\n` +
|
|
@@ -221,7 +221,7 @@ function getRedNudge() {
|
|
|
221
221
|
: 0;
|
|
222
222
|
const health = getSessionHealth();
|
|
223
223
|
return `\n\n---\n` +
|
|
224
|
-
|
|
224
|
+
`**⟡🔮 MERLIN › 🛑 STOP — CONTEXT STALE (${minutesSince}min, session health: ${health}%)**\n\n` +
|
|
225
225
|
`You have made ${state.callsSinceContext} tool calls without checking codebase context.\n` +
|
|
226
226
|
`This is exactly how duplicate code and broken patterns happen.\n\n` +
|
|
227
227
|
`**DO THIS NOW:**\n` +
|
|
@@ -245,7 +245,7 @@ export function getProtocolStatus() {
|
|
|
245
245
|
: minutesSince === 0
|
|
246
246
|
? 'just now'
|
|
247
247
|
: `${minutesSince}m ago`;
|
|
248
|
-
return `${icon} Protocol: ${health}% │ Last context: ${lastCheck} │ Calls since: ${state.callsSinceContext}`;
|
|
248
|
+
return `${icon} ⟡🔮 Protocol: ${health}% │ Last context: ${lastCheck} │ Calls since: ${state.callsSinceContext}`;
|
|
249
249
|
}
|
|
250
250
|
/**
|
|
251
251
|
* Reset session state (for testing or session restart)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-coach.js","sourceRoot":"","sources":["../../src/server/session-coach.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-coach.js","sourceRoot":"","sources":["../../src/server/session-coach.ts"],"names":[],"mappings":"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"}
|
package/dist/server/stats.js
CHANGED
|
@@ -82,7 +82,7 @@ export function getSessionEnforcementReminder() {
|
|
|
82
82
|
if (stats.sessionStatusShown) {
|
|
83
83
|
return null;
|
|
84
84
|
}
|
|
85
|
-
return
|
|
85
|
+
return `**⟡🔮 MERLIN › STOP — BOOT REQUIRED.** You must call \`merlin_get_selected_repo\` and \`merlin_get_project_status\` before doing any work. Call them now.\n\n`;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Mark that context was refreshed (called for get_context, search, find_files)
|
|
@@ -115,7 +115,7 @@ export function getStaleContextReminder() {
|
|
|
115
115
|
: `${stats.queriesSinceRefresh} queries since last context refresh`;
|
|
116
116
|
return `
|
|
117
117
|
┌──────────────────────────────────────────────────────────────────┐
|
|
118
|
-
│
|
|
118
|
+
│ ⟡🔮 MERLIN › CONTEXT MAY BE STALE │
|
|
119
119
|
├──────────────────────────────────────────────────────────────────┤
|
|
120
120
|
│ ${reason.padEnd(62)}│
|
|
121
121
|
│ │
|
|
@@ -157,7 +157,7 @@ export function formatHeader(toolName, options = {}) {
|
|
|
157
157
|
const { task, filesFound = 0, responseTokens = 0, isSuccess = true, summary } = options;
|
|
158
158
|
const shortName = toolName.replace('merlin_', '');
|
|
159
159
|
// Line 1: Tool and task
|
|
160
|
-
let header =
|
|
160
|
+
let header = `**⟡🔮 MERLIN** › ${shortName}`;
|
|
161
161
|
if (task) {
|
|
162
162
|
const truncatedTask = task.length > 35 ? task.slice(0, 35) + '...' : task;
|
|
163
163
|
header += ` ("${truncatedTask}")`;
|
|
@@ -260,7 +260,7 @@ export function getSessionSummary() {
|
|
|
260
260
|
? Math.round((saved / stats.wouldHaveRead) * 100)
|
|
261
261
|
: 0;
|
|
262
262
|
let summary = `\n---\n`;
|
|
263
|
-
summary +=
|
|
263
|
+
summary += `**⟡🔮 MERLIN › Session: ${stats.queries} queries**\n`;
|
|
264
264
|
summary += `Merlin: ${formatTokens(stats.merlinTokens)} tokens │ `;
|
|
265
265
|
summary += `Without: ~${formatTokens(stats.wouldHaveRead)} tokens │ `;
|
|
266
266
|
summary += `**${savedPercent}% smaller context**\n`;
|
|
@@ -279,7 +279,7 @@ export function getCompactStats() {
|
|
|
279
279
|
const savedPercent = stats.wouldHaveRead > 0
|
|
280
280
|
? Math.round((saved / stats.wouldHaveRead) * 100)
|
|
281
281
|
: 0;
|
|
282
|
-
return
|
|
282
|
+
return `⟡🔮 ${stats.queries} queries │ ${formatTokens(stats.merlinTokens)} vs ~${formatTokens(stats.wouldHaveRead)} tokens (${savedPercent}% saved)`;
|
|
283
283
|
}
|
|
284
284
|
/**
|
|
285
285
|
* Human-readable labels for save types
|
|
@@ -311,10 +311,10 @@ export function formatSaveNotification(saveType, options = {}) {
|
|
|
311
311
|
let notification = '';
|
|
312
312
|
// Line 1: Type header
|
|
313
313
|
if (isSuccess) {
|
|
314
|
-
notification +=
|
|
314
|
+
notification += `⟡🔮 **MERLIN › SAVED** › ${label}\n`;
|
|
315
315
|
}
|
|
316
316
|
else {
|
|
317
|
-
notification +=
|
|
317
|
+
notification += `⟡🔮 **MERLIN › FAILED** › ${label}\n`;
|
|
318
318
|
}
|
|
319
319
|
// Line 2: What was saved
|
|
320
320
|
if (isSuccess) {
|
package/dist/server/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAgBzF,uCAAuC;AACvC,MAAM,qBAAqB,GAAG,CAAC,CAAC,CAAM,uCAAuC;AAC7E,MAAM,uBAAuB,GAAG,CAAC,CAAC,CAAI,oCAAoC;AAE1E,uBAAuB;AACvB,MAAM,KAAK,GAAiB;IAC1B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;IACxB,OAAO,EAAE,CAAC;IACV,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;IACxB,eAAe,EAAE,KAAK;IACtB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,CAAC;IACrB,mBAAmB,EAAE,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,YAAoB,EACpB,aAAqB,CAAC;IAEtB,KAAK,CAAC,OAAO,EAAE,CAAC;IAChB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC;IAE/B,uBAAuB;IACvB,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAClD,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC;IAEnC,2CAA2C;IAC3C,iDAAiD;IACjD,0EAA0E;IAC1E,MAAM,aAAa,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAChD,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,CAAC,kBAAkB,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for augmentation module — cache, discovery eligibility, handoff building.
|
|
3
|
+
*
|
|
4
|
+
* Tests use a temp directory for cache operations to avoid polluting
|
|
5
|
+
* the real ~/.claude/agents/_cloud/ directory.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=augmentation.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augmentation.test.d.ts","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/augmentation.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for augmentation module — cache, discovery eligibility, handoff building.
|
|
3
|
+
*
|
|
4
|
+
* Tests use a temp directory for cache operations to avoid polluting
|
|
5
|
+
* the real ~/.claude/agents/_cloud/ directory.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
// We need to mock the CLOUD_CACHE_DIR before importing the module
|
|
9
|
+
// Since the module uses a constant, we'll test the exported functions
|
|
10
|
+
// that don't depend on the hardcoded path, and test cache behavior
|
|
11
|
+
// through integration-style tests with a temp dir.
|
|
12
|
+
// Test shouldAugment and buildAugmentationSection directly
|
|
13
|
+
import { shouldAugment, buildAugmentationSection } from '../augmentation.js';
|
|
14
|
+
describe('shouldAugment', () => {
|
|
15
|
+
it('returns true for code-writing agents', () => {
|
|
16
|
+
expect(shouldAugment('implementation-dev')).toBe(true);
|
|
17
|
+
expect(shouldAugment('merlin-frontend')).toBe(true);
|
|
18
|
+
expect(shouldAugment('hardening-guard')).toBe(true);
|
|
19
|
+
expect(shouldAugment('tests-qa')).toBe(true);
|
|
20
|
+
expect(shouldAugment('ui-builder')).toBe(true);
|
|
21
|
+
expect(shouldAugment('merlin-executor')).toBe(true);
|
|
22
|
+
expect(shouldAugment('merlin-api-designer')).toBe(true);
|
|
23
|
+
expect(shouldAugment('merlin-security')).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
it('returns false for non-code-writing agents', () => {
|
|
26
|
+
expect(shouldAugment('docs-keeper')).toBe(false);
|
|
27
|
+
expect(shouldAugment('merlin-planner')).toBe(false);
|
|
28
|
+
expect(shouldAugment('merlin-verifier')).toBe(false);
|
|
29
|
+
expect(shouldAugment('merlin-reviewer')).toBe(false);
|
|
30
|
+
expect(shouldAugment('product-spec')).toBe(false);
|
|
31
|
+
expect(shouldAugment('system-architect')).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('returns true for unknown agents (opt-out model)', () => {
|
|
34
|
+
expect(shouldAugment('custom-agent')).toBe(true);
|
|
35
|
+
expect(shouldAugment('my-special-agent')).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('buildAugmentationSection', () => {
|
|
39
|
+
it('builds correct markdown section', () => {
|
|
40
|
+
const result = buildAugmentationSection({
|
|
41
|
+
slug: 'prisma-expert',
|
|
42
|
+
grade: 'A++',
|
|
43
|
+
description: 'Prisma ORM patterns and migrations',
|
|
44
|
+
systemPrompt: 'You are a Prisma expert. Always use prisma migrate for schema changes.',
|
|
45
|
+
});
|
|
46
|
+
expect(result[0]).toBe('## Domain Expertise (auto-augmented)');
|
|
47
|
+
expect(result[1]).toContain('prisma-expert');
|
|
48
|
+
expect(result[1]).toContain('A++');
|
|
49
|
+
expect(result[3]).toContain('Prisma expert');
|
|
50
|
+
expect(result[5]).toContain('supplementary domain knowledge');
|
|
51
|
+
});
|
|
52
|
+
it('truncates prompts over 4000 characters', () => {
|
|
53
|
+
const longPrompt = 'x'.repeat(5000);
|
|
54
|
+
const result = buildAugmentationSection({
|
|
55
|
+
slug: 'long-agent',
|
|
56
|
+
grade: 'A',
|
|
57
|
+
description: 'Test',
|
|
58
|
+
systemPrompt: longPrompt,
|
|
59
|
+
});
|
|
60
|
+
const promptSection = result[3];
|
|
61
|
+
expect(promptSection.length).toBeLessThan(4100); // 4000 + truncation message
|
|
62
|
+
expect(promptSection).toContain('truncated');
|
|
63
|
+
});
|
|
64
|
+
it('does not truncate prompts under 4000 characters', () => {
|
|
65
|
+
const shortPrompt = 'You are a specialist. Do good work.';
|
|
66
|
+
const result = buildAugmentationSection({
|
|
67
|
+
slug: 'short-agent',
|
|
68
|
+
grade: 'A+',
|
|
69
|
+
description: 'Test',
|
|
70
|
+
systemPrompt: shortPrompt,
|
|
71
|
+
});
|
|
72
|
+
expect(result[3]).toBe(shortPrompt);
|
|
73
|
+
expect(result[3]).not.toContain('truncated');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=augmentation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augmentation.test.js","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/augmentation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-helpers.test.d.ts","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/route-helpers.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for route-helpers — effort prefix building, agent roles constants.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { buildEffortPrefix, AGENT_ROLES, WORKFLOW_AGENTS } from '../route-helpers.js';
|
|
6
|
+
describe('buildEffortPrefix', () => {
|
|
7
|
+
it('returns ultrathink prefix for high effort', () => {
|
|
8
|
+
const { prefix, suffix } = buildEffortPrefix('high');
|
|
9
|
+
expect(prefix).toBe('ultrathink\n\n');
|
|
10
|
+
expect(suffix).toBe('');
|
|
11
|
+
});
|
|
12
|
+
it('returns concise suffix for low effort', () => {
|
|
13
|
+
const { prefix, suffix } = buildEffortPrefix('low');
|
|
14
|
+
expect(prefix).toBe('');
|
|
15
|
+
expect(suffix).toContain('concise');
|
|
16
|
+
});
|
|
17
|
+
it('returns empty strings for medium effort', () => {
|
|
18
|
+
const { prefix, suffix } = buildEffortPrefix('medium');
|
|
19
|
+
expect(prefix).toBe('');
|
|
20
|
+
expect(suffix).toBe('');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('AGENT_ROLES', () => {
|
|
24
|
+
it('contains all 8 core specialist agents', () => {
|
|
25
|
+
const expected = [
|
|
26
|
+
'product-spec', 'system-architect', 'implementation-dev',
|
|
27
|
+
'dry-refactor', 'hardening-guard', 'tests-qa',
|
|
28
|
+
'ops-railway', 'docs-keeper',
|
|
29
|
+
];
|
|
30
|
+
for (const agent of expected) {
|
|
31
|
+
expect(AGENT_ROLES).toHaveProperty(agent);
|
|
32
|
+
expect(typeof AGENT_ROLES[agent]).toBe('string');
|
|
33
|
+
}
|
|
34
|
+
expect(Object.keys(AGENT_ROLES).length).toBe(8);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('WORKFLOW_AGENTS', () => {
|
|
38
|
+
it('contains expected workflow agents', () => {
|
|
39
|
+
expect(WORKFLOW_AGENTS).toContain('merlin-planner');
|
|
40
|
+
expect(WORKFLOW_AGENTS).toContain('merlin-executor');
|
|
41
|
+
expect(WORKFLOW_AGENTS).toContain('merlin-frontend');
|
|
42
|
+
expect(WORKFLOW_AGENTS).toContain('merlin-security');
|
|
43
|
+
});
|
|
44
|
+
it('does not contain core specialist agents', () => {
|
|
45
|
+
expect(WORKFLOW_AGENTS).not.toContain('implementation-dev');
|
|
46
|
+
expect(WORKFLOW_AGENTS).not.toContain('product-spec');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=route-helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-helpers.test.js","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/route-helpers.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG;YACf,cAAc,EAAE,kBAAkB,EAAE,oBAAoB;YACxD,cAAc,EAAE,iBAAiB,EAAE,UAAU;YAC7C,aAAa,EAAE,aAAa;SAC7B,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawn — Fresh Claude process spawning and output management.
|
|
3
|
+
*
|
|
4
|
+
* Handles the actual child process lifecycle: spawn, timeout, output
|
|
5
|
+
* capture, memory limits, and cleanup.
|
|
6
|
+
*/
|
|
7
|
+
import type { IsolationMode } from './route-helpers.js';
|
|
8
|
+
/**
|
|
9
|
+
* Spawn a fresh Claude process and capture its output.
|
|
10
|
+
* Removes CLAUDECODE env var so child doesn't reject as nested session.
|
|
11
|
+
*/
|
|
12
|
+
export declare function spawnAgent(agent: string, input: string, timeoutMs: number, model?: string, isolation?: IsolationMode): Promise<{
|
|
13
|
+
stdout: string;
|
|
14
|
+
stderr: string;
|
|
15
|
+
exitCode: number | null;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Get list of available agent names from ~/.claude/agents/ and .claude/agents/
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAvailableAgents(): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Truncate output to prevent context window explosion.
|
|
23
|
+
*/
|
|
24
|
+
export declare function truncateOutput(output: string, maxLength?: number): string;
|
|
25
|
+
//# sourceMappingURL=agent-spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-spawn.d.ts","sourceRoot":"","sources":["../../../src/server/tools/agent-spawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAgEtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAW7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,MAAM,CAIhF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawn — Fresh Claude process spawning and output management.
|
|
3
|
+
*
|
|
4
|
+
* Handles the actual child process lifecycle: spawn, timeout, output
|
|
5
|
+
* capture, memory limits, and cleanup.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { existsSync, readdirSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
/** Max output size to prevent context explosion (100KB) */
|
|
12
|
+
const MAX_OUTPUT_SIZE = 100 * 1024;
|
|
13
|
+
/**
|
|
14
|
+
* Spawn a fresh Claude process and capture its output.
|
|
15
|
+
* Removes CLAUDECODE env var so child doesn't reject as nested session.
|
|
16
|
+
*/
|
|
17
|
+
export function spawnAgent(agent, input, timeoutMs, model, isolation) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
let settled = false;
|
|
20
|
+
const settle = (fn, value) => {
|
|
21
|
+
if (settled)
|
|
22
|
+
return;
|
|
23
|
+
settled = true;
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
fn(value);
|
|
26
|
+
};
|
|
27
|
+
const childEnv = { ...process.env };
|
|
28
|
+
delete childEnv.CLAUDECODE;
|
|
29
|
+
const spawnArgs = [
|
|
30
|
+
'--agent', agent,
|
|
31
|
+
'-p',
|
|
32
|
+
'--permission-mode', 'acceptEdits',
|
|
33
|
+
'--output-format', 'text',
|
|
34
|
+
];
|
|
35
|
+
if (isolation === 'worktree') {
|
|
36
|
+
spawnArgs.push('--worktree');
|
|
37
|
+
}
|
|
38
|
+
if (model) {
|
|
39
|
+
spawnArgs.push('--model', model);
|
|
40
|
+
}
|
|
41
|
+
const proc = spawn('claude', spawnArgs, {
|
|
42
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
43
|
+
env: childEnv,
|
|
44
|
+
});
|
|
45
|
+
let stdout = '';
|
|
46
|
+
let stderr = '';
|
|
47
|
+
proc.stdout.on('data', (data) => {
|
|
48
|
+
stdout += data.toString();
|
|
49
|
+
if (stdout.length > MAX_OUTPUT_SIZE) {
|
|
50
|
+
proc.kill('SIGTERM');
|
|
51
|
+
settle(reject, new Error('Agent output exceeded 100KB limit'));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
proc.stderr.on('data', (data) => {
|
|
55
|
+
stderr += data.toString();
|
|
56
|
+
});
|
|
57
|
+
proc.stdin.write(input);
|
|
58
|
+
proc.stdin.end();
|
|
59
|
+
const timer = setTimeout(() => {
|
|
60
|
+
proc.kill('SIGTERM');
|
|
61
|
+
settle(reject, new Error(`Agent timed out after ${Math.round(timeoutMs / 60000)} minutes`));
|
|
62
|
+
}, timeoutMs);
|
|
63
|
+
proc.on('close', (code) => {
|
|
64
|
+
settle(resolve, { stdout, stderr, exitCode: code });
|
|
65
|
+
});
|
|
66
|
+
proc.on('error', (err) => {
|
|
67
|
+
settle(reject, err);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get list of available agent names from ~/.claude/agents/ and .claude/agents/
|
|
73
|
+
*/
|
|
74
|
+
export function getAvailableAgents() {
|
|
75
|
+
const agents = new Set();
|
|
76
|
+
const globalDir = join(homedir(), '.claude', 'agents');
|
|
77
|
+
if (existsSync(globalDir)) {
|
|
78
|
+
readdirSync(globalDir).filter(f => f.endsWith('.md')).forEach(f => agents.add(f.replace('.md', '')));
|
|
79
|
+
}
|
|
80
|
+
const localDir = join(process.cwd(), '.claude', 'agents');
|
|
81
|
+
if (existsSync(localDir)) {
|
|
82
|
+
readdirSync(localDir).filter(f => f.endsWith('.md')).forEach(f => agents.add(f.replace('.md', '')));
|
|
83
|
+
}
|
|
84
|
+
return [...agents].sort();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Truncate output to prevent context window explosion.
|
|
88
|
+
*/
|
|
89
|
+
export function truncateOutput(output, maxLength = 50000) {
|
|
90
|
+
if (output.length <= maxLength)
|
|
91
|
+
return output;
|
|
92
|
+
const truncated = output.slice(0, maxLength);
|
|
93
|
+
return truncated + `\n\n... [Output truncated at ${maxLength} chars. Full output was ${output.length} chars]`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=agent-spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-spawn.js","sourceRoot":"","sources":["../../../src/server/tools/agent-spawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAG7B,2DAA2D;AAC3D,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,KAAa,EACb,SAAiB,EACjB,KAAc,EACd,SAAyB;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,EAAkC,EAAE,KAAU,EAAE,EAAE;YAChE,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC;QAE3B,MAAM,SAAS,GAAG;YAChB,SAAS,EAAE,KAAK;YAChB,IAAI;YACJ,mBAAmB,EAAE,aAAa;YAClC,iBAAiB,EAAE,MAAM;SAC1B,CAAC;QAEF,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE;YACtC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAEjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,YAAoB,KAAK;IACtE,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,SAAS,GAAG,gCAAgC,SAAS,2BAA2B,MAAM,CAAC,MAAM,SAAS,CAAC;AAChH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Augmentation — Cloud agent discovery, caching, and expertise injection.
|
|
3
|
+
*
|
|
4
|
+
* When a task matches a cloud-indexed agent (A/A+/A++), this module:
|
|
5
|
+
* 1. Discovers the match via catalog search
|
|
6
|
+
* 2. Fetches the agent's system prompt (cache-first, API fallback)
|
|
7
|
+
* 3. Returns structured data for handoff injection
|
|
8
|
+
*
|
|
9
|
+
* Cache: ~/.claude/agents/_cloud/<slug>.md
|
|
10
|
+
* - 7-day TTL with stale-while-revalidate fallback
|
|
11
|
+
* - 50-file LRU cap with mtime-based eviction
|
|
12
|
+
* - Underscore prefix keeps _cloud/ out of agent loader's flat directory scan
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolContext } from './types.js';
|
|
15
|
+
import type { AugmentationResult } from '../api/types.js';
|
|
16
|
+
/** Discovery result from catalog search */
|
|
17
|
+
export interface DiscoveryHint {
|
|
18
|
+
name: string;
|
|
19
|
+
grade: string;
|
|
20
|
+
description: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Discovery-first routing: check the catalog for a better-fit
|
|
25
|
+
* community/specialist agent. Returns a hint if a high-scoring
|
|
26
|
+
* match exists (A/A+/A++), otherwise null.
|
|
27
|
+
*/
|
|
28
|
+
export declare function discoverBetterAgent(client: ToolContext['client'], task: string, chosenAgent: string): Promise<DiscoveryHint | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Check whether an agent should be augmented.
|
|
31
|
+
* Returns true for all code-writing agents (opt-out model).
|
|
32
|
+
*/
|
|
33
|
+
export declare function shouldAugment(agent: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Fetch augmentation data for a discovered cloud agent.
|
|
36
|
+
* Checks local disk cache first, falls back to API, caches result.
|
|
37
|
+
* Returns null silently on any failure — augmentation never blocks routing.
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchAugmentation(client: ToolContext['client'], hint: DiscoveryHint): Promise<AugmentationResult | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Build the domain expertise handoff section from augmentation data.
|
|
42
|
+
* Caps injected content at 4000 characters.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildAugmentationSection(augmentation: AugmentationResult): string[];
|
|
45
|
+
//# sourceMappingURL=augmentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augmentation.d.ts","sourceRoot":"","sources":["../../../src/server/tools/augmentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAY1D,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAsED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmB/B;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA0BpC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAiBnF"}
|