reeboot 1.0.0 → 1.3.1
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/README.md +218 -7
- 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 +51 -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/extensions/scheduler-tool.ts +360 -8
- package/extensions/skill-manager.ts +421 -0
- package/extensions/web-search.ts +466 -0
- package/package.json +5 -3
- package/skills/docker/SKILL.md +131 -0
- package/skills/files/SKILL.md +94 -0
- package/skills/gcal/SKILL.md +69 -0
- package/skills/gdrive/SKILL.md +65 -0
- package/skills/github/SKILL.md +80 -0
- package/skills/gmail/SKILL.md +68 -0
- package/skills/hubspot/SKILL.md +77 -0
- package/skills/linear/SKILL.md +78 -0
- package/skills/notion/SKILL.md +85 -0
- package/skills/postgres/SKILL.md +75 -0
- package/skills/reeboot-tasks/SKILL.md +98 -0
- package/skills/send-message/SKILL.md +52 -14
- package/skills/slack/SKILL.md +74 -0
- package/skills/sqlite/SKILL.md +85 -0
- package/skills/web-research/SKILL.md +47 -0
- package/templates/models-ollama.json +16 -0
- package/skills/web-search/SKILL.md +0 -32
|
@@ -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"}
|
|
@@ -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"}
|