@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,17 @@
1
+ export interface AuthData {
2
+ /** The license code itself, e.g. "bbclaw-xxxx-xxxx-xxxx". */
3
+ code: string;
4
+ /** ISO timestamp of expiry as returned by the server. */
5
+ expiresAt: string;
6
+ /** ISO timestamp of when we last successfully verified. */
7
+ verifiedAt: string;
8
+ /** Server URL the verification went through (so we know where to renew). */
9
+ server: string;
10
+ }
11
+ export declare function loadAuth(): Promise<AuthData | null>;
12
+ export declare function saveAuth(data: AuthData): Promise<void>;
13
+ export declare function clearAuth(): Promise<void>;
14
+ /** True if `auth` is non-null AND its expiresAt hasn't passed locally. */
15
+ export declare function isAuthValid(auth: AuthData | null): boolean;
16
+ export declare function authPath(): string;
17
+ //# sourceMappingURL=authStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authStore.d.ts","sourceRoot":"","sources":["../../src/auth/authStore.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAezD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAK1D;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC"}
@@ -0,0 +1,40 @@
1
+ import { readFile, rm, writeFile, mkdir } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ const ROOT = process.env.BBCLAW_DIR ?? join(homedir(), '.bbclaw');
5
+ const AUTH_PATH = join(ROOT, 'auth.json');
6
+ export async function loadAuth() {
7
+ try {
8
+ const text = await readFile(AUTH_PATH, 'utf8');
9
+ const parsed = JSON.parse(text);
10
+ if (typeof parsed.code !== 'string' ||
11
+ typeof parsed.expiresAt !== 'string' ||
12
+ typeof parsed.server !== 'string') {
13
+ return null;
14
+ }
15
+ return parsed;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ export async function saveAuth(data) {
22
+ await mkdir(dirname(AUTH_PATH), { recursive: true });
23
+ await writeFile(AUTH_PATH, JSON.stringify(data, null, 2), { mode: 0o600 });
24
+ }
25
+ export async function clearAuth() {
26
+ await rm(AUTH_PATH, { force: true });
27
+ }
28
+ /** True if `auth` is non-null AND its expiresAt hasn't passed locally. */
29
+ export function isAuthValid(auth) {
30
+ if (!auth)
31
+ return false;
32
+ const expiry = Date.parse(auth.expiresAt);
33
+ if (!Number.isFinite(expiry))
34
+ return false;
35
+ return expiry > Date.now();
36
+ }
37
+ export function authPath() {
38
+ return AUTH_PATH;
39
+ }
40
+ //# sourceMappingURL=authStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authStore.js","sourceRoot":"","sources":["../../src/auth/authStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;AAazC,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAa,CAAA;QAC3C,IACE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EACjC,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACtC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Talks to the BBClaw admin server's /api/verify endpoint.
3
+ *
4
+ * The server URL is resolved in this order:
5
+ * 1. explicit `server` arg to verifyCode()
6
+ * 2. BBCLAW_API env var
7
+ * 3. DEFAULT_SERVER (constant)
8
+ *
9
+ * Replace DEFAULT_SERVER with the hosted URL once we deploy.
10
+ */
11
+ export declare const DEFAULT_SERVER = "http://localhost:3000";
12
+ export interface VerifyOk {
13
+ valid: true;
14
+ expiresAt: string;
15
+ }
16
+ export interface VerifyErr {
17
+ valid: false;
18
+ reason: string;
19
+ }
20
+ export type VerifyResponse = VerifyOk | VerifyErr;
21
+ export declare function resolveServer(explicit?: string): string;
22
+ export declare function verifyCode(code: string, server?: string): Promise<VerifyResponse>;
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc,0BAA0B,CAAA;AAErD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,IAAI,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEjD,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CA6BzB"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Talks to the BBClaw admin server's /api/verify endpoint.
3
+ *
4
+ * The server URL is resolved in this order:
5
+ * 1. explicit `server` arg to verifyCode()
6
+ * 2. BBCLAW_API env var
7
+ * 3. DEFAULT_SERVER (constant)
8
+ *
9
+ * Replace DEFAULT_SERVER with the hosted URL once we deploy.
10
+ */
11
+ export const DEFAULT_SERVER = 'http://localhost:3000';
12
+ export function resolveServer(explicit) {
13
+ if (explicit)
14
+ return explicit.replace(/\/+$/, '');
15
+ const env = process.env.BBCLAW_API;
16
+ if (env)
17
+ return env.replace(/\/+$/, '');
18
+ return DEFAULT_SERVER;
19
+ }
20
+ export async function verifyCode(code, server) {
21
+ const url = `${resolveServer(server)}/api/verify`;
22
+ let res;
23
+ try {
24
+ res = await fetch(url, {
25
+ method: 'POST',
26
+ headers: { 'content-type': 'application/json' },
27
+ body: JSON.stringify({ code }),
28
+ });
29
+ }
30
+ catch (e) {
31
+ return {
32
+ valid: false,
33
+ reason: `network_error: ${e instanceof Error ? e.message : String(e)}`,
34
+ };
35
+ }
36
+ const text = await res.text().catch(() => '');
37
+ let body = {};
38
+ try {
39
+ body = JSON.parse(text);
40
+ }
41
+ catch {
42
+ return { valid: false, reason: `bad_response_${res.status}` };
43
+ }
44
+ if (res.ok && body.valid === true && typeof body.expiresAt === 'string') {
45
+ return { valid: true, expiresAt: body.expiresAt };
46
+ }
47
+ const reason = typeof body.reason === 'string' ? body.reason : `http_${res.status}`;
48
+ return { valid: false, reason };
49
+ }
50
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAA;AAcrD,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAClC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACvC,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,MAAe;IAEf,MAAM,GAAG,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAA;IACjD,IAAI,GAAa,CAAA;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,kBAAkB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACvE,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7C,IAAI,IAAI,GAA+D,EAAE,CAAA;IACzE,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;IAC/D,CAAC;IAED,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;IACnD,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAA;IACnF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACjC,CAAC"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BBClaw CLI entry point.
4
+ *
5
+ * Provider auto-registration:
6
+ * - DeepSeek Web (browser bridge) is registered by default and set as the
7
+ * default when no API keys are present. First use opens a browser for
8
+ * login; subsequent use is headless.
9
+ * - API providers are registered when their respective env vars are set.
10
+ * Setting any API env var also nominates that provider as the default
11
+ * (with API > web-bridge preference, since they're more reliable).
12
+ *
13
+ * Configuration directory: ~/.bbclaw/
14
+ * - deepseek-session/ Persistent Chromium profile for the DeepSeek bridge.
15
+ * - (more later: config.json, byok-keys.json.enc, etc.)
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
package/dist/index.js ADDED
@@ -0,0 +1,401 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BBClaw CLI entry point.
4
+ *
5
+ * Provider auto-registration:
6
+ * - DeepSeek Web (browser bridge) is registered by default and set as the
7
+ * default when no API keys are present. First use opens a browser for
8
+ * login; subsequent use is headless.
9
+ * - API providers are registered when their respective env vars are set.
10
+ * Setting any API env var also nominates that provider as the default
11
+ * (with API > web-bridge preference, since they're more reliable).
12
+ *
13
+ * Configuration directory: ~/.bbclaw/
14
+ * - deepseek-session/ Persistent Chromium profile for the DeepSeek bridge.
15
+ * - (more later: config.json, byok-keys.json.enc, etc.)
16
+ */
17
+ import { homedir } from 'node:os';
18
+ import { join } from 'node:path';
19
+ import { Command } from 'commander';
20
+ import { consoleLogger } from '@bbclaw/shared';
21
+ import { AnthropicProvider, BridgeLoginRequiredError, DEEPSEEK_WEB_SPEC, OPENAI_COMPAT_PRESETS, OpenAICompatProvider, ProviderRegistry, WebBridgeProvider, } from '@bbclaw/core';
22
+ const BBCLAW_DIR = process.env.BBCLAW_DIR ?? join(homedir(), '.bbclaw');
23
+ const program = new Command();
24
+ program
25
+ .name('bbclaw')
26
+ .description('BBClaw — multi-provider AI agent CLI')
27
+ .version('0.1.0');
28
+ program
29
+ .command('chat', { isDefault: true })
30
+ .description('Start the interactive REPL (default action).')
31
+ .option('-p, --provider <id>', 'pre-select provider id')
32
+ .option('-r, --resume [id]', 'resume the latest session, or one by id')
33
+ .option('--show-browser', 'for web-bridge providers: show the browser window (debug aid)')
34
+ .option('--verbose', 'log debug info to stderr')
35
+ .action(async (opts) => {
36
+ await requireAuth();
37
+ const registry = buildRegistryFromEnv(opts.verbose ?? false);
38
+ if (opts.provider) {
39
+ if (!registry.has(opts.provider)) {
40
+ console.error(`error: provider "${opts.provider}" is not registered`);
41
+ console.error('available:', registry.list().map((p) => p.id).join(', '));
42
+ await registry.closeAll();
43
+ process.exit(2);
44
+ }
45
+ registry.setDefault(opts.provider);
46
+ }
47
+ if (opts.showBrowser) {
48
+ for (const p of registry.list()) {
49
+ if (p.kind === 'web-bridge')
50
+ await p.setHeadless(false);
51
+ }
52
+ }
53
+ let initialSession;
54
+ if (opts.resume !== undefined) {
55
+ const { loadSession, latestSession } = await import('./repl/sessionStore.js');
56
+ if (opts.resume === true) {
57
+ const latest = await latestSession();
58
+ if (!latest) {
59
+ console.error('error: no saved sessions to resume');
60
+ await registry.closeAll();
61
+ process.exit(2);
62
+ }
63
+ initialSession = latest;
64
+ }
65
+ else {
66
+ const loaded = await loadSession(opts.resume);
67
+ if (!loaded) {
68
+ console.error(`error: no session found with id "${opts.resume}"`);
69
+ await registry.closeAll();
70
+ process.exit(2);
71
+ }
72
+ initialSession = loaded;
73
+ }
74
+ }
75
+ const { runRepl } = await import('./repl/runRepl.js');
76
+ await runRepl(registry, initialSession);
77
+ });
78
+ program
79
+ .command('sessions')
80
+ .description('List saved chat sessions.')
81
+ .action(async () => {
82
+ const { listSessions } = await import('./repl/sessionStore.js');
83
+ const list = await listSessions();
84
+ if (list.length === 0) {
85
+ console.log('(no saved sessions)');
86
+ return;
87
+ }
88
+ for (const s of list.slice(0, 50)) {
89
+ const model = s.model ? ` ${s.model}` : '';
90
+ console.log(`${s.id}\tturns=${s.turns}\t${s.providerId}${model}\t${s.summary}`);
91
+ }
92
+ });
93
+ program
94
+ .command('ask <prompt>')
95
+ .description('Send a one-shot prompt to a provider and print the response.')
96
+ .option('-p, --provider <id>', 'provider id (default: auto)')
97
+ .option('-m, --model <name>', 'model id to send to the provider')
98
+ .option('-t, --max-tokens <n>', 'max output tokens', '1024')
99
+ .option('--no-headless', 'for web-bridge providers: show the browser (debug aid)')
100
+ .option('--verbose', 'log debug info to stderr')
101
+ .action(async (prompt, opts) => {
102
+ const registry = buildRegistryFromEnv(opts.verbose ?? false);
103
+ const provider = pickProvider(registry, opts.provider);
104
+ if (opts.headless === false && provider.kind === 'web-bridge') {
105
+ await provider.setHeadless(false);
106
+ }
107
+ const model = opts.model ?? provider.defaultModel;
108
+ if (!model) {
109
+ console.error(`error: --model is required for provider "${provider.id}"`);
110
+ console.error(` This provider has no default model configured.`);
111
+ console.error(` Either:`);
112
+ console.error(` • pass -m <model-id>`);
113
+ console.error(` • or switch to a different provider with -p:`);
114
+ console.error(` ${registry.list().map((p) => p.id).join(', ')}`);
115
+ await registry.closeAll();
116
+ process.exit(2);
117
+ }
118
+ try {
119
+ const stream = await provider.streamMessage({
120
+ model,
121
+ max_tokens: Number.parseInt(opts.maxTokens, 10),
122
+ messages: [{ role: 'user', content: prompt }],
123
+ });
124
+ for await (const event of stream) {
125
+ if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
126
+ process.stdout.write(event.delta.text);
127
+ }
128
+ else if (event.type === 'message_delta') {
129
+ const stop = event.delta.stop_reason;
130
+ if (stop && stop !== 'end_turn')
131
+ process.stderr.write(`\n[stop_reason: ${stop}]\n`);
132
+ }
133
+ }
134
+ process.stdout.write('\n');
135
+ }
136
+ catch (e) {
137
+ if (e instanceof BridgeLoginRequiredError || (e instanceof Error && /needs login/.test(e.message))) {
138
+ console.error(`\n⚠ ${provider.displayName} needs login.`);
139
+ console.error(` Run this once to sign in, then re-run your command:\n`);
140
+ console.error(` bbclaw login ${provider.id}\n`);
141
+ await registry.closeAll();
142
+ process.exit(2);
143
+ }
144
+ throw e;
145
+ }
146
+ finally {
147
+ await registry.closeAll();
148
+ }
149
+ });
150
+ program
151
+ .command('providers')
152
+ .description('List configured providers.')
153
+ .action(() => {
154
+ const registry = buildRegistryFromEnv(false);
155
+ const list = registry.list();
156
+ if (list.length === 0) {
157
+ console.log('(no providers configured)');
158
+ return;
159
+ }
160
+ const def = registry.getDefault()?.id;
161
+ for (const p of list) {
162
+ const marker = p.id === def ? ' (default)' : '';
163
+ console.log(`${p.id}${marker}\t[${p.kind}]\t${p.displayName}`);
164
+ }
165
+ });
166
+ program
167
+ .command('presets')
168
+ .description('Show built-in OpenAI-compat presets.')
169
+ .action(() => {
170
+ for (const preset of OPENAI_COMPAT_PRESETS) {
171
+ const model = preset.defaultModel ? ` · default model: ${preset.defaultModel}` : '';
172
+ console.log(`${preset.id}\t${preset.label}${model}`);
173
+ if (preset.baseURL)
174
+ console.log(` baseURL: ${preset.baseURL}`);
175
+ if (preset.notes)
176
+ console.log(` notes: ${preset.notes}`);
177
+ }
178
+ });
179
+ program
180
+ .command('health')
181
+ .description('Probe all configured providers.')
182
+ .option('--skip-web-bridge', 'do not start the headless browser')
183
+ .action(async (opts) => {
184
+ const registry = buildRegistryFromEnv(false);
185
+ // Web-bridge healthCheck launches a browser; allow opting out for quick checks.
186
+ if (opts.skipWebBridge) {
187
+ for (const p of registry.list()) {
188
+ if (p.kind === 'web-bridge')
189
+ registry.unregister(p.id);
190
+ }
191
+ }
192
+ const results = await registry.healthCheckAll();
193
+ if (results.length === 0) {
194
+ console.log('(no providers configured)');
195
+ return;
196
+ }
197
+ for (const r of results) {
198
+ const status = r.ok ? '✓ ok' : '✗ failed';
199
+ const latency = r.latencyMs !== undefined ? ` ${r.latencyMs}ms` : '';
200
+ const reason = r.reason ? ` (${r.reason})` : '';
201
+ console.log(`${r.id}\t${status}${latency}${reason}`);
202
+ }
203
+ await registry.closeAll();
204
+ });
205
+ program
206
+ .command('login <provider>')
207
+ .description('Open a browser window to log in to a web-bridge provider (deepseek-web, ...).')
208
+ .action(async (providerId) => {
209
+ const registry = buildRegistryFromEnv(false);
210
+ const provider = registry.get(providerId);
211
+ if (!provider) {
212
+ console.error(`error: provider "${providerId}" is not registered`);
213
+ console.error('available:', registry.list().map((p) => p.id).join(', '));
214
+ process.exit(2);
215
+ }
216
+ if (provider.kind !== 'web-bridge') {
217
+ console.error(`error: login is only for web-bridge providers (got kind=${provider.kind})`);
218
+ console.error(' API providers authenticate via environment variables instead.');
219
+ process.exit(2);
220
+ }
221
+ const wbp = provider;
222
+ console.log(`Opening browser for ${provider.displayName}...`);
223
+ await wbp.showForLogin();
224
+ console.log('A browser window has opened. Steps:');
225
+ console.log(' 1. Sign in to the service.');
226
+ console.log(' 2. Wait until you see the chat composer (textarea) in the page.');
227
+ console.log(' 3. Then come back here and press Enter.');
228
+ await waitForEnter();
229
+ const url = wbp.currentUrl();
230
+ if (url)
231
+ console.log(` current page: ${url}`);
232
+ console.log('Verifying login (up to 15s)...');
233
+ const ok = await wbp.confirmLogin();
234
+ if (ok) {
235
+ console.log('✓ Login confirmed. Switched back to headless mode.');
236
+ }
237
+ else {
238
+ console.log('✗ Composer not visible within 15s.');
239
+ console.log(' If you DID sign in, the SPA may just be slow — try `bbclaw health` in a moment.');
240
+ console.log(' If you see a login page above, re-run `bbclaw login deepseek-web` and finish signing in before pressing Enter.');
241
+ }
242
+ await registry.closeAll();
243
+ });
244
+ // -------- auth subcommands --------
245
+ const authCmd = program
246
+ .command('auth')
247
+ .description('Manage your BBClaw license code (license-gated beta).');
248
+ authCmd
249
+ .command('login')
250
+ .description('Verify a license code and save it locally.')
251
+ .requiredOption('--code <code>', 'license code, e.g. bbclaw-xxxx-xxxx-xxxx')
252
+ .option('--server <url>', 'BBClaw admin server URL (defaults to $BBCLAW_API or built-in)')
253
+ .action(async (opts) => {
254
+ const { verifyCode, resolveServer } = await import('./auth/client.js');
255
+ const { saveAuth } = await import('./auth/authStore.js');
256
+ const server = resolveServer(opts.server);
257
+ process.stderr.write(`Verifying code against ${server}…\n`);
258
+ const res = await verifyCode(opts.code, server);
259
+ if (!res.valid) {
260
+ console.error(`✗ Verification failed: ${res.reason}`);
261
+ process.exit(2);
262
+ }
263
+ await saveAuth({
264
+ code: opts.code,
265
+ expiresAt: res.expiresAt,
266
+ verifiedAt: new Date().toISOString(),
267
+ server,
268
+ });
269
+ console.log(`✓ Authenticated. Code valid until ${new Date(res.expiresAt).toLocaleString()}.`);
270
+ });
271
+ authCmd
272
+ .command('status')
273
+ .description('Show whether the local license is present and still valid.')
274
+ .action(async () => {
275
+ const { loadAuth, isAuthValid, authPath } = await import('./auth/authStore.js');
276
+ const auth = await loadAuth();
277
+ if (!auth) {
278
+ console.log('Not authenticated. Run: bbclaw auth login --code <code>');
279
+ console.log(` (auth would be stored at ${authPath()})`);
280
+ return;
281
+ }
282
+ const expiry = new Date(auth.expiresAt);
283
+ if (!isAuthValid(auth)) {
284
+ console.log(`✗ License expired on ${expiry.toLocaleString()}.`);
285
+ console.log(' Get a new code, then run: bbclaw auth login --code <code>');
286
+ process.exit(2);
287
+ }
288
+ console.log(`✓ Authenticated`);
289
+ console.log(` code: ${auth.code}`);
290
+ console.log(` expires: ${expiry.toLocaleString()}`);
291
+ console.log(` server: ${auth.server}`);
292
+ });
293
+ authCmd
294
+ .command('logout')
295
+ .description('Forget the local license code.')
296
+ .action(async () => {
297
+ const { clearAuth, authPath } = await import('./auth/authStore.js');
298
+ await clearAuth();
299
+ console.log(`Cleared ${authPath()}.`);
300
+ });
301
+ program.parseAsync(process.argv).catch(async (e) => {
302
+ console.error('error:', e instanceof Error ? e.message : e);
303
+ process.exit(1);
304
+ });
305
+ // ---- helpers ----
306
+ async function requireAuth() {
307
+ // Escape hatch for local dev / CI where we don't want the gate active.
308
+ if (process.env.BBCLAW_SKIP_AUTH === '1')
309
+ return;
310
+ const { loadAuth, isAuthValid } = await import('./auth/authStore.js');
311
+ const auth = await loadAuth();
312
+ if (isAuthValid(auth))
313
+ return;
314
+ if (auth) {
315
+ const expiry = new Date(auth.expiresAt).toLocaleString();
316
+ console.error(`✗ Your BBClaw license expired on ${expiry}.`);
317
+ }
318
+ else {
319
+ console.error('✗ BBClaw is license-gated. No local license found.');
320
+ }
321
+ console.error(' Run: bbclaw auth login --code <your-code>');
322
+ console.error(' (set BBCLAW_SKIP_AUTH=1 to bypass this check during development.)');
323
+ process.exit(2);
324
+ }
325
+ function buildRegistryFromEnv(verbose) {
326
+ const logger = verbose ? consoleLogger('[bbclaw]') : undefined;
327
+ const registry = new ProviderRegistry({ logger });
328
+ // Register DeepSeek web bridge FIRST so it's the fallback default. API
329
+ // providers register after and overtake the default if any env var is set.
330
+ registry.register(new WebBridgeProvider(DEEPSEEK_WEB_SPEC, {
331
+ userDataDir: join(BBCLAW_DIR, 'deepseek-session'),
332
+ headless: true,
333
+ logger,
334
+ }));
335
+ if (process.env.ANTHROPIC_API_KEY) {
336
+ registry.register(new AnthropicProvider({
337
+ apiKey: process.env.ANTHROPIC_API_KEY,
338
+ baseURL: process.env.ANTHROPIC_BASE_URL,
339
+ logger,
340
+ }));
341
+ registry.setDefault('anthropic');
342
+ }
343
+ const apiKeyEnvMap = [
344
+ { env: 'OPENAI_API_KEY', preset: 'openai' },
345
+ { env: 'DEEPSEEK_API_KEY', preset: 'deepseek-api' },
346
+ { env: 'GROQ_API_KEY', preset: 'groq' },
347
+ { env: 'OPENROUTER_API_KEY', preset: 'openrouter' },
348
+ { env: 'TOGETHER_API_KEY', preset: 'together' },
349
+ { env: 'MISTRAL_API_KEY', preset: 'mistral' },
350
+ ];
351
+ let firstApiPreset = null;
352
+ for (const { env, preset } of apiKeyEnvMap) {
353
+ const key = process.env[env];
354
+ if (!key)
355
+ continue;
356
+ registry.register(new OpenAICompatProvider({
357
+ id: preset,
358
+ preset,
359
+ apiKey: key,
360
+ logger,
361
+ }));
362
+ if (firstApiPreset === null)
363
+ firstApiPreset = preset;
364
+ }
365
+ if (firstApiPreset && !process.env.ANTHROPIC_API_KEY) {
366
+ registry.setDefault(firstApiPreset);
367
+ }
368
+ if (process.env.BBCLAW_OLLAMA) {
369
+ registry.register(new OpenAICompatProvider({
370
+ id: 'ollama',
371
+ preset: 'ollama',
372
+ logger,
373
+ }));
374
+ }
375
+ // Allow an explicit override of the default via env.
376
+ if (process.env.BBCLAW_PROVIDER) {
377
+ const want = process.env.BBCLAW_PROVIDER;
378
+ if (registry.has(want))
379
+ registry.setDefault(want);
380
+ }
381
+ return registry;
382
+ }
383
+ function pickProvider(registry, id) {
384
+ try {
385
+ return registry.pick(id);
386
+ }
387
+ catch (e) {
388
+ console.error('error:', e instanceof Error ? e.message : e);
389
+ process.exit(2);
390
+ }
391
+ }
392
+ async function waitForEnter() {
393
+ return new Promise((resolve) => {
394
+ process.stdin.resume();
395
+ process.stdin.once('data', () => {
396
+ process.stdin.pause();
397
+ resolve();
398
+ });
399
+ });
400
+ }
401
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProviderRegistry } from '@bbclaw/core';
2
+ import { type FC } from 'react';
3
+ import type { SessionData } from './sessionStore.js';
4
+ interface AppProps {
5
+ registry: ProviderRegistry;
6
+ initialSession?: SessionData;
7
+ }
8
+ export declare const App: FC<AppProps>;
9
+ export {};
10
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/repl/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAwB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAIrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKpD,UAAU,QAAQ;IAChB,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,cAAc,CAAC,EAAE,WAAW,CAAA;CAC7B;AAED,eAAO,MAAM,GAAG,EAAE,EAAE,CAAC,QAAQ,CA+I5B,CAAA"}