bobo-ai-cli 2.1.0 → 3.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 +52 -9
- package/dist/agent.js +66 -45
- package/dist/agent.js.map +1 -1
- package/dist/agents/catalog.d.ts +40 -0
- package/dist/agents/catalog.js +172 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/router.d.ts +43 -0
- package/dist/agents/router.js +87 -0
- package/dist/agents/router.js.map +1 -0
- package/dist/agents/spawn.d.ts +46 -0
- package/dist/agents/spawn.js +91 -0
- package/dist/agents/spawn.js.map +1 -0
- package/dist/autonomous.js +41 -1
- package/dist/autonomous.js.map +1 -1
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +667 -0
- package/dist/cli.js.map +1 -0
- package/dist/compactor.d.ts +49 -4
- package/dist/compactor.js +164 -17
- package/dist/compactor.js.map +1 -1
- package/dist/completer.js +2 -0
- package/dist/completer.js.map +1 -1
- package/dist/cost-tracker.js +35 -2
- package/dist/cost-tracker.js.map +1 -1
- package/dist/dream.d.ts +42 -0
- package/dist/dream.js +321 -0
- package/dist/dream.js.map +1 -0
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/index.js +8 -1134
- package/dist/index.js.map +1 -1
- package/dist/insight.js +4 -11
- package/dist/insight.js.map +1 -1
- package/dist/knowledge.d.ts +13 -0
- package/dist/knowledge.js +13 -2
- package/dist/knowledge.js.map +1 -1
- package/dist/memory.d.ts +4 -0
- package/dist/memory.js +6 -0
- package/dist/memory.js.map +1 -1
- package/dist/repl.d.ts +16 -0
- package/dist/repl.js +702 -0
- package/dist/repl.js.map +1 -0
- package/dist/sessions.js +23 -0
- package/dist/sessions.js.map +1 -1
- package/dist/skills/composer.d.ts +18 -0
- package/dist/skills/composer.js +59 -0
- package/dist/skills/composer.js.map +1 -0
- package/dist/skills/index.d.ts +3 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +12 -0
- package/dist/skills/loader.js +150 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/types.d.ts +28 -0
- package/dist/skills/types.js +9 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills.d.ts +1 -0
- package/dist/skills.js +1 -0
- package/dist/skills.js.map +1 -1
- package/dist/state/artifacts.d.ts +71 -0
- package/dist/state/artifacts.js +131 -0
- package/dist/state/artifacts.js.map +1 -0
- package/dist/state/index.d.ts +9 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/manager.d.ts +89 -0
- package/dist/state/manager.js +130 -0
- package/dist/state/manager.js.map +1 -0
- package/dist/state/project-memory.d.ts +24 -0
- package/dist/state/project-memory.js +81 -0
- package/dist/state/project-memory.js.map +1 -0
- package/dist/state/recovery.d.ts +24 -0
- package/dist/state/recovery.js +94 -0
- package/dist/state/recovery.js.map +1 -0
- package/dist/statusbar.d.ts +1 -0
- package/dist/statusbar.js +12 -1
- package/dist/statusbar.js.map +1 -1
- package/dist/sub-agent-runner.d.ts +1 -0
- package/dist/sub-agent-runner.js +29 -3
- package/dist/sub-agent-runner.js.map +1 -1
- package/dist/sub-agents.d.ts +19 -1
- package/dist/sub-agents.js +137 -2
- package/dist/sub-agents.js.map +1 -1
- package/dist/tool-governance.d.ts +77 -0
- package/dist/tool-governance.js +335 -0
- package/dist/tool-governance.js.map +1 -0
- package/dist/ui/hud.d.ts +25 -0
- package/dist/ui/hud.js +67 -0
- package/dist/ui/hud.js.map +1 -0
- package/dist/verification-agent.d.ts +46 -0
- package/dist/verification-agent.js +528 -0
- package/dist/verification-agent.js.map +1 -0
- package/dist/workflows/ask.d.ts +13 -0
- package/dist/workflows/ask.js +66 -0
- package/dist/workflows/ask.js.map +1 -0
- package/dist/workflows/index.d.ts +5 -0
- package/dist/workflows/index.js +6 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/interview.d.ts +11 -0
- package/dist/workflows/interview.js +36 -0
- package/dist/workflows/interview.js.map +1 -0
- package/dist/workflows/plan.d.ts +13 -0
- package/dist/workflows/plan.js +34 -0
- package/dist/workflows/plan.js.map +1 -0
- package/dist/workflows/team.d.ts +17 -0
- package/dist/workflows/team.js +86 -0
- package/dist/workflows/team.js.map +1 -0
- package/dist/workflows/verify.d.ts +11 -0
- package/dist/workflows/verify.js +21 -0
- package/dist/workflows/verify.js.map +1 -0
- package/package.json +2 -4
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Governance Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Enforces safety and consistency for all tool executions:
|
|
5
|
+
* Input validation → Risk classification → PreToolUse Hook →
|
|
6
|
+
* Permission check → Execution → PostToolUse Hook → Telemetry
|
|
7
|
+
*
|
|
8
|
+
* Key principles:
|
|
9
|
+
* - Fail-closed: All tools are unsafe by default
|
|
10
|
+
* - Explicit permissions: isConcurrencySafe and isReadOnly must be declared
|
|
11
|
+
* - Stateful constraints: edit_file requires prior read_file
|
|
12
|
+
*/
|
|
13
|
+
import { runHooks } from './hooks.js';
|
|
14
|
+
/**
|
|
15
|
+
* Governance state tracker.
|
|
16
|
+
*/
|
|
17
|
+
class GovernanceState {
|
|
18
|
+
filesRead = new Set();
|
|
19
|
+
toolCallHistory = [];
|
|
20
|
+
maxHistorySize = 100;
|
|
21
|
+
recordFileRead(path) {
|
|
22
|
+
this.filesRead.add(path);
|
|
23
|
+
}
|
|
24
|
+
hasReadFile(path) {
|
|
25
|
+
return this.filesRead.has(path);
|
|
26
|
+
}
|
|
27
|
+
recordToolCall(context) {
|
|
28
|
+
this.toolCallHistory.push(context);
|
|
29
|
+
if (this.toolCallHistory.length > this.maxHistorySize) {
|
|
30
|
+
this.toolCallHistory.shift();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
getRecentToolCalls(limit = 10) {
|
|
34
|
+
return this.toolCallHistory.slice(-limit);
|
|
35
|
+
}
|
|
36
|
+
reset() {
|
|
37
|
+
this.filesRead.clear();
|
|
38
|
+
this.toolCallHistory = [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Global governance state (per process)
|
|
42
|
+
const governanceState = new GovernanceState();
|
|
43
|
+
/**
|
|
44
|
+
* Tool metadata registry.
|
|
45
|
+
* IMPORTANT: Default to fail-closed (unsafe) for unknown tools.
|
|
46
|
+
*/
|
|
47
|
+
const toolMetadataRegistry = {
|
|
48
|
+
// Read-only tools (safe)
|
|
49
|
+
read_file: {
|
|
50
|
+
name: 'read_file',
|
|
51
|
+
isReadOnly: true,
|
|
52
|
+
isConcurrencySafe: true,
|
|
53
|
+
riskLevel: 'safe',
|
|
54
|
+
},
|
|
55
|
+
list_directory: {
|
|
56
|
+
name: 'list_directory',
|
|
57
|
+
isReadOnly: true,
|
|
58
|
+
isConcurrencySafe: true,
|
|
59
|
+
riskLevel: 'safe',
|
|
60
|
+
},
|
|
61
|
+
search_files: {
|
|
62
|
+
name: 'search_files',
|
|
63
|
+
isReadOnly: true,
|
|
64
|
+
isConcurrencySafe: true,
|
|
65
|
+
riskLevel: 'safe',
|
|
66
|
+
},
|
|
67
|
+
git_status: {
|
|
68
|
+
name: 'git_status',
|
|
69
|
+
isReadOnly: true,
|
|
70
|
+
isConcurrencySafe: true,
|
|
71
|
+
riskLevel: 'safe',
|
|
72
|
+
},
|
|
73
|
+
git_diff: {
|
|
74
|
+
name: 'git_diff',
|
|
75
|
+
isReadOnly: true,
|
|
76
|
+
isConcurrencySafe: true,
|
|
77
|
+
riskLevel: 'safe',
|
|
78
|
+
},
|
|
79
|
+
git_log: {
|
|
80
|
+
name: 'git_log',
|
|
81
|
+
isReadOnly: true,
|
|
82
|
+
isConcurrencySafe: true,
|
|
83
|
+
riskLevel: 'safe',
|
|
84
|
+
},
|
|
85
|
+
search_memory: {
|
|
86
|
+
name: 'search_memory',
|
|
87
|
+
isReadOnly: true,
|
|
88
|
+
isConcurrencySafe: true,
|
|
89
|
+
riskLevel: 'safe',
|
|
90
|
+
},
|
|
91
|
+
// Moderate-risk tools (state-modifying but recoverable)
|
|
92
|
+
write_file: {
|
|
93
|
+
name: 'write_file',
|
|
94
|
+
isReadOnly: false,
|
|
95
|
+
isConcurrencySafe: false, // File system races
|
|
96
|
+
riskLevel: 'moderate',
|
|
97
|
+
},
|
|
98
|
+
edit_file: {
|
|
99
|
+
name: 'edit_file',
|
|
100
|
+
isReadOnly: false,
|
|
101
|
+
isConcurrencySafe: false,
|
|
102
|
+
riskLevel: 'moderate',
|
|
103
|
+
requiresPriorRead: ['read_file'], // MUST read file before editing
|
|
104
|
+
},
|
|
105
|
+
save_memory: {
|
|
106
|
+
name: 'save_memory',
|
|
107
|
+
isReadOnly: false,
|
|
108
|
+
isConcurrencySafe: false,
|
|
109
|
+
riskLevel: 'moderate',
|
|
110
|
+
},
|
|
111
|
+
// Dangerous tools (hard to reverse)
|
|
112
|
+
shell: {
|
|
113
|
+
name: 'shell',
|
|
114
|
+
isReadOnly: false,
|
|
115
|
+
isConcurrencySafe: false,
|
|
116
|
+
riskLevel: 'dangerous',
|
|
117
|
+
},
|
|
118
|
+
git_commit: {
|
|
119
|
+
name: 'git_commit',
|
|
120
|
+
isReadOnly: false,
|
|
121
|
+
isConcurrencySafe: false,
|
|
122
|
+
riskLevel: 'dangerous',
|
|
123
|
+
},
|
|
124
|
+
git_push: {
|
|
125
|
+
name: 'git_push',
|
|
126
|
+
isReadOnly: false,
|
|
127
|
+
isConcurrencySafe: false,
|
|
128
|
+
riskLevel: 'dangerous',
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Get tool metadata (fail-closed for unknown tools).
|
|
133
|
+
*/
|
|
134
|
+
export function getToolMetadata(toolName) {
|
|
135
|
+
return toolMetadataRegistry[toolName] || {
|
|
136
|
+
name: toolName,
|
|
137
|
+
isReadOnly: false,
|
|
138
|
+
isConcurrencySafe: false,
|
|
139
|
+
riskLevel: 'dangerous', // Unknown tools are dangerous by default
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Register tool metadata (for external tools).
|
|
144
|
+
*/
|
|
145
|
+
export function registerToolMetadata(metadata) {
|
|
146
|
+
toolMetadataRegistry[metadata.name] = metadata;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Validate tool inputs against schema.
|
|
150
|
+
*/
|
|
151
|
+
function validateToolInputs(toolName, args) {
|
|
152
|
+
// Basic validation - can be extended with JSON schema validation
|
|
153
|
+
switch (toolName) {
|
|
154
|
+
case 'read_file':
|
|
155
|
+
case 'write_file':
|
|
156
|
+
case 'edit_file':
|
|
157
|
+
if (!args.path || typeof args.path !== 'string') {
|
|
158
|
+
return { valid: false, error: 'Missing or invalid "path" parameter' };
|
|
159
|
+
}
|
|
160
|
+
// Check for path traversal attempts
|
|
161
|
+
if (args.path.includes('..')) {
|
|
162
|
+
return { valid: false, error: 'Path traversal not allowed' };
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case 'shell':
|
|
166
|
+
if (!args.command || typeof args.command !== 'string') {
|
|
167
|
+
return { valid: false, error: 'Missing or invalid "command" parameter' };
|
|
168
|
+
}
|
|
169
|
+
// Check for dangerous patterns
|
|
170
|
+
const cmd = args.command;
|
|
171
|
+
if (cmd.includes('rm -rf /') || cmd.includes('mkfs') || cmd.includes(':(){:|:&};:')) {
|
|
172
|
+
return { valid: false, error: 'Dangerous command blocked' };
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case 'edit_file':
|
|
176
|
+
if (!args.oldText || !args.newText) {
|
|
177
|
+
return { valid: false, error: 'Missing "oldText" or "newText" parameter' };
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
return { valid: true };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if tool execution should be allowed based on governance rules.
|
|
185
|
+
*/
|
|
186
|
+
function checkGovernanceRules(toolName, args) {
|
|
187
|
+
const metadata = getToolMetadata(toolName);
|
|
188
|
+
// Check for required prior tool calls
|
|
189
|
+
if (metadata.requiresPriorRead && metadata.requiresPriorRead.length > 0) {
|
|
190
|
+
if (toolName === 'edit_file' && args.path) {
|
|
191
|
+
const filePath = args.path;
|
|
192
|
+
if (!governanceState.hasReadFile(filePath)) {
|
|
193
|
+
return {
|
|
194
|
+
allowed: false,
|
|
195
|
+
reason: `Must read file "${filePath}" before editing. Use read_file first.`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { allowed: true };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Execute tool with full governance pipeline.
|
|
204
|
+
*/
|
|
205
|
+
export async function executeToolWithGovernance(toolName, args, executor) {
|
|
206
|
+
const startTime = Date.now();
|
|
207
|
+
const context = {
|
|
208
|
+
toolName,
|
|
209
|
+
args,
|
|
210
|
+
timestamp: startTime,
|
|
211
|
+
};
|
|
212
|
+
try {
|
|
213
|
+
// Step 1: Input validation
|
|
214
|
+
const validation = validateToolInputs(toolName, args);
|
|
215
|
+
if (!validation.valid) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
error: `Input validation failed: ${validation.error}`,
|
|
219
|
+
duration: Date.now() - startTime,
|
|
220
|
+
blocked: true,
|
|
221
|
+
blockReason: validation.error,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// Step 2: Risk classification (already in metadata)
|
|
225
|
+
const metadata = getToolMetadata(toolName);
|
|
226
|
+
// Step 3: Governance rules check
|
|
227
|
+
const governanceCheck = checkGovernanceRules(toolName, args);
|
|
228
|
+
if (!governanceCheck.allowed) {
|
|
229
|
+
return {
|
|
230
|
+
success: false,
|
|
231
|
+
error: `Governance rule violation: ${governanceCheck.reason}`,
|
|
232
|
+
duration: Date.now() - startTime,
|
|
233
|
+
blocked: true,
|
|
234
|
+
blockReason: governanceCheck.reason,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Step 4: PreToolUse Hook
|
|
238
|
+
try {
|
|
239
|
+
runHooks('pre-tool-use', {
|
|
240
|
+
BOBO_TOOL_NAME: toolName,
|
|
241
|
+
BOBO_TOOL_RISK: metadata.riskLevel,
|
|
242
|
+
BOBO_TOOL_ARGS: JSON.stringify(args),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
catch (hookError) {
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
error: `Pre-tool-use hook failed: ${hookError.message}`,
|
|
249
|
+
duration: Date.now() - startTime,
|
|
250
|
+
blocked: true,
|
|
251
|
+
blockReason: 'Hook rejection',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Step 5: Execute tool
|
|
255
|
+
let output;
|
|
256
|
+
try {
|
|
257
|
+
const result = executor(toolName, args);
|
|
258
|
+
output = result instanceof Promise ? await result : result;
|
|
259
|
+
}
|
|
260
|
+
catch (execError) {
|
|
261
|
+
const duration = Date.now() - startTime;
|
|
262
|
+
governanceState.recordToolCall(context);
|
|
263
|
+
return {
|
|
264
|
+
success: false,
|
|
265
|
+
error: execError.message,
|
|
266
|
+
duration,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
// Step 6: PostToolUse Hook
|
|
270
|
+
try {
|
|
271
|
+
runHooks('post-tool-use', {
|
|
272
|
+
BOBO_TOOL_NAME: toolName,
|
|
273
|
+
BOBO_TOOL_RISK: metadata.riskLevel,
|
|
274
|
+
BOBO_TOOL_SUCCESS: 'true',
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Post-execution hooks shouldn't block
|
|
279
|
+
}
|
|
280
|
+
// Step 7: Update governance state
|
|
281
|
+
governanceState.recordToolCall(context);
|
|
282
|
+
// Track file reads for edit_file enforcement
|
|
283
|
+
if (toolName === 'read_file' && args.path) {
|
|
284
|
+
governanceState.recordFileRead(args.path);
|
|
285
|
+
}
|
|
286
|
+
// Step 8: Telemetry (recorded in context history)
|
|
287
|
+
const duration = Date.now() - startTime;
|
|
288
|
+
return {
|
|
289
|
+
success: true,
|
|
290
|
+
output,
|
|
291
|
+
duration,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
return {
|
|
296
|
+
success: false,
|
|
297
|
+
error: `Governance pipeline error: ${error.message}`,
|
|
298
|
+
duration: Date.now() - startTime,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Check if tools can be run concurrently.
|
|
304
|
+
*/
|
|
305
|
+
export function canRunConcurrently(toolNames) {
|
|
306
|
+
return toolNames.every(name => {
|
|
307
|
+
const metadata = getToolMetadata(name);
|
|
308
|
+
return metadata.isConcurrencySafe;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get governance statistics.
|
|
313
|
+
*/
|
|
314
|
+
export function getGovernanceStats() {
|
|
315
|
+
return {
|
|
316
|
+
filesRead: governanceState['filesRead'].size,
|
|
317
|
+
recentToolCalls: governanceState.getRecentToolCalls(20),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Reset governance state (useful for testing or session boundaries).
|
|
322
|
+
*/
|
|
323
|
+
export function resetGovernanceState() {
|
|
324
|
+
governanceState.reset();
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Format governance result for user display.
|
|
328
|
+
*/
|
|
329
|
+
export function formatGovernanceError(result) {
|
|
330
|
+
if (result.blocked) {
|
|
331
|
+
return `🚫 Tool execution blocked: ${result.blockReason || result.error}`;
|
|
332
|
+
}
|
|
333
|
+
return `❌ Tool execution failed: ${result.error}`;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=tool-governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-governance.js","sourceRoot":"","sources":["../src/tool-governance.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/hud.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HUD — 轻量状态显示
|
|
3
|
+
*
|
|
4
|
+
* 在 CLI 交互模式下,显示当前 agent 状态、活跃 workflow、token 用量
|
|
5
|
+
*/
|
|
6
|
+
export interface HUDState {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
model: string;
|
|
9
|
+
effort: string;
|
|
10
|
+
activeAgents: string[];
|
|
11
|
+
completedTasks: number;
|
|
12
|
+
totalTasks: number;
|
|
13
|
+
tokenUsage: {
|
|
14
|
+
input: number;
|
|
15
|
+
output: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 渲染单行 HUD
|
|
20
|
+
*/
|
|
21
|
+
export declare function renderHUD(state: HUDState): string;
|
|
22
|
+
/**
|
|
23
|
+
* 渲染详细状态面板
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderStatusPanel(state: HUDState): string;
|
package/dist/ui/hud.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HUD — 轻量状态显示
|
|
3
|
+
*
|
|
4
|
+
* 在 CLI 交互模式下,显示当前 agent 状态、活跃 workflow、token 用量
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { readActiveWorkflows } from '../state/manager.js';
|
|
8
|
+
/**
|
|
9
|
+
* 渲染单行 HUD
|
|
10
|
+
*/
|
|
11
|
+
export function renderHUD(state) {
|
|
12
|
+
const agents = state.activeAgents.length > 0
|
|
13
|
+
? state.activeAgents.map(a => chalk.cyan(a)).join(', ')
|
|
14
|
+
: chalk.dim('idle');
|
|
15
|
+
const progress = state.totalTasks > 0
|
|
16
|
+
? `${state.completedTasks}/${state.totalTasks}`
|
|
17
|
+
: '-';
|
|
18
|
+
const tokens = state.tokenUsage.input + state.tokenUsage.output > 0
|
|
19
|
+
? `${formatTokens(state.tokenUsage.input)}↓ ${formatTokens(state.tokenUsage.output)}↑`
|
|
20
|
+
: '';
|
|
21
|
+
const workflows = readActiveWorkflows();
|
|
22
|
+
const workflowStr = workflows.length > 0
|
|
23
|
+
? chalk.yellow(` wf:${workflows.length}`)
|
|
24
|
+
: '';
|
|
25
|
+
return chalk.dim('[') +
|
|
26
|
+
chalk.bold(state.model) +
|
|
27
|
+
chalk.dim('/') +
|
|
28
|
+
state.effort +
|
|
29
|
+
chalk.dim('] ') +
|
|
30
|
+
agents +
|
|
31
|
+
chalk.dim(` ${progress}`) +
|
|
32
|
+
workflowStr +
|
|
33
|
+
(tokens ? chalk.dim(` ${tokens}`) : '');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 渲染详细状态面板
|
|
37
|
+
*/
|
|
38
|
+
export function renderStatusPanel(state) {
|
|
39
|
+
const lines = [
|
|
40
|
+
chalk.cyan.bold('─'.repeat(50)),
|
|
41
|
+
` ${chalk.bold('Session:')} ${state.sessionId}`,
|
|
42
|
+
` ${chalk.bold('Model:')} ${state.model} (${state.effort})`,
|
|
43
|
+
` ${chalk.bold('Agents:')} ${state.activeAgents.length > 0 ? state.activeAgents.join(', ') : 'none'}`,
|
|
44
|
+
` ${chalk.bold('Tasks:')} ${state.completedTasks}/${state.totalTasks}`,
|
|
45
|
+
];
|
|
46
|
+
if (state.tokenUsage.input + state.tokenUsage.output > 0) {
|
|
47
|
+
lines.push(` ${chalk.bold('Tokens:')} ${formatTokens(state.tokenUsage.input)} in / ${formatTokens(state.tokenUsage.output)} out`);
|
|
48
|
+
}
|
|
49
|
+
const workflows = readActiveWorkflows();
|
|
50
|
+
if (workflows.length > 0) {
|
|
51
|
+
lines.push(` ${chalk.bold('Workflows:')}`);
|
|
52
|
+
for (const w of workflows) {
|
|
53
|
+
const icon = w.status === 'completed' ? '✅' : w.status === 'failed' ? '❌' : '⏳';
|
|
54
|
+
lines.push(` ${icon} ${w.type} (${w.status})`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
lines.push(chalk.cyan.bold('─'.repeat(50)));
|
|
58
|
+
return lines.join('\n');
|
|
59
|
+
}
|
|
60
|
+
function formatTokens(n) {
|
|
61
|
+
if (n >= 1_000_000)
|
|
62
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
63
|
+
if (n >= 1_000)
|
|
64
|
+
return `${(n / 1_000).toFixed(1)}K`;
|
|
65
|
+
return String(n);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=hud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hud.js","sourceRoot":"","sources":["../../src/ui/hud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification Agent — 'try to break it' philosophy
|
|
3
|
+
*
|
|
4
|
+
* Instead of confirming success, this agent actively tries to find flaws.
|
|
5
|
+
* - Enforces build/test/lint execution
|
|
6
|
+
* - Adversarial probing: boundary testing, actual API calls
|
|
7
|
+
* - Separation of concerns: independent from the code-writing agent
|
|
8
|
+
* - Returns VERDICT: PASS / FAIL / PARTIAL
|
|
9
|
+
*/
|
|
10
|
+
export type VerificationVerdict = 'PASS' | 'FAIL' | 'PARTIAL';
|
|
11
|
+
export interface VerificationResult {
|
|
12
|
+
verdict: VerificationVerdict;
|
|
13
|
+
summary: string;
|
|
14
|
+
checks: VerificationCheck[];
|
|
15
|
+
reasoning: string;
|
|
16
|
+
suggestedFixes?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface VerificationCheck {
|
|
19
|
+
name: string;
|
|
20
|
+
passed: boolean;
|
|
21
|
+
output?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
skipped?: boolean;
|
|
24
|
+
skipReason?: string;
|
|
25
|
+
}
|
|
26
|
+
interface VerificationOptions {
|
|
27
|
+
cwd?: string;
|
|
28
|
+
skipTests?: boolean;
|
|
29
|
+
skipBuild?: boolean;
|
|
30
|
+
skipLint?: boolean;
|
|
31
|
+
adversarialTests?: AdversarialTest[];
|
|
32
|
+
}
|
|
33
|
+
interface AdversarialTest {
|
|
34
|
+
name: string;
|
|
35
|
+
command: string;
|
|
36
|
+
expectFail?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Main verification function — runs all checks and returns verdict.
|
|
40
|
+
*/
|
|
41
|
+
export declare function runVerification(task: string, result: string, options?: VerificationOptions): Promise<VerificationResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Format verification result for display.
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatVerificationResult(result: VerificationResult): string;
|
|
46
|
+
export {};
|