@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,31 @@
1
+ /**
2
+ * Session persistence: read/write chat sessions to ~/.bbclaw/sessions/<id>.json.
3
+ *
4
+ * One file per session, JSON-serializable. The session ID is a sortable
5
+ * timestamp + nonce, so file listings are naturally chronological.
6
+ */
7
+ import type { LogEntry } from './slashCommands.js';
8
+ export interface SessionData {
9
+ id: string;
10
+ createdAt: string;
11
+ updatedAt: string;
12
+ providerId: string;
13
+ model: string | undefined;
14
+ log: LogEntry[];
15
+ history: string[];
16
+ }
17
+ export interface SessionMeta {
18
+ id: string;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ providerId: string;
22
+ model: string | undefined;
23
+ summary: string;
24
+ turns: number;
25
+ }
26
+ export declare function newSessionId(): string;
27
+ export declare function saveSession(data: SessionData): Promise<void>;
28
+ export declare function loadSession(id: string): Promise<SessionData | null>;
29
+ export declare function listSessions(): Promise<SessionMeta[]>;
30
+ export declare function latestSession(): Promise<SessionData | null>;
31
+ //# sourceMappingURL=sessionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../src/repl/sessionStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAKlD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,GAAG,EAAE,QAAQ,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAUD,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAUzE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CA2B3D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAIjE"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Session persistence: read/write chat sessions to ~/.bbclaw/sessions/<id>.json.
3
+ *
4
+ * One file per session, JSON-serializable. The session ID is a sortable
5
+ * timestamp + nonce, so file listings are naturally chronological.
6
+ */
7
+ import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ const ROOT = process.env.BBCLAW_DIR ?? join(homedir(), '.bbclaw');
11
+ const DIR = join(ROOT, 'sessions');
12
+ export function newSessionId() {
13
+ const t = new Date();
14
+ const iso = t.toISOString();
15
+ const date = iso.slice(0, 10).replaceAll('-', '');
16
+ const time = iso.slice(11, 19).replaceAll(':', '');
17
+ const nonce = Math.floor(Math.random() * 0x10000).toString(16).padStart(4, '0');
18
+ return `${date}-${time}-${nonce}`;
19
+ }
20
+ async function ensureDir() {
21
+ await mkdir(DIR, { recursive: true });
22
+ }
23
+ function filePath(id) {
24
+ return join(DIR, `${id}.json`);
25
+ }
26
+ export async function saveSession(data) {
27
+ await ensureDir();
28
+ await writeFile(filePath(data.id), JSON.stringify(data, null, 2), 'utf8');
29
+ }
30
+ export async function loadSession(id) {
31
+ try {
32
+ const txt = await readFile(filePath(id), 'utf8');
33
+ const parsed = JSON.parse(txt);
34
+ if (typeof parsed.id !== 'string' || !Array.isArray(parsed.log))
35
+ return null;
36
+ if (!Array.isArray(parsed.history))
37
+ parsed.history = [];
38
+ return parsed;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ export async function listSessions() {
45
+ await ensureDir();
46
+ const files = await readdir(DIR).catch(() => []);
47
+ const out = [];
48
+ for (const f of files) {
49
+ if (!f.endsWith('.json'))
50
+ continue;
51
+ const id = f.slice(0, -5);
52
+ const data = await loadSession(id);
53
+ if (!data)
54
+ continue;
55
+ const firstUser = data.log.find((e) => e.kind === 'user');
56
+ const summary = firstUser
57
+ ? firstUser.text.slice(0, 60).replace(/\s+/g, ' ')
58
+ : '(empty)';
59
+ const turns = data.log.filter((e) => e.kind === 'user').length;
60
+ out.push({
61
+ id: data.id,
62
+ createdAt: data.createdAt,
63
+ updatedAt: data.updatedAt,
64
+ providerId: data.providerId,
65
+ model: data.model,
66
+ summary,
67
+ turns,
68
+ });
69
+ }
70
+ // Newest first.
71
+ out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
72
+ return out;
73
+ }
74
+ export async function latestSession() {
75
+ const list = await listSessions();
76
+ const top = list[0];
77
+ return top ? await loadSession(top.id) : null;
78
+ }
79
+ //# sourceMappingURL=sessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../src/repl/sessionStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type ProviderRegistry } from '@bbclaw/core';
2
+ import { type SessionData } from './sessionStore.js';
3
+ /** UI-only log entry. Notes/errors are rendered but never sent to the provider. */
4
+ export type LogEntry = {
5
+ kind: 'user';
6
+ text: string;
7
+ } | {
8
+ kind: 'assistant';
9
+ text: string;
10
+ } | {
11
+ kind: 'tool-use';
12
+ id: string;
13
+ name: string;
14
+ input: unknown;
15
+ } | {
16
+ kind: 'tool-result';
17
+ toolUseId: string;
18
+ toolName: string;
19
+ output: string;
20
+ isError: boolean;
21
+ } | {
22
+ kind: 'note';
23
+ text: string;
24
+ } | {
25
+ kind: 'error';
26
+ text: string;
27
+ };
28
+ export interface SlashCommandContext {
29
+ registry: ProviderRegistry;
30
+ currentProviderId: string;
31
+ currentModel: string | undefined;
32
+ setProvider: (id: string) => void;
33
+ setModel: (model: string | undefined) => void;
34
+ clearLog: () => void;
35
+ addNote: (text: string) => void;
36
+ /** Resend the last user message in the log. No-op if there is none. */
37
+ retryLast: () => Promise<void>;
38
+ /** Replace all state from a SessionData (used by /resume). */
39
+ loadState: (data: SessionData) => void;
40
+ /** Snapshot of the current state, used by /save to write the file. */
41
+ snapshot: () => SessionData;
42
+ /** Names of tools currently approved without prompting this session. */
43
+ alwaysAllowed: () => string[];
44
+ /** Loop scheduling. */
45
+ startLoop: (prompt: string, intervalMs: number) => void;
46
+ stopLoop: () => void;
47
+ isLooping: () => boolean;
48
+ exit: () => void;
49
+ }
50
+ export interface SlashCommand {
51
+ name: string;
52
+ description: string;
53
+ run(ctx: SlashCommandContext, args: string[]): Promise<void> | void;
54
+ }
55
+ export declare const SLASH_COMMANDS: Record<string, SlashCommand>;
56
+ export declare function parseSlash(input: string): {
57
+ name: string;
58
+ args: string[];
59
+ } | null;
60
+ export declare function dispatchSlash(input: string, ctx: SlashCommandContext): Promise<boolean>;
61
+ //# sourceMappingURL=slashCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slashCommands.d.ts","sourceRoot":"","sources":["../../src/repl/slashCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGvE,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE5F,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,uEAAuE;IACvE,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,8DAA8D;IAC9D,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;IACtC,sEAAsE;IACtE,QAAQ,EAAE,MAAM,WAAW,CAAA;IAC3B,wEAAwE;IACxE,aAAa,EAAE,MAAM,MAAM,EAAE,CAAA;IAC7B,uBAAuB;IACvB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACpE;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAmTvD,CAAA;AA2BD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAMjF;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,328 @@
1
+ import { WebBridgeProvider } from '@bbclaw/core';
2
+ import { isAuthValid, loadAuth } from '../auth/authStore.js';
3
+ import { BUILTIN_TOOLS } from '../tools/index.js';
4
+ import { listSessions, loadSession, saveSession } from './sessionStore.js';
5
+ export const SLASH_COMMANDS = {
6
+ help: {
7
+ name: 'help',
8
+ description: 'Show available slash commands.',
9
+ run(ctx) {
10
+ const lines = Object.values(SLASH_COMMANDS)
11
+ .map((c) => ` /${c.name.padEnd(10)} ${c.description}`)
12
+ .join('\n');
13
+ ctx.addNote(`Slash commands:\n${lines}`);
14
+ },
15
+ },
16
+ clear: {
17
+ name: 'clear',
18
+ description: 'Clear the conversation log.',
19
+ run(ctx) {
20
+ ctx.clearLog();
21
+ },
22
+ },
23
+ quit: {
24
+ name: 'quit',
25
+ description: 'Exit the REPL.',
26
+ run(ctx) {
27
+ ctx.exit();
28
+ },
29
+ },
30
+ exit: {
31
+ name: 'exit',
32
+ description: 'Exit the REPL (alias of /quit).',
33
+ run(ctx) {
34
+ ctx.exit();
35
+ },
36
+ },
37
+ providers: {
38
+ name: 'providers',
39
+ description: 'List configured providers.',
40
+ run(ctx) {
41
+ const list = ctx.registry.list();
42
+ if (list.length === 0) {
43
+ ctx.addNote('(no providers configured)');
44
+ return;
45
+ }
46
+ const lines = list
47
+ .map((p) => ` ${p.id === ctx.currentProviderId ? '*' : ' '} ${p.id.padEnd(16)} [${p.kind}] ${p.displayName}`)
48
+ .join('\n');
49
+ ctx.addNote(`Providers:\n${lines}`);
50
+ },
51
+ },
52
+ provider: {
53
+ name: 'provider',
54
+ description: 'Switch active provider: /provider <id>',
55
+ run(ctx, args) {
56
+ const id = args[0];
57
+ if (!id) {
58
+ ctx.addNote(`Current provider: ${ctx.currentProviderId}. Usage: /provider <id>`);
59
+ return;
60
+ }
61
+ if (!ctx.registry.has(id)) {
62
+ ctx.addNote(`Unknown provider "${id}". Try /providers.`);
63
+ return;
64
+ }
65
+ ctx.setProvider(id);
66
+ ctx.setModel(undefined);
67
+ ctx.addNote(`Switched provider → ${id}`);
68
+ },
69
+ },
70
+ model: {
71
+ name: 'model',
72
+ description: 'Set model for the active provider: /model <name>',
73
+ run(ctx, args) {
74
+ const m = args[0];
75
+ if (!m) {
76
+ ctx.addNote(`Current model: ${ctx.currentModel ?? '(provider default)'}. Usage: /model <name>`);
77
+ return;
78
+ }
79
+ ctx.setModel(m);
80
+ ctx.addNote(`Switched model → ${m}`);
81
+ },
82
+ },
83
+ health: {
84
+ name: 'health',
85
+ description: 'Probe all configured providers.',
86
+ async run(ctx) {
87
+ ctx.addNote('Probing providers...');
88
+ const results = await ctx.registry.healthCheckAll();
89
+ const lines = results
90
+ .map((r) => {
91
+ const status = r.ok ? 'ok' : 'failed';
92
+ const latency = r.latencyMs !== undefined ? ` ${r.latencyMs}ms` : '';
93
+ const reason = r.reason ? ` (${r.reason})` : '';
94
+ return ` ${r.id.padEnd(16)} ${status}${latency}${reason}`;
95
+ })
96
+ .join('\n');
97
+ ctx.addNote(`Health:\n${lines}`);
98
+ },
99
+ },
100
+ retry: {
101
+ name: 'retry',
102
+ description: 'Re-send the most recent user message.',
103
+ async run(ctx) {
104
+ await ctx.retryLast();
105
+ },
106
+ },
107
+ login: {
108
+ name: 'login',
109
+ description: 'Open a browser to sign in to the current web-bridge provider.',
110
+ async run(ctx) {
111
+ const provider = ctx.registry.get(ctx.currentProviderId);
112
+ if (!provider) {
113
+ ctx.addNote(`No provider "${ctx.currentProviderId}" registered.`);
114
+ return;
115
+ }
116
+ if (provider.kind !== 'web-bridge') {
117
+ ctx.addNote(`/login only applies to web-bridge providers. "${provider.id}" is kind=${provider.kind}.`);
118
+ return;
119
+ }
120
+ const wbp = provider;
121
+ ctx.addNote(`Opening browser for ${provider.displayName}…`);
122
+ try {
123
+ await wbp.showForLogin();
124
+ }
125
+ catch (e) {
126
+ ctx.addNote(`Failed to open browser: ${e instanceof Error ? e.message : String(e)}`);
127
+ return;
128
+ }
129
+ ctx.addNote('Sign in inside the browser window. I will poll for up to 90s and confirm automatically.');
130
+ // Fire-and-forget polling. Avoids blocking the REPL during login.
131
+ void (async () => {
132
+ const deadline = Date.now() + 90_000;
133
+ while (Date.now() < deadline) {
134
+ await new Promise((r) => setTimeout(r, 2_000));
135
+ const ok = await wbp.confirmLogin().catch(() => false);
136
+ if (ok) {
137
+ ctx.addNote(`✓ Login confirmed for ${provider.id}. Browser switched to headless.`);
138
+ return;
139
+ }
140
+ }
141
+ ctx.addNote(`⚠ Login still not detected after 90s. If you signed in, try sending a message — the SPA may just be slow.`);
142
+ })();
143
+ },
144
+ },
145
+ sessions: {
146
+ name: 'sessions',
147
+ description: 'List saved sessions.',
148
+ async run(ctx) {
149
+ const list = await listSessions();
150
+ if (list.length === 0) {
151
+ ctx.addNote('(no saved sessions)');
152
+ return;
153
+ }
154
+ const lines = list
155
+ .slice(0, 20)
156
+ .map((s) => ` ${s.id} turns=${String(s.turns).padStart(3)} ${s.providerId.padEnd(14)} ${s.summary}`)
157
+ .join('\n');
158
+ ctx.addNote(`Sessions (newest first):\n${lines}\n\nUse /resume <id> to load.`);
159
+ },
160
+ },
161
+ save: {
162
+ name: 'save',
163
+ description: 'Force-save the current session.',
164
+ async run(ctx) {
165
+ const data = ctx.snapshot();
166
+ try {
167
+ await saveSession(data);
168
+ ctx.addNote(`✓ Saved as ${data.id}`);
169
+ }
170
+ catch (e) {
171
+ ctx.addNote(`Save failed: ${e instanceof Error ? e.message : String(e)}`);
172
+ }
173
+ },
174
+ },
175
+ resume: {
176
+ name: 'resume',
177
+ description: 'Load a saved session by id: /resume <id>',
178
+ async run(ctx, args) {
179
+ const id = args[0];
180
+ if (!id) {
181
+ ctx.addNote('Usage: /resume <id>. Try /sessions to list available ids.');
182
+ return;
183
+ }
184
+ const data = await loadSession(id);
185
+ if (!data) {
186
+ ctx.addNote(`No session found with id "${id}".`);
187
+ return;
188
+ }
189
+ if (!ctx.registry.has(data.providerId)) {
190
+ ctx.addNote(`Session was for provider "${data.providerId}" which is not currently registered. Loading anyway; messages may fail until provider is available.`);
191
+ }
192
+ ctx.loadState(data);
193
+ ctx.addNote(`✓ Resumed session ${data.id} (${data.log.length} entries).`);
194
+ },
195
+ },
196
+ tools: {
197
+ name: 'tools',
198
+ description: 'List built-in tools available to the assistant.',
199
+ run(ctx) {
200
+ const lines = BUILTIN_TOOLS.map((t) => {
201
+ const firstSentence = (t.def.description ?? '').split(/[.。]/)[0] ?? '';
202
+ return ` ${t.def.name.padEnd(8)} ${firstSentence.trim()}`;
203
+ }).join('\n');
204
+ ctx.addNote(`Built-in tools:\n${lines}`);
205
+ },
206
+ },
207
+ allowed: {
208
+ name: 'allowed',
209
+ description: 'Show tools approved without prompting this session.',
210
+ run(ctx) {
211
+ const list = ctx.alwaysAllowed();
212
+ if (list.length === 0) {
213
+ ctx.addNote('No tools are auto-approved. Press "a" at an approval prompt to add one.');
214
+ return;
215
+ }
216
+ ctx.addNote(`Auto-approved this session: ${list.join(', ')}`);
217
+ },
218
+ },
219
+ loop: {
220
+ name: 'loop',
221
+ description: 'Re-fire a prompt on an interval. Usage: /loop <30s|5m|1h> <prompt>',
222
+ run(ctx, args) {
223
+ if (args.length < 2) {
224
+ ctx.addNote('Usage: /loop <interval> <prompt>\n intervals: 45s, 5m, 1h, or a bare number (seconds)\n example: /loop 5m check the deploy status');
225
+ return;
226
+ }
227
+ const intervalArg = args[0];
228
+ if (!intervalArg) {
229
+ ctx.addNote('Interval is required. See /help loop.');
230
+ return;
231
+ }
232
+ const intervalMs = parseInterval(intervalArg);
233
+ if (intervalMs == null) {
234
+ ctx.addNote(`Could not parse interval "${intervalArg}". Use formats like 45s, 5m, 1h, or a bare number.`);
235
+ return;
236
+ }
237
+ if (intervalMs < 5_000) {
238
+ ctx.addNote('Minimum loop interval is 5s — pick something larger to keep the REPL usable.');
239
+ return;
240
+ }
241
+ const prompt = args.slice(1).join(' ').trim();
242
+ if (!prompt) {
243
+ ctx.addNote('Prompt is required after the interval.');
244
+ return;
245
+ }
246
+ ctx.startLoop(prompt, intervalMs);
247
+ ctx.addNote(`🔁 Loop started — every ${formatMs(intervalMs)}: "${prompt.slice(0, 80)}${prompt.length > 80 ? '…' : ''}"`);
248
+ },
249
+ },
250
+ unloop: {
251
+ name: 'unloop',
252
+ description: 'Stop the current loop.',
253
+ run(ctx) {
254
+ if (!ctx.isLooping()) {
255
+ ctx.addNote('No loop is currently running.');
256
+ return;
257
+ }
258
+ ctx.stopLoop();
259
+ ctx.addNote('🔁 Loop stopped.');
260
+ },
261
+ },
262
+ whoami: {
263
+ name: 'whoami',
264
+ description: 'Show the local BBClaw license status.',
265
+ async run(ctx) {
266
+ const auth = await loadAuth();
267
+ if (!auth) {
268
+ ctx.addNote('Not authenticated. Run: bbclaw auth login --code <code>');
269
+ return;
270
+ }
271
+ const expiry = new Date(auth.expiresAt).toLocaleString();
272
+ if (!isAuthValid(auth)) {
273
+ ctx.addNote(`✗ License expired on ${expiry}. Get a new code, then run bbclaw auth login.`);
274
+ return;
275
+ }
276
+ ctx.addNote(`✓ ${auth.code}\n expires: ${expiry}\n server: ${auth.server}`);
277
+ },
278
+ },
279
+ };
280
+ function parseInterval(s) {
281
+ const m = s.trim().match(/^(\d+(?:\.\d+)?)([smh]?)$/);
282
+ if (!m)
283
+ return null;
284
+ const num = Number(m[1]);
285
+ if (!Number.isFinite(num) || num <= 0)
286
+ return null;
287
+ const unit = m[2] ?? '';
288
+ switch (unit) {
289
+ case 'h':
290
+ return num * 3_600_000;
291
+ case 'm':
292
+ return num * 60_000;
293
+ case 's':
294
+ case '':
295
+ return num * 1_000;
296
+ default:
297
+ return null;
298
+ }
299
+ }
300
+ function formatMs(ms) {
301
+ if (ms >= 3_600_000)
302
+ return `${(ms / 3_600_000).toFixed(ms % 3_600_000 ? 1 : 0)}h`;
303
+ if (ms >= 60_000)
304
+ return `${(ms / 60_000).toFixed(ms % 60_000 ? 1 : 0)}m`;
305
+ return `${(ms / 1_000).toFixed(0)}s`;
306
+ }
307
+ export function parseSlash(input) {
308
+ if (!input.startsWith('/'))
309
+ return null;
310
+ const parts = input.slice(1).trim().split(/\s+/);
311
+ const [name, ...args] = parts;
312
+ if (!name)
313
+ return null;
314
+ return { name, args };
315
+ }
316
+ export async function dispatchSlash(input, ctx) {
317
+ const parsed = parseSlash(input);
318
+ if (!parsed)
319
+ return false;
320
+ const cmd = SLASH_COMMANDS[parsed.name];
321
+ if (!cmd) {
322
+ ctx.addNote(`Unknown command "/${parsed.name}". Try /help.`);
323
+ return true;
324
+ }
325
+ await cmd.run(ctx, parsed.args);
326
+ return true;
327
+ }
328
+ //# sourceMappingURL=slashCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slashCommands.js","sourceRoot":"","sources":["../../src/repl/slashCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type Provider, type ProviderRegistry } from '@bbclaw/core';
2
+ import { type BbclawTool } from '../tools/index.js';
3
+ import { type SessionData } from './sessionStore.js';
4
+ import type { LogEntry } from './slashCommands.js';
5
+ export type ChatStatus = 'idle' | 'streaming' | 'awaiting-approval';
6
+ export type ApprovalDecision = 'approve' | 'deny' | 'allow-all';
7
+ export interface PendingTool {
8
+ id: string;
9
+ name: string;
10
+ input: unknown;
11
+ }
12
+ export interface RunningTool {
13
+ id: string;
14
+ name: string;
15
+ startedAt: number;
16
+ }
17
+ export interface LoopState {
18
+ prompt: string;
19
+ intervalMs: number;
20
+ iteration: number;
21
+ startedAt: number;
22
+ nextFireAt: number;
23
+ }
24
+ export interface UseChatOptions {
25
+ registry: ProviderRegistry;
26
+ maxTokens?: number;
27
+ initialSession?: SessionData;
28
+ /** Tools the assistant may call. Defaults to BUILTIN_TOOLS. */
29
+ tools?: BbclawTool[];
30
+ /** Hard cap on agent-loop iterations per send() call. */
31
+ maxIterations?: number;
32
+ }
33
+ export interface UsageStats {
34
+ inputTokens: number;
35
+ outputTokens: number;
36
+ }
37
+ export interface UseChat {
38
+ log: LogEntry[];
39
+ streamingText: string;
40
+ status: ChatStatus;
41
+ providerId: string;
42
+ model: string | undefined;
43
+ currentProvider: Provider;
44
+ history: string[];
45
+ usage: UsageStats;
46
+ sessionId: string;
47
+ pendingTool: PendingTool | null;
48
+ runningTool: RunningTool | null;
49
+ loop: LoopState | null;
50
+ send(text: string): Promise<void>;
51
+ retryLast(): Promise<void>;
52
+ cancel(): void;
53
+ clearLog(): void;
54
+ addNote(text: string): void;
55
+ setProvider(id: string): void;
56
+ setModel(model: string | undefined): void;
57
+ loadState(data: SessionData): void;
58
+ snapshot(): SessionData;
59
+ respondToApproval(decision: ApprovalDecision): void;
60
+ alwaysAllowed(): string[];
61
+ startLoop(prompt: string, intervalMs: number): void;
62
+ stopLoop(): void;
63
+ }
64
+ export declare function useChat({ registry, maxTokens, initialSession, tools, maxIterations, }: UseChatOptions): UseChat;
65
+ //# sourceMappingURL=useChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/repl/useChat.ts"],"names":[],"mappings":"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"}