@synergenius/flow-weaver-pack-weaver 0.9.0 → 0.9.3
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/ai-client.d.ts +22 -2
- package/dist/bot/ai-client.d.ts.map +1 -1
- package/dist/bot/ai-client.js +168 -20
- package/dist/bot/ai-client.js.map +1 -1
- package/dist/bot/assistant-core.d.ts +25 -0
- package/dist/bot/assistant-core.d.ts.map +1 -0
- package/dist/bot/assistant-core.js +265 -0
- package/dist/bot/assistant-core.js.map +1 -0
- package/dist/bot/assistant-tools.d.ts +9 -0
- package/dist/bot/assistant-tools.d.ts.map +1 -0
- package/dist/bot/assistant-tools.js +602 -0
- package/dist/bot/assistant-tools.js.map +1 -0
- package/dist/bot/audit-logger.d.ts.map +1 -1
- package/dist/bot/audit-logger.js +9 -5
- package/dist/bot/audit-logger.js.map +1 -1
- package/dist/bot/bot-manager.d.ts +49 -0
- package/dist/bot/bot-manager.d.ts.map +1 -0
- package/dist/bot/bot-manager.js +279 -0
- package/dist/bot/bot-manager.js.map +1 -0
- package/dist/bot/child-process-tracker.d.ts +6 -0
- package/dist/bot/child-process-tracker.d.ts.map +1 -0
- package/dist/bot/child-process-tracker.js +35 -0
- package/dist/bot/child-process-tracker.js.map +1 -0
- package/dist/bot/cli-provider.d.ts.map +1 -1
- package/dist/bot/cli-provider.js +13 -8
- package/dist/bot/cli-provider.js.map +1 -1
- package/dist/bot/conversation-store.d.ts +40 -0
- package/dist/bot/conversation-store.d.ts.map +1 -0
- package/dist/bot/conversation-store.js +182 -0
- package/dist/bot/conversation-store.js.map +1 -0
- package/dist/bot/error-guide.d.ts +10 -0
- package/dist/bot/error-guide.d.ts.map +1 -0
- package/dist/bot/error-guide.js +34 -0
- package/dist/bot/error-guide.js.map +1 -0
- package/dist/bot/knowledge-store.d.ts +17 -0
- package/dist/bot/knowledge-store.d.ts.map +1 -0
- package/dist/bot/knowledge-store.js +53 -0
- package/dist/bot/knowledge-store.js.map +1 -0
- package/dist/bot/retry-utils.d.ts +19 -0
- package/dist/bot/retry-utils.d.ts.map +1 -0
- package/dist/bot/retry-utils.js +64 -0
- package/dist/bot/retry-utils.js.map +1 -0
- package/dist/bot/runner.d.ts.map +1 -1
- package/dist/bot/runner.js +12 -1
- package/dist/bot/runner.js.map +1 -1
- package/dist/bot/session-state.d.ts.map +1 -1
- package/dist/bot/session-state.js +3 -1
- package/dist/bot/session-state.js.map +1 -1
- package/dist/bot/steering.js +1 -1
- package/dist/bot/steering.js.map +1 -1
- package/dist/bot/step-executor.d.ts +10 -5
- package/dist/bot/step-executor.d.ts.map +1 -1
- package/dist/bot/step-executor.js +252 -3
- package/dist/bot/step-executor.js.map +1 -1
- package/dist/bot/system-prompt.d.ts +1 -1
- package/dist/bot/system-prompt.d.ts.map +1 -1
- package/dist/bot/system-prompt.js +69 -43
- package/dist/bot/system-prompt.js.map +1 -1
- package/dist/bot/task-decomposer.d.ts +24 -0
- package/dist/bot/task-decomposer.d.ts.map +1 -0
- package/dist/bot/task-decomposer.js +75 -0
- package/dist/bot/task-decomposer.js.map +1 -0
- package/dist/bot/task-queue.d.ts +17 -4
- package/dist/bot/task-queue.d.ts.map +1 -1
- package/dist/bot/task-queue.js +95 -4
- package/dist/bot/task-queue.js.map +1 -1
- package/dist/bot/terminal-renderer.d.ts +60 -0
- package/dist/bot/terminal-renderer.d.ts.map +1 -0
- package/dist/bot/terminal-renderer.js +205 -0
- package/dist/bot/terminal-renderer.js.map +1 -0
- package/dist/bot/types.d.ts +7 -0
- package/dist/bot/types.d.ts.map +1 -1
- package/dist/bot/weaver-tools.d.ts +18 -0
- package/dist/bot/weaver-tools.d.ts.map +1 -0
- package/dist/bot/weaver-tools.js +215 -0
- package/dist/bot/weaver-tools.js.map +1 -0
- package/dist/cli-bridge.d.ts.map +1 -1
- package/dist/cli-bridge.js +5 -1
- package/dist/cli-bridge.js.map +1 -1
- package/dist/cli-handlers.d.ts +13 -1
- package/dist/cli-handlers.d.ts.map +1 -1
- package/dist/cli-handlers.js +616 -48
- package/dist/cli-handlers.js.map +1 -1
- package/dist/mcp-tools.js +2 -2
- package/dist/mcp-tools.js.map +1 -1
- package/dist/node-types/abort-task.d.ts.map +1 -1
- package/dist/node-types/abort-task.js +4 -3
- package/dist/node-types/abort-task.js.map +1 -1
- package/dist/node-types/agent-execute.d.ts +38 -0
- package/dist/node-types/agent-execute.d.ts.map +1 -0
- package/dist/node-types/agent-execute.js +256 -0
- package/dist/node-types/agent-execute.js.map +1 -0
- package/dist/node-types/bot-report.d.ts +5 -3
- package/dist/node-types/bot-report.d.ts.map +1 -1
- package/dist/node-types/bot-report.js +39 -7
- package/dist/node-types/bot-report.js.map +1 -1
- package/dist/node-types/build-context.d.ts +3 -3
- package/dist/node-types/build-context.d.ts.map +1 -1
- package/dist/node-types/build-context.js +108 -24
- package/dist/node-types/build-context.js.map +1 -1
- package/dist/node-types/detect-provider.d.ts +2 -2
- package/dist/node-types/detect-provider.d.ts.map +1 -1
- package/dist/node-types/detect-provider.js +3 -1
- package/dist/node-types/detect-provider.js.map +1 -1
- package/dist/node-types/exec-validate-retry.d.ts.map +1 -1
- package/dist/node-types/exec-validate-retry.js +43 -6
- package/dist/node-types/exec-validate-retry.js.map +1 -1
- package/dist/node-types/execute-plan.d.ts.map +1 -1
- package/dist/node-types/execute-plan.js +31 -8
- package/dist/node-types/execute-plan.js.map +1 -1
- package/dist/node-types/execute-target.d.ts.map +1 -1
- package/dist/node-types/execute-target.js +3 -1
- package/dist/node-types/execute-target.js.map +1 -1
- package/dist/node-types/fix-errors.d.ts.map +1 -1
- package/dist/node-types/fix-errors.js +21 -5
- package/dist/node-types/fix-errors.js.map +1 -1
- package/dist/node-types/genesis-observe.d.ts.map +1 -1
- package/dist/node-types/genesis-observe.js +3 -1
- package/dist/node-types/genesis-observe.js.map +1 -1
- package/dist/node-types/genesis-report.js +4 -1
- package/dist/node-types/genesis-report.js.map +1 -1
- package/dist/node-types/git-ops.d.ts.map +1 -1
- package/dist/node-types/git-ops.js +98 -4
- package/dist/node-types/git-ops.js.map +1 -1
- package/dist/node-types/index.d.ts +2 -0
- package/dist/node-types/index.d.ts.map +1 -1
- package/dist/node-types/index.js +2 -0
- package/dist/node-types/index.js.map +1 -1
- package/dist/node-types/load-config.d.ts +2 -2
- package/dist/node-types/load-config.d.ts.map +1 -1
- package/dist/node-types/load-config.js.map +1 -1
- package/dist/node-types/plan-task.d.ts.map +1 -1
- package/dist/node-types/plan-task.js +14 -2
- package/dist/node-types/plan-task.js.map +1 -1
- package/dist/node-types/read-workflow.js +8 -2
- package/dist/node-types/read-workflow.js.map +1 -1
- package/dist/node-types/receive-task.d.ts.map +1 -1
- package/dist/node-types/receive-task.js +35 -26
- package/dist/node-types/receive-task.js.map +1 -1
- package/dist/node-types/send-notify.js +2 -1
- package/dist/node-types/send-notify.js.map +1 -1
- package/dist/node-types/validate-gate.d.ts +18 -0
- package/dist/node-types/validate-gate.d.ts.map +1 -0
- package/dist/node-types/validate-gate.js +96 -0
- package/dist/node-types/validate-gate.js.map +1 -0
- package/dist/workflows/genesis-task.d.ts +20 -12
- package/dist/workflows/genesis-task.d.ts.map +1 -1
- package/dist/workflows/genesis-task.js +20 -12
- package/dist/workflows/genesis-task.js.map +1 -1
- package/dist/workflows/weaver-agent.d.ts +35 -0
- package/dist/workflows/weaver-agent.d.ts.map +1 -0
- package/dist/workflows/weaver-agent.js +777 -0
- package/dist/workflows/weaver-agent.js.map +1 -0
- package/dist/workflows/weaver-bot-batch.d.ts +19 -26
- package/dist/workflows/weaver-bot-batch.d.ts.map +1 -1
- package/dist/workflows/weaver-bot-batch.js +1043 -27
- package/dist/workflows/weaver-bot-batch.js.map +1 -1
- package/dist/workflows/weaver-bot.d.ts +21 -35
- package/dist/workflows/weaver-bot.d.ts.map +1 -1
- package/dist/workflows/weaver-bot.js +1119 -36
- package/dist/workflows/weaver-bot.js.map +1 -1
- package/flowweaver.manifest.json +21 -1
- package/package.json +5 -2
- package/src/bot/ai-client.ts +180 -19
- package/src/bot/assistant-core.ts +306 -0
- package/src/bot/assistant-tools.ts +605 -0
- package/src/bot/audit-logger.ts +6 -5
- package/src/bot/bot-manager.ts +293 -0
- package/src/bot/child-process-tracker.ts +40 -0
- package/src/bot/cli-provider.ts +13 -8
- package/src/bot/conversation-store.ts +222 -0
- package/src/bot/error-guide.ts +34 -0
- package/src/bot/knowledge-store.ts +59 -0
- package/src/bot/retry-utils.ts +76 -0
- package/src/bot/runner.ts +12 -1
- package/src/bot/session-state.ts +2 -1
- package/src/bot/steering.ts +1 -1
- package/src/bot/step-executor.ts +313 -5
- package/src/bot/system-prompt.ts +70 -47
- package/src/bot/task-decomposer.ts +100 -0
- package/src/bot/task-queue.ts +113 -7
- package/src/bot/terminal-renderer.ts +241 -0
- package/src/bot/types.ts +8 -0
- package/src/bot/weaver-tools.ts +225 -0
- package/src/cli-bridge.ts +7 -1
- package/src/cli-handlers.ts +625 -48
- package/src/mcp-tools.ts +2 -2
- package/src/node-types/abort-task.ts +5 -4
- package/src/node-types/agent-execute.ts +306 -0
- package/src/node-types/bot-report.ts +40 -9
- package/src/node-types/build-context.ts +112 -25
- package/src/node-types/detect-provider.ts +4 -3
- package/src/node-types/exec-validate-retry.ts +47 -8
- package/src/node-types/execute-plan.ts +32 -8
- package/src/node-types/execute-target.ts +2 -1
- package/src/node-types/fix-errors.ts +20 -5
- package/src/node-types/genesis-observe.ts +2 -1
- package/src/node-types/genesis-report.ts +1 -1
- package/src/node-types/git-ops.ts +93 -4
- package/src/node-types/index.ts +2 -0
- package/src/node-types/load-config.ts +3 -3
- package/src/node-types/plan-task.ts +15 -3
- package/src/node-types/read-workflow.ts +2 -2
- package/src/node-types/receive-task.ts +31 -26
- package/src/node-types/send-notify.ts +1 -1
- package/src/node-types/validate-gate.ts +112 -0
- package/src/workflows/genesis-task.ts +20 -12
- package/src/workflows/weaver-agent.ts +799 -0
- package/src/workflows/weaver-bot-batch.ts +1049 -27
- package/src/workflows/weaver-bot.ts +1123 -36
|
@@ -1,22 +1,271 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
3
4
|
import { runCommand } from '@synergenius/flow-weaver';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Safety thresholds
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/** Refuse writes that shrink an existing file by more than this ratio (0-1). */
|
|
9
|
+
const MAX_SHRINK_RATIO = 0.5;
|
|
10
|
+
/** Minimum file size (bytes) before shrink guard kicks in. */
|
|
11
|
+
const SHRINK_GUARD_MIN_SIZE = 100;
|
|
12
|
+
/** Maximum number of files that can be written in a single plan. */
|
|
13
|
+
const MAX_FILES_PER_PLAN = 50;
|
|
14
|
+
/** Maximum shell command execution time (ms). */
|
|
15
|
+
const SHELL_TIMEOUT = 60_000;
|
|
16
|
+
/** Maximum file size for read/patch operations (1MB). */
|
|
17
|
+
const MAX_READ_SIZE = 1_048_576;
|
|
18
|
+
/** Maximum files returned by list-files. */
|
|
19
|
+
const MAX_LIST_FILES = 1000;
|
|
20
|
+
/** Shell commands that are NEVER allowed (destructive operations). */
|
|
21
|
+
const BLOCKED_SHELL_PATTERNS = [
|
|
22
|
+
/\brm\s+(-[a-z]*r|-[a-z]*f)[a-z]*\s/i, // rm with -r or -f flags
|
|
23
|
+
/\bgit\s+push\b/i, // git push (no remote ops)
|
|
24
|
+
/\bgit\s+reset\s+--hard\b/i, // git reset --hard
|
|
25
|
+
/\bnpm\s+publish\b/i, // npm publish
|
|
26
|
+
/\bcurl\b.*\|\s*(sh|bash)\b/i, // curl | sh/bash
|
|
27
|
+
/\bwget\b.*\|\s*(sh|bash)\b/i, // wget | sh/bash
|
|
28
|
+
/\bsudo\b/i, // sudo
|
|
29
|
+
/\bchmod\s+777\b/i, // chmod 777
|
|
30
|
+
/\bkill\s+-9\b/i, // kill -9
|
|
31
|
+
/\bmkfs\b/i, // format disk
|
|
32
|
+
/\bdd\s+if=/i, // dd (disk destroyer)
|
|
33
|
+
/>\s*\/dev\/sd/i, // write to raw disk
|
|
34
|
+
];
|
|
35
|
+
/** Track files written in this process to enforce the per-plan cap. */
|
|
36
|
+
let filesWrittenThisPlan = 0;
|
|
37
|
+
/** Reset the per-plan counter between plans. */
|
|
38
|
+
export function resetPlanFileCounter() {
|
|
39
|
+
filesWrittenThisPlan = 0;
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Path safety
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
function assertSafePath(filePath, projectDir) {
|
|
45
|
+
const resolved = path.resolve(projectDir, filePath);
|
|
46
|
+
if (!resolved.startsWith(path.resolve(projectDir))) {
|
|
47
|
+
throw new Error(`Path traversal blocked: "${filePath}" resolves outside project directory.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function checkWriteSafety(filePath, content) {
|
|
51
|
+
// Guard 1: Empty content
|
|
52
|
+
if (!content || content.trim().length === 0) {
|
|
53
|
+
return {
|
|
54
|
+
allowed: false,
|
|
55
|
+
reason: `Refusing to write empty content to ${path.basename(filePath)}. ` +
|
|
56
|
+
`Use read-file first, then write the complete modified file back.`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Guard 2: Per-plan file cap
|
|
60
|
+
if (filesWrittenThisPlan >= MAX_FILES_PER_PLAN) {
|
|
61
|
+
return {
|
|
62
|
+
allowed: false,
|
|
63
|
+
reason: `File write limit reached (${MAX_FILES_PER_PLAN} files per plan).`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Guard 3: Shrink detection
|
|
67
|
+
if (fs.existsSync(filePath)) {
|
|
68
|
+
const existingSize = fs.statSync(filePath).size;
|
|
69
|
+
const newSize = Buffer.byteLength(content, 'utf-8');
|
|
70
|
+
if (existingSize > SHRINK_GUARD_MIN_SIZE && newSize < existingSize * MAX_SHRINK_RATIO) {
|
|
71
|
+
const shrinkPct = Math.round((1 - newSize / existingSize) * 100);
|
|
72
|
+
return {
|
|
73
|
+
allowed: false,
|
|
74
|
+
reason: `Refusing to write ${path.basename(filePath)}: new content (${newSize}B) ` +
|
|
75
|
+
`is ${shrinkPct}% smaller than existing (${existingSize}B). ` +
|
|
76
|
+
`Use read-file first, make targeted changes, write complete file back.`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { allowed: true };
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Shell safety
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function checkShellSafety(command) {
|
|
86
|
+
for (const pattern of BLOCKED_SHELL_PATTERNS) {
|
|
87
|
+
if (pattern.test(command)) {
|
|
88
|
+
return {
|
|
89
|
+
allowed: false,
|
|
90
|
+
reason: `Shell command blocked by safety policy: matches "${pattern.source}"`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { allowed: true };
|
|
95
|
+
}
|
|
4
96
|
export async function executeStep(step, projectDir) {
|
|
5
97
|
const args = step.args;
|
|
6
98
|
const file = args.file;
|
|
7
99
|
switch (step.operation) {
|
|
100
|
+
// -----------------------------------------------------------------
|
|
101
|
+
// File write operations (with safety guards)
|
|
102
|
+
// -----------------------------------------------------------------
|
|
8
103
|
case 'write-file':
|
|
9
104
|
case 'create-workflow':
|
|
10
105
|
case 'modify-source':
|
|
11
106
|
case 'implement-node': {
|
|
107
|
+
if (!file) {
|
|
108
|
+
return { blocked: true, blockReason: `${step.operation} requires a "file" argument.` };
|
|
109
|
+
}
|
|
110
|
+
assertSafePath(file, projectDir);
|
|
12
111
|
const filePath = path.resolve(projectDir, file);
|
|
112
|
+
const content = args.content ?? args.body ?? '';
|
|
113
|
+
const guard = checkWriteSafety(filePath, content);
|
|
114
|
+
if (!guard.allowed) {
|
|
115
|
+
return { file: filePath, blocked: true, blockReason: guard.reason };
|
|
116
|
+
}
|
|
13
117
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
14
118
|
const existed = fs.existsSync(filePath);
|
|
15
|
-
fs.writeFileSync(filePath,
|
|
119
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
120
|
+
filesWrittenThisPlan++;
|
|
16
121
|
return { file: filePath, created: !existed };
|
|
17
122
|
}
|
|
18
|
-
|
|
19
|
-
|
|
123
|
+
// -----------------------------------------------------------------
|
|
124
|
+
// Patch file: surgical find-and-replace (no full rewrite needed)
|
|
125
|
+
// -----------------------------------------------------------------
|
|
126
|
+
case 'patch-file': {
|
|
127
|
+
if (!file) {
|
|
128
|
+
return { blocked: true, blockReason: 'patch-file requires a "file" argument.' };
|
|
129
|
+
}
|
|
130
|
+
assertSafePath(file, projectDir);
|
|
131
|
+
const filePath = path.resolve(projectDir, file);
|
|
132
|
+
if (!fs.existsSync(filePath)) {
|
|
133
|
+
return { blocked: true, blockReason: `File not found: ${file}` };
|
|
134
|
+
}
|
|
135
|
+
// File size guard
|
|
136
|
+
const fileSize = fs.statSync(filePath).size;
|
|
137
|
+
if (fileSize > MAX_READ_SIZE) {
|
|
138
|
+
return { blocked: true, blockReason: `File too large for patch-file (${fileSize} bytes, max ${MAX_READ_SIZE}).` };
|
|
139
|
+
}
|
|
140
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
141
|
+
const patches = args.patches ?? [];
|
|
142
|
+
if (!patches.length && args.find && args.replace !== undefined) {
|
|
143
|
+
patches.push({ find: args.find, replace: args.replace });
|
|
144
|
+
}
|
|
145
|
+
if (!patches.length) {
|
|
146
|
+
return { blocked: true, blockReason: 'patch-file requires "patches" array or "find"+"replace" args.' };
|
|
147
|
+
}
|
|
148
|
+
let applied = 0;
|
|
149
|
+
const notFound = [];
|
|
150
|
+
for (const patch of patches) {
|
|
151
|
+
if (content.includes(patch.find)) {
|
|
152
|
+
content = content.split(patch.find).join(patch.replace); // replaceAll without regex
|
|
153
|
+
applied++;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
notFound.push(patch.find.substring(0, 60));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (applied === 0) {
|
|
160
|
+
return {
|
|
161
|
+
file: filePath,
|
|
162
|
+
output: `No patches applied. Search strings not found: ${notFound.join('; ')}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
166
|
+
filesWrittenThisPlan++;
|
|
167
|
+
const summary = `Applied ${applied}/${patches.length} patches` +
|
|
168
|
+
(notFound.length ? `. Not found: ${notFound.join('; ')}` : '');
|
|
169
|
+
return { file: filePath, output: summary };
|
|
170
|
+
}
|
|
171
|
+
// -----------------------------------------------------------------
|
|
172
|
+
// Read file: return content for AI context
|
|
173
|
+
// -----------------------------------------------------------------
|
|
174
|
+
case 'read-file': {
|
|
175
|
+
if (!file) {
|
|
176
|
+
return { output: '' };
|
|
177
|
+
}
|
|
178
|
+
assertSafePath(file, projectDir);
|
|
179
|
+
const filePath = path.resolve(projectDir, file);
|
|
180
|
+
if (!fs.existsSync(filePath)) {
|
|
181
|
+
return { output: `File not found: ${file}` };
|
|
182
|
+
}
|
|
183
|
+
if (fs.statSync(filePath).isDirectory()) {
|
|
184
|
+
const entries = fs.readdirSync(filePath, { encoding: 'utf-8' });
|
|
185
|
+
return { output: `"${file}" is a directory. Contents:\n${entries.join('\n')}` };
|
|
186
|
+
}
|
|
187
|
+
const fileSize = fs.statSync(filePath).size;
|
|
188
|
+
if (fileSize > MAX_READ_SIZE) {
|
|
189
|
+
return { output: `File too large to read (${fileSize} bytes, max ${MAX_READ_SIZE}). Use run-shell with head/tail instead.` };
|
|
190
|
+
}
|
|
191
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
192
|
+
return { file: filePath, output: content };
|
|
193
|
+
}
|
|
194
|
+
// -----------------------------------------------------------------
|
|
195
|
+
// Shell command: run arbitrary command with safety guards
|
|
196
|
+
// -----------------------------------------------------------------
|
|
197
|
+
case 'run-shell': {
|
|
198
|
+
const command = args.command ?? '';
|
|
199
|
+
if (!command.trim()) {
|
|
200
|
+
return { blocked: true, blockReason: 'run-shell requires a "command" argument.' };
|
|
201
|
+
}
|
|
202
|
+
const shellGuard = checkShellSafety(command);
|
|
203
|
+
if (!shellGuard.allowed) {
|
|
204
|
+
return { blocked: true, blockReason: shellGuard.reason };
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const output = execSync(command, {
|
|
208
|
+
cwd: projectDir,
|
|
209
|
+
encoding: 'utf-8',
|
|
210
|
+
timeout: SHELL_TIMEOUT,
|
|
211
|
+
maxBuffer: 1024 * 1024, // 1MB output cap
|
|
212
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
213
|
+
});
|
|
214
|
+
return { output: output.trim() };
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
// Shell commands that exit non-zero still return useful output
|
|
218
|
+
const execErr = err;
|
|
219
|
+
const stdout = (execErr.stdout ?? '').trim();
|
|
220
|
+
const stderr = (execErr.stderr ?? '').trim();
|
|
221
|
+
const combined = [stdout, stderr].filter(Boolean).join('\n');
|
|
222
|
+
return {
|
|
223
|
+
output: combined || (err instanceof Error ? err.message : String(err)),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// -----------------------------------------------------------------
|
|
228
|
+
// List files: glob-like directory listing
|
|
229
|
+
// -----------------------------------------------------------------
|
|
230
|
+
case 'list-files': {
|
|
231
|
+
const dir = args.directory ?? args.dir ?? '.';
|
|
232
|
+
const pattern = args.pattern ?? '';
|
|
233
|
+
assertSafePath(dir, projectDir);
|
|
234
|
+
const targetDir = path.resolve(projectDir, dir);
|
|
235
|
+
if (!fs.existsSync(targetDir)) {
|
|
236
|
+
return { output: `Directory not found: ${dir}` };
|
|
237
|
+
}
|
|
238
|
+
const entries = fs.readdirSync(targetDir, { recursive: true, encoding: 'utf-8' });
|
|
239
|
+
let files = entries
|
|
240
|
+
.filter(e => {
|
|
241
|
+
if (e.includes('node_modules') || e.includes('.git'))
|
|
242
|
+
return false;
|
|
243
|
+
const full = path.join(targetDir, e);
|
|
244
|
+
try {
|
|
245
|
+
return fs.statSync(full).isFile();
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
.sort();
|
|
252
|
+
if (pattern) {
|
|
253
|
+
try {
|
|
254
|
+
const regex = new RegExp(pattern);
|
|
255
|
+
files = files.filter(f => regex.test(f));
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return { output: `Invalid regex pattern: ${pattern}` };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (files.length > MAX_LIST_FILES) {
|
|
262
|
+
files = files.slice(0, MAX_LIST_FILES);
|
|
263
|
+
}
|
|
264
|
+
return { files: files.map(f => path.join(dir, f)), output: files.join('\n') };
|
|
265
|
+
}
|
|
266
|
+
// -----------------------------------------------------------------
|
|
267
|
+
// Flow-weaver CLI commands (via programmatic API)
|
|
268
|
+
// -----------------------------------------------------------------
|
|
20
269
|
default: {
|
|
21
270
|
const result = await runCommand(step.operation, { ...args, cwd: projectDir });
|
|
22
271
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-executor.js","sourceRoot":"","sources":["../../src/bot/step-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA0D,EAC1D,UAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;IAE7C,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB,CAAC;QACvB,KAAK,eAAe,CAAC;QACrB,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"step-executor.js","sourceRoot":"","sources":["../../src/bot/step-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,6 @@ interface CliCommandDoc {
|
|
|
14
14
|
}[];
|
|
15
15
|
}
|
|
16
16
|
export declare function buildSystemPrompt(): Promise<string>;
|
|
17
|
-
export declare function buildBotSystemPrompt(contextBundle?: string,
|
|
17
|
+
export declare function buildBotSystemPrompt(contextBundle?: string, _cliCommands?: CliCommandDoc[], projectDir?: string): string;
|
|
18
18
|
export {};
|
|
19
19
|
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/bot/system-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClE;
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/bot/system-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClE;AAqLD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBzD;AA0CD,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,aAAa,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA4BxH"}
|
|
@@ -135,9 +135,38 @@ Genesis is a 17-step self-evolving workflow engine:
|
|
|
135
135
|
|
|
136
136
|
When stabilize mode is active, only fix-up operations are allowed: removeNode, removeConnection, implementNode. No new nodes or connections.
|
|
137
137
|
|
|
138
|
-
##
|
|
138
|
+
## Tool Use
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
You have tools available: validate, read_file, patch_file, run_shell, list_files, write_file.
|
|
141
|
+
|
|
142
|
+
USE TOOLS to complete tasks. Do NOT describe what you would do — actually do it by calling tools. You can see tool results and decide your next action dynamically.
|
|
143
|
+
|
|
144
|
+
Workflow for fixing validation errors:
|
|
145
|
+
1. Call validate(file) to see exact errors
|
|
146
|
+
2. Call read_file(file) to see the code
|
|
147
|
+
3. Call patch_file(file, patches) with exact find/replace strings
|
|
148
|
+
4. Call validate(file) again to confirm fixes
|
|
149
|
+
5. Repeat if errors remain
|
|
150
|
+
|
|
151
|
+
Rules:
|
|
152
|
+
- Always validate BEFORE and AFTER patching
|
|
153
|
+
- Always read a file before patching it (you need exact strings for find/replace)
|
|
154
|
+
- Use patch_file for modifications, write_file only for new files
|
|
155
|
+
- Be concise in your text responses — let tool results speak
|
|
156
|
+
|
|
157
|
+
Flow Weaver workflows are TypeScript. You can also help create supporting files in other formats (JSON configs, shell scripts, Markdown docs).
|
|
158
|
+
|
|
159
|
+
Before starting a task on a file, call recall(filename) to check if there is stored knowledge about known issues or patterns for that file.
|
|
160
|
+
After discovering something important (a pattern, a common fix, a gotcha), call learn(key, value) to store it for future tasks.
|
|
161
|
+
|
|
162
|
+
## Teaching
|
|
163
|
+
|
|
164
|
+
When creating or modifying workflows, briefly explain your decisions:
|
|
165
|
+
- Why you chose a particular template or pattern (1 line)
|
|
166
|
+
- What each node does and why it is @expression vs standard (1 line)
|
|
167
|
+
- What the data flow looks like (1 line)
|
|
168
|
+
Do NOT lecture. Keep explanations short. The user is learning Flow Weaver by watching you work.
|
|
169
|
+
Example: "Using sequential template — best for linear pipelines. The validator is @expression (pure, no side effects). Data flows: input -> validate -> transform -> output."`;
|
|
141
170
|
}
|
|
142
171
|
export async function buildSystemPrompt() {
|
|
143
172
|
if (cachedPrompt)
|
|
@@ -154,11 +183,25 @@ export async function buildSystemPrompt() {
|
|
|
154
183
|
}
|
|
155
184
|
function formatBotOperations(cliCommands) {
|
|
156
185
|
const packOps = [
|
|
186
|
+
'## File Operations',
|
|
157
187
|
'- create-workflow: Create a new workflow file. args: { file, content }',
|
|
158
188
|
'- implement-node: Write a node type implementation. args: { file, content }',
|
|
159
|
-
'-
|
|
160
|
-
'- read-file: Read a file
|
|
161
|
-
'-
|
|
189
|
+
'- write-file: Write a file. args: { file, content }. Content must be the COMPLETE file.',
|
|
190
|
+
'- read-file: Read a file and return its content. args: { file }',
|
|
191
|
+
'- patch-file: Surgical find-and-replace edits. args: { file, patches: [{ find: "old text", replace: "new text" }] }. PREFERRED for modifying existing files — no need to rewrite the entire file.',
|
|
192
|
+
'- list-files: List files in a directory. args: { directory, pattern? } (pattern is regex)',
|
|
193
|
+
'',
|
|
194
|
+
'## Shell Commands',
|
|
195
|
+
'- run-shell: Execute a shell command and return output. args: { command }. Use for: npx vitest, git status, grep, find, etc.',
|
|
196
|
+
' Examples: { "command": "npx vitest run --reporter verbose" }, { "command": "npx flow-weaver validate src/workflow.ts --json" }',
|
|
197
|
+
' Blocked: rm -rf, git push, npm publish, sudo, curl|sh (safety policy).',
|
|
198
|
+
'',
|
|
199
|
+
'## Best Practices',
|
|
200
|
+
'PREFER patch-file over write-file for modifying existing files (surgical edits, no truncation risk).',
|
|
201
|
+
'Use run-shell for running tests (npx vitest), validation (flow-weaver validate), and inspecting output.',
|
|
202
|
+
'Use read-file to understand a file before modifying it.',
|
|
203
|
+
'Use list-files to discover project structure.',
|
|
204
|
+
'Writes that shrink a file by >50% or write empty content are automatically BLOCKED.',
|
|
162
205
|
];
|
|
163
206
|
const fwOps = cliCommands
|
|
164
207
|
.filter(cmd => cmd.botCompatible)
|
|
@@ -175,45 +218,28 @@ function formatBotOperations(cliCommands) {
|
|
|
175
218
|
});
|
|
176
219
|
return [...packOps, ...fwOps].join('\n');
|
|
177
220
|
}
|
|
178
|
-
export function buildBotSystemPrompt(contextBundle,
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
221
|
+
export function buildBotSystemPrompt(contextBundle, _cliCommands, projectDir) {
|
|
222
|
+
let prompt = `## Safety Policy
|
|
223
|
+
|
|
224
|
+
Writes that shrink a file by >50% or write empty content are automatically BLOCKED.
|
|
225
|
+
Blocked shell commands: rm -rf, git push, npm publish, sudo, curl|sh.
|
|
226
|
+
Always validate BEFORE and AFTER patching.
|
|
227
|
+
Always read a file before patching it (you need exact strings for find/replace).
|
|
228
|
+
Use patch_file for modifications, write_file only for new files.
|
|
229
|
+
Be concise in your text responses — let tool results speak.`;
|
|
230
|
+
// Load project plan file if it exists — this is the vision spec that guides all work
|
|
231
|
+
if (projectDir) {
|
|
232
|
+
try {
|
|
233
|
+
const fs = require('node:fs');
|
|
234
|
+
const path = require('node:path');
|
|
235
|
+
const planPath = path.resolve(projectDir, '.weaver-plan.md');
|
|
236
|
+
if (fs.existsSync(planPath)) {
|
|
237
|
+
const plan = fs.readFileSync(planPath, 'utf-8').trim();
|
|
238
|
+
prompt += '\n\n## Project Plan & Vision\n\nIMPORTANT: All work MUST align with this plan. If a task contradicts the plan, skip it and explain why.\n\n' + plan;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch { /* plan file not available */ }
|
|
190
242
|
}
|
|
191
|
-
],
|
|
192
|
-
"summary": "Brief description of the overall plan"
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
Available operations:
|
|
196
|
-
${operationsList}`;
|
|
197
|
-
const botInstructions = `## Bot Mode Instructions
|
|
198
|
-
|
|
199
|
-
You are operating in autonomous bot mode. Your job is to plan and execute workflow creation or modification tasks.
|
|
200
|
-
|
|
201
|
-
When planning:
|
|
202
|
-
1. Break the task into concrete, ordered steps using the plan schema above
|
|
203
|
-
2. For new workflows, plan: scaffold/create -> implement nodes -> compile -> validate
|
|
204
|
-
3. For modifications, plan: read current state -> modify -> compile -> validate
|
|
205
|
-
4. Each step is executed via the flow-weaver programmatic API
|
|
206
|
-
5. Use templates when they match the task
|
|
207
|
-
6. Prefer @expression nodes for deterministic operations
|
|
208
|
-
7. Use proper JSDoc annotations on all node types and workflows
|
|
209
|
-
8. Include visualization metadata (colors, icons, positions) on workflow nodes
|
|
210
|
-
|
|
211
|
-
When fixing validation errors:
|
|
212
|
-
1. Read the error messages carefully
|
|
213
|
-
2. Map each error to a specific fix operation
|
|
214
|
-
3. Common fixes: add missing connections, fix port names, resolve type mismatches
|
|
215
|
-
4. Return a new plan with only the fix steps`;
|
|
216
|
-
let prompt = planSchema + '\n\n' + botInstructions;
|
|
217
243
|
if (contextBundle) {
|
|
218
244
|
prompt += '\n\n## Project Context\n\n' + contextBundle;
|
|
219
245
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/bot/system-prompt.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/bot/system-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,SAAS,iBAAiB,CAAC,WAA4B;IACrD,+CAA+C;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,QAAuB,EAAE,QAAuB;IACvE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,KAA0B;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAyB;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;SACzD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAA4B,EAC5B,aAA4B,EAC5B,aAA4B,EAC5B,eAAoC,EACpC,WAA4B;IAE5B,OAAO;;;;;;;;;;;;;EAaP,iBAAiB,CAAC,WAAW,CAAC;;EAE9B,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC7C,iBAAiB,CAAC,WAAW,CAAC;;;;;;EAM9B,YAAY,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8KA8D+I,CAAC;AAC/K,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAEtE,YAAY,GAAG,uBAAuB,CACpC,OAAO,CAAC,eAAe,IAAI,EAAE,EAC7B,OAAO,CAAC,cAAc,IAAI,EAAE,EAC5B,OAAO,CAAC,cAAc,IAAI,EAAE,EAC5B,OAAO,CAAC,gBAAgB,IAAI,EAAE,EAC9B,OAAO,CAAC,YAAY,IAAI,EAAE,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,YAAY,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,mBAAmB,CAAC,WAA4B;IACvD,MAAM,OAAO,GAAG;QACd,oBAAoB;QACpB,wEAAwE;QACxE,6EAA6E;QAC7E,yFAAyF;QACzF,iEAAiE;QACjE,mMAAmM;QACnM,2FAA2F;QAC3F,EAAE;QACF,mBAAmB;QACnB,8HAA8H;QAC9H,kIAAkI;QAClI,0EAA0E;QAC1E,EAAE;QACF,mBAAmB;QACnB,sGAAsG;QACtG,yGAAyG;QACzG,yDAAyD;QACzD,+CAA+C;QAC/C,qFAAqF;KACtF,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW;SACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;SAChC,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;aACnH,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1E,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW,aAAa,OAAO,IAAI,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,aAAsB,EAAE,YAA8B,EAAE,UAAmB;IAC9G,IAAI,MAAM,GAAG;;;;;;;4DAO6C,CAAC;IAE3D,qFAAqF;IACrF,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvD,MAAM,IAAI,6IAA6I,GAAG,IAAI,CAAC;YACjK,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,4BAA4B,GAAG,aAAa,CAAC;IACzD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto task decomposition — splits broad tasks into per-file tasks.
|
|
3
|
+
*
|
|
4
|
+
* When a task says "fix all templates" or "validate everything",
|
|
5
|
+
* decompose it into one task per file. This gives the AI focused
|
|
6
|
+
* context and prevents one failure from blocking all files.
|
|
7
|
+
*/
|
|
8
|
+
export interface DecomposableTask {
|
|
9
|
+
id: string;
|
|
10
|
+
instruction: string;
|
|
11
|
+
mode?: string;
|
|
12
|
+
targets?: string[];
|
|
13
|
+
priority?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface DecomposedResult {
|
|
16
|
+
decomposed: boolean;
|
|
17
|
+
tasks: DecomposableTask[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a task should be decomposed into per-file tasks.
|
|
21
|
+
* Returns the original task unchanged if no decomposition is needed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function decomposeTask(task: DecomposableTask, projectDir: string): DecomposedResult;
|
|
24
|
+
//# sourceMappingURL=task-decomposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.d.ts","sourceRoot":"","sources":["../../src/bot/task-decomposer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,GACjB,gBAAgB,CA6DlB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto task decomposition — splits broad tasks into per-file tasks.
|
|
3
|
+
*
|
|
4
|
+
* When a task says "fix all templates" or "validate everything",
|
|
5
|
+
* decompose it into one task per file. This gives the AI focused
|
|
6
|
+
* context and prevents one failure from blocking all files.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
// Patterns that suggest a broad task targeting multiple files
|
|
11
|
+
const BROAD_PATTERNS = [
|
|
12
|
+
/\b(all|every|each)\b.*\b(template|workflow|file|node.?type)s?\b/i,
|
|
13
|
+
/\bfix\b.*\bin\s+src\/(templates|node-types|workflows)\/?$/i,
|
|
14
|
+
/\bvalidat(e|ion)\b.*\b(all|every|each|src\/)\b/i,
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Check if a task should be decomposed into per-file tasks.
|
|
18
|
+
* Returns the original task unchanged if no decomposition is needed.
|
|
19
|
+
*/
|
|
20
|
+
export function decomposeTask(task, projectDir) {
|
|
21
|
+
const instruction = task.instruction;
|
|
22
|
+
// Already has specific targets — don't decompose
|
|
23
|
+
if (task.targets && task.targets.length === 1) {
|
|
24
|
+
return { decomposed: false, tasks: [task] };
|
|
25
|
+
}
|
|
26
|
+
// Check if instruction matches broad patterns
|
|
27
|
+
const isBroad = BROAD_PATTERNS.some(p => p.test(instruction));
|
|
28
|
+
if (!isBroad) {
|
|
29
|
+
return { decomposed: false, tasks: [task] };
|
|
30
|
+
}
|
|
31
|
+
// Determine which directory to scan
|
|
32
|
+
let targetDir;
|
|
33
|
+
if (instruction.match(/template/i))
|
|
34
|
+
targetDir = 'src/templates';
|
|
35
|
+
else if (instruction.match(/node.?type/i))
|
|
36
|
+
targetDir = 'src/node-types';
|
|
37
|
+
else if (instruction.match(/workflow/i))
|
|
38
|
+
targetDir = 'src/workflows';
|
|
39
|
+
if (!targetDir) {
|
|
40
|
+
return { decomposed: false, tasks: [task] };
|
|
41
|
+
}
|
|
42
|
+
const absDir = path.resolve(projectDir, targetDir);
|
|
43
|
+
if (!fs.existsSync(absDir)) {
|
|
44
|
+
return { decomposed: false, tasks: [task] };
|
|
45
|
+
}
|
|
46
|
+
// List .ts files in the directory — only files that actually exist
|
|
47
|
+
let files;
|
|
48
|
+
try {
|
|
49
|
+
files = fs.readdirSync(absDir)
|
|
50
|
+
.filter(f => f.endsWith('.ts') && !f.startsWith('index'))
|
|
51
|
+
.filter(f => fs.existsSync(path.resolve(absDir, f))) // verify file exists
|
|
52
|
+
.sort();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { decomposed: false, tasks: [task] };
|
|
56
|
+
}
|
|
57
|
+
if (files.length === 0 || files.length > 50) {
|
|
58
|
+
return { decomposed: false, tasks: [task] };
|
|
59
|
+
}
|
|
60
|
+
// Extract the verb from the original instruction for clean per-file instructions
|
|
61
|
+
const verb = instruction.match(/^(Fix|Validate|Add|Update|Review|Run|Check|Test|Improve)/i)?.[0] ?? 'Process';
|
|
62
|
+
// Create per-file tasks with clean, grammatical instructions
|
|
63
|
+
const tasks = files.map((file, i) => {
|
|
64
|
+
const filePath = path.join(targetDir, file);
|
|
65
|
+
return {
|
|
66
|
+
id: `${task.id}-${i + 1}`,
|
|
67
|
+
instruction: `${verb} ${filePath}`,
|
|
68
|
+
mode: task.mode ?? 'modify',
|
|
69
|
+
targets: [filePath],
|
|
70
|
+
priority: task.priority ?? 0,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
return { decomposed: true, tasks };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=task-decomposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposer.js","sourceRoot":"","sources":["../../src/bot/task-decomposer.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/task-queue.d.ts
CHANGED
|
@@ -6,19 +6,32 @@ export interface QueuedTask {
|
|
|
6
6
|
options?: Record<string, unknown>;
|
|
7
7
|
priority: number;
|
|
8
8
|
addedAt: number;
|
|
9
|
-
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
9
|
+
status: 'pending' | 'running' | 'completed' | 'no-op' | 'failed' | 'cancelled';
|
|
10
|
+
/** Error reason (set on failure) */
|
|
11
|
+
failureReason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AddResult {
|
|
14
|
+
id: string;
|
|
15
|
+
duplicate: boolean;
|
|
10
16
|
}
|
|
11
17
|
export declare class TaskQueue {
|
|
12
|
-
|
|
18
|
+
readonly filePath: string;
|
|
13
19
|
constructor(dir?: string);
|
|
14
|
-
add(task: Omit<QueuedTask, 'id' | 'addedAt' | 'status'>): Promise<
|
|
20
|
+
add(task: Omit<QueuedTask, 'id' | 'addedAt' | 'status'>): Promise<AddResult>;
|
|
15
21
|
next(): Promise<QueuedTask | null>;
|
|
16
22
|
list(): Promise<QueuedTask[]>;
|
|
17
23
|
remove(id: string): Promise<boolean>;
|
|
18
24
|
clear(): Promise<number>;
|
|
19
25
|
markRunning(id: string): Promise<void>;
|
|
20
26
|
markComplete(id: string): Promise<void>;
|
|
21
|
-
|
|
27
|
+
markNoOp(id: string): Promise<void>;
|
|
28
|
+
markFailed(id: string, reason?: string): Promise<void>;
|
|
29
|
+
/** Reset a failed or running task back to pending. */
|
|
30
|
+
retry(id: string): Promise<boolean>;
|
|
31
|
+
/** Reset ALL failed tasks back to pending. Returns count reset. */
|
|
32
|
+
retryAll(): Promise<number>;
|
|
33
|
+
/** Reset orphaned "running" tasks to pending (crash recovery). */
|
|
34
|
+
recoverOrphans(): Promise<number>;
|
|
22
35
|
private updateStatus;
|
|
23
36
|
private readAll;
|
|
24
37
|
private writeAll;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-queue.d.ts","sourceRoot":"","sources":["../../src/bot/task-queue.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"task-queue.d.ts","sourceRoot":"","sources":["../../src/bot/task-queue.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC/E,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD,qBAAa,SAAS;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,GAAG,CAAC,EAAE,MAAM;IAWlB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAqC5E,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQlC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAI7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IASxB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,sDAAsD;IAChD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYzC,mEAAmE;IAC7D,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBjC,kEAAkE;IAC5D,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;YAezB,YAAY;IAW1B,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,QAAQ;CAKjB"}
|