reeboot 1.3.0 → 1.3.2

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 (91) hide show
  1. package/dist/channels/signal.d.ts +13 -0
  2. package/dist/channels/signal.d.ts.map +1 -1
  3. package/dist/channels/signal.js +54 -0
  4. package/dist/channels/signal.js.map +1 -1
  5. package/dist/channels/whatsapp.d.ts +14 -0
  6. package/dist/channels/whatsapp.d.ts.map +1 -1
  7. package/dist/channels/whatsapp.js +64 -0
  8. package/dist/channels/whatsapp.js.map +1 -1
  9. package/dist/config.d.ts +112 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +18 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/db/schema.d.ts +96 -0
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +69 -0
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/extensions/loader.d.ts.map +1 -1
  18. package/dist/extensions/loader.js +16 -0
  19. package/dist/extensions/loader.js.map +1 -1
  20. package/dist/index.d.ts +30 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +132 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/orchestrator.d.ts +7 -0
  25. package/dist/orchestrator.d.ts.map +1 -1
  26. package/dist/orchestrator.js +30 -0
  27. package/dist/orchestrator.js.map +1 -1
  28. package/dist/scheduler/heartbeat.d.ts +27 -0
  29. package/dist/scheduler/heartbeat.d.ts.map +1 -0
  30. package/dist/scheduler/heartbeat.js +74 -0
  31. package/dist/scheduler/heartbeat.js.map +1 -0
  32. package/dist/scheduler/parse.d.ts +42 -0
  33. package/dist/scheduler/parse.d.ts.map +1 -0
  34. package/dist/scheduler/parse.js +119 -0
  35. package/dist/scheduler/parse.js.map +1 -0
  36. package/dist/scheduler-registry.d.ts +7 -3
  37. package/dist/scheduler-registry.d.ts.map +1 -1
  38. package/dist/scheduler-registry.js +3 -0
  39. package/dist/scheduler-registry.js.map +1 -1
  40. package/dist/scheduler.d.ts +71 -15
  41. package/dist/scheduler.d.ts.map +1 -1
  42. package/dist/scheduler.js +304 -64
  43. package/dist/scheduler.js.map +1 -1
  44. package/dist/server.d.ts.map +1 -1
  45. package/dist/server.js +18 -4
  46. package/dist/server.js.map +1 -1
  47. package/dist/setup-wizard.d.ts +5 -0
  48. package/dist/setup-wizard.d.ts.map +1 -1
  49. package/dist/setup-wizard.js +23 -69
  50. package/dist/setup-wizard.js.map +1 -1
  51. package/dist/skills-cli.d.ts +22 -0
  52. package/dist/skills-cli.d.ts.map +1 -0
  53. package/dist/skills-cli.js +56 -0
  54. package/dist/skills-cli.js.map +1 -0
  55. package/dist/utils/atomic-config.d.ts +7 -0
  56. package/dist/utils/atomic-config.d.ts.map +1 -0
  57. package/dist/utils/atomic-config.js +10 -0
  58. package/dist/utils/atomic-config.js.map +1 -0
  59. package/dist/utils/docker.d.ts +10 -0
  60. package/dist/utils/docker.d.ts.map +1 -0
  61. package/dist/utils/docker.js +27 -0
  62. package/dist/utils/docker.js.map +1 -0
  63. package/dist/wizard/index.d.ts +21 -0
  64. package/dist/wizard/index.d.ts.map +1 -0
  65. package/dist/wizard/index.js +101 -0
  66. package/dist/wizard/index.js.map +1 -0
  67. package/dist/wizard/prompter.d.ts +48 -0
  68. package/dist/wizard/prompter.d.ts.map +1 -0
  69. package/dist/wizard/prompter.js +62 -0
  70. package/dist/wizard/prompter.js.map +1 -0
  71. package/dist/wizard/steps/channels.d.ts +20 -0
  72. package/dist/wizard/steps/channels.d.ts.map +1 -0
  73. package/dist/wizard/steps/channels.js +215 -0
  74. package/dist/wizard/steps/channels.js.map +1 -0
  75. package/dist/wizard/steps/launch.d.ts +20 -0
  76. package/dist/wizard/steps/launch.d.ts.map +1 -0
  77. package/dist/wizard/steps/launch.js +82 -0
  78. package/dist/wizard/steps/launch.js.map +1 -0
  79. package/dist/wizard/steps/name.d.ts +9 -0
  80. package/dist/wizard/steps/name.d.ts.map +1 -0
  81. package/dist/wizard/steps/name.js +16 -0
  82. package/dist/wizard/steps/name.js.map +1 -0
  83. package/dist/wizard/steps/provider.d.ts +22 -0
  84. package/dist/wizard/steps/provider.d.ts.map +1 -0
  85. package/dist/wizard/steps/provider.js +134 -0
  86. package/dist/wizard/steps/provider.js.map +1 -0
  87. package/dist/wizard/steps/web-search.d.ts +10 -0
  88. package/dist/wizard/steps/web-search.d.ts.map +1 -0
  89. package/dist/wizard/steps/web-search.js +84 -0
  90. package/dist/wizard/steps/web-search.js.map +1 -0
  91. package/package.json +1 -1
@@ -0,0 +1,215 @@
1
+ import { mkdirSync, rmSync, existsSync, readdirSync, renameSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ import { checkDockerStatus } from '../../utils/docker.js';
5
+ import { linkWhatsAppDevice } from '../../channels/whatsapp.js';
6
+ import { linkSignalDevice } from '../../channels/signal.js';
7
+ // ─── runChannelsStep ──────────────────────────────────────────────────────────
8
+ export async function runChannelsStep(opts) {
9
+ const { prompter } = opts;
10
+ const configDir = opts.configDir ?? join(homedir(), '.reeboot');
11
+ const deps = opts._deps ?? {};
12
+ const _linkWhatsApp = deps.linkWhatsApp ?? linkWhatsAppDevice;
13
+ const _linkSignal = deps.linkSignal ?? linkSignalDevice;
14
+ const _checkDocker = deps.checkDocker ?? checkDockerStatus;
15
+ console.log('\n── Step 3: Channels ─────────────────────────────────────────────\n');
16
+ console.log(' ✓ WebChat is always enabled (built-in web UI)\n');
17
+ const selected = await prompter.checkbox({
18
+ message: 'Select additional channels to set up now (optional):',
19
+ choices: [
20
+ { name: 'WhatsApp (scan QR code)', value: 'whatsapp' },
21
+ { name: 'Signal (requires Docker)', value: 'signal' },
22
+ ],
23
+ });
24
+ const result = {
25
+ whatsapp: false,
26
+ signal: false,
27
+ };
28
+ if (selected.includes('whatsapp')) {
29
+ result.whatsapp = await runWhatsAppSubflow({ configDir, linkFn: _linkWhatsApp });
30
+ }
31
+ if (selected.includes('signal')) {
32
+ // Skip real Docker container setup when link function is injected (test mode)
33
+ const skipDockerSetup = !!deps.linkSignal;
34
+ const signalResult = await runSignalSubflow({
35
+ prompter,
36
+ configDir,
37
+ checkDocker: _checkDocker,
38
+ linkFn: _linkSignal,
39
+ skipDockerSetup,
40
+ });
41
+ result.signal = signalResult.enabled;
42
+ if (signalResult.phone)
43
+ result.signalPhone = signalResult.phone;
44
+ }
45
+ return result;
46
+ }
47
+ // ─── WhatsApp sub-flow ────────────────────────────────────────────────────────
48
+ async function runWhatsAppSubflow(opts) {
49
+ const { configDir, linkFn } = opts;
50
+ console.log('\n 📱 WhatsApp Setup');
51
+ console.log(' ─────────────────────────────────────────────────────────────');
52
+ // Clean up any orphaned temp auth dirs from previous wizard runs
53
+ cleanOrphanedWizardAuthDirs(configDir);
54
+ const tempAuthDir = join(configDir, `.wiz-wa-auth-${Date.now()}`);
55
+ mkdirSync(tempAuthDir, { recursive: true });
56
+ let success = false;
57
+ try {
58
+ const qrTerminal = await import('qrcode-terminal');
59
+ await new Promise((resolve) => {
60
+ linkFn({
61
+ authDir: tempAuthDir,
62
+ onQr: (qr) => {
63
+ console.log('\n Scan this QR code with WhatsApp:');
64
+ console.log(' (Settings → Linked Devices → Link a Device)\n');
65
+ qrTerminal.default.generate(qr, { small: true });
66
+ console.log('\n Waiting up to 2 minutes...\n');
67
+ },
68
+ onSuccess: () => {
69
+ success = true;
70
+ // Move temp auth dir to permanent location
71
+ const permDir = join(configDir, 'channels', 'whatsapp', 'auth');
72
+ mkdirSync(join(configDir, 'channels', 'whatsapp'), { recursive: true });
73
+ try {
74
+ if (existsSync(tempAuthDir)) {
75
+ rmSync(permDir, { recursive: true, force: true });
76
+ renameSync(tempAuthDir, permDir);
77
+ }
78
+ }
79
+ catch { /* ignore move errors */ }
80
+ console.log(' ✓ WhatsApp linked!');
81
+ resolve();
82
+ },
83
+ onTimeout: () => {
84
+ success = false;
85
+ console.log(' ✗ WhatsApp QR timed out.');
86
+ console.log(' → Run `reeboot channel login whatsapp` later to link.\n');
87
+ try {
88
+ rmSync(tempAuthDir, { recursive: true, force: true });
89
+ }
90
+ catch { /* ignore */ }
91
+ resolve();
92
+ },
93
+ });
94
+ });
95
+ }
96
+ catch {
97
+ success = false;
98
+ }
99
+ return success;
100
+ }
101
+ // ─── Signal sub-flow ──────────────────────────────────────────────────────────
102
+ async function runSignalSubflow(opts) {
103
+ const { prompter, configDir, checkDocker, linkFn, skipDockerSetup } = opts;
104
+ console.log('\n 📡 Signal Setup');
105
+ console.log(' ─────────────────────────────────────────────────────────────');
106
+ const dockerStatus = await checkDocker();
107
+ if (dockerStatus === 'not-installed') {
108
+ console.log(' ✗ Docker is not installed.');
109
+ console.log(' → Install Docker Desktop: https://www.docker.com/products/docker-desktop');
110
+ console.log(' → Run `reeboot channel login signal` after installing Docker.\n');
111
+ return { enabled: false };
112
+ }
113
+ if (dockerStatus === 'not-running') {
114
+ const continueAnyway = await prompter.confirm({
115
+ message: 'Docker is installed but not running. Start Docker Desktop, then continue?',
116
+ default: false,
117
+ });
118
+ if (!continueAnyway) {
119
+ console.log(' → Skipping Signal setup. Run `reeboot channel login signal` later.\n');
120
+ return { enabled: false };
121
+ }
122
+ // Check again after user started Docker
123
+ const newStatus = await checkDocker();
124
+ if (newStatus !== 'running') {
125
+ console.log(' ✗ Docker still not running. Skipping Signal setup.\n');
126
+ return { enabled: false };
127
+ }
128
+ }
129
+ // Docker is running — prompt for phone number
130
+ const phone = await prompter.input({
131
+ message: 'Your Signal phone number (with country code, e.g. +15551234567):',
132
+ validate: (val) => val.trim().startsWith('+') ? true : 'phone number must start with + and country code',
133
+ });
134
+ const SIGNAL_API_PORT = 8080;
135
+ if (!skipDockerSetup) {
136
+ console.log(`\n Starting Signal container for ${phone}...`);
137
+ const signalDir = join(configDir, 'channels', 'signal');
138
+ mkdirSync(signalDir, { recursive: true });
139
+ const { spawnSync } = await import('child_process');
140
+ spawnSync('docker', ['rm', '-f', 'reeboot-signal-setup'], { stdio: 'pipe' });
141
+ const start = spawnSync('docker', [
142
+ 'run', '-d',
143
+ '--name', 'reeboot-signal-setup',
144
+ '-p', `${SIGNAL_API_PORT}:8080`,
145
+ '-v', `${signalDir}:/home/.local/share/signal-cli`,
146
+ '-e', 'MODE=native',
147
+ 'bbernhard/signal-cli-rest-api:latest',
148
+ ], { stdio: 'pipe' });
149
+ if (start.status !== 0) {
150
+ console.log(' ✗ Failed to start Signal container. Skipping Signal setup.\n');
151
+ return { enabled: false, phone };
152
+ }
153
+ // Wait for container to be ready
154
+ process.stdout.write(' Waiting for Signal container to be ready...');
155
+ let ready = false;
156
+ for (let i = 0; i < 15; i++) {
157
+ await new Promise(r => setTimeout(r, 1000));
158
+ process.stdout.write('.');
159
+ try {
160
+ const res = await fetch(`http://127.0.0.1:${SIGNAL_API_PORT}/v1/about`);
161
+ if (res.ok) {
162
+ ready = true;
163
+ break;
164
+ }
165
+ }
166
+ catch { /* not ready yet */ }
167
+ }
168
+ if (!ready) {
169
+ console.log(' ✗');
170
+ console.log(' ✗ Signal container did not become ready.\n');
171
+ return { enabled: false, phone };
172
+ }
173
+ console.log(' ✓');
174
+ }
175
+ let success = false;
176
+ await new Promise((resolve) => {
177
+ linkFn({
178
+ phoneNumber: phone,
179
+ apiPort: SIGNAL_API_PORT,
180
+ onQr: (url) => {
181
+ console.log(`\n 📱 Open this URL to scan the Signal QR code:`);
182
+ console.log(` ${url}`);
183
+ console.log('\n Waiting up to 3 minutes for you to scan...\n');
184
+ },
185
+ onSuccess: () => {
186
+ success = true;
187
+ console.log(' ✓ Signal linked!');
188
+ resolve();
189
+ },
190
+ onTimeout: () => {
191
+ success = false;
192
+ console.log(' ✗ Signal QR timed out.');
193
+ console.log(' → Container is still running. Run `reeboot channel login signal` later.\n');
194
+ resolve();
195
+ },
196
+ });
197
+ });
198
+ return { enabled: success, phone };
199
+ }
200
+ // ─── cleanOrphanedWizardAuthDirs ──────────────────────────────────────────────
201
+ function cleanOrphanedWizardAuthDirs(configDir) {
202
+ try {
203
+ const entries = readdirSync(configDir);
204
+ for (const entry of entries) {
205
+ if (entry.startsWith('.wiz-wa-auth-')) {
206
+ try {
207
+ rmSync(join(configDir, entry), { recursive: true, force: true });
208
+ }
209
+ catch { /* ignore */ }
210
+ }
211
+ }
212
+ }
213
+ catch { /* configDir may not exist yet */ }
214
+ }
215
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../src/wizard/steps/channels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Prompter } from '../prompter.js';
2
+ export interface LaunchDraft {
3
+ provider: string;
4
+ modelId: string;
5
+ apiKey: string;
6
+ ollamaBaseUrl?: string;
7
+ agentName: string;
8
+ whatsapp: boolean;
9
+ signal: boolean;
10
+ signalPhone?: string;
11
+ searchProvider: string;
12
+ searchApiKey?: string;
13
+ searxngBaseUrl?: string;
14
+ }
15
+ export declare function runLaunchStep(opts: {
16
+ prompter: Prompter;
17
+ draft: LaunchDraft;
18
+ configPath?: string;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAM9C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,WAAW,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFhB"}
@@ -0,0 +1,82 @@
1
+ import { defaultConfig } from '../../config.js';
2
+ // ─── runLaunchStep ────────────────────────────────────────────────────────────
3
+ export async function runLaunchStep(opts) {
4
+ const { prompter, draft, configPath } = opts;
5
+ const { join } = await import('path');
6
+ const { homedir } = await import('os');
7
+ const finalConfigPath = configPath ?? join(homedir(), '.reeboot', 'config.json');
8
+ // ── Summary display ──────────────────────────────────────────────────────
9
+ console.log('\n── Step 4: Ready to Launch ──────────────────────────────────────\n');
10
+ console.log(' Configuration summary:');
11
+ console.log(' ─────────────────────────────────────────────────────────────');
12
+ console.log(` Provider: ${draft.provider}`);
13
+ console.log(` Model: ${draft.modelId}`);
14
+ console.log(` Agent name: ${draft.agentName}`);
15
+ console.log(` WhatsApp: ${draft.whatsapp ? '✓ linked' : '✗ not linked'}`);
16
+ console.log(` Signal: ${draft.signal ? '✓ linked' : '✗ not linked'}`);
17
+ console.log(` Web search: ${draft.searchProvider}`);
18
+ console.log(' ─────────────────────────────────────────────────────────────\n');
19
+ // ── Build config ─────────────────────────────────────────────────────────
20
+ const config = {
21
+ ...defaultConfig,
22
+ agent: {
23
+ ...defaultConfig.agent,
24
+ name: draft.agentName,
25
+ model: {
26
+ provider: draft.provider,
27
+ id: draft.modelId,
28
+ apiKey: draft.apiKey ?? '',
29
+ },
30
+ },
31
+ channels: {
32
+ web: { enabled: true, port: defaultConfig.channels.web.port },
33
+ whatsapp: { enabled: draft.whatsapp },
34
+ signal: {
35
+ enabled: draft.signal,
36
+ phoneNumber: draft.signalPhone ?? '',
37
+ apiPort: defaultConfig.channels.signal.apiPort,
38
+ pollInterval: defaultConfig.channels.signal.pollInterval,
39
+ },
40
+ },
41
+ search: {
42
+ provider: draft.searchProvider,
43
+ apiKey: draft.searchApiKey ?? '',
44
+ searxngBaseUrl: draft.searxngBaseUrl ?? 'http://localhost:4000',
45
+ },
46
+ heartbeat: defaultConfig.heartbeat,
47
+ sandbox: defaultConfig.sandbox,
48
+ logging: defaultConfig.logging,
49
+ server: defaultConfig.server,
50
+ extensions: defaultConfig.extensions,
51
+ routing: defaultConfig.routing,
52
+ session: defaultConfig.session,
53
+ credentialProxy: defaultConfig.credentialProxy,
54
+ };
55
+ // ── Ask to start now ──────────────────────────────────────────────────────
56
+ const startNow = await prompter.confirm({
57
+ message: 'Start your agent now?',
58
+ default: true,
59
+ });
60
+ // Write config atomically (always, whether starting now or not)
61
+ const { saveConfigAtomic } = await import('../../utils/atomic-config.js');
62
+ saveConfigAtomic(config, finalConfigPath);
63
+ console.log(`\n ✓ Config written to ${finalConfigPath}`);
64
+ if (startNow) {
65
+ console.log('\n 🚀 Starting reeboot...\n');
66
+ const { loadConfig } = await import('../../config.js');
67
+ const { startServer } = await import('../../server.js');
68
+ const loaded = loadConfig(finalConfigPath);
69
+ console.log(` ✓ WebChat ready at http://localhost:${loaded.channels.web.port}`);
70
+ await startServer({
71
+ port: loaded.channels.web.port,
72
+ host: process.env.REEBOOT_HOST ?? '127.0.0.1',
73
+ logLevel: loaded.logging.level,
74
+ token: loaded.server.token,
75
+ config: loaded,
76
+ });
77
+ }
78
+ else {
79
+ console.log('\n Run `reeboot start` when ready.\n');
80
+ }
81
+ }
82
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/wizard/steps/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Prompter } from '../prompter.js';
2
+ /**
3
+ * Step 2: prompt for the agent's display name.
4
+ * Returns the chosen name (defaults to "Reeboot").
5
+ */
6
+ export declare function runNameStep(opts: {
7
+ prompter: Prompter;
8
+ }): Promise<string>;
9
+ //# sourceMappingURL=name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAI9C;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAY/E"}
@@ -0,0 +1,16 @@
1
+ // ─── runNameStep ──────────────────────────────────────────────────────────────
2
+ /**
3
+ * Step 2: prompt for the agent's display name.
4
+ * Returns the chosen name (defaults to "Reeboot").
5
+ */
6
+ export async function runNameStep(opts) {
7
+ const { prompter } = opts;
8
+ console.log('\n── Step 2: Agent Name ───────────────────────────────────────────\n');
9
+ const name = await prompter.input({
10
+ message: 'Agent name:',
11
+ default: 'Reeboot',
12
+ validate: (val) => val.trim().length > 0 ? true : 'agent name cannot be empty',
13
+ });
14
+ return name.trim() || 'Reeboot';
15
+ }
16
+ //# sourceMappingURL=name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.js","sourceRoot":"","sources":["../../../src/wizard/steps/name.ts"],"names":[],"mappings":"AAEA,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAA4B;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAEzB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;IAEpF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;QAChC,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B;KAC/E,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAA;AACjC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Prompter } from '../prompter.js';
2
+ export interface ProviderStepResult {
3
+ provider: string;
4
+ modelId: string;
5
+ apiKey: string;
6
+ ollamaBaseUrl: string;
7
+ }
8
+ export interface ProviderChoice {
9
+ name: string;
10
+ value: string;
11
+ }
12
+ export interface ModelChoice {
13
+ name: string;
14
+ value: string;
15
+ }
16
+ export declare const PROVIDERS: ProviderChoice[];
17
+ export declare const MODEL_LISTS: Record<string, ModelChoice[]>;
18
+ export declare function runProviderStep(opts: {
19
+ prompter: Prompter;
20
+ configDir: string;
21
+ }): Promise<ProviderStepResult>;
22
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAM9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAID,eAAO,MAAM,SAAS,EAAE,cAAc,EASrC,CAAA;AAID,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAmCrD,CAAA;AAgBD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmD9B"}
@@ -0,0 +1,134 @@
1
+ import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ // ─── Provider list (8) ────────────────────────────────────────────────────────
6
+ export const PROVIDERS = [
7
+ { name: 'Anthropic (Claude)', value: 'anthropic' },
8
+ { name: 'OpenAI (GPT)', value: 'openai' },
9
+ { name: 'Google (Gemini)', value: 'google' },
10
+ { name: 'Groq (fast inference)', value: 'groq' },
11
+ { name: 'Mistral', value: 'mistral' },
12
+ { name: 'xAI (Grok)', value: 'xai' },
13
+ { name: 'OpenRouter (multi-provider)', value: 'openrouter' },
14
+ { name: 'Ollama (local models)', value: 'ollama' },
15
+ ];
16
+ // ─── Curated model lists per provider ────────────────────────────────────────
17
+ export const MODEL_LISTS = {
18
+ anthropic: [
19
+ { name: 'claude-sonnet-4-5 [recommended]', value: 'claude-sonnet-4-5' },
20
+ { name: 'claude-3-5-haiku-20241022', value: 'claude-3-5-haiku-20241022' },
21
+ { name: 'claude-opus-4-5', value: 'claude-opus-4-5' },
22
+ ],
23
+ openai: [
24
+ { name: 'gpt-4o [recommended]', value: 'gpt-4o' },
25
+ { name: 'gpt-4o-mini', value: 'gpt-4o-mini' },
26
+ { name: 'o3-mini', value: 'o3-mini' },
27
+ ],
28
+ google: [
29
+ { name: 'gemini-2.0-flash [recommended]', value: 'gemini-2.0-flash' },
30
+ { name: 'gemini-2.0-flash-lite', value: 'gemini-2.0-flash-lite' },
31
+ { name: 'gemini-2.5-pro-preview', value: 'gemini-2.5-pro-preview' },
32
+ ],
33
+ groq: [
34
+ { name: 'llama-3.3-70b-versatile [recommended]', value: 'llama-3.3-70b-versatile' },
35
+ { name: 'llama-3.1-8b-instant', value: 'llama-3.1-8b-instant' },
36
+ { name: 'mixtral-8x7b-32768', value: 'mixtral-8x7b-32768' },
37
+ ],
38
+ mistral: [
39
+ { name: 'mistral-large-latest [recommended]', value: 'mistral-large-latest' },
40
+ { name: 'mistral-small-latest', value: 'mistral-small-latest' },
41
+ { name: 'codestral-latest', value: 'codestral-latest' },
42
+ ],
43
+ xai: [
44
+ { name: 'grok-2 [recommended]', value: 'grok-2' },
45
+ { name: 'grok-2-mini', value: 'grok-2-mini' },
46
+ ],
47
+ openrouter: [
48
+ { name: 'openai/gpt-4o [recommended]', value: 'openai/gpt-4o' },
49
+ { name: 'anthropic/claude-sonnet-4-5', value: 'anthropic/claude-sonnet-4-5' },
50
+ { name: 'google/gemini-2.0-flash', value: 'google/gemini-2.0-flash' },
51
+ ],
52
+ };
53
+ // ─── ENV var hints per provider ───────────────────────────────────────────────
54
+ const ENV_VARS = {
55
+ anthropic: 'ANTHROPIC_API_KEY',
56
+ openai: 'OPENAI_API_KEY',
57
+ google: 'GOOGLE_GENERATIVE_AI_API_KEY',
58
+ groq: 'GROQ_API_KEY',
59
+ mistral: 'MISTRAL_API_KEY',
60
+ xai: 'XAI_API_KEY',
61
+ openrouter: 'OPENROUTER_API_KEY',
62
+ };
63
+ // ─── runProviderStep ──────────────────────────────────────────────────────────
64
+ export async function runProviderStep(opts) {
65
+ const { prompter, configDir } = opts;
66
+ console.log('\n── Step 1: AI Provider ──────────────────────────────────────────\n');
67
+ console.log(' Note: Custom providers can be added via config.json after setup.\n');
68
+ // Select provider
69
+ const provider = await prompter.select({
70
+ message: 'Select your AI provider:',
71
+ choices: PROVIDERS,
72
+ });
73
+ let modelId;
74
+ let apiKey = '';
75
+ let ollamaBaseUrl = '';
76
+ if (provider === 'ollama') {
77
+ // Ollama: URL + model ID (no API key)
78
+ ollamaBaseUrl = await prompter.input({
79
+ message: 'Ollama base URL:',
80
+ default: 'http://localhost:11434/v1',
81
+ validate: (val) => val.trim().length > 0 ? true : 'base URL cannot be empty',
82
+ });
83
+ modelId = await prompter.input({
84
+ message: 'Model ID (run `ollama list` to see available models):',
85
+ validate: (val) => val.trim().length > 0 ? true : 'model ID cannot be empty',
86
+ });
87
+ // Write models.json
88
+ await writeOllamaModelsJson({ configDir, ollamaBaseUrl, modelId });
89
+ }
90
+ else {
91
+ // Non-Ollama: select from curated model list
92
+ const modelChoices = MODEL_LISTS[provider];
93
+ modelId = await prompter.select({
94
+ message: 'Select a model:',
95
+ choices: modelChoices,
96
+ default: modelChoices[0].value,
97
+ });
98
+ // Prompt for API key
99
+ const envVar = ENV_VARS[provider] ?? 'API_KEY';
100
+ console.log(` ℹ You can also set ${envVar} env var instead of storing the key.\n`);
101
+ apiKey = await prompter.password({
102
+ message: `Enter your ${provider} API key:`,
103
+ validate: (val) => val.trim().length > 0 ? true : 'API key cannot be empty',
104
+ });
105
+ }
106
+ return { provider, modelId, apiKey, ollamaBaseUrl };
107
+ }
108
+ // ─── writeOllamaModelsJson ────────────────────────────────────────────────────
109
+ async function writeOllamaModelsJson(opts) {
110
+ const { configDir, ollamaBaseUrl, modelId } = opts;
111
+ const templatesDir = join(__dirname, '..', '..', '..', 'templates');
112
+ const templatePath = join(templatesDir, 'models-ollama.json');
113
+ let template;
114
+ if (existsSync(templatePath)) {
115
+ template = readFileSync(templatePath, 'utf-8');
116
+ template = template
117
+ .replace(/{{MODEL_ID}}/g, modelId)
118
+ .replace(/"baseUrl":\s*"[^"]*"/, `"baseUrl": "${ollamaBaseUrl}"`);
119
+ }
120
+ else {
121
+ // Fallback inline template
122
+ template = JSON.stringify({
123
+ providers: [{
124
+ id: 'ollama',
125
+ name: 'Ollama (local)',
126
+ baseUrl: ollamaBaseUrl,
127
+ models: [{ id: modelId, name: modelId, contextWindow: 8192 }],
128
+ }],
129
+ }, null, 2);
130
+ }
131
+ mkdirSync(configDir, { recursive: true });
132
+ writeFileSync(join(configDir, 'models.json'), template, 'utf-8');
133
+ }
134
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/wizard/steps/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Prompter } from '../prompter.js';
2
+ export interface WebSearchStepResult {
3
+ provider: string;
4
+ apiKey: string;
5
+ searxngBaseUrl: string;
6
+ }
7
+ export declare function runWebSearchStep(opts: {
8
+ prompter: Prompter;
9
+ }): Promise<WebSearchStepResult>;
10
+ //# sourceMappingURL=web-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAI9C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAaD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,QAAQ,CAAA;CACnB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA2C/B"}