@brutalist/mcp 0.8.1 → 1.0.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 +34 -7
- package/dist/brutalist-server.d.ts +55 -16
- package/dist/brutalist-server.d.ts.map +1 -1
- package/dist/brutalist-server.js +550 -732
- package/dist/brutalist-server.js.map +1 -1
- package/dist/cli-agents.d.ts +9 -7
- package/dist/cli-agents.d.ts.map +1 -1
- package/dist/cli-agents.js +290 -202
- package/dist/cli-agents.js.map +1 -1
- package/dist/domains/argument-space.d.ts +12 -3
- package/dist/domains/argument-space.d.ts.map +1 -1
- package/dist/domains/argument-space.js +30 -23
- package/dist/domains/argument-space.js.map +1 -1
- package/dist/domains/critique-domain.d.ts +12 -0
- package/dist/domains/critique-domain.d.ts.map +1 -1
- package/dist/domains/critique-domain.js +12 -1
- package/dist/domains/critique-domain.js.map +1 -1
- package/dist/formatting/response-formatter.d.ts +43 -0
- package/dist/formatting/response-formatter.d.ts.map +1 -0
- package/dist/formatting/response-formatter.js +277 -0
- package/dist/formatting/response-formatter.js.map +1 -0
- package/dist/generators/tool-generator.d.ts.map +1 -1
- package/dist/generators/tool-generator.js +8 -6
- package/dist/generators/tool-generator.js.map +1 -1
- package/dist/handlers/tool-handler.d.ts +33 -0
- package/dist/handlers/tool-handler.d.ts.map +1 -0
- package/dist/handlers/tool-handler.js +307 -0
- package/dist/handlers/tool-handler.js.map +1 -0
- package/dist/registry/argument-spaces.js +17 -17
- package/dist/registry/argument-spaces.js.map +1 -1
- package/dist/registry/domains.d.ts +10 -0
- package/dist/registry/domains.d.ts.map +1 -1
- package/dist/registry/domains.js +153 -11
- package/dist/registry/domains.js.map +1 -1
- package/dist/system-prompts.d.ts +8 -0
- package/dist/system-prompts.d.ts.map +1 -0
- package/dist/system-prompts.js +596 -0
- package/dist/system-prompts.js.map +1 -0
- package/dist/tool-definitions.d.ts +20 -1
- package/dist/tool-definitions.d.ts.map +1 -1
- package/dist/tool-definitions.js +42 -213
- package/dist/tool-definitions.js.map +1 -1
- package/dist/tool-router.d.ts +12 -0
- package/dist/tool-router.d.ts.map +1 -0
- package/dist/tool-router.js +59 -0
- package/dist/tool-router.js.map +1 -0
- package/dist/transport/http-transport.d.ts +40 -0
- package/dist/transport/http-transport.d.ts.map +1 -0
- package/dist/transport/http-transport.js +182 -0
- package/dist/transport/http-transport.js.map +1 -0
- package/dist/types/brutalist.d.ts +1 -0
- package/dist/types/brutalist.d.ts.map +1 -1
- package/dist/types/tool-config.d.ts +4 -3
- package/dist/types/tool-config.d.ts.map +1 -1
- package/dist/types/tool-config.js +7 -6
- package/dist/types/tool-config.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +13 -6
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
import { extractPaginationParams, parseCursor } from '../utils/pagination.js';
|
|
3
|
+
import { getSystemPrompt } from '../system-prompts.js';
|
|
4
|
+
/**
|
|
5
|
+
* ToolHandler - Handles roast tool execution with caching and pagination
|
|
6
|
+
* Extracted from BrutalistServer to follow Single Responsibility Principle
|
|
7
|
+
*/
|
|
8
|
+
export class ToolHandler {
|
|
9
|
+
cliOrchestrator;
|
|
10
|
+
responseCache;
|
|
11
|
+
formatter;
|
|
12
|
+
config;
|
|
13
|
+
activeSessions;
|
|
14
|
+
handleStreamingEvent;
|
|
15
|
+
handleProgressUpdate;
|
|
16
|
+
ensureSessionCapacity;
|
|
17
|
+
constructor(cliOrchestrator, responseCache, formatter, config, activeSessions, handleStreamingEvent, handleProgressUpdate, ensureSessionCapacity) {
|
|
18
|
+
this.cliOrchestrator = cliOrchestrator;
|
|
19
|
+
this.responseCache = responseCache;
|
|
20
|
+
this.formatter = formatter;
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.activeSessions = activeSessions;
|
|
23
|
+
this.handleStreamingEvent = handleStreamingEvent;
|
|
24
|
+
this.handleProgressUpdate = handleProgressUpdate;
|
|
25
|
+
this.ensureSessionCapacity = ensureSessionCapacity;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Unified handler for all roast tools - DRY principle
|
|
29
|
+
*/
|
|
30
|
+
async handleRoastTool(config, args, extra) {
|
|
31
|
+
try {
|
|
32
|
+
// CRITICAL: Prevent recursion - reject tool calls from brutalist-spawned subprocesses
|
|
33
|
+
if (process.env.BRUTALIST_SUBPROCESS === '1') {
|
|
34
|
+
logger.warn(`🚫 Rejecting tool call from brutalist subprocess (recursion prevented)`);
|
|
35
|
+
return {
|
|
36
|
+
content: [{
|
|
37
|
+
type: "text",
|
|
38
|
+
text: `ERROR: Brutalist MCP tools cannot be used from within a brutalist-spawned CLI subprocess (recursion prevented)`
|
|
39
|
+
}]
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const progressToken = extra._meta?.progressToken;
|
|
43
|
+
// Extract session context for security
|
|
44
|
+
// IMPORTANT: Use consistent "anonymous" for all anonymous users to enable cache sharing
|
|
45
|
+
const sessionId = extra?.sessionId ||
|
|
46
|
+
extra?._meta?.sessionId ||
|
|
47
|
+
extra?.headers?.['mcp-session-id'] ||
|
|
48
|
+
'anonymous'; // Consistent for cache sharing across pagination requests
|
|
49
|
+
const requestId = `${sessionId}-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
50
|
+
logger.debug(`🔐 Processing request with session: ${sessionId.substring(0, 8)}..., request: ${requestId.substring(0, 12)}...`);
|
|
51
|
+
// Track session activity
|
|
52
|
+
if (!this.activeSessions.has(sessionId)) {
|
|
53
|
+
this.ensureSessionCapacity(); // Ensure capacity before adding new session
|
|
54
|
+
this.activeSessions.set(sessionId, {
|
|
55
|
+
startTime: Date.now(),
|
|
56
|
+
requestCount: 0,
|
|
57
|
+
lastActivity: Date.now()
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const sessionInfo = this.activeSessions.get(sessionId);
|
|
61
|
+
sessionInfo.requestCount++;
|
|
62
|
+
sessionInfo.lastActivity = Date.now();
|
|
63
|
+
logger.debug(`Tool execution: ${config.name}, primaryArgField=${config.primaryArgField}`);
|
|
64
|
+
logger.debug(`Args: ${JSON.stringify(args, null, 2)}`);
|
|
65
|
+
// Extract pagination parameters
|
|
66
|
+
const paginationParams = extractPaginationParams(args);
|
|
67
|
+
if (args.cursor) {
|
|
68
|
+
const cursorParams = parseCursor(args.cursor);
|
|
69
|
+
Object.assign(paginationParams, cursorParams);
|
|
70
|
+
}
|
|
71
|
+
// Determine if pagination was explicitly requested by the user
|
|
72
|
+
const explicitPaginationRequested = args.offset !== undefined ||
|
|
73
|
+
args.limit !== undefined ||
|
|
74
|
+
args.cursor !== undefined ||
|
|
75
|
+
args.context_id !== undefined;
|
|
76
|
+
logger.info(`🔧 DEBUG: explicitPaginationRequested=${explicitPaginationRequested}, offset=${args.offset}, limit=${args.limit}, cursor=${args.cursor}, context_id=${args.context_id}, resume=${args.resume}`);
|
|
77
|
+
// Validate resume flag requires context_id
|
|
78
|
+
if (args.resume && !args.context_id) {
|
|
79
|
+
throw new Error(`The 'resume' flag requires a 'context_id' from a previous response. ` +
|
|
80
|
+
`Run an initial analysis first, then use the returned context_id with resume: true.`);
|
|
81
|
+
}
|
|
82
|
+
// Check cache if context_id provided
|
|
83
|
+
// Two modes: PAGINATION (context_id alone) vs CONTINUATION (context_id + resume: true)
|
|
84
|
+
let conversationHistory;
|
|
85
|
+
let resumeFollowUpQuestion; // Store follow-up for conversation history
|
|
86
|
+
let resumeOriginalParams; // Original params for filesystem tools
|
|
87
|
+
if (args.context_id && !args.force_refresh) {
|
|
88
|
+
const cachedResponse = await this.responseCache.getByContextId(args.context_id, sessionId);
|
|
89
|
+
if (cachedResponse) {
|
|
90
|
+
logger.info(`🎯 Cache HIT for context_id: ${args.context_id}`);
|
|
91
|
+
if (args.resume === true) {
|
|
92
|
+
// CONVERSATION CONTINUATION: User explicitly wants to continue with history injection
|
|
93
|
+
const textContent = args.content || args.idea || args.architecture || args.research || args.product || args.security || args.infrastructure;
|
|
94
|
+
const primaryArg = textContent || args[config.primaryArgField];
|
|
95
|
+
if (!primaryArg || primaryArg.trim() === '') {
|
|
96
|
+
throw new Error(`Conversation continuation (resume: true) requires new content/prompt. ` +
|
|
97
|
+
`Provide your follow-up question or comment in the content field.`);
|
|
98
|
+
}
|
|
99
|
+
// Store the follow-up question for conversation history
|
|
100
|
+
resumeFollowUpQuestion = primaryArg;
|
|
101
|
+
// Store original request params (for filesystem tools that need original targetPath)
|
|
102
|
+
resumeOriginalParams = cachedResponse.requestParams;
|
|
103
|
+
logger.info(`💬 Conversation continuation - new prompt: "${primaryArg.substring(0, 50)}..."`);
|
|
104
|
+
conversationHistory = cachedResponse.conversationHistory || [];
|
|
105
|
+
// Fall through to execute new analysis with history
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// PAGINATION: Just retrieving previous response (no resume flag)
|
|
109
|
+
logger.info(`📖 Pagination request - returning cached response`);
|
|
110
|
+
const cachedResult = {
|
|
111
|
+
success: true,
|
|
112
|
+
responses: [{
|
|
113
|
+
agent: 'cached',
|
|
114
|
+
success: true,
|
|
115
|
+
output: cachedResponse.content,
|
|
116
|
+
executionTime: 0
|
|
117
|
+
}]
|
|
118
|
+
};
|
|
119
|
+
return this.formatter.formatToolResponse(cachedResult, args.verbose, paginationParams, args.context_id, explicitPaginationRequested);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
logger.warn(`❌ Cache MISS for context_id: ${args.context_id}, session: ${sessionId}`);
|
|
124
|
+
throw new Error(`Context ID "${args.context_id}" not found in cache. ` +
|
|
125
|
+
`It may have expired (2 hour TTL) or belong to a different session. ` +
|
|
126
|
+
`Remove context_id parameter to run a new analysis.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Generate cache key for this request
|
|
130
|
+
const cacheKey = this.responseCache.generateCacheKey(config.cacheKeyFields.reduce((acc, field) => {
|
|
131
|
+
acc.tool = config.name;
|
|
132
|
+
if (args[field] !== undefined)
|
|
133
|
+
acc[field] = args[field];
|
|
134
|
+
return acc;
|
|
135
|
+
}, {}));
|
|
136
|
+
// Check if we have a cached result (unless forcing refresh)
|
|
137
|
+
if (!args.force_refresh) {
|
|
138
|
+
const cachedContent = await this.responseCache.get(cacheKey, sessionId);
|
|
139
|
+
if (cachedContent) {
|
|
140
|
+
// Get existing context_id or create new alias
|
|
141
|
+
const existingContextId = this.responseCache.findContextIdForKey(cacheKey);
|
|
142
|
+
const contextId = existingContextId
|
|
143
|
+
? this.responseCache.createAlias(existingContextId, cacheKey)
|
|
144
|
+
: this.responseCache.generateContextId(cacheKey);
|
|
145
|
+
logger.info(`🎯 Cache hit for new request, using context_id: ${contextId}`);
|
|
146
|
+
const cachedResult = {
|
|
147
|
+
success: true,
|
|
148
|
+
responses: [{
|
|
149
|
+
agent: 'cached',
|
|
150
|
+
success: true,
|
|
151
|
+
output: cachedContent,
|
|
152
|
+
executionTime: 0
|
|
153
|
+
}]
|
|
154
|
+
};
|
|
155
|
+
return this.formatter.formatToolResponse(cachedResult, args.verbose, paginationParams, contextId, explicitPaginationRequested);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Build context with custom builder if available
|
|
159
|
+
let context = config.contextBuilder ? config.contextBuilder(args) : args.context;
|
|
160
|
+
// Get the primary argument (targetPath or content)
|
|
161
|
+
// All abstract tools now use 'content', filesystem tools use 'targetPath'
|
|
162
|
+
let primaryArg = args[config.primaryArgField];
|
|
163
|
+
// For resume mode with filesystem tools, use original targetPath from cached params
|
|
164
|
+
// and inject the follow-up question into context instead
|
|
165
|
+
const filesystemTools = ['codebase', 'fileStructure', 'dependencies', 'gitHistory', 'testCoverage'];
|
|
166
|
+
if (resumeOriginalParams && filesystemTools.includes(config.analysisType)) {
|
|
167
|
+
// Use original targetPath for the CLI execution (needed for path validation)
|
|
168
|
+
const originalTargetPath = resumeOriginalParams.targetPath;
|
|
169
|
+
if (originalTargetPath) {
|
|
170
|
+
logger.info(`🔄 Resume mode: Using original targetPath="${originalTargetPath}" for filesystem tool`);
|
|
171
|
+
primaryArg = originalTargetPath;
|
|
172
|
+
// Also restore workingDirectory if available
|
|
173
|
+
if (resumeOriginalParams.workingDirectory) {
|
|
174
|
+
args.workingDirectory = resumeOriginalParams.workingDirectory;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Validate that primary argument is provided
|
|
179
|
+
if (!primaryArg) {
|
|
180
|
+
throw new Error(`Missing required argument: ${config.primaryArgField}`);
|
|
181
|
+
}
|
|
182
|
+
// Type narrowing: primaryArg is now guaranteed to be a string
|
|
183
|
+
const validatedPrimaryArg = primaryArg;
|
|
184
|
+
// If we have conversation history, inject it into the context
|
|
185
|
+
if (conversationHistory && conversationHistory.length > 0) {
|
|
186
|
+
const conversationContext = conversationHistory.map(msg => {
|
|
187
|
+
const role = msg.role === 'user' ? 'User' : 'Assistant';
|
|
188
|
+
return `${role}: ${msg.content}`;
|
|
189
|
+
}).join('\n\n---\n\n');
|
|
190
|
+
// For resume mode, inject the follow-up question into the context
|
|
191
|
+
const followUpContent = resumeFollowUpQuestion || '';
|
|
192
|
+
const contextPrefix = `## Previous Conversation\n\n${conversationContext}\n\n---\n\n## New User Prompt\n\n${followUpContent}\n\n`;
|
|
193
|
+
context = contextPrefix + (context || '');
|
|
194
|
+
logger.info(`💬 Injected ${conversationHistory.length} previous messages into context`);
|
|
195
|
+
}
|
|
196
|
+
logger.debug(`Primary arg: ${config.primaryArgField}="${validatedPrimaryArg}", analysisType="${config.analysisType}"`);
|
|
197
|
+
// Get system prompt (from deprecated field or system-prompts.ts)
|
|
198
|
+
const systemPrompt = config.systemPrompt || getSystemPrompt(config.analysisType);
|
|
199
|
+
// Run the analysis
|
|
200
|
+
const result = await this.executeBrutalistAnalysis(config.analysisType, validatedPrimaryArg, systemPrompt, context, args.workingDirectory, args.clis, args.verbose, args.models, progressToken, sessionId, requestId);
|
|
201
|
+
// Cache the result if successful
|
|
202
|
+
let contextId;
|
|
203
|
+
if (result.success && result.responses.length > 0) {
|
|
204
|
+
const fullContent = this.formatter.extractFullContent(result);
|
|
205
|
+
if (fullContent) {
|
|
206
|
+
const cacheData = config.cacheKeyFields.reduce((acc, field) => {
|
|
207
|
+
acc.tool = config.name;
|
|
208
|
+
if (args[field] !== undefined)
|
|
209
|
+
acc[field] = args[field];
|
|
210
|
+
return acc;
|
|
211
|
+
}, {});
|
|
212
|
+
// Build updated conversation history
|
|
213
|
+
// For resume mode, use the follow-up question; otherwise use primaryArg
|
|
214
|
+
const now = Date.now();
|
|
215
|
+
const userMessageContent = resumeFollowUpQuestion || primaryArg;
|
|
216
|
+
const updatedConversation = [
|
|
217
|
+
...(conversationHistory || []),
|
|
218
|
+
{ role: 'user', content: userMessageContent, timestamp: now },
|
|
219
|
+
{ role: 'assistant', content: fullContent, timestamp: now }
|
|
220
|
+
];
|
|
221
|
+
// If continuing a conversation (resume: true), update existing context_id
|
|
222
|
+
if (args.resume && args.context_id && conversationHistory) {
|
|
223
|
+
// Update existing cache entry with extended conversation
|
|
224
|
+
contextId = args.context_id;
|
|
225
|
+
await this.responseCache.updateByContextId(contextId, fullContent, updatedConversation, sessionId || 'anonymous');
|
|
226
|
+
logger.info(`✅ Updated conversation ${contextId} (now ${updatedConversation.length} messages)`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// New conversation - create new context_id
|
|
230
|
+
const { contextId: newId } = await this.responseCache.set(cacheData, fullContent, cacheKey, sessionId, requestId, updatedConversation);
|
|
231
|
+
contextId = newId;
|
|
232
|
+
logger.info(`✅ Cached new conversation with context ID: ${contextId} for session: ${sessionId?.substring(0, 8)}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return this.formatter.formatToolResponse(result, args.verbose, paginationParams, contextId, explicitPaginationRequested);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
return this.formatter.formatErrorResponse(error);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Execute brutalist analysis with CLI orchestrator
|
|
244
|
+
*/
|
|
245
|
+
async executeBrutalistAnalysis(analysisType, primaryContent, systemPromptSpec, context, workingDirectory, clis, verbose, models, progressToken, sessionId, requestId) {
|
|
246
|
+
logger.info(`🏢 Starting brutalist analysis: ${analysisType}`);
|
|
247
|
+
logger.info(`🔧 DEBUG: clis=${clis?.join(',') || 'all'}, primaryContent=${primaryContent}`);
|
|
248
|
+
logger.debug("Executing brutalist analysis", {
|
|
249
|
+
primaryContent,
|
|
250
|
+
analysisType,
|
|
251
|
+
systemPromptSpec,
|
|
252
|
+
workingDirectory,
|
|
253
|
+
clis
|
|
254
|
+
});
|
|
255
|
+
try {
|
|
256
|
+
// Get CLI context for execution summary
|
|
257
|
+
logger.info(`🔧 DEBUG: About to detect CLI context`);
|
|
258
|
+
await this.cliOrchestrator.detectCLIContext();
|
|
259
|
+
logger.info(`🔧 DEBUG: CLI context detected successfully`);
|
|
260
|
+
// Execute CLI agent analysis (single or multi-CLI based on preferences)
|
|
261
|
+
logger.info(`🔍 Executing brutalist analysis with timeout: ${this.config.defaultTimeout}ms`);
|
|
262
|
+
logger.info(`🔧 DEBUG: About to call cliOrchestrator.executeBrutalistAnalysis`);
|
|
263
|
+
const responses = await this.cliOrchestrator.executeBrutalistAnalysis(analysisType, primaryContent, systemPromptSpec, context, {
|
|
264
|
+
workingDirectory: workingDirectory || this.config.workingDirectory,
|
|
265
|
+
timeout: this.config.defaultTimeout,
|
|
266
|
+
clis,
|
|
267
|
+
analysisType: analysisType,
|
|
268
|
+
models,
|
|
269
|
+
onStreamingEvent: this.handleStreamingEvent,
|
|
270
|
+
progressToken,
|
|
271
|
+
onProgress: progressToken && sessionId ?
|
|
272
|
+
(progress, total, message) => this.handleProgressUpdate(progressToken, progress, total, message, sessionId) : undefined,
|
|
273
|
+
sessionId,
|
|
274
|
+
requestId
|
|
275
|
+
});
|
|
276
|
+
logger.info(`🔧 DEBUG: cliOrchestrator.executeBrutalistAnalysis returned ${responses.length} responses`);
|
|
277
|
+
const successfulResponses = responses.filter(r => r.success);
|
|
278
|
+
const totalExecutionTime = responses.reduce((sum, r) => sum + r.executionTime, 0);
|
|
279
|
+
logger.info(`📊 Analysis complete: ${successfulResponses.length}/${responses.length} CLIs successful (${totalExecutionTime}ms total)`);
|
|
280
|
+
logger.info(`🔧 DEBUG: About to synthesize feedback`);
|
|
281
|
+
const synthesis = this.cliOrchestrator.synthesizeBrutalistFeedback(responses, analysisType);
|
|
282
|
+
logger.info(`🔧 DEBUG: Synthesis length: ${synthesis.length} characters`);
|
|
283
|
+
const result = {
|
|
284
|
+
success: successfulResponses.length > 0,
|
|
285
|
+
responses,
|
|
286
|
+
synthesis,
|
|
287
|
+
analysisType,
|
|
288
|
+
targetPath: primaryContent,
|
|
289
|
+
executionSummary: {
|
|
290
|
+
totalCLIs: responses.length,
|
|
291
|
+
successfulCLIs: successfulResponses.length,
|
|
292
|
+
failedCLIs: responses.length - successfulResponses.length,
|
|
293
|
+
totalExecutionTime,
|
|
294
|
+
selectedCLI: responses.length === 1 ? responses[0].agent : undefined,
|
|
295
|
+
selectionMethod: responses.length === 1 ? responses[0].selectionMethod : 'multi-cli'
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
logger.info(`🔧 DEBUG: Returning result with success=${result.success}`);
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
logger.error("Brutalist analysis execution failed", error);
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=tool-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-handler.js","sourceRoot":"","sources":["../../src/handlers/tool-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,8 @@ export const ARGUMENT_SPACES = {
|
|
|
27
27
|
name: 'Extended Text Input',
|
|
28
28
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
29
29
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
30
|
-
resources: z.string().optional().describe("Available resources (budget, team, time
|
|
31
|
-
timeline: z.string().optional().describe("Expected timeline
|
|
30
|
+
resources: z.string().optional().describe("Available resources (budget, team, time)"),
|
|
31
|
+
timeline: z.string().optional().describe("Expected timeline")
|
|
32
32
|
}),
|
|
33
33
|
computed: (args) => ({
|
|
34
34
|
workingDirectory: args.targetPath || '.',
|
|
@@ -41,9 +41,9 @@ export const ARGUMENT_SPACES = {
|
|
|
41
41
|
name: 'Architecture Specific',
|
|
42
42
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
43
43
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
44
|
-
scale: z.string().optional().describe("Expected scale/load
|
|
45
|
-
constraints: z.string().optional().describe("
|
|
46
|
-
deployment: z.string().optional().describe("Deployment
|
|
44
|
+
scale: z.string().optional().describe("Expected scale/load"),
|
|
45
|
+
constraints: z.string().optional().describe("Technical/budget constraints"),
|
|
46
|
+
deployment: z.string().optional().describe("Deployment strategy")
|
|
47
47
|
}),
|
|
48
48
|
computed: (args) => ({
|
|
49
49
|
workingDirectory: args.targetPath || '.',
|
|
@@ -57,9 +57,9 @@ export const ARGUMENT_SPACES = {
|
|
|
57
57
|
name: 'Research Specific',
|
|
58
58
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
59
59
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
60
|
-
field: z.string().optional().describe("Research field
|
|
61
|
-
claims: z.string().optional().describe("Main claims
|
|
62
|
-
data: z.string().optional().describe("Data sources
|
|
60
|
+
field: z.string().optional().describe("Research field"),
|
|
61
|
+
claims: z.string().optional().describe("Main claims"),
|
|
62
|
+
data: z.string().optional().describe("Data sources/setup")
|
|
63
63
|
}),
|
|
64
64
|
computed: (args) => ({
|
|
65
65
|
workingDirectory: args.targetPath || '.',
|
|
@@ -73,9 +73,9 @@ export const ARGUMENT_SPACES = {
|
|
|
73
73
|
name: 'Security Specific',
|
|
74
74
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
75
75
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
76
|
-
assets: z.string().optional().describe("Critical assets
|
|
77
|
-
threatModel: z.string().optional().describe("Known threats
|
|
78
|
-
compliance: z.string().optional().describe("Compliance requirements
|
|
76
|
+
assets: z.string().optional().describe("Critical assets to protect"),
|
|
77
|
+
threatModel: z.string().optional().describe("Known threats"),
|
|
78
|
+
compliance: z.string().optional().describe("Compliance requirements")
|
|
79
79
|
}),
|
|
80
80
|
computed: (args) => ({
|
|
81
81
|
workingDirectory: args.targetPath || '.',
|
|
@@ -89,9 +89,9 @@ export const ARGUMENT_SPACES = {
|
|
|
89
89
|
name: 'Product Specific',
|
|
90
90
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
91
91
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
92
|
-
users: z.string().optional().describe("Target users
|
|
93
|
-
competition: z.string().optional().describe("
|
|
94
|
-
metrics: z.string().optional().describe("Success metrics
|
|
92
|
+
users: z.string().optional().describe("Target users"),
|
|
93
|
+
competition: z.string().optional().describe("Competitors"),
|
|
94
|
+
metrics: z.string().optional().describe("Success metrics")
|
|
95
95
|
}),
|
|
96
96
|
computed: (args) => ({
|
|
97
97
|
workingDirectory: args.targetPath || '.',
|
|
@@ -105,9 +105,9 @@ export const ARGUMENT_SPACES = {
|
|
|
105
105
|
name: 'Infrastructure Specific',
|
|
106
106
|
base: FILESYSTEM_ARGUMENT_SPACE.base,
|
|
107
107
|
domain: TEXT_INPUT_ARGUMENT_SPACE.domain.extend({
|
|
108
|
-
scale: z.string().optional().describe("Expected scale
|
|
109
|
-
sla: z.string().optional().describe("SLA
|
|
110
|
-
budget: z.string().optional().describe("
|
|
108
|
+
scale: z.string().optional().describe("Expected scale"),
|
|
109
|
+
sla: z.string().optional().describe("SLA/uptime targets"),
|
|
110
|
+
budget: z.string().optional().describe("Cost constraints")
|
|
111
111
|
}),
|
|
112
112
|
computed: (args) => ({
|
|
113
113
|
workingDirectory: args.targetPath || '.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argument-spaces.js","sourceRoot":"","sources":["../../src/registry/argument-spaces.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,yBAAyB,EACzB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,+BAA+B;IAC/B,UAAU,EAAE,yBAAyB;IAErC,gEAAgE;IAChE,UAAU,EAAE,yBAAyB;IAErC,mEAAmE;IACnE,gBAAgB,EAAE,qBAAqB;IAEvC,4BAA4B;IAC5B,gBAAgB,EAAE,sBAAsB;IAExC,0BAA0B;IAC1B,cAAc,EAAE,oBAAoB;IAEpC,sBAAsB;IACtB,UAAU,EAAE,gBAAgB;IAE5B,qDAAqD;IACrD,mBAAmB,EAAE;QACnB,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,yBAAyB,CAAC,IAAI;QACpC,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"argument-spaces.js","sourceRoot":"","sources":["../../src/registry/argument-spaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* These are extracted from the original TOOL_CONFIGS and elevated to first-class abstractions.
|
|
5
5
|
*/
|
|
6
6
|
import { CritiqueDomain } from '../domains/critique-domain.js';
|
|
7
|
+
import { ToolConfig } from '../types/tool-config.js';
|
|
7
8
|
export declare const DOMAINS: Record<string, CritiqueDomain>;
|
|
8
9
|
/**
|
|
9
10
|
* Helper to get a domain by ID
|
|
@@ -21,4 +22,13 @@ export declare function findDomainsByCapability(capability: string): CritiqueDom
|
|
|
21
22
|
* Helper to find domains by artifact type
|
|
22
23
|
*/
|
|
23
24
|
export declare function findDomainsByArtifactType(artifactType: string): CritiqueDomain[];
|
|
25
|
+
/**
|
|
26
|
+
* Generate a ToolConfig from a CritiqueDomain.
|
|
27
|
+
* This is the canonical way to create tools - no more duplication.
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateToolConfig(domain: CritiqueDomain): ToolConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Generate all tool configs from the domain registry.
|
|
32
|
+
*/
|
|
33
|
+
export declare function generateAllToolConfigs(): ToolConfig[];
|
|
24
34
|
//# sourceMappingURL=domains.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/registry/domains.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/registry/domains.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA8KlD,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAI5E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,EAAE,CAIhF;AAwDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAsBrE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,EAAE,CAErD"}
|