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.
Files changed (126) hide show
  1. package/README.md +52 -9
  2. package/dist/agent.js +70 -45
  3. package/dist/agent.js.map +1 -1
  4. package/dist/agents/catalog.d.ts +40 -0
  5. package/dist/agents/catalog.js +172 -0
  6. package/dist/agents/catalog.js.map +1 -0
  7. package/dist/agents/index.d.ts +6 -0
  8. package/dist/agents/index.js +4 -0
  9. package/dist/agents/index.js.map +1 -0
  10. package/dist/agents/router.d.ts +43 -0
  11. package/dist/agents/router.js +87 -0
  12. package/dist/agents/router.js.map +1 -0
  13. package/dist/agents/spawn.d.ts +46 -0
  14. package/dist/agents/spawn.js +91 -0
  15. package/dist/agents/spawn.js.map +1 -0
  16. package/dist/autonomous.js +41 -1
  17. package/dist/autonomous.js.map +1 -1
  18. package/dist/claude-bridge.d.ts +18 -0
  19. package/dist/claude-bridge.js +91 -0
  20. package/dist/claude-bridge.js.map +1 -0
  21. package/dist/cli.d.ts +8 -0
  22. package/dist/cli.js +667 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/compactor.d.ts +49 -4
  25. package/dist/compactor.js +164 -17
  26. package/dist/compactor.js.map +1 -1
  27. package/dist/completer.js +2 -0
  28. package/dist/completer.js.map +1 -1
  29. package/dist/cost-tracker.js +35 -2
  30. package/dist/cost-tracker.js.map +1 -1
  31. package/dist/dream.d.ts +42 -0
  32. package/dist/dream.js +321 -0
  33. package/dist/dream.js.map +1 -0
  34. package/dist/hooks.d.ts +1 -1
  35. package/dist/hooks.js +4 -0
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/index.js +8 -1099
  38. package/dist/index.js.map +1 -1
  39. package/dist/insight.js +4 -11
  40. package/dist/insight.js.map +1 -1
  41. package/dist/knowledge.d.ts +13 -0
  42. package/dist/knowledge.js +13 -2
  43. package/dist/knowledge.js.map +1 -1
  44. package/dist/memory.d.ts +4 -0
  45. package/dist/memory.js +6 -0
  46. package/dist/memory.js.map +1 -1
  47. package/dist/repl.d.ts +16 -0
  48. package/dist/repl.js +702 -0
  49. package/dist/repl.js.map +1 -0
  50. package/dist/sessions.js +23 -0
  51. package/dist/sessions.js.map +1 -1
  52. package/dist/skills/composer.d.ts +18 -0
  53. package/dist/skills/composer.js +59 -0
  54. package/dist/skills/composer.js.map +1 -0
  55. package/dist/skills/index.d.ts +3 -0
  56. package/dist/skills/index.js +3 -0
  57. package/dist/skills/index.js.map +1 -0
  58. package/dist/skills/loader.d.ts +12 -0
  59. package/dist/skills/loader.js +150 -0
  60. package/dist/skills/loader.js.map +1 -0
  61. package/dist/skills/types.d.ts +28 -0
  62. package/dist/skills/types.js +9 -0
  63. package/dist/skills/types.js.map +1 -0
  64. package/dist/skills.d.ts +1 -0
  65. package/dist/skills.js +1 -0
  66. package/dist/skills.js.map +1 -1
  67. package/dist/state/artifacts.d.ts +71 -0
  68. package/dist/state/artifacts.js +131 -0
  69. package/dist/state/artifacts.js.map +1 -0
  70. package/dist/state/index.d.ts +9 -0
  71. package/dist/state/index.js +7 -0
  72. package/dist/state/index.js.map +1 -0
  73. package/dist/state/manager.d.ts +89 -0
  74. package/dist/state/manager.js +130 -0
  75. package/dist/state/manager.js.map +1 -0
  76. package/dist/state/project-memory.d.ts +24 -0
  77. package/dist/state/project-memory.js +81 -0
  78. package/dist/state/project-memory.js.map +1 -0
  79. package/dist/state/recovery.d.ts +24 -0
  80. package/dist/state/recovery.js +94 -0
  81. package/dist/state/recovery.js.map +1 -0
  82. package/dist/statusbar.d.ts +1 -0
  83. package/dist/statusbar.js +12 -1
  84. package/dist/statusbar.js.map +1 -1
  85. package/dist/sub-agent-runner.d.ts +1 -0
  86. package/dist/sub-agent-runner.js +29 -3
  87. package/dist/sub-agent-runner.js.map +1 -1
  88. package/dist/sub-agents.d.ts +19 -1
  89. package/dist/sub-agents.js +137 -2
  90. package/dist/sub-agents.js.map +1 -1
  91. package/dist/tool-governance.d.ts +77 -0
  92. package/dist/tool-governance.js +335 -0
  93. package/dist/tool-governance.js.map +1 -0
  94. package/dist/tools/claude-bridge-tool.d.ts +4 -0
  95. package/dist/tools/claude-bridge-tool.js +44 -0
  96. package/dist/tools/claude-bridge-tool.js.map +1 -0
  97. package/dist/tools/claude-code.d.ts +33 -0
  98. package/dist/tools/claude-code.js +279 -0
  99. package/dist/tools/claude-code.js.map +1 -0
  100. package/dist/tools/index.js +4 -0
  101. package/dist/tools/index.js.map +1 -1
  102. package/dist/ui/hud.d.ts +25 -0
  103. package/dist/ui/hud.js +67 -0
  104. package/dist/ui/hud.js.map +1 -0
  105. package/dist/verification-agent.d.ts +46 -0
  106. package/dist/verification-agent.js +528 -0
  107. package/dist/verification-agent.js.map +1 -0
  108. package/dist/workflows/ask.d.ts +13 -0
  109. package/dist/workflows/ask.js +66 -0
  110. package/dist/workflows/ask.js.map +1 -0
  111. package/dist/workflows/index.d.ts +5 -0
  112. package/dist/workflows/index.js +6 -0
  113. package/dist/workflows/index.js.map +1 -0
  114. package/dist/workflows/interview.d.ts +11 -0
  115. package/dist/workflows/interview.js +36 -0
  116. package/dist/workflows/interview.js.map +1 -0
  117. package/dist/workflows/plan.d.ts +13 -0
  118. package/dist/workflows/plan.js +34 -0
  119. package/dist/workflows/plan.js.map +1 -0
  120. package/dist/workflows/team.d.ts +17 -0
  121. package/dist/workflows/team.js +86 -0
  122. package/dist/workflows/team.js.map +1 -0
  123. package/dist/workflows/verify.d.ts +11 -0
  124. package/dist/workflows/verify.js +21 -0
  125. package/dist/workflows/verify.js.map +1 -0
  126. 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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"}
@@ -0,0 +1,4 @@
1
+ import type { ChatCompletionTool } from 'openai/resources/index.js';
2
+ export declare const claudeBridgeToolDefinitions: ChatCompletionTool[];
3
+ export declare function isClaudeBridgeTool(name: string): boolean;
4
+ export declare function executeClaudeBridgeTool(args: Record<string, unknown>): Promise<string>;
@@ -0,0 +1,44 @@
1
+ import { delegateToClaudeFile, isClaudeAvailable } from '../claude-bridge.js';
2
+ export const claudeBridgeToolDefinitions = [
3
+ {
4
+ type: 'function',
5
+ function: {
6
+ name: 'delegate_claude',
7
+ description: 'Delegate a heavy engineering or long-running task to local Claude Code CLI and return its result.',
8
+ parameters: {
9
+ type: 'object',
10
+ properties: {
11
+ task: { type: 'string', description: 'Task prompt to send to Claude Code' },
12
+ cwd: { type: 'string', description: 'Working directory for Claude Code' },
13
+ model: { type: 'string', description: 'Optional Claude model override' },
14
+ maxTimeout: { type: 'number', description: 'Timeout in seconds (default 120)' },
15
+ systemPromptAppend: { type: 'string', description: 'Extra system prompt appended to Claude Code' },
16
+ outputFormat: { type: 'string', enum: ['text', 'json'], description: 'Claude output format' },
17
+ },
18
+ required: ['task'],
19
+ },
20
+ },
21
+ },
22
+ ];
23
+ export function isClaudeBridgeTool(name) {
24
+ return name === 'delegate_claude';
25
+ }
26
+ export async function executeClaudeBridgeTool(args) {
27
+ if (!isClaudeAvailable()) {
28
+ return 'Error: Claude Code CLI is not available in PATH';
29
+ }
30
+ const result = delegateToClaudeFile({
31
+ task: args.task,
32
+ cwd: args.cwd,
33
+ model: args.model,
34
+ maxTimeout: args.maxTimeout,
35
+ systemPromptAppend: args.systemPromptAppend,
36
+ outputFormat: args.outputFormat || 'text',
37
+ });
38
+ const duration = `${(result.durationMs / 1000).toFixed(1)}s`;
39
+ if (result.success) {
40
+ return `Claude Code delegation succeeded in ${duration}\n\n${result.output}`.trim();
41
+ }
42
+ return `Claude Code delegation failed in ${duration}\nExit code: ${result.exitCode ?? 'unknown'}\n${result.error || result.output}`.trim();
43
+ }
44
+ //# sourceMappingURL=claude-bridge-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-bridge-tool.js","sourceRoot":"","sources":["../../src/tools/claude-bridge-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,CAAC,MAAM,2BAA2B,GAAyB;IAC/D;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,mGAAmG;YAChH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBAC3E,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;oBACzE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;oBACxE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;oBAC/E,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;oBAClG,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE;iBAC9F;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,KAAK,iBAAiB,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IACzE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO,iDAAiD,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAc;QACzB,GAAG,EAAE,IAAI,CAAC,GAAyB;QACnC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,UAAU,EAAE,IAAI,CAAC,UAAgC;QACjD,kBAAkB,EAAE,IAAI,CAAC,kBAAwC;QACjE,YAAY,EAAG,IAAI,CAAC,YAA4C,IAAI,MAAM;KAC3E,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,uCAAuC,QAAQ,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IACtF,CAAC;IAED,OAAO,oCAAoC,QAAQ,gBAAgB,MAAM,CAAC,QAAQ,IAAI,SAAS,KAAK,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7I,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Claude Code Bridge — invoke Claude Code as a tool from Bobo CLI.
3
+ *
4
+ * Architecture:
5
+ * - Bobo CLI decides WHAT to do (skill routing, planning, memory)
6
+ * - Claude Code does the HEAVY LIFTING (large refactors, long chains, testing)
7
+ * - Results flow back to Bobo CLI for tracking and memory
8
+ *
9
+ * Delegation rules:
10
+ * - Simple edits → Bobo's own tools
11
+ * - Complex multi-file refactors → Claude Code
12
+ * - Long-running tasks → Claude Code
13
+ * - Tasks needing browser/visual → Claude Code
14
+ * - Skill routing / planning → Bobo keeps
15
+ */
16
+ import type { ChatCompletionTool } from 'openai/resources/index.js';
17
+ export declare const claudeCodeToolDefinitions: ChatCompletionTool[];
18
+ export declare function isClaudeCodeAvailable(): boolean;
19
+ export declare function isClaudeCodeTool(name: string): boolean;
20
+ export declare function executeClaudeCodeTool(name: string, args: Record<string, unknown>): string;
21
+ export interface DelegationDecision {
22
+ target: 'bobo' | 'claude-code';
23
+ reason: string;
24
+ confidence: number;
25
+ }
26
+ /**
27
+ * Decide whether a task should be handled by Bobo or delegated to Claude Code.
28
+ */
29
+ export declare function shouldDelegate(taskDescription: string): DelegationDecision;
30
+ /**
31
+ * Cleanup all Claude Code sessions.
32
+ */
33
+ export declare function cleanupClaudeSessions(): void;