bobo-ai-cli 2.0.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 +70 -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/claude-bridge.d.ts +18 -0
- package/dist/claude-bridge.js +91 -0
- package/dist/claude-bridge.js.map +1 -0
- 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 -1099
- 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/tools/claude-bridge-tool.d.ts +4 -0
- package/dist/tools/claude-bridge-tool.js +44 -0
- package/dist/tools/claude-bridge-tool.js.map +1 -0
- package/dist/tools/claude-code.d.ts +33 -0
- package/dist/tools/claude-code.js +279 -0
- package/dist/tools/claude-code.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- 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
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
* Sub-agent runner — standalone script that runs as a child process.
|
|
3
3
|
* Usage: node dist/sub-agent-runner.js <taskFile>
|
|
4
4
|
* Reads task from JSON file, runs agent loop, writes result back.
|
|
5
|
+
* Enhanced with role-based tool filtering and prompt injection.
|
|
5
6
|
*/
|
|
6
7
|
export {};
|
package/dist/sub-agent-runner.js
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
* Sub-agent runner — standalone script that runs as a child process.
|
|
3
3
|
* Usage: node dist/sub-agent-runner.js <taskFile>
|
|
4
4
|
* Reads task from JSON file, runs agent loop, writes result back.
|
|
5
|
+
* Enhanced with role-based tool filtering and prompt injection.
|
|
5
6
|
*/
|
|
6
7
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
7
8
|
import { runAgent } from './agent.js';
|
|
9
|
+
import { runVerification, formatVerificationResult } from './verification-agent.js';
|
|
10
|
+
import { getRolePromptInjection } from './sub-agents.js';
|
|
8
11
|
async function main() {
|
|
9
12
|
const taskFile = process.argv[2];
|
|
10
13
|
if (!taskFile) {
|
|
@@ -17,20 +20,43 @@ async function main() {
|
|
|
17
20
|
catch {
|
|
18
21
|
process.exit(1);
|
|
19
22
|
}
|
|
23
|
+
// Set 30-minute timeout
|
|
24
|
+
const timeoutMs = 30 * 60 * 1000;
|
|
25
|
+
const timeoutHandle = setTimeout(() => {
|
|
26
|
+
taskData.status = 'failed';
|
|
27
|
+
taskData.error = 'Timeout: exceeded 30 minute limit';
|
|
28
|
+
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}, timeoutMs);
|
|
20
31
|
// Change to task's cwd
|
|
21
32
|
try {
|
|
22
33
|
process.chdir(taskData.cwd);
|
|
23
34
|
}
|
|
24
35
|
catch { /* stay in current dir */ }
|
|
25
36
|
try {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
const role = taskData.role || 'worker';
|
|
38
|
+
if (role === 'verify') {
|
|
39
|
+
// Special handling for verification agents
|
|
40
|
+
const verificationResult = await runVerification(taskData.task, '', { cwd: taskData.cwd });
|
|
41
|
+
taskData.status = verificationResult.verdict === 'FAIL' ? 'failed' : 'completed';
|
|
42
|
+
taskData.result = formatVerificationResult(verificationResult);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Inject role-specific prompt
|
|
46
|
+
const rolePrompt = getRolePromptInjection(role);
|
|
47
|
+
const enhancedTask = rolePrompt ? `${rolePrompt}\n\n---\n\n${taskData.task}` : taskData.task;
|
|
48
|
+
const result = await runAgent(enhancedTask, [], { quiet: true });
|
|
49
|
+
taskData.status = 'completed';
|
|
50
|
+
taskData.result = result.response;
|
|
51
|
+
}
|
|
29
52
|
}
|
|
30
53
|
catch (e) {
|
|
31
54
|
taskData.status = 'failed';
|
|
32
55
|
taskData.error = e.message;
|
|
33
56
|
}
|
|
57
|
+
finally {
|
|
58
|
+
clearTimeout(timeoutHandle);
|
|
59
|
+
}
|
|
34
60
|
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
35
61
|
}
|
|
36
62
|
main().catch(() => process.exit(1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/sub-agents.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sub-agent management — spawn, list, show background agents.
|
|
3
|
+
* Enhanced with role-based isolation (explore/plan/worker/verify).
|
|
3
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Agent role types with different permission levels.
|
|
7
|
+
* - explore: Read-only exploration (read_file, list_directory, search_files, shell with restrictions)
|
|
8
|
+
* - plan: Read-only planning mode (outputs task plans but cannot modify files)
|
|
9
|
+
* - worker: Full tool permissions (but injected with anti-recursion prompt)
|
|
10
|
+
* - verify: Uses verification-agent logic to validate work
|
|
11
|
+
*/
|
|
12
|
+
export type AgentRole = 'explore' | 'plan' | 'worker' | 'verify';
|
|
4
13
|
interface SubAgentTask {
|
|
5
14
|
id: string;
|
|
6
15
|
task: string;
|
|
@@ -11,11 +20,20 @@ interface SubAgentTask {
|
|
|
11
20
|
result?: string;
|
|
12
21
|
error?: string;
|
|
13
22
|
pid?: number;
|
|
23
|
+
role?: AgentRole;
|
|
14
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Get allowed tools for a specific role.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getAllowedToolsForRole(role: AgentRole): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Get role-specific system prompt injection.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getRolePromptInjection(role: AgentRole): string;
|
|
15
33
|
/**
|
|
16
34
|
* Spawn a new sub-agent to run a task in the background.
|
|
17
35
|
*/
|
|
18
|
-
export declare function spawnSubAgent(task: string): {
|
|
36
|
+
export declare function spawnSubAgent(task: string, role?: AgentRole): {
|
|
19
37
|
id: string;
|
|
20
38
|
error?: string;
|
|
21
39
|
};
|
package/dist/sub-agents.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Sub-agent management — spawn, list, show background agents.
|
|
3
|
+
* Enhanced with role-based isolation (explore/plan/worker/verify).
|
|
3
4
|
*/
|
|
4
5
|
import { fork } from 'node:child_process';
|
|
5
6
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
6
7
|
import { join } from 'node:path';
|
|
7
8
|
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import { getConfigDir } from './config.js';
|
|
10
|
+
import { AGENT_CATALOG } from './agents/catalog.js';
|
|
9
11
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
10
12
|
const MAX_CONCURRENT = 3;
|
|
11
13
|
// Track running processes in memory
|
|
@@ -19,17 +21,149 @@ function ensureAgentsDir() {
|
|
|
19
21
|
mkdirSync(dir, { recursive: true });
|
|
20
22
|
}
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Get allowed tools for a specific role.
|
|
26
|
+
*/
|
|
27
|
+
export function getAllowedToolsForRole(role) {
|
|
28
|
+
switch (role) {
|
|
29
|
+
case 'explore':
|
|
30
|
+
// Read-only tools for exploration
|
|
31
|
+
return [
|
|
32
|
+
'read_file',
|
|
33
|
+
'list_directory',
|
|
34
|
+
'search_files',
|
|
35
|
+
'git_status',
|
|
36
|
+
'git_diff',
|
|
37
|
+
'git_log',
|
|
38
|
+
'search_memory',
|
|
39
|
+
];
|
|
40
|
+
case 'plan':
|
|
41
|
+
// Read-only + planning tools
|
|
42
|
+
return [
|
|
43
|
+
'read_file',
|
|
44
|
+
'list_directory',
|
|
45
|
+
'search_files',
|
|
46
|
+
'git_status',
|
|
47
|
+
'git_diff',
|
|
48
|
+
'git_log',
|
|
49
|
+
'search_memory',
|
|
50
|
+
];
|
|
51
|
+
case 'worker':
|
|
52
|
+
// Full access (but will be injected with anti-recursion prompt)
|
|
53
|
+
return ['*']; // All tools allowed
|
|
54
|
+
case 'verify':
|
|
55
|
+
// Verification tools
|
|
56
|
+
return [
|
|
57
|
+
'read_file',
|
|
58
|
+
'list_directory',
|
|
59
|
+
'search_files',
|
|
60
|
+
'shell', // For running build/test/lint
|
|
61
|
+
'git_status',
|
|
62
|
+
'git_diff',
|
|
63
|
+
];
|
|
64
|
+
default:
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get role-specific system prompt injection.
|
|
70
|
+
*/
|
|
71
|
+
export function getRolePromptInjection(role) {
|
|
72
|
+
// Try to use catalog-based prompts first for richer role definitions
|
|
73
|
+
const catalogRole = role === 'worker' ? 'executor' : role === 'plan' ? 'planner' : role === 'verify' ? 'verifier' : role;
|
|
74
|
+
const catalogAgent = AGENT_CATALOG[catalogRole];
|
|
75
|
+
const catalogContext = catalogAgent
|
|
76
|
+
? `\n\n## Catalog Context\n- Role: ${catalogAgent.role}\n- Description: ${catalogAgent.description}\n- Use cases: ${catalogAgent.useCases.join(', ')}\n- Boundaries: ${catalogAgent.boundaries.join(', ')}`
|
|
77
|
+
: '';
|
|
78
|
+
switch (role) {
|
|
79
|
+
case 'explore':
|
|
80
|
+
return `
|
|
81
|
+
# Role: Explorer Agent
|
|
82
|
+
|
|
83
|
+
You are an exploration agent with READ-ONLY access. Your job is to:
|
|
84
|
+
- Read and analyze files
|
|
85
|
+
- Search for patterns and information
|
|
86
|
+
- Report findings clearly
|
|
87
|
+
|
|
88
|
+
You CANNOT:
|
|
89
|
+
- Modify any files (write_file, edit_file)
|
|
90
|
+
- Execute arbitrary shell commands
|
|
91
|
+
- Create or delete files
|
|
92
|
+
- Make git commits
|
|
93
|
+
|
|
94
|
+
Focus on gathering information and presenting it clearly.${catalogContext}`;
|
|
95
|
+
case 'plan':
|
|
96
|
+
return `
|
|
97
|
+
# Role: Planning Agent
|
|
98
|
+
|
|
99
|
+
You are a planning agent with READ-ONLY access. Your job is to:
|
|
100
|
+
- Analyze the codebase and requirements
|
|
101
|
+
- Create detailed task breakdowns
|
|
102
|
+
- Identify dependencies and risks
|
|
103
|
+
- Propose implementation approaches
|
|
104
|
+
|
|
105
|
+
You CANNOT:
|
|
106
|
+
- Modify any files
|
|
107
|
+
- Execute code changes
|
|
108
|
+
- Make commits
|
|
109
|
+
|
|
110
|
+
Output a structured plan with:
|
|
111
|
+
1. Tasks broken down into steps
|
|
112
|
+
2. File paths that need changes
|
|
113
|
+
3. Potential risks or blockers
|
|
114
|
+
4. Estimated complexity${catalogContext}`;
|
|
115
|
+
case 'worker':
|
|
116
|
+
return `
|
|
117
|
+
# Role: Worker Agent
|
|
118
|
+
|
|
119
|
+
You are a worker agent with FULL tool access. Your job is to:
|
|
120
|
+
- Execute tasks efficiently
|
|
121
|
+
- Make file changes as needed
|
|
122
|
+
- Run tests and verify your work
|
|
123
|
+
- Report completion status
|
|
124
|
+
|
|
125
|
+
CRITICAL CONSTRAINTS:
|
|
126
|
+
- You are a WORKER, not a manager
|
|
127
|
+
- NEVER spawn sub-agents or delegate work
|
|
128
|
+
- Execute tasks directly yourself
|
|
129
|
+
- If you encounter blockers, report them immediately
|
|
130
|
+
|
|
131
|
+
Focus on DOING the work, not planning or delegating.${catalogContext}`;
|
|
132
|
+
case 'verify':
|
|
133
|
+
return `
|
|
134
|
+
# Role: Verification Agent
|
|
135
|
+
|
|
136
|
+
You are a verification agent using 'try to break it' philosophy. Your job is to:
|
|
137
|
+
- Run build/test/lint checks
|
|
138
|
+
- Probe for edge cases and boundary conditions
|
|
139
|
+
- Test actual functionality (API calls, CLI commands)
|
|
140
|
+
- Report honest assessment
|
|
141
|
+
|
|
142
|
+
You SHOULD:
|
|
143
|
+
- Be adversarial - try to find what's broken
|
|
144
|
+
- Run all available verification steps
|
|
145
|
+
- Test with unusual inputs
|
|
146
|
+
- Check for security issues
|
|
147
|
+
|
|
148
|
+
You MUST:
|
|
149
|
+
- Return VERDICT: PASS / FAIL / PARTIAL
|
|
150
|
+
- Provide specific evidence for failures
|
|
151
|
+
- Suggest concrete fixes${catalogContext}`;
|
|
152
|
+
default:
|
|
153
|
+
return '';
|
|
154
|
+
}
|
|
155
|
+
}
|
|
22
156
|
/**
|
|
23
157
|
* Spawn a new sub-agent to run a task in the background.
|
|
24
158
|
*/
|
|
25
|
-
export function spawnSubAgent(task) {
|
|
159
|
+
export function spawnSubAgent(task, role = 'worker') {
|
|
26
160
|
ensureAgentsDir();
|
|
27
161
|
// Check concurrent limit
|
|
28
162
|
const running = listSubAgents().filter(a => a.status === 'running');
|
|
29
163
|
if (running.length >= MAX_CONCURRENT) {
|
|
30
164
|
return { id: '', error: `Max ${MAX_CONCURRENT} concurrent sub-agents. Wait for one to finish or check /agents.` };
|
|
31
165
|
}
|
|
32
|
-
const id = `agent-${Date.now().toString(36)}`;
|
|
166
|
+
const id = `agent-${Date.now().toString(36)}-${role}`;
|
|
33
167
|
const taskFile = join(getAgentsDir(), `${id}.json`);
|
|
34
168
|
const taskData = {
|
|
35
169
|
id,
|
|
@@ -37,6 +171,7 @@ export function spawnSubAgent(task) {
|
|
|
37
171
|
cwd: process.cwd(),
|
|
38
172
|
status: 'running',
|
|
39
173
|
startedAt: new Date().toISOString(),
|
|
174
|
+
role,
|
|
40
175
|
};
|
|
41
176
|
writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
|
|
42
177
|
// Fork the sub-agent runner
|
package/dist/sub-agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
/**
|
|
14
|
+
* Risk levels for tool operations.
|
|
15
|
+
*/
|
|
16
|
+
export type ToolRiskLevel = 'safe' | 'moderate' | 'dangerous';
|
|
17
|
+
/**
|
|
18
|
+
* Tool metadata for governance.
|
|
19
|
+
*/
|
|
20
|
+
export interface ToolMetadata {
|
|
21
|
+
name: string;
|
|
22
|
+
isReadOnly: boolean;
|
|
23
|
+
isConcurrencySafe: boolean;
|
|
24
|
+
riskLevel: ToolRiskLevel;
|
|
25
|
+
requiresPriorRead?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tool execution context.
|
|
29
|
+
*/
|
|
30
|
+
export interface ToolExecutionContext {
|
|
31
|
+
toolName: string;
|
|
32
|
+
args: Record<string, unknown>;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Tool execution result.
|
|
38
|
+
*/
|
|
39
|
+
export interface ToolExecutionResult {
|
|
40
|
+
success: boolean;
|
|
41
|
+
output?: string;
|
|
42
|
+
error?: string;
|
|
43
|
+
duration: number;
|
|
44
|
+
blocked?: boolean;
|
|
45
|
+
blockReason?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get tool metadata (fail-closed for unknown tools).
|
|
49
|
+
*/
|
|
50
|
+
export declare function getToolMetadata(toolName: string): ToolMetadata;
|
|
51
|
+
/**
|
|
52
|
+
* Register tool metadata (for external tools).
|
|
53
|
+
*/
|
|
54
|
+
export declare function registerToolMetadata(metadata: ToolMetadata): void;
|
|
55
|
+
/**
|
|
56
|
+
* Execute tool with full governance pipeline.
|
|
57
|
+
*/
|
|
58
|
+
export declare function executeToolWithGovernance(toolName: string, args: Record<string, unknown>, executor: (name: string, args: Record<string, unknown>) => Promise<string> | string): Promise<ToolExecutionResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if tools can be run concurrently.
|
|
61
|
+
*/
|
|
62
|
+
export declare function canRunConcurrently(toolNames: string[]): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get governance statistics.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getGovernanceStats(): {
|
|
67
|
+
filesRead: number;
|
|
68
|
+
recentToolCalls: ToolExecutionContext[];
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Reset governance state (useful for testing or session boundaries).
|
|
72
|
+
*/
|
|
73
|
+
export declare function resetGovernanceState(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Format governance result for user display.
|
|
76
|
+
*/
|
|
77
|
+
export declare function formatGovernanceError(result: ToolExecutionResult): string;
|