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
@@ -5,24 +5,29 @@ import { fileURLToPath } from 'url';
5
5
  import { saveConfig, defaultConfig } from './config.js';
6
6
  const __dirname = dirname(fileURLToPath(import.meta.url));
7
7
  // ─── runWizard ───────────────────────────────────────────────────────────────
8
+ /**
9
+ * Legacy wizard entrypoint — kept for backward compatibility.
10
+ * In interactive mode, delegates to the new modular wizard (src/wizard/index.ts).
11
+ * In non-interactive mode, builds config directly from provided opts.
12
+ */
8
13
  export async function runWizard(opts = {}) {
9
14
  const configDir = opts.configDir ?? join(homedir(), '.reeboot');
10
15
  const configPath = join(configDir, 'config.json');
11
16
  const interactive = opts.interactive !== false;
12
- let answers;
13
17
  if (interactive) {
14
- answers = await runInteractiveWizard(configPath, opts);
15
- }
16
- else {
17
- // Non-interactive: use provided flags
18
- answers = {
19
- provider: opts.provider ?? '',
20
- apiKey: opts.apiKey ?? '',
21
- model: opts.model ?? '',
22
- channels: opts.channels ? opts.channels.split(',').map(s => s.trim()) : ['web'],
23
- name: opts.name ?? 'Reeboot',
24
- };
18
+ // Delegate to new wizard
19
+ const { runSetupWizard } = await import('./wizard/index.js');
20
+ await runSetupWizard({ configPath, configDir });
21
+ return;
25
22
  }
23
+ // Non-interactive: build config from provided flags directly
24
+ const answers = {
25
+ provider: opts.provider ?? '',
26
+ apiKey: opts.apiKey ?? '',
27
+ model: opts.model ?? '',
28
+ channels: opts.channels ? opts.channels.split(',').map(s => s.trim()) : ['web'],
29
+ name: opts.name ?? 'Reeboot',
30
+ };
26
31
  // Build config from answers
27
32
  const config = {
28
33
  ...defaultConfig,
@@ -54,6 +59,12 @@ export async function runWizard(opts = {}) {
54
59
  sandbox: defaultConfig.sandbox,
55
60
  logging: defaultConfig.logging,
56
61
  server: defaultConfig.server,
62
+ extensions: defaultConfig.extensions,
63
+ routing: defaultConfig.routing,
64
+ session: defaultConfig.session,
65
+ credentialProxy: defaultConfig.credentialProxy,
66
+ search: defaultConfig.search,
67
+ heartbeat: defaultConfig.heartbeat,
57
68
  };
58
69
  // Write config
59
70
  mkdirSync(configDir, { recursive: true });
@@ -66,63 +77,6 @@ export async function runWizard(opts = {}) {
66
77
  scaffoldTemplates(configDir);
67
78
  console.log(`✓ Templates scaffolded`);
68
79
  }
69
- // ─── Interactive wizard ───────────────────────────────────────────────────────
70
- async function runInteractiveWizard(configPath, _opts) {
71
- const { default: inquirer } = await import('inquirer');
72
- console.log('\n🚀 Welcome to Reeboot Setup Wizard\n');
73
- // Check if config exists and ask for confirmation
74
- if (existsSync(configPath)) {
75
- const { overwrite } = await inquirer.prompt([
76
- {
77
- type: 'confirm',
78
- name: 'overwrite',
79
- message: 'A config already exists. Overwrite it?',
80
- default: false,
81
- },
82
- ]);
83
- if (!overwrite) {
84
- console.log('Setup cancelled. Existing config preserved.');
85
- process.exit(0);
86
- }
87
- }
88
- const answers = await inquirer.prompt([
89
- {
90
- type: 'list',
91
- name: 'provider',
92
- message: 'Select your LLM provider:',
93
- choices: ['anthropic', 'openai', 'ollama', 'other'],
94
- },
95
- {
96
- type: 'password',
97
- name: 'apiKey',
98
- message: 'Enter your API key:',
99
- mask: '*',
100
- },
101
- {
102
- type: 'input',
103
- name: 'model',
104
- message: 'Enter the model ID:',
105
- default: 'claude-sonnet-4-20250514',
106
- },
107
- {
108
- type: 'checkbox',
109
- name: 'channels',
110
- message: 'Select channels to enable:',
111
- choices: [
112
- { name: 'WebChat (built-in web UI)', value: 'web', checked: true },
113
- { name: 'WhatsApp', value: 'whatsapp' },
114
- { name: 'Signal', value: 'signal' },
115
- ],
116
- },
117
- {
118
- type: 'input',
119
- name: 'name',
120
- message: 'Agent name:',
121
- default: 'Reeboot',
122
- },
123
- ]);
124
- return answers;
125
- }
126
80
  // ─── Directory scaffolding ────────────────────────────────────────────────────
127
81
  function scaffoldDirectories(configDir) {
128
82
  const dirs = [
@@ -1 +1 @@
1
- {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Skills CLI helper — extracted so tests can import without subprocess spawn.
3
+ * Used by `reeboot skills list` and `reeboot skills update`.
4
+ */
5
+ export interface SkillEntry {
6
+ name: string;
7
+ description: string;
8
+ }
9
+ /**
10
+ * Scan a skills directory, parse YAML frontmatter from each SKILL.md,
11
+ * and return sorted entries.
12
+ */
13
+ export declare function listBundledSkills(skillsDir: string): SkillEntry[];
14
+ /**
15
+ * Return the stub message for `reeboot skills update`.
16
+ */
17
+ export declare function getSkillsUpdateMessage(skillsDir: string): string;
18
+ /**
19
+ * Print the skills list table to stdout.
20
+ */
21
+ export declare function printSkillsList(skillsDir: string): void;
22
+ //# sourceMappingURL=skills-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-cli.d.ts","sourceRoot":"","sources":["../src/skills-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBjE;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhE;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAYvD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Skills CLI helper — extracted so tests can import without subprocess spawn.
3
+ * Used by `reeboot skills list` and `reeboot skills update`.
4
+ */
5
+ import { readdirSync, readFileSync, existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ // ─── listBundledSkills ────────────────────────────────────────────────────────
8
+ /**
9
+ * Scan a skills directory, parse YAML frontmatter from each SKILL.md,
10
+ * and return sorted entries.
11
+ */
12
+ export function listBundledSkills(skillsDir) {
13
+ if (!existsSync(skillsDir))
14
+ return [];
15
+ return readdirSync(skillsDir, { withFileTypes: true })
16
+ .filter(d => d.isDirectory())
17
+ .map(d => {
18
+ const skillMd = join(skillsDir, d.name, 'SKILL.md');
19
+ if (!existsSync(skillMd))
20
+ return null;
21
+ const content = readFileSync(skillMd, 'utf-8');
22
+ const descMatch = content.match(/^description:\s*(.+)$/m);
23
+ return {
24
+ name: d.name,
25
+ description: descMatch?.[1]?.trim() ?? '',
26
+ };
27
+ })
28
+ .filter((entry) => entry !== null && entry.description.length > 0)
29
+ .sort((a, b) => a.name.localeCompare(b.name));
30
+ }
31
+ // ─── getSkillsUpdateMessage ───────────────────────────────────────────────────
32
+ /**
33
+ * Return the stub message for `reeboot skills update`.
34
+ */
35
+ export function getSkillsUpdateMessage(skillsDir) {
36
+ const count = listBundledSkills(skillsDir).length;
37
+ return `Extended skill catalog update coming soon. Currently using ${count} bundled skills.`;
38
+ }
39
+ // ─── printSkillsList ──────────────────────────────────────────────────────────
40
+ /**
41
+ * Print the skills list table to stdout.
42
+ */
43
+ export function printSkillsList(skillsDir) {
44
+ const skills = listBundledSkills(skillsDir);
45
+ if (skills.length === 0) {
46
+ console.log('No bundled skills found.');
47
+ return;
48
+ }
49
+ const nameWidth = Math.max(...skills.map(s => s.name.length), 4);
50
+ console.log(`${'Name'.padEnd(nameWidth)} Description`);
51
+ console.log(`${'─'.repeat(nameWidth)} ${'─'.repeat(60)}`);
52
+ for (const s of skills) {
53
+ console.log(`${s.name.padEnd(nameWidth)} ${s.description}`);
54
+ }
55
+ }
56
+ //# sourceMappingURL=skills-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-cli.js","sourceRoot":"","sources":["../src/skills-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,OAAO,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC1D,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;SAC1C,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAuB,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;SACtF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO,8DAA8D,KAAK,kBAAkB,CAAC;AAC/F,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Config } from '../config.js';
2
+ /**
3
+ * Saves config atomically using the temp-file + rename pattern.
4
+ * Delegates to the existing saveConfig() which already implements atomic writes.
5
+ */
6
+ export declare function saveConfigAtomic(config: Config, configPath: string): void;
7
+ //# sourceMappingURL=atomic-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-config.d.ts","sourceRoot":"","sources":["../../src/utils/atomic-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AAItD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAEzE"}
@@ -0,0 +1,10 @@
1
+ import { saveConfig } from '../config.js';
2
+ // ─── saveConfigAtomic ─────────────────────────────────────────────────────────
3
+ /**
4
+ * Saves config atomically using the temp-file + rename pattern.
5
+ * Delegates to the existing saveConfig() which already implements atomic writes.
6
+ */
7
+ export function saveConfigAtomic(config, configPath) {
8
+ saveConfig(config, configPath);
9
+ }
10
+ //# sourceMappingURL=atomic-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-config.js","sourceRoot":"","sources":["../../src/utils/atomic-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAe,MAAM,cAAc,CAAA;AAEtD,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,UAAkB;IACjE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAChC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type DockerStatus = 'not-installed' | 'not-running' | 'running';
2
+ /**
3
+ * Checks the current Docker daemon status.
4
+ * Returns:
5
+ * 'not-installed' — docker binary not found
6
+ * 'not-running' — docker binary found but daemon not responding
7
+ * 'running' — docker daemon is running and healthy
8
+ */
9
+ export declare function checkDockerStatus(): Promise<DockerStatus>;
10
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,SAAS,CAAA;AAItE;;;;;;GAMG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CAe/D"}
@@ -0,0 +1,27 @@
1
+ import { execSync } from 'child_process';
2
+ // ─── checkDockerStatus ────────────────────────────────────────────────────────
3
+ /**
4
+ * Checks the current Docker daemon status.
5
+ * Returns:
6
+ * 'not-installed' — docker binary not found
7
+ * 'not-running' — docker binary found but daemon not responding
8
+ * 'running' — docker daemon is running and healthy
9
+ */
10
+ export async function checkDockerStatus() {
11
+ // First, check if docker binary exists
12
+ try {
13
+ execSync('docker --version', { stdio: ['pipe', 'pipe', 'pipe'] });
14
+ }
15
+ catch {
16
+ return 'not-installed';
17
+ }
18
+ // Then check if daemon is running
19
+ try {
20
+ execSync('docker info', { stdio: ['pipe', 'pipe', 'pipe'] });
21
+ return 'running';
22
+ }
23
+ catch {
24
+ return 'not-running';
25
+ }
26
+ }
27
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAMxC,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,uCAAuC;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAA;IACxB,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC;QACH,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5D,OAAO,SAAS,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAA;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Prompter } from './prompter.js';
2
+ export interface WizardOptions {
3
+ prompter?: Prompter;
4
+ configPath?: string;
5
+ configDir?: string;
6
+ }
7
+ /**
8
+ * Orchestrates the full setup wizard in order:
9
+ * 1. Provider setup (provider, model, API key / Ollama URL+model)
10
+ * 2. Agent name
11
+ * 3. Channel linking (WhatsApp, Signal)
12
+ * 4. Web search setup
13
+ * 5. Launch (summary + start confirmation + atomic config write)
14
+ *
15
+ * Config is written ONLY at step 5. If the wizard is interrupted before that,
16
+ * no config file is created or modified.
17
+ *
18
+ * Accepts an injectable `Prompter` for testing (defaults to InquirerPrompter).
19
+ */
20
+ export declare function runSetupWizard(opts?: WizardOptions): Promise<void>;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD5E"}
@@ -0,0 +1,101 @@
1
+ import { join } from 'path';
2
+ import { homedir } from 'os';
3
+ import { InquirerPrompter } from './prompter.js';
4
+ // ─── runSetupWizard ───────────────────────────────────────────────────────────
5
+ /**
6
+ * Orchestrates the full setup wizard in order:
7
+ * 1. Provider setup (provider, model, API key / Ollama URL+model)
8
+ * 2. Agent name
9
+ * 3. Channel linking (WhatsApp, Signal)
10
+ * 4. Web search setup
11
+ * 5. Launch (summary + start confirmation + atomic config write)
12
+ *
13
+ * Config is written ONLY at step 5. If the wizard is interrupted before that,
14
+ * no config file is created or modified.
15
+ *
16
+ * Accepts an injectable `Prompter` for testing (defaults to InquirerPrompter).
17
+ */
18
+ export async function runSetupWizard(opts = {}) {
19
+ const prompter = opts.prompter ?? new InquirerPrompter();
20
+ const configPath = opts.configPath
21
+ ?? process.env.REEBOOT_CONFIG_PATH
22
+ ?? join(homedir(), '.reeboot', 'config.json');
23
+ const configDir = opts.configDir ?? join(homedir(), '.reeboot');
24
+ console.log('\n🚀 Welcome to Reeboot Setup Wizard\n');
25
+ console.log(' We\'ll guide you through setting up your AI agent in 4 steps.\n');
26
+ // ── Step 1: Provider ──────────────────────────────────────────────────────
27
+ const { runProviderStep } = await import('./steps/provider.js');
28
+ const providerResult = await runProviderStep({ prompter, configDir });
29
+ // ── Step 2: Agent name ────────────────────────────────────────────────────
30
+ const { runNameStep } = await import('./steps/name.js');
31
+ const agentName = await runNameStep({ prompter });
32
+ // ── Step 3: Channels ──────────────────────────────────────────────────────
33
+ const { runChannelsStep } = await import('./steps/channels.js');
34
+ const channelsResult = await runChannelsStep({ prompter, configDir });
35
+ // ── Step 3b: Web search ───────────────────────────────────────────────────
36
+ const { runWebSearchStep } = await import('./steps/web-search.js');
37
+ const searchResult = await runWebSearchStep({ prompter });
38
+ // ── Step 4: Launch (writes config here) ──────────────────────────────────
39
+ const { runLaunchStep } = await import('./steps/launch.js');
40
+ await runLaunchStep({
41
+ prompter,
42
+ configPath,
43
+ draft: {
44
+ provider: providerResult.provider,
45
+ modelId: providerResult.modelId,
46
+ apiKey: providerResult.apiKey,
47
+ ollamaBaseUrl: providerResult.ollamaBaseUrl,
48
+ agentName,
49
+ whatsapp: channelsResult.whatsapp,
50
+ signal: channelsResult.signal,
51
+ signalPhone: channelsResult.signalPhone,
52
+ searchProvider: searchResult.provider,
53
+ searchApiKey: searchResult.apiKey,
54
+ searxngBaseUrl: searchResult.searxngBaseUrl,
55
+ },
56
+ });
57
+ // ── Scaffold directories and templates ────────────────────────────────────
58
+ const { runWizard } = await import('../setup-wizard.js');
59
+ // Scaffold only (non-interactive, using existing configDir)
60
+ // We call scaffoldOnly to avoid double-writing config
61
+ await scaffoldSetup(configDir);
62
+ }
63
+ // ─── scaffoldSetup ────────────────────────────────────────────────────────────
64
+ async function scaffoldSetup(configDir) {
65
+ const { mkdirSync, existsSync, copyFileSync } = await import('fs');
66
+ const { join } = await import('path');
67
+ const { dirname } = await import('path');
68
+ const { fileURLToPath } = await import('url');
69
+ const dirs = [
70
+ join(configDir, 'contexts', 'global'),
71
+ join(configDir, 'contexts', 'main', 'workspace'),
72
+ join(configDir, 'contexts', 'main', '.pi', 'extensions'),
73
+ join(configDir, 'contexts', 'main', '.pi', 'skills'),
74
+ join(configDir, 'channels'),
75
+ join(configDir, 'sessions', 'main'),
76
+ ];
77
+ for (const dir of dirs) {
78
+ mkdirSync(dir, { recursive: true });
79
+ }
80
+ // Copy templates
81
+ // __dirname is not available in ESM directly, use fileURLToPath
82
+ const thisDir = dirname(fileURLToPath(import.meta.url));
83
+ const templatesDir = join(thisDir, '..', '..', 'templates');
84
+ const copies = [
85
+ {
86
+ src: join(templatesDir, 'global-agents.md'),
87
+ dest: join(configDir, 'contexts', 'global', 'AGENTS.md'),
88
+ },
89
+ {
90
+ src: join(templatesDir, 'main-agents.md'),
91
+ dest: join(configDir, 'contexts', 'main', 'AGENTS.md'),
92
+ },
93
+ ];
94
+ for (const { src, dest } of copies) {
95
+ if (existsSync(dest))
96
+ continue;
97
+ if (existsSync(src))
98
+ copyFileSync(src, dest);
99
+ }
100
+ }
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface SelectOptions {
2
+ message: string;
3
+ choices: Array<{
4
+ name: string;
5
+ value: string;
6
+ }>;
7
+ default?: string;
8
+ }
9
+ export interface InputOptions {
10
+ message: string;
11
+ default?: string;
12
+ validate?: (val: string) => true | string;
13
+ }
14
+ export interface PasswordOptions {
15
+ message: string;
16
+ validate?: (val: string) => true | string;
17
+ }
18
+ export interface CheckboxOptions {
19
+ message: string;
20
+ choices: Array<{
21
+ name: string;
22
+ value: string;
23
+ checked?: boolean;
24
+ }>;
25
+ }
26
+ export interface ConfirmOptions {
27
+ message: string;
28
+ default?: boolean;
29
+ }
30
+ export interface Prompter {
31
+ select(opts: SelectOptions): Promise<string>;
32
+ input(opts: InputOptions): Promise<string>;
33
+ password(opts: PasswordOptions): Promise<string>;
34
+ checkbox(opts: CheckboxOptions): Promise<string[]>;
35
+ confirm(opts: ConfirmOptions): Promise<boolean>;
36
+ }
37
+ /**
38
+ * Production prompter backed by inquirer.
39
+ * Lazy-loads inquirer so tests that inject FakePrompter never import it.
40
+ */
41
+ export declare class InquirerPrompter implements Prompter {
42
+ select(opts: SelectOptions): Promise<string>;
43
+ input(opts: InputOptions): Promise<string>;
44
+ password(opts: PasswordOptions): Promise<string>;
45
+ checkbox(opts: CheckboxOptions): Promise<string[]>;
46
+ confirm(opts: ConfirmOptions): Promise<boolean>;
47
+ }
48
+ //# sourceMappingURL=prompter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.d.ts","sourceRoot":"","sources":["../../src/wizard/prompter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAA;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAA;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACnE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAChD;AAID;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IACzC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAY5C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1C,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWlD,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAUtD"}
@@ -0,0 +1,62 @@
1
+ // ─── Prompter Interface ───────────────────────────────────────────────────────
2
+ // ─── InquirerPrompter ─────────────────────────────────────────────────────────
3
+ /**
4
+ * Production prompter backed by inquirer.
5
+ * Lazy-loads inquirer so tests that inject FakePrompter never import it.
6
+ */
7
+ export class InquirerPrompter {
8
+ async select(opts) {
9
+ const { default: inquirer } = await import('inquirer');
10
+ const { answer } = await inquirer.prompt([{
11
+ type: 'list',
12
+ name: 'answer',
13
+ message: opts.message,
14
+ choices: opts.choices,
15
+ default: opts.default,
16
+ }]);
17
+ return answer;
18
+ }
19
+ async input(opts) {
20
+ const { default: inquirer } = await import('inquirer');
21
+ const { answer } = await inquirer.prompt([{
22
+ type: 'input',
23
+ name: 'answer',
24
+ message: opts.message,
25
+ default: opts.default,
26
+ validate: opts.validate,
27
+ }]);
28
+ return answer;
29
+ }
30
+ async password(opts) {
31
+ const { default: inquirer } = await import('inquirer');
32
+ const { answer } = await inquirer.prompt([{
33
+ type: 'password',
34
+ name: 'answer',
35
+ message: opts.message,
36
+ mask: '*',
37
+ validate: opts.validate,
38
+ }]);
39
+ return answer;
40
+ }
41
+ async checkbox(opts) {
42
+ const { default: inquirer } = await import('inquirer');
43
+ const { answer } = await inquirer.prompt([{
44
+ type: 'checkbox',
45
+ name: 'answer',
46
+ message: opts.message,
47
+ choices: opts.choices,
48
+ }]);
49
+ return answer;
50
+ }
51
+ async confirm(opts) {
52
+ const { default: inquirer } = await import('inquirer');
53
+ const { answer } = await inquirer.prompt([{
54
+ type: 'confirm',
55
+ name: 'answer',
56
+ message: opts.message,
57
+ default: opts.default,
58
+ }]);
59
+ return answer;
60
+ }
61
+ }
62
+ //# sourceMappingURL=prompter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.js","sourceRoot":"","sources":["../../src/wizard/prompter.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAqCjF,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAC3B,KAAK,CAAC,MAAM,CAAC,IAAmB;QAC9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC,CAAA;QACH,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC,CAAA;QACH,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAqB;QAClC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC,CAAA;QACH,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAqB;QAClC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC,CAAA;QACH,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC,CAAA;QACH,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { Prompter } from '../prompter.js';
2
+ import { checkDockerStatus } from '../../utils/docker.js';
3
+ import { linkWhatsAppDevice } from '../../channels/whatsapp.js';
4
+ import { linkSignalDevice } from '../../channels/signal.js';
5
+ export interface ChannelsStepResult {
6
+ whatsapp: boolean;
7
+ signal: boolean;
8
+ signalPhone?: string;
9
+ }
10
+ export interface ChannelsStepDeps {
11
+ linkWhatsApp?: typeof linkWhatsAppDevice;
12
+ linkSignal?: typeof linkSignalDevice;
13
+ checkDocker?: typeof checkDockerStatus;
14
+ }
15
+ export declare function runChannelsStep(opts: {
16
+ prompter: Prompter;
17
+ configDir?: string;
18
+ _deps?: ChannelsStepDeps;
19
+ }): Promise<ChannelsStepResult>;
20
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/channels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAI3D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,kBAAkB,CAAA;IACxC,UAAU,CAAC,EAAE,OAAO,gBAAgB,CAAA;IACpC,WAAW,CAAC,EAAE,OAAO,iBAAiB,CAAA;CACvC;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4C9B"}