reeboot 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +361 -0
  2. package/container/Dockerfile +48 -0
  3. package/container/entrypoint.sh +8 -0
  4. package/dist/agent-runner/index.d.ts +9 -0
  5. package/dist/agent-runner/index.d.ts.map +1 -0
  6. package/dist/agent-runner/index.js +21 -0
  7. package/dist/agent-runner/index.js.map +1 -0
  8. package/dist/agent-runner/interface.d.ts +56 -0
  9. package/dist/agent-runner/interface.d.ts.map +1 -0
  10. package/dist/agent-runner/interface.js +5 -0
  11. package/dist/agent-runner/interface.js.map +1 -0
  12. package/dist/agent-runner/pi-runner.d.ts +41 -0
  13. package/dist/agent-runner/pi-runner.d.ts.map +1 -0
  14. package/dist/agent-runner/pi-runner.js +162 -0
  15. package/dist/agent-runner/pi-runner.js.map +1 -0
  16. package/dist/channels/interface.d.ts +63 -0
  17. package/dist/channels/interface.d.ts.map +1 -0
  18. package/dist/channels/interface.js +33 -0
  19. package/dist/channels/interface.js.map +1 -0
  20. package/dist/channels/registry.d.ts +30 -0
  21. package/dist/channels/registry.d.ts.map +1 -0
  22. package/dist/channels/registry.js +71 -0
  23. package/dist/channels/registry.js.map +1 -0
  24. package/dist/channels/signal.d.ts +51 -0
  25. package/dist/channels/signal.d.ts.map +1 -0
  26. package/dist/channels/signal.js +263 -0
  27. package/dist/channels/signal.js.map +1 -0
  28. package/dist/channels/web.d.ts +35 -0
  29. package/dist/channels/web.d.ts.map +1 -0
  30. package/dist/channels/web.js +65 -0
  31. package/dist/channels/web.js.map +1 -0
  32. package/dist/channels/whatsapp.d.ts +25 -0
  33. package/dist/channels/whatsapp.d.ts.map +1 -0
  34. package/dist/channels/whatsapp.js +150 -0
  35. package/dist/channels/whatsapp.js.map +1 -0
  36. package/dist/config.d.ts +366 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +140 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/context.d.ts +69 -0
  41. package/dist/context.d.ts.map +1 -0
  42. package/dist/context.js +166 -0
  43. package/dist/context.js.map +1 -0
  44. package/dist/credential-proxy.d.ts +25 -0
  45. package/dist/credential-proxy.d.ts.map +1 -0
  46. package/dist/credential-proxy.js +96 -0
  47. package/dist/credential-proxy.js.map +1 -0
  48. package/dist/daemon.d.ts +25 -0
  49. package/dist/daemon.d.ts.map +1 -0
  50. package/dist/daemon.js +138 -0
  51. package/dist/daemon.js.map +1 -0
  52. package/dist/db/index.d.ts +23 -0
  53. package/dist/db/index.d.ts.map +1 -0
  54. package/dist/db/index.js +113 -0
  55. package/dist/db/index.js.map +1 -0
  56. package/dist/db/schema.d.ts +408 -0
  57. package/dist/db/schema.d.ts.map +1 -0
  58. package/dist/db/schema.js +55 -0
  59. package/dist/db/schema.js.map +1 -0
  60. package/dist/doctor.d.ts +23 -0
  61. package/dist/doctor.d.ts.map +1 -0
  62. package/dist/doctor.js +217 -0
  63. package/dist/doctor.js.map +1 -0
  64. package/dist/extensions/loader.d.ts +19 -0
  65. package/dist/extensions/loader.d.ts.map +1 -0
  66. package/dist/extensions/loader.js +124 -0
  67. package/dist/extensions/loader.js.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +561 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/orchestrator.d.ts +60 -0
  73. package/dist/orchestrator.d.ts.map +1 -0
  74. package/dist/orchestrator.js +313 -0
  75. package/dist/orchestrator.js.map +1 -0
  76. package/dist/packages.d.ts +21 -0
  77. package/dist/packages.d.ts.map +1 -0
  78. package/dist/packages.js +116 -0
  79. package/dist/packages.js.map +1 -0
  80. package/dist/scheduler-registry.d.ts +8 -0
  81. package/dist/scheduler-registry.d.ts.map +1 -0
  82. package/dist/scheduler-registry.js +14 -0
  83. package/dist/scheduler-registry.js.map +1 -0
  84. package/dist/scheduler.d.ts +60 -0
  85. package/dist/scheduler.d.ts.map +1 -0
  86. package/dist/scheduler.js +143 -0
  87. package/dist/scheduler.js.map +1 -0
  88. package/dist/server.d.ts +18 -0
  89. package/dist/server.d.ts.map +1 -0
  90. package/dist/server.js +489 -0
  91. package/dist/server.js.map +1 -0
  92. package/dist/setup-wizard.d.ts +12 -0
  93. package/dist/setup-wizard.d.ts.map +1 -0
  94. package/dist/setup-wizard.js +163 -0
  95. package/dist/setup-wizard.js.map +1 -0
  96. package/extensions/confirm-destructive.ts +59 -0
  97. package/extensions/custom-compaction.ts +114 -0
  98. package/extensions/protected-paths.ts +30 -0
  99. package/extensions/sandbox/index.ts +317 -0
  100. package/extensions/sandbox/package-lock.json +92 -0
  101. package/extensions/sandbox/package.json +19 -0
  102. package/extensions/scheduler-tool.ts +65 -0
  103. package/extensions/session-name.ts +27 -0
  104. package/extensions/token-meter.ts +55 -0
  105. package/package.json +68 -0
  106. package/skills/send-message/SKILL.md +27 -0
  107. package/skills/web-search/SKILL.md +32 -0
  108. package/templates/global-agents.md +23 -0
  109. package/templates/main-agents.md +28 -0
  110. package/webchat/index.html +421 -0
@@ -0,0 +1,366 @@
1
+ import { z } from 'zod';
2
+ export declare const ConfigSchema: z.ZodObject<{
3
+ agent: z.ZodDefault<z.ZodObject<{
4
+ name: z.ZodDefault<z.ZodString>;
5
+ runner: z.ZodDefault<z.ZodString>;
6
+ model: z.ZodDefault<z.ZodObject<{
7
+ provider: z.ZodDefault<z.ZodString>;
8
+ id: z.ZodDefault<z.ZodString>;
9
+ apiKey: z.ZodDefault<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ provider: string;
12
+ id: string;
13
+ apiKey: string;
14
+ }, {
15
+ provider?: string | undefined;
16
+ id?: string | undefined;
17
+ apiKey?: string | undefined;
18
+ }>>;
19
+ turnTimeout: z.ZodDefault<z.ZodNumber>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ name: string;
22
+ runner: string;
23
+ model: {
24
+ provider: string;
25
+ id: string;
26
+ apiKey: string;
27
+ };
28
+ turnTimeout: number;
29
+ }, {
30
+ name?: string | undefined;
31
+ runner?: string | undefined;
32
+ model?: {
33
+ provider?: string | undefined;
34
+ id?: string | undefined;
35
+ apiKey?: string | undefined;
36
+ } | undefined;
37
+ turnTimeout?: number | undefined;
38
+ }>>;
39
+ channels: z.ZodDefault<z.ZodObject<{
40
+ web: z.ZodDefault<z.ZodObject<{
41
+ enabled: z.ZodDefault<z.ZodBoolean>;
42
+ port: z.ZodDefault<z.ZodNumber>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ enabled: boolean;
45
+ port: number;
46
+ }, {
47
+ enabled?: boolean | undefined;
48
+ port?: number | undefined;
49
+ }>>;
50
+ whatsapp: z.ZodDefault<z.ZodObject<{
51
+ enabled: z.ZodDefault<z.ZodBoolean>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ enabled: boolean;
54
+ }, {
55
+ enabled?: boolean | undefined;
56
+ }>>;
57
+ signal: z.ZodDefault<z.ZodObject<{
58
+ enabled: z.ZodDefault<z.ZodBoolean>;
59
+ phoneNumber: z.ZodDefault<z.ZodString>;
60
+ apiPort: z.ZodDefault<z.ZodNumber>;
61
+ pollInterval: z.ZodDefault<z.ZodNumber>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ enabled: boolean;
64
+ phoneNumber: string;
65
+ apiPort: number;
66
+ pollInterval: number;
67
+ }, {
68
+ enabled?: boolean | undefined;
69
+ phoneNumber?: string | undefined;
70
+ apiPort?: number | undefined;
71
+ pollInterval?: number | undefined;
72
+ }>>;
73
+ }, "strip", z.ZodTypeAny, {
74
+ web: {
75
+ enabled: boolean;
76
+ port: number;
77
+ };
78
+ whatsapp: {
79
+ enabled: boolean;
80
+ };
81
+ signal: {
82
+ enabled: boolean;
83
+ phoneNumber: string;
84
+ apiPort: number;
85
+ pollInterval: number;
86
+ };
87
+ }, {
88
+ web?: {
89
+ enabled?: boolean | undefined;
90
+ port?: number | undefined;
91
+ } | undefined;
92
+ whatsapp?: {
93
+ enabled?: boolean | undefined;
94
+ } | undefined;
95
+ signal?: {
96
+ enabled?: boolean | undefined;
97
+ phoneNumber?: string | undefined;
98
+ apiPort?: number | undefined;
99
+ pollInterval?: number | undefined;
100
+ } | undefined;
101
+ }>>;
102
+ sandbox: z.ZodDefault<z.ZodObject<{
103
+ mode: z.ZodDefault<z.ZodEnum<["os", "docker"]>>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ mode: "os" | "docker";
106
+ }, {
107
+ mode?: "os" | "docker" | undefined;
108
+ }>>;
109
+ logging: z.ZodDefault<z.ZodObject<{
110
+ level: z.ZodDefault<z.ZodEnum<["trace", "debug", "info", "warn", "error", "fatal"]>>;
111
+ }, "strip", z.ZodTypeAny, {
112
+ level: "trace" | "debug" | "info" | "warn" | "error" | "fatal";
113
+ }, {
114
+ level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal" | undefined;
115
+ }>>;
116
+ server: z.ZodDefault<z.ZodObject<{
117
+ token: z.ZodOptional<z.ZodString>;
118
+ }, "strip", z.ZodTypeAny, {
119
+ token?: string | undefined;
120
+ }, {
121
+ token?: string | undefined;
122
+ }>>;
123
+ extensions: z.ZodDefault<z.ZodObject<{
124
+ core: z.ZodDefault<z.ZodObject<{
125
+ sandbox: z.ZodDefault<z.ZodBoolean>;
126
+ confirm_destructive: z.ZodDefault<z.ZodBoolean>;
127
+ protected_paths: z.ZodDefault<z.ZodBoolean>;
128
+ git_checkpoint: z.ZodDefault<z.ZodBoolean>;
129
+ session_name: z.ZodDefault<z.ZodBoolean>;
130
+ custom_compaction: z.ZodDefault<z.ZodBoolean>;
131
+ scheduler_tool: z.ZodDefault<z.ZodBoolean>;
132
+ token_meter: z.ZodDefault<z.ZodBoolean>;
133
+ }, "strip", z.ZodTypeAny, {
134
+ sandbox: boolean;
135
+ confirm_destructive: boolean;
136
+ protected_paths: boolean;
137
+ git_checkpoint: boolean;
138
+ session_name: boolean;
139
+ custom_compaction: boolean;
140
+ scheduler_tool: boolean;
141
+ token_meter: boolean;
142
+ }, {
143
+ sandbox?: boolean | undefined;
144
+ confirm_destructive?: boolean | undefined;
145
+ protected_paths?: boolean | undefined;
146
+ git_checkpoint?: boolean | undefined;
147
+ session_name?: boolean | undefined;
148
+ custom_compaction?: boolean | undefined;
149
+ scheduler_tool?: boolean | undefined;
150
+ token_meter?: boolean | undefined;
151
+ }>>;
152
+ }, "strip", z.ZodTypeAny, {
153
+ core: {
154
+ sandbox: boolean;
155
+ confirm_destructive: boolean;
156
+ protected_paths: boolean;
157
+ git_checkpoint: boolean;
158
+ session_name: boolean;
159
+ custom_compaction: boolean;
160
+ scheduler_tool: boolean;
161
+ token_meter: boolean;
162
+ };
163
+ }, {
164
+ core?: {
165
+ sandbox?: boolean | undefined;
166
+ confirm_destructive?: boolean | undefined;
167
+ protected_paths?: boolean | undefined;
168
+ git_checkpoint?: boolean | undefined;
169
+ session_name?: boolean | undefined;
170
+ custom_compaction?: boolean | undefined;
171
+ scheduler_tool?: boolean | undefined;
172
+ token_meter?: boolean | undefined;
173
+ } | undefined;
174
+ }>>;
175
+ routing: z.ZodDefault<z.ZodObject<{
176
+ default: z.ZodDefault<z.ZodString>;
177
+ rules: z.ZodDefault<z.ZodArray<z.ZodUnion<[z.ZodObject<{
178
+ peer: z.ZodString;
179
+ context: z.ZodString;
180
+ }, "strip", z.ZodTypeAny, {
181
+ peer: string;
182
+ context: string;
183
+ }, {
184
+ peer: string;
185
+ context: string;
186
+ }>, z.ZodObject<{
187
+ channel: z.ZodString;
188
+ context: z.ZodString;
189
+ }, "strip", z.ZodTypeAny, {
190
+ context: string;
191
+ channel: string;
192
+ }, {
193
+ context: string;
194
+ channel: string;
195
+ }>]>, "many">>;
196
+ }, "strip", z.ZodTypeAny, {
197
+ default: string;
198
+ rules: ({
199
+ peer: string;
200
+ context: string;
201
+ } | {
202
+ context: string;
203
+ channel: string;
204
+ })[];
205
+ }, {
206
+ default?: string | undefined;
207
+ rules?: ({
208
+ peer: string;
209
+ context: string;
210
+ } | {
211
+ context: string;
212
+ channel: string;
213
+ })[] | undefined;
214
+ }>>;
215
+ session: z.ZodDefault<z.ZodObject<{
216
+ inactivityTimeout: z.ZodDefault<z.ZodNumber>;
217
+ }, "strip", z.ZodTypeAny, {
218
+ inactivityTimeout: number;
219
+ }, {
220
+ inactivityTimeout?: number | undefined;
221
+ }>>;
222
+ credentialProxy: z.ZodDefault<z.ZodObject<{
223
+ enabled: z.ZodDefault<z.ZodBoolean>;
224
+ port: z.ZodDefault<z.ZodNumber>;
225
+ }, "strip", z.ZodTypeAny, {
226
+ enabled: boolean;
227
+ port: number;
228
+ }, {
229
+ enabled?: boolean | undefined;
230
+ port?: number | undefined;
231
+ }>>;
232
+ }, "strip", z.ZodTypeAny, {
233
+ sandbox: {
234
+ mode: "os" | "docker";
235
+ };
236
+ agent: {
237
+ name: string;
238
+ runner: string;
239
+ model: {
240
+ provider: string;
241
+ id: string;
242
+ apiKey: string;
243
+ };
244
+ turnTimeout: number;
245
+ };
246
+ channels: {
247
+ web: {
248
+ enabled: boolean;
249
+ port: number;
250
+ };
251
+ whatsapp: {
252
+ enabled: boolean;
253
+ };
254
+ signal: {
255
+ enabled: boolean;
256
+ phoneNumber: string;
257
+ apiPort: number;
258
+ pollInterval: number;
259
+ };
260
+ };
261
+ logging: {
262
+ level: "trace" | "debug" | "info" | "warn" | "error" | "fatal";
263
+ };
264
+ server: {
265
+ token?: string | undefined;
266
+ };
267
+ extensions: {
268
+ core: {
269
+ sandbox: boolean;
270
+ confirm_destructive: boolean;
271
+ protected_paths: boolean;
272
+ git_checkpoint: boolean;
273
+ session_name: boolean;
274
+ custom_compaction: boolean;
275
+ scheduler_tool: boolean;
276
+ token_meter: boolean;
277
+ };
278
+ };
279
+ routing: {
280
+ default: string;
281
+ rules: ({
282
+ peer: string;
283
+ context: string;
284
+ } | {
285
+ context: string;
286
+ channel: string;
287
+ })[];
288
+ };
289
+ session: {
290
+ inactivityTimeout: number;
291
+ };
292
+ credentialProxy: {
293
+ enabled: boolean;
294
+ port: number;
295
+ };
296
+ }, {
297
+ sandbox?: {
298
+ mode?: "os" | "docker" | undefined;
299
+ } | undefined;
300
+ agent?: {
301
+ name?: string | undefined;
302
+ runner?: string | undefined;
303
+ model?: {
304
+ provider?: string | undefined;
305
+ id?: string | undefined;
306
+ apiKey?: string | undefined;
307
+ } | undefined;
308
+ turnTimeout?: number | undefined;
309
+ } | undefined;
310
+ channels?: {
311
+ web?: {
312
+ enabled?: boolean | undefined;
313
+ port?: number | undefined;
314
+ } | undefined;
315
+ whatsapp?: {
316
+ enabled?: boolean | undefined;
317
+ } | undefined;
318
+ signal?: {
319
+ enabled?: boolean | undefined;
320
+ phoneNumber?: string | undefined;
321
+ apiPort?: number | undefined;
322
+ pollInterval?: number | undefined;
323
+ } | undefined;
324
+ } | undefined;
325
+ logging?: {
326
+ level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal" | undefined;
327
+ } | undefined;
328
+ server?: {
329
+ token?: string | undefined;
330
+ } | undefined;
331
+ extensions?: {
332
+ core?: {
333
+ sandbox?: boolean | undefined;
334
+ confirm_destructive?: boolean | undefined;
335
+ protected_paths?: boolean | undefined;
336
+ git_checkpoint?: boolean | undefined;
337
+ session_name?: boolean | undefined;
338
+ custom_compaction?: boolean | undefined;
339
+ scheduler_tool?: boolean | undefined;
340
+ token_meter?: boolean | undefined;
341
+ } | undefined;
342
+ } | undefined;
343
+ routing?: {
344
+ default?: string | undefined;
345
+ rules?: ({
346
+ peer: string;
347
+ context: string;
348
+ } | {
349
+ context: string;
350
+ channel: string;
351
+ })[] | undefined;
352
+ } | undefined;
353
+ session?: {
354
+ inactivityTimeout?: number | undefined;
355
+ } | undefined;
356
+ credentialProxy?: {
357
+ enabled?: boolean | undefined;
358
+ port?: number | undefined;
359
+ } | undefined;
360
+ }>;
361
+ export type Config = z.infer<typeof ConfigSchema>;
362
+ export declare const defaultConfig: Config;
363
+ export declare function getDefaultConfigPath(): string;
364
+ export declare function loadConfig(configPath?: string): Config;
365
+ export declare function saveConfig(config: Config, configPath?: string): void;
366
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqFxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD,eAAO,MAAM,aAAa,EAAE,MAA+B,CAAC;AAI5D,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAID,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAyCtD;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAepE"}
package/dist/config.js ADDED
@@ -0,0 +1,140 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { homedir } from 'os';
4
+ import { z } from 'zod';
5
+ // ─── Schema ──────────────────────────────────────────────────────────────────
6
+ const ModelConfigSchema = z.object({
7
+ provider: z.string().default(''),
8
+ id: z.string().default(''),
9
+ apiKey: z.string().default(''),
10
+ });
11
+ const AgentConfigSchema = z.object({
12
+ name: z.string().default('Reeboot'),
13
+ runner: z.string().default('pi'),
14
+ model: ModelConfigSchema.default({}),
15
+ turnTimeout: z.number().int().default(300_000), // 5 min
16
+ });
17
+ const ExtensionsCoreConfigSchema = z.object({
18
+ sandbox: z.boolean().default(true),
19
+ confirm_destructive: z.boolean().default(true),
20
+ protected_paths: z.boolean().default(true),
21
+ git_checkpoint: z.boolean().default(false),
22
+ session_name: z.boolean().default(true),
23
+ custom_compaction: z.boolean().default(true),
24
+ scheduler_tool: z.boolean().default(true),
25
+ token_meter: z.boolean().default(true),
26
+ });
27
+ const ExtensionsConfigSchema = z.object({
28
+ core: ExtensionsCoreConfigSchema.default({}),
29
+ });
30
+ const WebChannelSchema = z.object({
31
+ enabled: z.boolean().default(true),
32
+ port: z.number().int().default(3000),
33
+ });
34
+ const WhatsAppChannelSchema = z.object({
35
+ enabled: z.boolean().default(false),
36
+ });
37
+ const SignalChannelSchema = z.object({
38
+ enabled: z.boolean().default(false),
39
+ phoneNumber: z.string().default(''),
40
+ apiPort: z.number().int().default(8080),
41
+ pollInterval: z.number().int().default(1000),
42
+ });
43
+ const ChannelsConfigSchema = z.object({
44
+ web: WebChannelSchema.default({}),
45
+ whatsapp: WhatsAppChannelSchema.default({}),
46
+ signal: SignalChannelSchema.default({}),
47
+ });
48
+ const SandboxConfigSchema = z.object({
49
+ mode: z.enum(['os', 'docker']).default('os'),
50
+ });
51
+ const LoggingConfigSchema = z.object({
52
+ level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'),
53
+ });
54
+ const ServerConfigSchema = z.object({
55
+ token: z.string().optional(),
56
+ });
57
+ const RoutingRuleSchema = z.union([
58
+ z.object({ peer: z.string(), context: z.string() }),
59
+ z.object({ channel: z.string(), context: z.string() }),
60
+ ]);
61
+ const RoutingConfigSchema = z.object({
62
+ default: z.string().default('main'),
63
+ rules: z.array(RoutingRuleSchema).default([]),
64
+ });
65
+ const SessionConfigSchema = z.object({
66
+ inactivityTimeout: z.number().int().default(14_400_000), // 4 hours
67
+ });
68
+ const CredentialProxyConfigSchema = z.object({
69
+ enabled: z.boolean().default(false),
70
+ port: z.number().int().default(3001),
71
+ });
72
+ export const ConfigSchema = z.object({
73
+ agent: AgentConfigSchema.default({}),
74
+ channels: ChannelsConfigSchema.default({}),
75
+ sandbox: SandboxConfigSchema.default({}),
76
+ logging: LoggingConfigSchema.default({}),
77
+ server: ServerConfigSchema.default({}),
78
+ extensions: ExtensionsConfigSchema.default({}),
79
+ routing: RoutingConfigSchema.default({}),
80
+ session: SessionConfigSchema.default({}),
81
+ credentialProxy: CredentialProxyConfigSchema.default({}),
82
+ });
83
+ // ─── Defaults ────────────────────────────────────────────────────────────────
84
+ export const defaultConfig = ConfigSchema.parse({});
85
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
86
+ export function getDefaultConfigPath() {
87
+ return join(homedir(), '.reeboot', 'config.json');
88
+ }
89
+ // ─── loadConfig ──────────────────────────────────────────────────────────────
90
+ export function loadConfig(configPath) {
91
+ const path = configPath ?? getDefaultConfigPath();
92
+ let raw = {};
93
+ if (existsSync(path)) {
94
+ let text;
95
+ try {
96
+ text = readFileSync(path, 'utf-8');
97
+ }
98
+ catch (err) {
99
+ throw new Error(`Failed to parse config: ${err}`);
100
+ }
101
+ try {
102
+ raw = JSON.parse(text);
103
+ }
104
+ catch (err) {
105
+ throw new Error(`Failed to parse config: ${err}`);
106
+ }
107
+ }
108
+ // Parse with Zod (throws ZodError on schema violation, which includes field path)
109
+ const result = ConfigSchema.parse(raw);
110
+ // Apply environment variable overrides
111
+ if (process.env.REEBOOT_PORT) {
112
+ const port = parseInt(process.env.REEBOOT_PORT, 10);
113
+ if (!isNaN(port)) {
114
+ result.channels.web.port = port;
115
+ }
116
+ }
117
+ if (process.env.REEBOOT_LOG_LEVEL) {
118
+ const level = process.env.REEBOOT_LOG_LEVEL;
119
+ result.logging.level = level;
120
+ }
121
+ if (process.env.REEBOOT_API_TOKEN) {
122
+ result.server.token = process.env.REEBOOT_API_TOKEN;
123
+ }
124
+ return result;
125
+ }
126
+ // ─── saveConfig ──────────────────────────────────────────────────────────────
127
+ export function saveConfig(config, configPath) {
128
+ const path = configPath ?? getDefaultConfigPath();
129
+ // Validate before writing
130
+ ConfigSchema.parse(config);
131
+ // Ensure directory exists
132
+ mkdirSync(dirname(path), { recursive: true });
133
+ // Atomic write: write to a temp file in the same directory then rename.
134
+ // Using the same directory avoids EXDEV (cross-device rename) errors that
135
+ // occur in Docker when /tmp is on a different filesystem than the config dir.
136
+ const tmpFile = join(dirname(path), `.reeboot-config-${Date.now()}.json.tmp`);
137
+ writeFileSync(tmpFile, JSON.stringify(config, null, 2), 'utf-8');
138
+ renameSync(tmpFile, path);
139
+ }
140
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Context system
3
+ *
4
+ * Manages context workspace directories, AGENTS.md files, session file paths,
5
+ * and context/session metadata in SQLite.
6
+ *
7
+ * ~/.reeboot/
8
+ * contexts/
9
+ * global/
10
+ * AGENTS.md — prepended to every context's system prompt
11
+ * <contextId>/
12
+ * workspace/ — cwd for agent (project files go here)
13
+ * .pi/extensions/ — context-local extensions
14
+ * .pi/skills/ — context-local skills
15
+ * AGENTS.md — context-specific system prompt additions
16
+ * sessions/
17
+ * <contextId>/
18
+ * session-<timestamp>-<id>.json
19
+ */
20
+ import type Database from 'better-sqlite3';
21
+ export interface ContextRow {
22
+ id: string;
23
+ name: string;
24
+ model_provider: string;
25
+ model_id: string;
26
+ status: string;
27
+ created_at: string;
28
+ }
29
+ export interface SessionInfo {
30
+ sessionId: string;
31
+ startedAt: string;
32
+ messageCount: number;
33
+ }
34
+ export declare function createContextsTable(db: Database.Database): void;
35
+ export interface CreateContextParams {
36
+ id?: string;
37
+ name: string;
38
+ modelProvider: string;
39
+ modelId: string;
40
+ }
41
+ export declare function createContext(db: Database.Database, params: CreateContextParams): ContextRow;
42
+ export declare function listContexts(db: Database.Database): ContextRow[];
43
+ export declare function getContextById(db: Database.Database, id: string): ContextRow | undefined;
44
+ /**
45
+ * Ensures the context workspace directory structure exists.
46
+ * Does NOT overwrite an existing AGENTS.md.
47
+ */
48
+ export declare function initContextWorkspace(contextId: string, reebotDir?: string): Promise<void>;
49
+ /**
50
+ * Ensures the global context exists with its AGENTS.md.
51
+ */
52
+ export declare function initGlobalContext(reebotDir?: string): Promise<void>;
53
+ /**
54
+ * Returns a deterministic-ish session file path for a context.
55
+ * The session directory is `~/.reeboot/sessions/<contextId>/`.
56
+ * The file name encodes a timestamp + random id so each invocation is unique.
57
+ */
58
+ export declare function getActiveSessionPath(contextId: string, reebotDir?: string): string;
59
+ export declare function listSessions(contextId: string, reebotDir?: string): Promise<SessionInfo[]>;
60
+ /**
61
+ * Returns the most recent session file path for a context if it was updated
62
+ * within the inactivity window; otherwise returns null (start fresh).
63
+ */
64
+ export declare function getResumedSessionPath(contextId: string, inactivityTimeoutMs: number, reebotDir?: string): string | null;
65
+ /**
66
+ * Called on startup — ensures the main context and global context exist.
67
+ */
68
+ export declare function initContexts(db: Database.Database, reebotDir?: string): Promise<void>;
69
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAW/D;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,mBAAmB,GAC1B,UAAU,CAOZ;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,EAAE,CAEhE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAExF;AAqBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,IAAI,CAAC,CASf;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAoC,GAC9C,MAAM,CAMR;AAID,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,WAAW,EAAE,CAAC,CAoBxB;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,MAAM,EAC3B,SAAS,GAAE,MAAoC,GAC9C,MAAM,GAAG,IAAI,CAiBf;AAID;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,GAAE,MAAoC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAef"}