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.
- package/dist/channels/signal.d.ts +13 -0
- package/dist/channels/signal.d.ts.map +1 -1
- package/dist/channels/signal.js +54 -0
- package/dist/channels/signal.js.map +1 -1
- package/dist/channels/whatsapp.d.ts +14 -0
- package/dist/channels/whatsapp.d.ts.map +1 -1
- package/dist/channels/whatsapp.js +64 -0
- package/dist/channels/whatsapp.js.map +1 -1
- package/dist/config.d.ts +112 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -1
- package/dist/db/schema.d.ts +96 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +69 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/extensions/loader.d.ts.map +1 -1
- package/dist/extensions/loader.js +16 -0
- package/dist/extensions/loader.js.map +1 -1
- package/dist/index.d.ts +30 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +132 -7
- package/dist/index.js.map +1 -1
- package/dist/orchestrator.d.ts +7 -0
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +30 -0
- package/dist/orchestrator.js.map +1 -1
- package/dist/scheduler/heartbeat.d.ts +27 -0
- package/dist/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/scheduler/heartbeat.js +74 -0
- package/dist/scheduler/heartbeat.js.map +1 -0
- package/dist/scheduler/parse.d.ts +42 -0
- package/dist/scheduler/parse.d.ts.map +1 -0
- package/dist/scheduler/parse.js +119 -0
- package/dist/scheduler/parse.js.map +1 -0
- package/dist/scheduler-registry.d.ts +7 -3
- package/dist/scheduler-registry.d.ts.map +1 -1
- package/dist/scheduler-registry.js +3 -0
- package/dist/scheduler-registry.js.map +1 -1
- package/dist/scheduler.d.ts +71 -15
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +304 -64
- package/dist/scheduler.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +18 -4
- package/dist/server.js.map +1 -1
- package/dist/setup-wizard.d.ts +5 -0
- package/dist/setup-wizard.d.ts.map +1 -1
- package/dist/setup-wizard.js +23 -69
- package/dist/setup-wizard.js.map +1 -1
- package/dist/skills-cli.d.ts +22 -0
- package/dist/skills-cli.d.ts.map +1 -0
- package/dist/skills-cli.js +56 -0
- package/dist/skills-cli.js.map +1 -0
- package/dist/utils/atomic-config.d.ts +7 -0
- package/dist/utils/atomic-config.d.ts.map +1 -0
- package/dist/utils/atomic-config.js +10 -0
- package/dist/utils/atomic-config.js.map +1 -0
- package/dist/utils/docker.d.ts +10 -0
- package/dist/utils/docker.d.ts.map +1 -0
- package/dist/utils/docker.js +27 -0
- package/dist/utils/docker.js.map +1 -0
- package/dist/wizard/index.d.ts +21 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +101 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/prompter.d.ts +48 -0
- package/dist/wizard/prompter.d.ts.map +1 -0
- package/dist/wizard/prompter.js +62 -0
- package/dist/wizard/prompter.js.map +1 -0
- package/dist/wizard/steps/channels.d.ts +20 -0
- package/dist/wizard/steps/channels.d.ts.map +1 -0
- package/dist/wizard/steps/channels.js +215 -0
- package/dist/wizard/steps/channels.js.map +1 -0
- package/dist/wizard/steps/launch.d.ts +20 -0
- package/dist/wizard/steps/launch.d.ts.map +1 -0
- package/dist/wizard/steps/launch.js +82 -0
- package/dist/wizard/steps/launch.js.map +1 -0
- package/dist/wizard/steps/name.d.ts +9 -0
- package/dist/wizard/steps/name.d.ts.map +1 -0
- package/dist/wizard/steps/name.js +16 -0
- package/dist/wizard/steps/name.js.map +1 -0
- package/dist/wizard/steps/provider.d.ts +22 -0
- package/dist/wizard/steps/provider.d.ts.map +1 -0
- package/dist/wizard/steps/provider.js +134 -0
- package/dist/wizard/steps/provider.js.map +1 -0
- package/dist/wizard/steps/web-search.d.ts +10 -0
- package/dist/wizard/steps/web-search.d.ts.map +1 -0
- package/dist/wizard/steps/web-search.js +84 -0
- package/dist/wizard/steps/web-search.js.map +1 -0
- package/package.json +1 -1
package/dist/setup-wizard.js
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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 = [
|
package/dist/setup-wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,
|
|
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"}
|