@bbclaw/cli 0.1.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 (65) hide show
  1. package/dist/auth/authStore.d.ts +17 -0
  2. package/dist/auth/authStore.d.ts.map +1 -0
  3. package/dist/auth/authStore.js +40 -0
  4. package/dist/auth/authStore.js.map +1 -0
  5. package/dist/auth/client.d.ts +23 -0
  6. package/dist/auth/client.d.ts.map +1 -0
  7. package/dist/auth/client.js +50 -0
  8. package/dist/auth/client.js.map +1 -0
  9. package/dist/index.d.ts +18 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +401 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/repl/App.d.ts +10 -0
  14. package/dist/repl/App.d.ts.map +1 -0
  15. package/dist/repl/App.js +86 -0
  16. package/dist/repl/App.js.map +1 -0
  17. package/dist/repl/Input.d.ts +25 -0
  18. package/dist/repl/Input.d.ts.map +1 -0
  19. package/dist/repl/Input.js +162 -0
  20. package/dist/repl/Input.js.map +1 -0
  21. package/dist/repl/MessageList.d.ts +8 -0
  22. package/dist/repl/MessageList.d.ts.map +1 -0
  23. package/dist/repl/MessageList.js +63 -0
  24. package/dist/repl/MessageList.js.map +1 -0
  25. package/dist/repl/ToolApprovalPrompt.d.ts +10 -0
  26. package/dist/repl/ToolApprovalPrompt.d.ts.map +1 -0
  27. package/dist/repl/ToolApprovalPrompt.js +34 -0
  28. package/dist/repl/ToolApprovalPrompt.js.map +1 -0
  29. package/dist/repl/animations.d.ts +24 -0
  30. package/dist/repl/animations.d.ts.map +1 -0
  31. package/dist/repl/animations.js +79 -0
  32. package/dist/repl/animations.js.map +1 -0
  33. package/dist/repl/runRepl.d.ts +4 -0
  34. package/dist/repl/runRepl.d.ts.map +1 -0
  35. package/dist/repl/runRepl.js +44 -0
  36. package/dist/repl/runRepl.js.map +1 -0
  37. package/dist/repl/sessionStore.d.ts +31 -0
  38. package/dist/repl/sessionStore.d.ts.map +1 -0
  39. package/dist/repl/sessionStore.js +79 -0
  40. package/dist/repl/sessionStore.js.map +1 -0
  41. package/dist/repl/slashCommands.d.ts +61 -0
  42. package/dist/repl/slashCommands.d.ts.map +1 -0
  43. package/dist/repl/slashCommands.js +328 -0
  44. package/dist/repl/slashCommands.js.map +1 -0
  45. package/dist/repl/useChat.d.ts +65 -0
  46. package/dist/repl/useChat.d.ts.map +1 -0
  47. package/dist/repl/useChat.js +517 -0
  48. package/dist/repl/useChat.js.map +1 -0
  49. package/dist/tools/Bash.d.ts +11 -0
  50. package/dist/tools/Bash.d.ts.map +1 -0
  51. package/dist/tools/Bash.js +61 -0
  52. package/dist/tools/Bash.js.map +1 -0
  53. package/dist/tools/Read.d.ts +11 -0
  54. package/dist/tools/Read.d.ts.map +1 -0
  55. package/dist/tools/Read.js +39 -0
  56. package/dist/tools/Read.js.map +1 -0
  57. package/dist/tools/Write.d.ts +12 -0
  58. package/dist/tools/Write.d.ts.map +1 -0
  59. package/dist/tools/Write.js +42 -0
  60. package/dist/tools/Write.js.map +1 -0
  61. package/dist/tools/index.d.ts +15 -0
  62. package/dist/tools/index.d.ts.map +1 -0
  63. package/dist/tools/index.js +35 -0
  64. package/dist/tools/index.js.map +1 -0
  65. package/package.json +35 -0
@@ -0,0 +1,517 @@
1
+ import { BridgeLoginRequiredError, } from '@bbclaw/core';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { BUILTIN_TOOLS } from '../tools/index.js';
4
+ import { newSessionId, saveSession } from './sessionStore.js';
5
+ export function useChat({ registry, maxTokens, initialSession, tools = BUILTIN_TOOLS, maxIterations = 20, }) {
6
+ const fallbackInitial = registry.getDefault() ?? registry.list()[0];
7
+ if (!fallbackInitial)
8
+ throw new Error('ProviderRegistry is empty — cannot start REPL');
9
+ // Default to the provider's declared maxOutputTokens so big tool inputs
10
+ // (writing whole HTML files etc) don't get truncated mid-JSON.
11
+ const effectiveMaxTokens = maxTokens ?? fallbackInitial.capabilities.maxOutputTokens ?? 4096;
12
+ const [sessionId, setSessionId] = useState(initialSession?.id ?? newSessionId());
13
+ const createdAtRef = useRef(initialSession?.createdAt ?? new Date().toISOString());
14
+ const [providerId, setProviderId] = useState(initialSession?.providerId ?? fallbackInitial.id);
15
+ const [model, setModel] = useState(initialSession?.model ?? fallbackInitial.defaultModel);
16
+ const [log, setLog] = useState(initialSession?.log ?? []);
17
+ const [history, setHistory] = useState(initialSession?.history ?? []);
18
+ const [streamingText, setStreamingText] = useState('');
19
+ const [status, setStatus] = useState('idle');
20
+ const [usage, setUsage] = useState({ inputTokens: 0, outputTokens: 0 });
21
+ const [pendingTool, setPendingTool] = useState(null);
22
+ const [runningTool, setRunningTool] = useState(null);
23
+ const [loop, setLoop] = useState(null);
24
+ const cancelRef = useRef(false);
25
+ const approvalResolveRef = useRef(null);
26
+ const pendingToolRef = useRef(null);
27
+ const alwaysAllowedRef = useRef(new Set());
28
+ // Mirror the set into a re-render trigger so /allowed and UI hints stay live.
29
+ const [, setAlwaysAllowedTick] = useState(0);
30
+ const bumpAlwaysAllowed = useCallback(() => setAlwaysAllowedTick((n) => n + 1), []);
31
+ // Loop scheduling. Held in refs because the timer's callback would otherwise
32
+ // close over a stale `loop` state.
33
+ const loopRef = useRef(null);
34
+ const sendRef = useRef(async () => { });
35
+ const currentProvider = useMemo(() => {
36
+ const p = registry.get(providerId);
37
+ if (!p)
38
+ throw new Error(`Provider "${providerId}" no longer registered`);
39
+ return p;
40
+ }, [registry, providerId]);
41
+ const toolDefs = useMemo(() => tools.map((t) => t.def), [tools]);
42
+ const toolByName = useMemo(() => new Map(tools.map((t) => [t.def.name, t])), [tools]);
43
+ const addNote = useCallback((text) => {
44
+ setLog((prev) => [...prev, { kind: 'note', text }]);
45
+ }, []);
46
+ const clearLog = useCallback(() => {
47
+ setLog([]);
48
+ setStreamingText('');
49
+ setUsage({ inputTokens: 0, outputTokens: 0 });
50
+ }, []);
51
+ const cancel = useCallback(() => {
52
+ cancelRef.current = true;
53
+ const fn = approvalResolveRef.current;
54
+ if (fn) {
55
+ approvalResolveRef.current = null;
56
+ pendingToolRef.current = null;
57
+ setPendingTool(null);
58
+ fn('deny');
59
+ }
60
+ }, []);
61
+ const setProvider = useCallback((id) => {
62
+ const p = registry.get(id);
63
+ if (!p)
64
+ return;
65
+ setProviderId(id);
66
+ setModel(p.defaultModel);
67
+ }, [registry]);
68
+ const loadState = useCallback((data) => {
69
+ setSessionId(data.id);
70
+ createdAtRef.current = data.createdAt;
71
+ setProviderId(data.providerId);
72
+ setModel(data.model);
73
+ setLog(data.log);
74
+ setHistory(data.history);
75
+ setStreamingText('');
76
+ setUsage({ inputTokens: 0, outputTokens: 0 });
77
+ }, []);
78
+ const respondToApproval = useCallback((decision) => {
79
+ const fn = approvalResolveRef.current;
80
+ if (!fn)
81
+ return;
82
+ approvalResolveRef.current = null;
83
+ const pending = pendingToolRef.current;
84
+ pendingToolRef.current = null;
85
+ setPendingTool(null);
86
+ setStatus('streaming');
87
+ if (decision === 'allow-all') {
88
+ if (pending) {
89
+ alwaysAllowedRef.current.add(pending.name);
90
+ bumpAlwaysAllowed();
91
+ }
92
+ fn('approve');
93
+ }
94
+ else {
95
+ fn(decision);
96
+ }
97
+ }, [bumpAlwaysAllowed]);
98
+ const requestApproval = useCallback((block) => {
99
+ if (alwaysAllowedRef.current.has(block.name))
100
+ return Promise.resolve('approve');
101
+ return new Promise((resolve) => {
102
+ approvalResolveRef.current = resolve;
103
+ pendingToolRef.current = block;
104
+ setPendingTool(block);
105
+ setStatus('awaiting-approval');
106
+ });
107
+ }, []);
108
+ const agentLoop = useCallback(async (initialWorkLog) => {
109
+ let workLog = initialWorkLog;
110
+ const provider = registry.get(providerId);
111
+ if (!provider) {
112
+ setLog([...workLog, { kind: 'error', text: `Provider "${providerId}" not registered.` }]);
113
+ return;
114
+ }
115
+ const chosenModel = model ?? provider.defaultModel;
116
+ if (!chosenModel) {
117
+ setLog([
118
+ ...workLog,
119
+ {
120
+ kind: 'error',
121
+ text: `Provider "${provider.id}" has no default model. Set one with /model <name>.`,
122
+ },
123
+ ]);
124
+ return;
125
+ }
126
+ cancelRef.current = false;
127
+ setStatus('streaming');
128
+ for (let iter = 0; iter < maxIterations; iter++) {
129
+ if (cancelRef.current) {
130
+ workLog = [...workLog, { kind: 'note', text: '(cancelled)' }];
131
+ setLog(workLog);
132
+ setStatus('idle');
133
+ return;
134
+ }
135
+ const messages = toMessageParams(workLog);
136
+ setStreamingText('');
137
+ let assistantText = '';
138
+ const toolBlocks = [];
139
+ let stopReason;
140
+ let turnInputTokens = 0;
141
+ let turnOutputTokens = 0;
142
+ let inToolBlock = null;
143
+ try {
144
+ const stream = await provider.streamMessage({
145
+ model: chosenModel,
146
+ max_tokens: effectiveMaxTokens,
147
+ messages,
148
+ tools: toolDefs,
149
+ });
150
+ for await (const event of stream) {
151
+ if (cancelRef.current)
152
+ break;
153
+ if (event.type === 'message_start') {
154
+ turnInputTokens = event.message.usage?.input_tokens ?? 0;
155
+ }
156
+ else if (event.type === 'content_block_start') {
157
+ if (event.content_block.type === 'tool_use') {
158
+ inToolBlock = {
159
+ id: event.content_block.id,
160
+ name: event.content_block.name,
161
+ jsonSoFar: '',
162
+ };
163
+ }
164
+ }
165
+ else if (event.type === 'content_block_delta') {
166
+ if (event.delta.type === 'text_delta') {
167
+ assistantText += event.delta.text;
168
+ setStreamingText(assistantText);
169
+ }
170
+ else if (event.delta.type === 'input_json_delta' && inToolBlock) {
171
+ inToolBlock.jsonSoFar += event.delta.partial_json;
172
+ }
173
+ }
174
+ else if (event.type === 'content_block_stop') {
175
+ if (inToolBlock) {
176
+ let parsed = {};
177
+ try {
178
+ parsed = inToolBlock.jsonSoFar ? JSON.parse(inToolBlock.jsonSoFar) : {};
179
+ }
180
+ catch {
181
+ parsed = { _malformed: inToolBlock.jsonSoFar };
182
+ }
183
+ toolBlocks.push({ id: inToolBlock.id, name: inToolBlock.name, input: parsed });
184
+ inToolBlock = null;
185
+ }
186
+ }
187
+ else if (event.type === 'message_delta') {
188
+ stopReason = event.delta.stop_reason;
189
+ turnOutputTokens = event.usage?.output_tokens ?? turnOutputTokens;
190
+ }
191
+ }
192
+ }
193
+ catch (e) {
194
+ const msg = e instanceof BridgeLoginRequiredError ||
195
+ (e instanceof Error && /needs login/i.test(e.message))
196
+ ? `${provider.displayName} needs login. Run: bbclaw login ${provider.id}`
197
+ : e instanceof Error
198
+ ? e.message
199
+ : String(e);
200
+ workLog = [...workLog, { kind: 'error', text: msg }];
201
+ setLog(workLog);
202
+ setStreamingText('');
203
+ setStatus('idle');
204
+ return;
205
+ }
206
+ if (turnInputTokens > 0 || turnOutputTokens > 0) {
207
+ setUsage((prev) => ({
208
+ inputTokens: prev.inputTokens + turnInputTokens,
209
+ outputTokens: prev.outputTokens + turnOutputTokens,
210
+ }));
211
+ }
212
+ setStreamingText('');
213
+ if (cancelRef.current) {
214
+ workLog = [...workLog, { kind: 'note', text: '(cancelled)' }];
215
+ setLog(workLog);
216
+ setStatus('idle');
217
+ return;
218
+ }
219
+ const newEntries = [];
220
+ if (assistantText.length > 0)
221
+ newEntries.push({ kind: 'assistant', text: assistantText });
222
+ if (toolBlocks.length === 0 || stopReason !== 'tool_use') {
223
+ if (stopReason && stopReason !== 'end_turn' && stopReason !== 'tool_use') {
224
+ newEntries.push({ kind: 'note', text: `(stop_reason: ${stopReason})` });
225
+ }
226
+ workLog = [...workLog, ...newEntries];
227
+ setLog(workLog);
228
+ setStatus('idle');
229
+ return;
230
+ }
231
+ for (const block of toolBlocks) {
232
+ newEntries.push({ kind: 'tool-use', id: block.id, name: block.name, input: block.input });
233
+ }
234
+ workLog = [...workLog, ...newEntries];
235
+ setLog(workLog);
236
+ // Approval + execution for each tool call in order.
237
+ for (const block of toolBlocks) {
238
+ const decision = await requestApproval(block);
239
+ if (cancelRef.current) {
240
+ workLog = [
241
+ ...workLog,
242
+ {
243
+ kind: 'tool-result',
244
+ toolUseId: block.id,
245
+ toolName: block.name,
246
+ output: '(cancelled)',
247
+ isError: true,
248
+ },
249
+ ];
250
+ setLog(workLog);
251
+ setStatus('idle');
252
+ return;
253
+ }
254
+ let result;
255
+ if (decision === 'deny') {
256
+ result = { output: 'User denied this tool call.', isError: true };
257
+ }
258
+ else if (block.input &&
259
+ typeof block.input === 'object' &&
260
+ '_malformed' in block.input) {
261
+ // toolUseParser couldn't JSON.parse the input — usually means the
262
+ // stream got truncated mid-string by max_tokens. Give the model a
263
+ // clear error so it knows to retry differently instead of looping.
264
+ const raw = String(block.input._malformed ?? '');
265
+ const sliced = raw.length > 240 ? `${raw.slice(0, 240)}… (${raw.length} chars total)` : raw;
266
+ result = {
267
+ output: `Your tool input JSON could not be parsed — it was either malformed or truncated mid-string. ` +
268
+ `Likely cause: the response hit max_tokens=${effectiveMaxTokens} before closing the JSON. ` +
269
+ `Got:\n${sliced}\n\n` +
270
+ `Suggestion: for large file content, write the file in chunks across multiple turns (e.g. base structure first, then sections via /retry or follow-up calls), or trim the content for this turn.`,
271
+ isError: true,
272
+ };
273
+ }
274
+ else {
275
+ const tool = toolByName.get(block.name);
276
+ if (!tool) {
277
+ result = { output: `Unknown tool: ${block.name}`, isError: true };
278
+ }
279
+ else {
280
+ setRunningTool({ id: block.id, name: block.name, startedAt: Date.now() });
281
+ try {
282
+ result = await tool.execute(block.input);
283
+ }
284
+ catch (e) {
285
+ result = {
286
+ output: `Tool ${block.name} threw: ${e instanceof Error ? e.message : String(e)}`,
287
+ isError: true,
288
+ };
289
+ }
290
+ finally {
291
+ setRunningTool(null);
292
+ }
293
+ }
294
+ }
295
+ workLog = [
296
+ ...workLog,
297
+ {
298
+ kind: 'tool-result',
299
+ toolUseId: block.id,
300
+ toolName: block.name,
301
+ output: result.output,
302
+ isError: result.isError,
303
+ },
304
+ ];
305
+ setLog(workLog);
306
+ }
307
+ setStatus('streaming');
308
+ }
309
+ // Iteration cap.
310
+ workLog = [
311
+ ...workLog,
312
+ { kind: 'error', text: `Agent loop iteration cap (${maxIterations}) reached.` },
313
+ ];
314
+ setLog(workLog);
315
+ setStatus('idle');
316
+ }, [registry, providerId, model, effectiveMaxTokens, toolDefs, toolByName, maxIterations, requestApproval]);
317
+ const send = useCallback(async (text) => {
318
+ if (!text.trim())
319
+ return;
320
+ if (status !== 'idle')
321
+ return;
322
+ const userEntry = { kind: 'user', text };
323
+ const baseLog = [...log, userEntry];
324
+ setLog(baseLog);
325
+ setHistory((prev) => (prev[prev.length - 1] === text ? prev : [...prev, text]));
326
+ await agentLoop(baseLog);
327
+ }, [log, status, agentLoop]);
328
+ // Auto-save (idle + non-empty + debounced).
329
+ useEffect(() => {
330
+ if (status !== 'idle')
331
+ return;
332
+ if (log.length === 0)
333
+ return;
334
+ const timer = setTimeout(() => {
335
+ const data = {
336
+ id: sessionId,
337
+ createdAt: createdAtRef.current,
338
+ updatedAt: new Date().toISOString(),
339
+ providerId,
340
+ model,
341
+ log,
342
+ history,
343
+ };
344
+ saveSession(data).catch(() => { });
345
+ }, 600);
346
+ return () => clearTimeout(timer);
347
+ }, [sessionId, providerId, model, log, history, status]);
348
+ // Keep sendRef current so the loop timer always invokes the latest closure.
349
+ useEffect(() => {
350
+ sendRef.current = send;
351
+ }, [send]);
352
+ const stopLoop = useCallback(() => {
353
+ const ctx = loopRef.current;
354
+ if (ctx?.timer)
355
+ clearTimeout(ctx.timer);
356
+ loopRef.current = null;
357
+ setLoop(null);
358
+ }, []);
359
+ const fireLoopOnce = useCallback(async () => {
360
+ const ctx = loopRef.current;
361
+ if (!ctx)
362
+ return;
363
+ const next = {
364
+ ...ctx.state,
365
+ iteration: ctx.state.iteration + 1,
366
+ nextFireAt: Date.now() + ctx.state.intervalMs,
367
+ };
368
+ ctx.state = next;
369
+ setLoop(next);
370
+ // send() early-returns if status !== 'idle'. We still re-schedule so the
371
+ // loop survives transient busy states without manual nudging.
372
+ await sendRef.current(next.prompt);
373
+ const after = loopRef.current;
374
+ if (!after)
375
+ return;
376
+ after.timer = setTimeout(() => {
377
+ void fireLoopOnce();
378
+ }, after.state.intervalMs);
379
+ }, []);
380
+ const startLoop = useCallback((prompt, intervalMs) => {
381
+ stopLoop();
382
+ const initial = {
383
+ prompt,
384
+ intervalMs,
385
+ iteration: 0,
386
+ startedAt: Date.now(),
387
+ nextFireAt: Date.now(),
388
+ };
389
+ loopRef.current = { state: initial, timer: null };
390
+ setLoop(initial);
391
+ void fireLoopOnce();
392
+ }, [fireLoopOnce, stopLoop]);
393
+ // Stop the loop on unmount so the timer doesn't fire into an unmounted hook.
394
+ useEffect(() => {
395
+ return () => {
396
+ const ctx = loopRef.current;
397
+ if (ctx?.timer)
398
+ clearTimeout(ctx.timer);
399
+ loopRef.current = null;
400
+ };
401
+ }, []);
402
+ return {
403
+ log,
404
+ streamingText,
405
+ status,
406
+ providerId,
407
+ model,
408
+ currentProvider,
409
+ history,
410
+ usage,
411
+ sessionId,
412
+ pendingTool,
413
+ runningTool,
414
+ loop,
415
+ send,
416
+ retryLast: async () => {
417
+ for (let i = log.length - 1; i >= 0; i--) {
418
+ const entry = log[i];
419
+ if (entry?.kind === 'user') {
420
+ setLog(log.slice(0, i));
421
+ await send(entry.text);
422
+ return;
423
+ }
424
+ }
425
+ setLog((prev) => [...prev, { kind: 'note', text: 'Nothing to retry.' }]);
426
+ },
427
+ cancel,
428
+ clearLog,
429
+ addNote,
430
+ setProvider,
431
+ setModel,
432
+ loadState,
433
+ snapshot: () => ({
434
+ id: sessionId,
435
+ createdAt: createdAtRef.current,
436
+ updatedAt: new Date().toISOString(),
437
+ providerId,
438
+ model,
439
+ log,
440
+ history,
441
+ }),
442
+ respondToApproval,
443
+ alwaysAllowed: () => [...alwaysAllowedRef.current],
444
+ startLoop,
445
+ stopLoop,
446
+ };
447
+ }
448
+ function toMessageParams(log) {
449
+ const out = [];
450
+ let i = 0;
451
+ while (i < log.length) {
452
+ const entry = log[i];
453
+ if (!entry) {
454
+ i++;
455
+ continue;
456
+ }
457
+ if (entry.kind === 'user') {
458
+ out.push({ role: 'user', content: entry.text });
459
+ i++;
460
+ continue;
461
+ }
462
+ if (entry.kind === 'assistant' || entry.kind === 'tool-use') {
463
+ // Coalesce contiguous assistant text + tool-use into one assistant turn.
464
+ const blocks = [];
465
+ while (i < log.length) {
466
+ const e = log[i];
467
+ if (e?.kind === 'assistant') {
468
+ blocks.push({ type: 'text', text: e.text });
469
+ i++;
470
+ }
471
+ else if (e?.kind === 'tool-use') {
472
+ blocks.push({
473
+ type: 'tool_use',
474
+ id: e.id,
475
+ name: e.name,
476
+ input: (e.input ?? {}),
477
+ });
478
+ i++;
479
+ }
480
+ else
481
+ break;
482
+ }
483
+ if (blocks.length === 1) {
484
+ const only = blocks[0];
485
+ if (only?.type === 'text') {
486
+ out.push({ role: 'assistant', content: only.text });
487
+ continue;
488
+ }
489
+ }
490
+ out.push({ role: 'assistant', content: blocks });
491
+ continue;
492
+ }
493
+ if (entry.kind === 'tool-result') {
494
+ const blocks = [];
495
+ while (i < log.length) {
496
+ const e = log[i];
497
+ if (e?.kind === 'tool-result') {
498
+ blocks.push({
499
+ type: 'tool_result',
500
+ tool_use_id: e.toolUseId,
501
+ content: e.output,
502
+ is_error: e.isError,
503
+ });
504
+ i++;
505
+ }
506
+ else
507
+ break;
508
+ }
509
+ out.push({ role: 'user', content: blocks });
510
+ continue;
511
+ }
512
+ // note / error are UI-only — skip.
513
+ i++;
514
+ }
515
+ return out;
516
+ }
517
+ //# sourceMappingURL=useChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.js","sourceRoot":"","sources":["../../src/repl/useChat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Tool } from '@bbclaw/core';
2
+ export declare const BASH_TOOL: Tool;
3
+ interface BashInput {
4
+ command: string;
5
+ }
6
+ export declare function execBash(input: BashInput): Promise<{
7
+ output: string;
8
+ isError: boolean;
9
+ }>;
10
+ export {};
11
+ //# sourceMappingURL=Bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bash.d.ts","sourceRoot":"","sources":["../../src/tools/Bash.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAOxC,eAAO,MAAM,SAAS,EAAE,IAcvB,CAAA;AAED,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAyB9F"}
@@ -0,0 +1,61 @@
1
+ import { exec } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const execAsync = promisify(exec);
4
+ const TIMEOUT_MS = 30_000;
5
+ const MAX_OUTPUT = 10_000;
6
+ export const BASH_TOOL = {
7
+ name: 'Bash',
8
+ description: 'Execute a shell command in the user\'s current working directory and return stdout + stderr + exit code. Use for filesystem operations, git, build steps, running tests, etc. The user must approve each call. Output is truncated past 10,000 chars.',
9
+ input_schema: {
10
+ type: 'object',
11
+ properties: {
12
+ command: {
13
+ type: 'string',
14
+ description: 'The shell command to execute. Run it through /bin/sh -c, so pipes, redirects, and chains all work.',
15
+ },
16
+ },
17
+ required: ['command'],
18
+ },
19
+ };
20
+ export async function execBash(input) {
21
+ if (typeof input.command !== 'string' || input.command.length === 0) {
22
+ return { output: 'Bash requires { command: string }', isError: true };
23
+ }
24
+ try {
25
+ const { stdout, stderr } = await execAsync(input.command, {
26
+ timeout: TIMEOUT_MS,
27
+ maxBuffer: 2 * 1024 * 1024,
28
+ cwd: process.cwd(),
29
+ });
30
+ return { output: formatOutput(stdout, stderr, 0), isError: false };
31
+ }
32
+ catch (e) {
33
+ const err = e;
34
+ if (err.killed && err.signal === 'SIGTERM') {
35
+ return {
36
+ output: `[timed out after ${TIMEOUT_MS}ms]\n${formatOutput(err.stdout ?? '', err.stderr ?? '', -1)}`,
37
+ isError: true,
38
+ };
39
+ }
40
+ const code = typeof err.code === 'number' ? err.code : -1;
41
+ return {
42
+ output: formatOutput(err.stdout ?? '', err.stderr ?? '', code, err.message),
43
+ isError: true,
44
+ };
45
+ }
46
+ }
47
+ function formatOutput(stdout, stderr, exitCode, fallback) {
48
+ const parts = [];
49
+ if (stdout)
50
+ parts.push(stdout.trimEnd());
51
+ if (stderr)
52
+ parts.push(`[stderr]\n${stderr.trimEnd()}`);
53
+ if (parts.length === 0 && fallback)
54
+ parts.push(fallback);
55
+ parts.push(`[exit ${exitCode}]`);
56
+ const joined = parts.join('\n');
57
+ if (joined.length <= MAX_OUTPUT)
58
+ return joined;
59
+ return `${joined.slice(0, MAX_OUTPUT)}\n[…truncated, full size ${joined.length} bytes]`;
60
+ }
61
+ //# sourceMappingURL=Bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bash.js","sourceRoot":"","sources":["../../src/tools/Bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Tool } from '@bbclaw/core';
2
+ export declare const READ_TOOL: Tool;
3
+ interface ReadInput {
4
+ path: string;
5
+ }
6
+ export declare function execRead(input: ReadInput): Promise<{
7
+ output: string;
8
+ isError: boolean;
9
+ }>;
10
+ export {};
11
+ //# sourceMappingURL=Read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Read.d.ts","sourceRoot":"","sources":["../../src/tools/Read.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAIxC,eAAO,MAAM,SAAS,EAAE,IAevB,CAAA;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAkB9F"}