@synergenius/flow-weaver-pack-weaver 0.9.185 → 0.9.187
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/dist/bot/agent-loop.d.ts +20 -0
- package/dist/bot/agent-loop.d.ts.map +1 -0
- package/dist/bot/agent-loop.js +331 -0
- package/dist/bot/agent-loop.js.map +1 -0
- package/dist/bot/capability-registry.d.ts.map +1 -1
- package/dist/bot/capability-registry.js +15 -0
- package/dist/bot/capability-registry.js.map +1 -1
- package/dist/bot/error-guide.d.ts +5 -0
- package/dist/bot/error-guide.d.ts.map +1 -0
- package/dist/bot/error-guide.js +5 -0
- package/dist/bot/error-guide.js.map +1 -0
- package/dist/bot/retry-utils.d.ts +5 -0
- package/dist/bot/retry-utils.d.ts.map +1 -0
- package/dist/bot/retry-utils.js +5 -0
- package/dist/bot/retry-utils.js.map +1 -0
- package/dist/bot/session-state.d.ts +25 -0
- package/dist/bot/session-state.d.ts.map +1 -0
- package/dist/bot/session-state.js +110 -0
- package/dist/bot/session-state.js.map +1 -0
- package/dist/bot/task-queue.d.ts +46 -0
- package/dist/bot/task-queue.d.ts.map +1 -0
- package/dist/bot/task-queue.js +237 -0
- package/dist/bot/task-queue.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/docs/weaver-config.md +14 -28
- package/dist/node-types/receive-task.js.bak +38 -0
- package/dist/templates/weaver-template.d.ts +11 -0
- package/dist/templates/weaver-template.d.ts.map +1 -0
- package/dist/templates/weaver-template.js +53 -0
- package/dist/templates/weaver-template.js.map +1 -0
- package/dist/ui/capability-editor.js +15 -0
- package/dist/ui/profile-editor.js +15 -0
- package/dist/ui/swarm-dashboard.js +15 -0
- package/dist/ui/task-create-form.js +98 -0
- package/dist/workflows/weaver-bot-session.d.ts +65 -0
- package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
- package/dist/workflows/weaver-bot-session.js +68 -0
- package/dist/workflows/weaver-bot-session.js.map +1 -0
- package/dist/workflows/weaver.d.ts +24 -0
- package/dist/workflows/weaver.d.ts.map +1 -0
- package/dist/workflows/weaver.js +28 -0
- package/dist/workflows/weaver.js.map +1 -0
- package/flowweaver.manifest.json +1 -1
- package/package.json +1 -1
- package/src/bot/capability-registry.ts +15 -0
- package/dist/docs/weaver-bot-usage.md +0 -51
- package/dist/docs/weaver-genesis.md +0 -32
- package/dist/docs/weaver-task-queue.md +0 -46
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool-use agent loop — Claude drives the entire task via tool calls.
|
|
3
|
+
*
|
|
4
|
+
* Instead of plan → execute → retry, the AI calls tools directly:
|
|
5
|
+
* validate → sees errors → read_file → sees code → patch_file → validate → done
|
|
6
|
+
*
|
|
7
|
+
* Supports two providers:
|
|
8
|
+
* - Anthropic API: direct streaming with tool_use blocks
|
|
9
|
+
* - Claude CLI: fallback via callCliAsync (no tool loop, uses --json-schema)
|
|
10
|
+
*/
|
|
11
|
+
import type { ProviderInfo, StepLogEntry } from './types.js';
|
|
12
|
+
export interface AgentLoopResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
summary: string;
|
|
15
|
+
filesModified: string[];
|
|
16
|
+
stepLog: StepLogEntry[];
|
|
17
|
+
toolCallCount: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function runAgentLoop(pInfo: Pick<ProviderInfo, 'type' | 'apiKey' | 'model' | 'maxTokens'>, systemPrompt: string, taskPrompt: string, projectDir: string, maxIterations?: number): Promise<AgentLoopResult>;
|
|
20
|
+
//# sourceMappingURL=agent-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../src/bot/agent-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqH7D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAaD,wBAAsB,YAAY,CAChC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC,EACpE,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,SAAK,GACjB,OAAO,CAAC,eAAe,CAAC,CA8E1B"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool-use agent loop — Claude drives the entire task via tool calls.
|
|
3
|
+
*
|
|
4
|
+
* Instead of plan → execute → retry, the AI calls tools directly:
|
|
5
|
+
* validate → sees errors → read_file → sees code → patch_file → validate → done
|
|
6
|
+
*
|
|
7
|
+
* Supports two providers:
|
|
8
|
+
* - Anthropic API: direct streaming with tool_use blocks
|
|
9
|
+
* - Claude CLI: fallback via callCliAsync (no tool loop, uses --json-schema)
|
|
10
|
+
*/
|
|
11
|
+
import { executeStep } from './step-executor.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Tool definitions
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const TOOLS = [
|
|
16
|
+
{
|
|
17
|
+
name: 'validate',
|
|
18
|
+
description: 'Run flow-weaver validate on a workflow file. Returns JSON with errors and warnings. Use this FIRST to discover issues, and AFTER patching to confirm fixes.',
|
|
19
|
+
input_schema: { type: 'object', properties: { file: { type: 'string', description: 'Path to the workflow file to validate' } }, required: ['file'] },
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'read_file',
|
|
23
|
+
description: 'Read a file and return its full contents. Use this to understand file structure before patching.',
|
|
24
|
+
input_schema: { type: 'object', properties: { file: { type: 'string', description: 'Path to the file to read' } }, required: ['file'] },
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'patch_file',
|
|
28
|
+
description: 'Apply surgical find-and-replace patches to a file. Each patch must have exact "find" and "replace" strings. Preferred over write_file for modifications.',
|
|
29
|
+
input_schema: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
file: { type: 'string', description: 'Path to the file to patch' },
|
|
33
|
+
patches: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
items: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {
|
|
38
|
+
find: { type: 'string', description: 'Exact string to find' },
|
|
39
|
+
replace: { type: 'string', description: 'String to replace with' },
|
|
40
|
+
},
|
|
41
|
+
required: ['find', 'replace'],
|
|
42
|
+
},
|
|
43
|
+
description: 'Array of find/replace patches',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ['file', 'patches'],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'run_shell',
|
|
51
|
+
description: 'Execute a shell command and return output. Use for: npx flow-weaver validate, git status, etc. Blocked: rm -rf, git push, sudo.',
|
|
52
|
+
input_schema: { type: 'object', properties: { command: { type: 'string', description: 'Shell command to execute' } }, required: ['command'] },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'list_files',
|
|
56
|
+
description: 'List files in a directory, optionally filtered by regex pattern.',
|
|
57
|
+
input_schema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
directory: { type: 'string', description: 'Directory to list' },
|
|
61
|
+
pattern: { type: 'string', description: 'Optional regex filter pattern' },
|
|
62
|
+
},
|
|
63
|
+
required: ['directory'],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'write_file',
|
|
68
|
+
description: 'Write content to a file (creates or overwrites). Use patch_file instead for modifications to existing files.',
|
|
69
|
+
input_schema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: {
|
|
72
|
+
file: { type: 'string', description: 'Path to the file to write' },
|
|
73
|
+
content: { type: 'string', description: 'Complete file content' },
|
|
74
|
+
},
|
|
75
|
+
required: ['file', 'content'],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Tool execution — delegates to step-executor with all safety guards
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
async function executeTool(name, args, projectDir) {
|
|
83
|
+
// Map tool names to step-executor operations
|
|
84
|
+
const operationMap = {
|
|
85
|
+
validate: 'run-shell',
|
|
86
|
+
read_file: 'read-file',
|
|
87
|
+
patch_file: 'patch-file',
|
|
88
|
+
run_shell: 'run-shell',
|
|
89
|
+
list_files: 'list-files',
|
|
90
|
+
write_file: 'write-file',
|
|
91
|
+
};
|
|
92
|
+
const operation = operationMap[name];
|
|
93
|
+
if (!operation) {
|
|
94
|
+
return { result: `Unknown tool: ${name}`, isError: true };
|
|
95
|
+
}
|
|
96
|
+
// Transform validate tool to run-shell with flow-weaver validate command
|
|
97
|
+
let stepArgs = { ...args };
|
|
98
|
+
if (name === 'validate') {
|
|
99
|
+
stepArgs = { command: `npx flow-weaver validate ${args.file} --json` };
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const result = await executeStep({ operation, args: stepArgs }, projectDir);
|
|
103
|
+
if (result.blocked) {
|
|
104
|
+
return { result: result.blockReason ?? 'Blocked by safety guard', isError: true };
|
|
105
|
+
}
|
|
106
|
+
return { result: result.output ?? 'Done', isError: false };
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
110
|
+
return { result: msg, isError: true };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export async function runAgentLoop(pInfo, systemPrompt, taskPrompt, projectDir, maxIterations = 15) {
|
|
114
|
+
if (pInfo.type !== 'anthropic' || !pInfo.apiKey) {
|
|
115
|
+
throw new Error('Agent loop requires Anthropic API provider with API key');
|
|
116
|
+
}
|
|
117
|
+
const messages = [{ role: 'user', content: taskPrompt }];
|
|
118
|
+
const filesModified = [];
|
|
119
|
+
const stepLog = [];
|
|
120
|
+
let toolCallCount = 0;
|
|
121
|
+
for (let iteration = 0; iteration < maxIterations; iteration++) {
|
|
122
|
+
// Call Anthropic API with streaming
|
|
123
|
+
const { text, toolCalls, finishReason } = await streamAnthropicWithTools(pInfo.apiKey, pInfo.model ?? 'claude-sonnet-4-20250514', systemPrompt, messages, pInfo.maxTokens ?? 8192);
|
|
124
|
+
// Add assistant response to history
|
|
125
|
+
if (toolCalls.length > 0) {
|
|
126
|
+
messages.push({ role: 'assistant', content: text || '', toolCalls });
|
|
127
|
+
}
|
|
128
|
+
else if (text) {
|
|
129
|
+
messages.push({ role: 'assistant', content: text });
|
|
130
|
+
}
|
|
131
|
+
// If no tool calls, we're done
|
|
132
|
+
if (finishReason !== 'tool_calls' || toolCalls.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
success: true,
|
|
135
|
+
summary: text || 'Task completed',
|
|
136
|
+
filesModified: [...new Set(filesModified)],
|
|
137
|
+
stepLog,
|
|
138
|
+
toolCallCount,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Execute tool calls and add results to history
|
|
142
|
+
for (const tc of toolCalls) {
|
|
143
|
+
toolCallCount++;
|
|
144
|
+
process.stderr.write(`\x1b[33m ⚡ ${tc.name}(${formatToolArgs(tc.arguments)})\x1b[0m\n`);
|
|
145
|
+
const { result, isError } = await executeTool(tc.name, tc.arguments, projectDir);
|
|
146
|
+
// Track files modified by patch_file and write_file
|
|
147
|
+
if ((tc.name === 'patch_file' || tc.name === 'write_file') && !isError && tc.arguments.file) {
|
|
148
|
+
filesModified.push(tc.arguments.file);
|
|
149
|
+
}
|
|
150
|
+
// Log step
|
|
151
|
+
stepLog.push({
|
|
152
|
+
step: `${tc.name}`,
|
|
153
|
+
status: isError ? 'error' : 'ok',
|
|
154
|
+
detail: isError ? result.slice(0, 200) : `${tc.name}(${formatToolArgs(tc.arguments)})`,
|
|
155
|
+
});
|
|
156
|
+
// Print result preview
|
|
157
|
+
const preview = result.slice(0, 150).replace(/\n/g, ' ');
|
|
158
|
+
const icon = isError ? '\x1b[31m ✗' : '\x1b[32m →';
|
|
159
|
+
process.stderr.write(`${icon} ${preview}\x1b[0m\n`);
|
|
160
|
+
// Add tool result to conversation
|
|
161
|
+
messages.push({
|
|
162
|
+
role: 'tool',
|
|
163
|
+
content: result.slice(0, 10000), // Cap tool result to prevent context overflow
|
|
164
|
+
toolCallId: tc.id,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
summary: `Reached max iterations (${maxIterations})`,
|
|
171
|
+
filesModified: [...new Set(filesModified)],
|
|
172
|
+
stepLog,
|
|
173
|
+
toolCallCount,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function formatToolArgs(args) {
|
|
177
|
+
if (args.file)
|
|
178
|
+
return String(args.file).split('/').pop() ?? '';
|
|
179
|
+
if (args.command)
|
|
180
|
+
return String(args.command).slice(0, 60);
|
|
181
|
+
if (args.directory)
|
|
182
|
+
return String(args.directory);
|
|
183
|
+
return '';
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Anthropic streaming with tool support
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
async function streamAnthropicWithTools(apiKey, model, systemPrompt, messages, maxTokens) {
|
|
189
|
+
// Build Anthropic API request body
|
|
190
|
+
const apiMessages = messages.map((m) => {
|
|
191
|
+
if (m.role === 'tool') {
|
|
192
|
+
return {
|
|
193
|
+
role: 'user',
|
|
194
|
+
content: [{ type: 'tool_result', tool_use_id: m.toolCallId, content: m.content }],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (m.role === 'assistant' && m.toolCalls?.length) {
|
|
198
|
+
const blocks = [];
|
|
199
|
+
if (m.content)
|
|
200
|
+
blocks.push({ type: 'text', text: m.content });
|
|
201
|
+
for (const tc of m.toolCalls) {
|
|
202
|
+
blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.arguments });
|
|
203
|
+
}
|
|
204
|
+
return { role: 'assistant', content: blocks };
|
|
205
|
+
}
|
|
206
|
+
return { role: m.role, content: m.content };
|
|
207
|
+
});
|
|
208
|
+
const body = JSON.stringify({
|
|
209
|
+
model,
|
|
210
|
+
max_tokens: maxTokens,
|
|
211
|
+
system: systemPrompt,
|
|
212
|
+
stream: true,
|
|
213
|
+
messages: apiMessages,
|
|
214
|
+
tools: TOOLS,
|
|
215
|
+
});
|
|
216
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
217
|
+
method: 'POST',
|
|
218
|
+
headers: {
|
|
219
|
+
'x-api-key': apiKey,
|
|
220
|
+
'anthropic-version': '2025-04-15',
|
|
221
|
+
'content-type': 'application/json',
|
|
222
|
+
},
|
|
223
|
+
body,
|
|
224
|
+
signal: AbortSignal.timeout(300_000),
|
|
225
|
+
});
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
const err = await response.text();
|
|
228
|
+
throw new Error(`Anthropic API error ${response.status}: ${err.slice(0, 200)}`);
|
|
229
|
+
}
|
|
230
|
+
if (!response.body)
|
|
231
|
+
throw new Error('No response body');
|
|
232
|
+
// Parse SSE stream
|
|
233
|
+
const reader = response.body.getReader();
|
|
234
|
+
const decoder = new TextDecoder();
|
|
235
|
+
let buffer = '';
|
|
236
|
+
let textContent = '';
|
|
237
|
+
let finishReason = 'stop';
|
|
238
|
+
const toolCalls = [];
|
|
239
|
+
const activeToolUses = new Map();
|
|
240
|
+
let inThinking = false;
|
|
241
|
+
try {
|
|
242
|
+
while (true) {
|
|
243
|
+
const { done, value } = await reader.read();
|
|
244
|
+
if (done)
|
|
245
|
+
break;
|
|
246
|
+
buffer += decoder.decode(value, { stream: true });
|
|
247
|
+
const lines = buffer.split('\n');
|
|
248
|
+
buffer = lines.pop() || '';
|
|
249
|
+
for (const line of lines) {
|
|
250
|
+
if (!line.startsWith('data: '))
|
|
251
|
+
continue;
|
|
252
|
+
const jsonStr = line.slice(6).trim();
|
|
253
|
+
if (jsonStr === '[DONE]')
|
|
254
|
+
continue;
|
|
255
|
+
let event;
|
|
256
|
+
try {
|
|
257
|
+
event = JSON.parse(jsonStr);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const eventType = event.type;
|
|
263
|
+
if (eventType === 'content_block_start') {
|
|
264
|
+
const block = event.content_block;
|
|
265
|
+
const index = event.index;
|
|
266
|
+
if (block.type === 'tool_use' && block.id && block.name) {
|
|
267
|
+
activeToolUses.set(index, { id: block.id, name: block.name, jsonChunks: [] });
|
|
268
|
+
}
|
|
269
|
+
if (block.type === 'thinking') {
|
|
270
|
+
inThinking = true;
|
|
271
|
+
process.stderr.write('\x1b[90m thinking...');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (eventType === 'content_block_delta') {
|
|
275
|
+
const delta = event.delta;
|
|
276
|
+
const index = event.index;
|
|
277
|
+
if (delta.type === 'text_delta' && delta.text) {
|
|
278
|
+
textContent += delta.text;
|
|
279
|
+
process.stderr.write(`\x1b[36m${delta.text}\x1b[0m`);
|
|
280
|
+
}
|
|
281
|
+
if (delta.type === 'thinking_delta' && delta.thinking) {
|
|
282
|
+
// Thinking — just show indicator, don't spam
|
|
283
|
+
}
|
|
284
|
+
if (delta.type === 'input_json_delta' && delta.partial_json !== undefined) {
|
|
285
|
+
const active = activeToolUses.get(index);
|
|
286
|
+
if (active)
|
|
287
|
+
active.jsonChunks.push(delta.partial_json);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (eventType === 'content_block_stop') {
|
|
291
|
+
const index = event.index;
|
|
292
|
+
if (inThinking) {
|
|
293
|
+
process.stderr.write('\x1b[0m\n');
|
|
294
|
+
inThinking = false;
|
|
295
|
+
}
|
|
296
|
+
const active = activeToolUses.get(index);
|
|
297
|
+
if (active) {
|
|
298
|
+
activeToolUses.delete(index);
|
|
299
|
+
let args = {};
|
|
300
|
+
try {
|
|
301
|
+
args = JSON.parse(active.jsonChunks.join(''));
|
|
302
|
+
}
|
|
303
|
+
catch { /* malformed */ }
|
|
304
|
+
toolCalls.push({ id: active.id, name: active.name, arguments: args });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (eventType === 'message_delta') {
|
|
308
|
+
const delta = event.delta;
|
|
309
|
+
if (delta.stop_reason === 'tool_use')
|
|
310
|
+
finishReason = 'tool_calls';
|
|
311
|
+
else if (delta.stop_reason === 'end_turn')
|
|
312
|
+
finishReason = 'stop';
|
|
313
|
+
else if (delta.stop_reason)
|
|
314
|
+
finishReason = delta.stop_reason;
|
|
315
|
+
}
|
|
316
|
+
if (eventType === 'error') {
|
|
317
|
+
const errObj = event.error;
|
|
318
|
+
throw new Error(`Anthropic stream error: ${errObj?.message ?? 'unknown'}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
finally {
|
|
324
|
+
reader.releaseLock();
|
|
325
|
+
}
|
|
326
|
+
// Newline after streamed text
|
|
327
|
+
if (textContent)
|
|
328
|
+
process.stderr.write('\n');
|
|
329
|
+
return { text: textContent, toolCalls, finishReason };
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../src/bot/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/bot/capability-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"capability-registry.d.ts","sourceRoot":"","sources":["../../src/bot/capability-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA8TlE,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB,EAAE,SAAS,oBAAoB,EA0BhE,CAAC;AAMF,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAMzD,CAAC;AAMF,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAE5E;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,IAAI,oBAAoB,EAAE,CAEzD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAI9E"}
|
|
@@ -38,6 +38,21 @@ Your only output is task_create calls + done.
|
|
|
38
38
|
6. Maximize parallelism: tasks with no shared files should not depend on each other.
|
|
39
39
|
7. Your LAST subtask: "Review & Steer" assigned to orchestrator, dependsOn all others.
|
|
40
40
|
|
|
41
|
+
### Design First
|
|
42
|
+
For multi-file projects, your FIRST subtask should create a .design.md with:
|
|
43
|
+
- Module map: which files, what each exports (function signatures with types)
|
|
44
|
+
- Conventions: naming, error handling, patterns (e.g., factory functions for servers)
|
|
45
|
+
All subsequent developer tasks must read .design.md before writing code.
|
|
46
|
+
|
|
47
|
+
### Acceptance Criteria
|
|
48
|
+
Every subtask MUST have acceptance.checks — shell commands that verify "done" (exit 0 = pass).
|
|
49
|
+
The system runs them automatically after each run. If any fail, the task stays open.
|
|
50
|
+
Examples:
|
|
51
|
+
- File exists: test -f url-shortener/src/store.ts
|
|
52
|
+
- Compiles: cd url-shortener && npx tsc --noEmit
|
|
53
|
+
- Tests pass: cd url-shortener && npx vitest run
|
|
54
|
+
- Export exists: grep -q "export.*startServer" url-shortener/src/server.ts
|
|
55
|
+
|
|
41
56
|
### Steering Mode (when running a Review & Steer task)
|
|
42
57
|
Read sibling task statuses and acceptance results from your context, then decide:
|
|
43
58
|
- All checks pass → done.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/bot/capability-registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EACzD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EACrD,cAAc,EAAE,WAAW,EAAE,SAAS,GACvC,MAAM,iBAAiB,CAAC;AAEzB,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,QAAQ,GAAyB;IACrC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,qDAAqD;IAClE,MAAM,EAAE;;;;;wEAK8D;CACvE,CAAC;AAEF,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E,MAAM,qBAAqB,GAAyB;IAClD,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,6DAA6D;IAC1E,KAAK,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC;IACpD,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"capability-registry.js","sourceRoot":"","sources":["../../src/bot/capability-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-guide.d.ts","sourceRoot":"","sources":["../../src/bot/error-guide.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-guide.js","sourceRoot":"","sources":["../../src/bot/error-guide.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-utils.d.ts","sourceRoot":"","sources":["../../src/bot/retry-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-utils.js","sourceRoot":"","sources":["../../src/bot/retry-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface SessionState {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
status: 'idle' | 'planning' | 'executing' | 'validating' | 'waiting-approval' | 'paused' | 'fixing';
|
|
4
|
+
currentTask: string | null;
|
|
5
|
+
/** The runId of the currently executing task (for SSE streaming). */
|
|
6
|
+
currentRunId?: string | null;
|
|
7
|
+
completedTasks: number;
|
|
8
|
+
totalCost: number;
|
|
9
|
+
startedAt: number;
|
|
10
|
+
lastActivity: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class SessionStore {
|
|
13
|
+
private filePath;
|
|
14
|
+
constructor(dir?: string);
|
|
15
|
+
create(): Promise<SessionState>;
|
|
16
|
+
load(): SessionState | null;
|
|
17
|
+
/** Recover session from backup file when primary is corrupt. */
|
|
18
|
+
private loadBackup;
|
|
19
|
+
save(state: SessionState): Promise<void>;
|
|
20
|
+
update(patch: Partial<SessionState>): Promise<SessionState | null>;
|
|
21
|
+
clear(): void;
|
|
22
|
+
/** Atomic write: write to temp file, backup existing, rename into place. */
|
|
23
|
+
private writeAtomic;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=session-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,CAAC,EAAE,MAAM;IAKlB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAcrC,IAAI,IAAI,YAAY,GAAG,IAAI;IAW3B,gEAAgE;IAChE,OAAO,CAAC,UAAU;IAcZ,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAWxE,KAAK,IAAI,IAAI;IAQb,4EAA4E;IAC5E,OAAO,CAAC,WAAW;CAsBpB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as crypto from 'node:crypto';
|
|
5
|
+
import { withFileLock } from './file-lock.js';
|
|
6
|
+
export class SessionStore {
|
|
7
|
+
filePath;
|
|
8
|
+
constructor(dir) {
|
|
9
|
+
const base = dir ?? path.join(os.homedir(), '.weaver');
|
|
10
|
+
this.filePath = path.join(base, 'session.json');
|
|
11
|
+
}
|
|
12
|
+
async create() {
|
|
13
|
+
const state = {
|
|
14
|
+
sessionId: crypto.randomUUID().slice(0, 8),
|
|
15
|
+
status: 'idle',
|
|
16
|
+
currentTask: null,
|
|
17
|
+
completedTasks: 0,
|
|
18
|
+
totalCost: 0,
|
|
19
|
+
startedAt: Date.now(),
|
|
20
|
+
lastActivity: Date.now(),
|
|
21
|
+
};
|
|
22
|
+
await this.save(state);
|
|
23
|
+
return state;
|
|
24
|
+
}
|
|
25
|
+
load() {
|
|
26
|
+
try {
|
|
27
|
+
if (!fs.existsSync(this.filePath))
|
|
28
|
+
return null;
|
|
29
|
+
return JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (process.env.WEAVER_VERBOSE)
|
|
33
|
+
process.stderr.write(`[weaver] session state load failed: ${err}\n`);
|
|
34
|
+
// Try backup recovery
|
|
35
|
+
return this.loadBackup();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Recover session from backup file when primary is corrupt. */
|
|
39
|
+
loadBackup() {
|
|
40
|
+
const backupPath = this.filePath + '.bak';
|
|
41
|
+
if (!fs.existsSync(backupPath))
|
|
42
|
+
return null;
|
|
43
|
+
try {
|
|
44
|
+
const data = JSON.parse(fs.readFileSync(backupPath, 'utf-8'));
|
|
45
|
+
// Restore backup to primary
|
|
46
|
+
try {
|
|
47
|
+
this.writeAtomic(data);
|
|
48
|
+
}
|
|
49
|
+
catch { /* best effort */ }
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (process.env.WEAVER_VERBOSE)
|
|
54
|
+
process.stderr.write(`[weaver] session backup load failed: ${err}\n`);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async save(state) {
|
|
59
|
+
return withFileLock(this.filePath, () => {
|
|
60
|
+
state.lastActivity = Date.now();
|
|
61
|
+
this.writeAtomic(state);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async update(patch) {
|
|
65
|
+
return withFileLock(this.filePath, () => {
|
|
66
|
+
const state = this.load();
|
|
67
|
+
if (!state)
|
|
68
|
+
return null;
|
|
69
|
+
Object.assign(state, patch);
|
|
70
|
+
state.lastActivity = Date.now();
|
|
71
|
+
this.writeAtomic(state);
|
|
72
|
+
return state;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
clear() {
|
|
76
|
+
try {
|
|
77
|
+
fs.unlinkSync(this.filePath);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (err.code !== 'ENOENT')
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Atomic write: write to temp file, backup existing, rename into place. */
|
|
85
|
+
writeAtomic(state) {
|
|
86
|
+
const dir = path.dirname(this.filePath);
|
|
87
|
+
if (!fs.existsSync(dir))
|
|
88
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
89
|
+
const tmpPath = this.filePath + `.tmp.${process.pid}`;
|
|
90
|
+
const backupPath = this.filePath + '.bak';
|
|
91
|
+
const content = JSON.stringify(state, null, 2);
|
|
92
|
+
// Write to temp file first
|
|
93
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
94
|
+
// Backup current file if it exists
|
|
95
|
+
if (fs.existsSync(this.filePath)) {
|
|
96
|
+
try {
|
|
97
|
+
fs.copyFileSync(this.filePath, backupPath);
|
|
98
|
+
}
|
|
99
|
+
catch { /* best effort */ }
|
|
100
|
+
}
|
|
101
|
+
// Atomic rename
|
|
102
|
+
fs.renameSync(tmpPath, this.filePath);
|
|
103
|
+
// Update backup after successful write
|
|
104
|
+
try {
|
|
105
|
+
fs.copyFileSync(this.filePath, backupPath);
|
|
106
|
+
}
|
|
107
|
+
catch { /* best effort */ }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=session-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"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"}
|