copilot-hub 0.1.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 (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/apps/agent-engine/.env.example +41 -0
  4. package/apps/agent-engine/LICENSE +21 -0
  5. package/apps/agent-engine/README.md +57 -0
  6. package/apps/agent-engine/bot-registry.example.json +28 -0
  7. package/apps/agent-engine/capabilities/example/index.js +3 -0
  8. package/apps/agent-engine/capabilities/example/manifest.json +14 -0
  9. package/apps/agent-engine/dist/agent-worker.js +241 -0
  10. package/apps/agent-engine/dist/config.js +225 -0
  11. package/apps/agent-engine/dist/index.js +352 -0
  12. package/apps/agent-engine/dist/test/project-fingerprint.test.js +40 -0
  13. package/apps/agent-engine/dist/test/thread-id.test.js +12 -0
  14. package/apps/agent-engine/package.json +28 -0
  15. package/apps/control-plane/.env.example +25 -0
  16. package/apps/control-plane/README.md +35 -0
  17. package/apps/control-plane/bot-registry.example.json +40 -0
  18. package/apps/control-plane/capabilities/example/index.js +3 -0
  19. package/apps/control-plane/capabilities/example/manifest.json +14 -0
  20. package/apps/control-plane/dist/agent-worker.js +243 -0
  21. package/apps/control-plane/dist/channels/channel-factory.js +21 -0
  22. package/apps/control-plane/dist/channels/hub-ops-commands.js +752 -0
  23. package/apps/control-plane/dist/channels/telegram-channel.js +743 -0
  24. package/apps/control-plane/dist/channels/whatsapp-channel.js +35 -0
  25. package/apps/control-plane/dist/config.js +230 -0
  26. package/apps/control-plane/dist/copilot-hub.js +138 -0
  27. package/apps/control-plane/dist/index.js +349 -0
  28. package/apps/control-plane/dist/kernel/admin-contract.js +51 -0
  29. package/apps/control-plane/dist/test/project-fingerprint.test.js +40 -0
  30. package/apps/control-plane/dist/test/thread-id.test.js +12 -0
  31. package/apps/control-plane/package.json +27 -0
  32. package/package.json +89 -0
  33. package/packages/contracts/README.md +10 -0
  34. package/packages/contracts/dist/control-plane.d.ts +24 -0
  35. package/packages/contracts/dist/control-plane.js +37 -0
  36. package/packages/contracts/dist/control-plane.js.map +1 -0
  37. package/packages/contracts/dist/index.d.ts +1 -0
  38. package/packages/contracts/dist/index.js +2 -0
  39. package/packages/contracts/dist/index.js.map +1 -0
  40. package/packages/contracts/package.json +27 -0
  41. package/packages/core/README.md +33 -0
  42. package/packages/core/dist/agent-supervisor.d.ts +39 -0
  43. package/packages/core/dist/agent-supervisor.js +552 -0
  44. package/packages/core/dist/agent-supervisor.js.map +1 -0
  45. package/packages/core/dist/bot-manager.d.ts +66 -0
  46. package/packages/core/dist/bot-manager.js +333 -0
  47. package/packages/core/dist/bot-manager.js.map +1 -0
  48. package/packages/core/dist/bot-registry.d.ts +60 -0
  49. package/packages/core/dist/bot-registry.js +381 -0
  50. package/packages/core/dist/bot-registry.js.map +1 -0
  51. package/packages/core/dist/bot-runtime.d.ts +135 -0
  52. package/packages/core/dist/bot-runtime.js +349 -0
  53. package/packages/core/dist/bot-runtime.js.map +1 -0
  54. package/packages/core/dist/bridge-service.d.ts +39 -0
  55. package/packages/core/dist/bridge-service.js +272 -0
  56. package/packages/core/dist/bridge-service.js.map +1 -0
  57. package/packages/core/dist/capability-manager.d.ts +18 -0
  58. package/packages/core/dist/capability-manager.js +335 -0
  59. package/packages/core/dist/capability-manager.js.map +1 -0
  60. package/packages/core/dist/capability-scaffold.d.ts +26 -0
  61. package/packages/core/dist/capability-scaffold.js +118 -0
  62. package/packages/core/dist/capability-scaffold.js.map +1 -0
  63. package/packages/core/dist/channel-factory.d.ts +6 -0
  64. package/packages/core/dist/channel-factory.js +22 -0
  65. package/packages/core/dist/channel-factory.js.map +1 -0
  66. package/packages/core/dist/codex-app-client.d.ts +56 -0
  67. package/packages/core/dist/codex-app-client.js +762 -0
  68. package/packages/core/dist/codex-app-client.js.map +1 -0
  69. package/packages/core/dist/codex-provider.d.ts +31 -0
  70. package/packages/core/dist/codex-provider.js +64 -0
  71. package/packages/core/dist/codex-provider.js.map +1 -0
  72. package/packages/core/dist/control-permission.d.ts +19 -0
  73. package/packages/core/dist/control-permission.js +106 -0
  74. package/packages/core/dist/control-permission.js.map +1 -0
  75. package/packages/core/dist/control-plane-actions.d.ts +1 -0
  76. package/packages/core/dist/control-plane-actions.js +2 -0
  77. package/packages/core/dist/control-plane-actions.js.map +1 -0
  78. package/packages/core/dist/example-capability.d.ts +17 -0
  79. package/packages/core/dist/example-capability.js +22 -0
  80. package/packages/core/dist/example-capability.js.map +1 -0
  81. package/packages/core/dist/extension-contract.d.ts +22 -0
  82. package/packages/core/dist/extension-contract.js +28 -0
  83. package/packages/core/dist/extension-contract.js.map +1 -0
  84. package/packages/core/dist/index.d.ts +26 -0
  85. package/packages/core/dist/index.js +27 -0
  86. package/packages/core/dist/index.js.map +1 -0
  87. package/packages/core/dist/instance-lock.d.ts +9 -0
  88. package/packages/core/dist/instance-lock.js +74 -0
  89. package/packages/core/dist/instance-lock.js.map +1 -0
  90. package/packages/core/dist/kernel-control-plane.d.ts +16 -0
  91. package/packages/core/dist/kernel-control-plane.js +500 -0
  92. package/packages/core/dist/kernel-control-plane.js.map +1 -0
  93. package/packages/core/dist/kernel-version.d.ts +1 -0
  94. package/packages/core/dist/kernel-version.js +2 -0
  95. package/packages/core/dist/kernel-version.js.map +1 -0
  96. package/packages/core/dist/project-fingerprint.d.ts +11 -0
  97. package/packages/core/dist/project-fingerprint.js +33 -0
  98. package/packages/core/dist/project-fingerprint.js.map +1 -0
  99. package/packages/core/dist/provider-factory.d.ts +7 -0
  100. package/packages/core/dist/provider-factory.js +21 -0
  101. package/packages/core/dist/provider-factory.js.map +1 -0
  102. package/packages/core/dist/secret-store.d.ts +18 -0
  103. package/packages/core/dist/secret-store.js +110 -0
  104. package/packages/core/dist/secret-store.js.map +1 -0
  105. package/packages/core/dist/state-store.d.ts +50 -0
  106. package/packages/core/dist/state-store.js +324 -0
  107. package/packages/core/dist/state-store.js.map +1 -0
  108. package/packages/core/dist/telegram-channel.d.ts +27 -0
  109. package/packages/core/dist/telegram-channel.js +951 -0
  110. package/packages/core/dist/telegram-channel.js.map +1 -0
  111. package/packages/core/dist/thread-id.d.ts +1 -0
  112. package/packages/core/dist/thread-id.js +12 -0
  113. package/packages/core/dist/thread-id.js.map +1 -0
  114. package/packages/core/dist/whatsapp-channel.d.ts +26 -0
  115. package/packages/core/dist/whatsapp-channel.js +36 -0
  116. package/packages/core/dist/whatsapp-channel.js.map +1 -0
  117. package/packages/core/dist/workspace-paths.d.ts +5 -0
  118. package/packages/core/dist/workspace-paths.js +77 -0
  119. package/packages/core/dist/workspace-paths.js.map +1 -0
  120. package/packages/core/dist/workspace-policy.d.ts +30 -0
  121. package/packages/core/dist/workspace-policy.js +104 -0
  122. package/packages/core/dist/workspace-policy.js.map +1 -0
  123. package/packages/core/package.json +126 -0
  124. package/scripts/cli.mjs +537 -0
  125. package/scripts/configure.mjs +254 -0
  126. package/scripts/ensure-shared-build.mjs +96 -0
  127. package/scripts/run-node-tests.mjs +52 -0
  128. package/scripts/supervisor.mjs +332 -0
@@ -0,0 +1,66 @@
1
+ export declare class BotManager {
2
+ #private;
3
+ constructor({ botDefinitions, providerDefaults, turnActivityTimeoutMs, maxMessages, webPublicBaseUrl, projectsBaseDir, workerScriptPath, botDataRootDir, onKernelAction, heartbeatEnabled, heartbeatIntervalMs, heartbeatTimeoutMs, }: {
4
+ botDefinitions: any;
5
+ providerDefaults: any;
6
+ turnActivityTimeoutMs: any;
7
+ maxMessages: any;
8
+ webPublicBaseUrl: any;
9
+ projectsBaseDir: any;
10
+ workerScriptPath: any;
11
+ botDataRootDir?: null | undefined;
12
+ onKernelAction?: null | undefined;
13
+ heartbeatEnabled?: boolean | undefined;
14
+ heartbeatIntervalMs?: number | undefined;
15
+ heartbeatTimeoutMs?: number | undefined;
16
+ });
17
+ getBotCount(): any;
18
+ hasBot(botId: any): any;
19
+ setKernelActionHandler(handler: any): void;
20
+ setWebPublicBaseUrl(value: any): void;
21
+ startAutoBots(): Promise<void>;
22
+ listBots(): any[];
23
+ listBotsLive(): Promise<any[]>;
24
+ getBot(botId: any): any;
25
+ getBotStatus(botId: any): Promise<any>;
26
+ startBot(botId: any): Promise<any>;
27
+ stopBot(botId: any): Promise<any>;
28
+ resetWebThread(botId: any): Promise<any>;
29
+ listBotApprovals(botId: any, threadId: any): Promise<any>;
30
+ resolveBotApproval(botId: any, { threadId, approvalId, decision }: {
31
+ threadId: any;
32
+ approvalId: any;
33
+ decision: any;
34
+ }): Promise<any>;
35
+ listBotCapabilities(botId: any): Promise<any>;
36
+ setBotCapabilities(botId: any, nextCapabilities: any): any;
37
+ setBotProviderOptions(botId: any, providerOptions: any): Promise<any>;
38
+ reloadBotCapabilities(botId: any, nextCapabilities?: null): Promise<any>;
39
+ shutdownAll(): Promise<void>;
40
+ registerBot(definition: any, { startIfEnabled }?: {
41
+ startIfEnabled?: boolean | undefined;
42
+ }): Promise<any>;
43
+ removeBot(botId: any, { purgeData, purgeWorkspace }?: {
44
+ purgeData?: boolean | undefined;
45
+ purgeWorkspace?: boolean | undefined;
46
+ }): Promise<{
47
+ id: string;
48
+ removed: boolean;
49
+ purgeData: boolean;
50
+ purgeWorkspace: boolean;
51
+ }>;
52
+ listProjects(): Promise<{
53
+ baseDir: any;
54
+ projects: {
55
+ name: string;
56
+ path: string;
57
+ }[];
58
+ }>;
59
+ createProject(projectName: any): Promise<{
60
+ name: string;
61
+ path: string;
62
+ }>;
63
+ setBotProject(botId: any, projectName: any): Promise<any>;
64
+ startHeartbeatScheduler(): void;
65
+ stopHeartbeatScheduler(): void;
66
+ }
@@ -0,0 +1,333 @@
1
+ // @ts-nocheck
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { AgentSupervisor } from "./agent-supervisor.js";
6
+ export class BotManager {
7
+ constructor({ botDefinitions, providerDefaults, turnActivityTimeoutMs, maxMessages, webPublicBaseUrl, projectsBaseDir, workerScriptPath, botDataRootDir = null, onKernelAction = null, heartbeatEnabled = true, heartbeatIntervalMs = 5000, heartbeatTimeoutMs = 4000, }) {
8
+ this.supervisors = new Map();
9
+ this.providerDefaults = providerDefaults;
10
+ this.turnActivityTimeoutMs = turnActivityTimeoutMs;
11
+ this.maxMessages = maxMessages;
12
+ this.webPublicBaseUrl = webPublicBaseUrl;
13
+ this.projectsBaseDir = path.resolve(projectsBaseDir);
14
+ this.botDataRootDir = botDataRootDir ? path.resolve(botDataRootDir) : null;
15
+ this.workerScriptPath = path.resolve(String(workerScriptPath ?? ""));
16
+ if (!String(workerScriptPath ?? "").trim()) {
17
+ throw new Error("workerScriptPath is required.");
18
+ }
19
+ this.kernelActionHandler = typeof onKernelAction === "function" ? onKernelAction : null;
20
+ this.heartbeatEnabled = heartbeatEnabled;
21
+ this.heartbeatIntervalMs = heartbeatIntervalMs;
22
+ this.heartbeatTimeoutMs = heartbeatTimeoutMs;
23
+ this.heartbeatTimer = null;
24
+ this.heartbeatRunning = false;
25
+ for (const definition of botDefinitions) {
26
+ const supervisor = this.#createSupervisor(definition);
27
+ this.supervisors.set(definition.id, supervisor);
28
+ }
29
+ }
30
+ getBotCount() {
31
+ return this.supervisors.size;
32
+ }
33
+ hasBot(botId) {
34
+ return this.supervisors.has(String(botId));
35
+ }
36
+ setKernelActionHandler(handler) {
37
+ this.kernelActionHandler = typeof handler === "function" ? handler : null;
38
+ }
39
+ setWebPublicBaseUrl(value) {
40
+ this.webPublicBaseUrl = value;
41
+ for (const supervisor of this.supervisors.values()) {
42
+ supervisor.setWebPublicBaseUrl(value);
43
+ }
44
+ }
45
+ async startAutoBots() {
46
+ for (const supervisor of this.supervisors.values()) {
47
+ if (supervisor.config.enabled !== false) {
48
+ await supervisor.boot();
49
+ }
50
+ }
51
+ this.startHeartbeatScheduler();
52
+ }
53
+ listBots() {
54
+ return [...this.supervisors.values()].map((supervisor) => supervisor.getStatus());
55
+ }
56
+ async listBotsLive() {
57
+ const statuses = [];
58
+ for (const supervisor of this.supervisors.values()) {
59
+ try {
60
+ statuses.push(await supervisor.refreshStatus());
61
+ }
62
+ catch {
63
+ statuses.push(supervisor.getStatus());
64
+ }
65
+ }
66
+ return statuses;
67
+ }
68
+ getBot(botId) {
69
+ const supervisor = this.supervisors.get(String(botId));
70
+ if (!supervisor) {
71
+ throw new Error(`Unknown bot '${botId}'.`);
72
+ }
73
+ return supervisor;
74
+ }
75
+ async getBotStatus(botId) {
76
+ const supervisor = this.getBot(botId);
77
+ return supervisor.refreshStatus();
78
+ }
79
+ async startBot(botId) {
80
+ const supervisor = this.getBot(botId);
81
+ return supervisor.startChannels();
82
+ }
83
+ async stopBot(botId) {
84
+ const supervisor = this.getBot(botId);
85
+ return supervisor.stopChannels();
86
+ }
87
+ async resetWebThread(botId) {
88
+ const supervisor = this.getBot(botId);
89
+ return supervisor.resetWebThread();
90
+ }
91
+ async listBotApprovals(botId, threadId) {
92
+ const supervisor = this.getBot(botId);
93
+ return supervisor.listPendingApprovals(threadId);
94
+ }
95
+ async resolveBotApproval(botId, { threadId, approvalId, decision }) {
96
+ const supervisor = this.getBot(botId);
97
+ return supervisor.resolvePendingApproval({
98
+ threadId,
99
+ approvalId,
100
+ decision,
101
+ });
102
+ }
103
+ async listBotCapabilities(botId) {
104
+ const supervisor = this.getBot(botId);
105
+ return supervisor.listCapabilities();
106
+ }
107
+ setBotCapabilities(botId, nextCapabilities) {
108
+ const supervisor = this.getBot(botId);
109
+ supervisor.setCapabilities(nextCapabilities);
110
+ return supervisor.getStatus();
111
+ }
112
+ async setBotProviderOptions(botId, providerOptions) {
113
+ const supervisor = this.getBot(botId);
114
+ return supervisor.setProviderOptions(providerOptions);
115
+ }
116
+ async reloadBotCapabilities(botId, nextCapabilities = null) {
117
+ const supervisor = this.getBot(botId);
118
+ return supervisor.reloadCapabilities(nextCapabilities);
119
+ }
120
+ async shutdownAll() {
121
+ this.stopHeartbeatScheduler();
122
+ for (const supervisor of this.supervisors.values()) {
123
+ await supervisor.shutdown();
124
+ }
125
+ }
126
+ async registerBot(definition, { startIfEnabled = true } = {}) {
127
+ const id = String(definition?.id ?? "").trim();
128
+ if (!id) {
129
+ throw new Error("Bot definition id is required.");
130
+ }
131
+ if (this.supervisors.has(id)) {
132
+ throw new Error(`Bot '${id}' already exists.`);
133
+ }
134
+ const supervisor = this.#createSupervisor(definition);
135
+ this.supervisors.set(id, supervisor);
136
+ if (startIfEnabled && definition.enabled !== false) {
137
+ await supervisor.boot();
138
+ }
139
+ return supervisor.getStatus();
140
+ }
141
+ async removeBot(botId, { purgeData = false, purgeWorkspace = false } = {}) {
142
+ const id = String(botId ?? "").trim();
143
+ if (!id) {
144
+ throw new Error("botId is required.");
145
+ }
146
+ const supervisor = this.getBot(id);
147
+ this.supervisors.delete(id);
148
+ try {
149
+ await supervisor.shutdown();
150
+ if (purgeData) {
151
+ await this.#purgeBotDataDir(supervisor.config?.dataDir);
152
+ }
153
+ if (purgeWorkspace) {
154
+ await this.#purgeBotWorkspace(supervisor.config?.workspaceRoot);
155
+ }
156
+ }
157
+ catch (error) {
158
+ this.supervisors.set(id, supervisor);
159
+ throw error;
160
+ }
161
+ return {
162
+ id,
163
+ removed: true,
164
+ purgeData,
165
+ purgeWorkspace,
166
+ };
167
+ }
168
+ async listProjects() {
169
+ await fs.mkdir(this.projectsBaseDir, { recursive: true });
170
+ const entries = await fs.readdir(this.projectsBaseDir, { withFileTypes: true });
171
+ const projects = entries
172
+ .filter((entry) => entry.isDirectory())
173
+ .map((entry) => ({
174
+ name: entry.name,
175
+ path: path.join(this.projectsBaseDir, entry.name),
176
+ }))
177
+ .sort((a, b) => a.name.localeCompare(b.name));
178
+ return {
179
+ baseDir: this.projectsBaseDir,
180
+ projects,
181
+ };
182
+ }
183
+ async createProject(projectName) {
184
+ const normalized = normalizeProjectName(projectName);
185
+ const projectPath = resolveProjectPath(this.projectsBaseDir, normalized);
186
+ await fs.mkdir(projectPath, { recursive: true });
187
+ return {
188
+ name: normalized,
189
+ path: projectPath,
190
+ };
191
+ }
192
+ async setBotProject(botId, projectName) {
193
+ const supervisor = this.getBot(botId);
194
+ const normalized = normalizeProjectName(projectName);
195
+ const projectPath = resolveProjectPath(this.projectsBaseDir, normalized);
196
+ const stat = await fs.stat(projectPath).catch(() => null);
197
+ if (!stat || !stat.isDirectory()) {
198
+ throw new Error(`Project '${normalized}' does not exist in ${this.projectsBaseDir}.`);
199
+ }
200
+ return supervisor.setProjectRoot(projectPath);
201
+ }
202
+ #createSupervisor(definition) {
203
+ return new AgentSupervisor({
204
+ botConfig: definition,
205
+ providerDefaults: this.providerDefaults,
206
+ turnActivityTimeoutMs: this.turnActivityTimeoutMs,
207
+ maxMessages: this.maxMessages,
208
+ webPublicBaseUrl: this.webPublicBaseUrl,
209
+ workerScriptPath: this.workerScriptPath,
210
+ onKernelAction: (request) => this.#dispatchKernelAction(request),
211
+ });
212
+ }
213
+ async #dispatchKernelAction(request) {
214
+ if (!this.kernelActionHandler) {
215
+ throw new Error("Kernel action handler is not configured.");
216
+ }
217
+ return this.kernelActionHandler(request);
218
+ }
219
+ startHeartbeatScheduler() {
220
+ if (!this.heartbeatEnabled || this.heartbeatTimer) {
221
+ return;
222
+ }
223
+ this.heartbeatTimer = setInterval(() => {
224
+ void this.#runHeartbeatTick();
225
+ }, this.heartbeatIntervalMs);
226
+ if (typeof this.heartbeatTimer.unref === "function") {
227
+ this.heartbeatTimer.unref();
228
+ }
229
+ }
230
+ stopHeartbeatScheduler() {
231
+ if (!this.heartbeatTimer) {
232
+ return;
233
+ }
234
+ clearInterval(this.heartbeatTimer);
235
+ this.heartbeatTimer = null;
236
+ }
237
+ async #runHeartbeatTick() {
238
+ if (this.heartbeatRunning) {
239
+ return;
240
+ }
241
+ this.heartbeatRunning = true;
242
+ try {
243
+ for (const supervisor of this.supervisors.values()) {
244
+ await supervisor.heartbeat({ timeoutMs: this.heartbeatTimeoutMs });
245
+ }
246
+ }
247
+ catch (error) {
248
+ const message = error instanceof Error ? error.message : String(error);
249
+ console.error(`Heartbeat tick error: ${message}`);
250
+ }
251
+ finally {
252
+ this.heartbeatRunning = false;
253
+ }
254
+ }
255
+ async #purgeBotDataDir(dataDir) {
256
+ if (!this.botDataRootDir) {
257
+ throw new Error("botDataRootDir is not configured, cannot purge bot data.");
258
+ }
259
+ const target = path.resolve(String(dataDir ?? ""));
260
+ if (!target) {
261
+ throw new Error("Invalid bot data directory.");
262
+ }
263
+ if (!isSubPath(target, this.botDataRootDir)) {
264
+ throw new Error(`Refusing to purge outside bot data root: ${target}`);
265
+ }
266
+ await fs.rm(target, { recursive: true, force: true });
267
+ }
268
+ async #purgeBotWorkspace(workspaceRoot) {
269
+ const target = path.resolve(String(workspaceRoot ?? ""));
270
+ if (!target) {
271
+ throw new Error("Invalid bot workspace directory.");
272
+ }
273
+ assertSafePurgeTarget(target, {
274
+ label: "workspace",
275
+ protectedPaths: [
276
+ path.parse(target).root,
277
+ process.cwd(),
278
+ os.homedir(),
279
+ this.projectsBaseDir,
280
+ this.botDataRootDir,
281
+ ].filter(Boolean),
282
+ });
283
+ await fs.rm(target, { recursive: true, force: true });
284
+ }
285
+ }
286
+ const PROJECT_NAME_PATTERN = /^[A-Za-z0-9._-]{1,80}$/;
287
+ function normalizeProjectName(value) {
288
+ const name = String(value ?? "").trim();
289
+ if (!PROJECT_NAME_PATTERN.test(name)) {
290
+ throw new Error("Invalid project name. Allowed: letters, numbers, dot, underscore, dash.");
291
+ }
292
+ return name;
293
+ }
294
+ function resolveProjectPath(baseDir, projectName) {
295
+ const full = path.resolve(baseDir, projectName);
296
+ const resolvedBase = path.resolve(baseDir);
297
+ const normalizedBase = `${resolvedBase}${path.sep}`;
298
+ if (full !== resolvedBase && !full.startsWith(normalizedBase)) {
299
+ throw new Error("Project path escapes projects base directory.");
300
+ }
301
+ return full;
302
+ }
303
+ function isSubPath(candidatePath, rootPath) {
304
+ const normalizedRoot = path.resolve(rootPath);
305
+ const normalizedCandidate = path.resolve(candidatePath);
306
+ if (normalizedCandidate === normalizedRoot) {
307
+ return false;
308
+ }
309
+ const rootWithSep = normalizedRoot.endsWith(path.sep)
310
+ ? normalizedRoot
311
+ : `${normalizedRoot}${path.sep}`;
312
+ return normalizedCandidate.startsWith(rootWithSep);
313
+ }
314
+ function assertSafePurgeTarget(targetPath, { label, protectedPaths }) {
315
+ const normalizedTarget = path.resolve(String(targetPath ?? ""));
316
+ const root = path.parse(normalizedTarget).root;
317
+ if (normalizedTarget === root) {
318
+ throw new Error(`Refusing to purge ${label} root directory: ${normalizedTarget}`);
319
+ }
320
+ for (const entry of protectedPaths) {
321
+ const protectedPath = path.resolve(String(entry));
322
+ if (!protectedPath) {
323
+ continue;
324
+ }
325
+ if (normalizedTarget === protectedPath) {
326
+ throw new Error(`Refusing to purge protected ${label} path: ${normalizedTarget}`);
327
+ }
328
+ if (isSubPath(protectedPath, normalizedTarget)) {
329
+ throw new Error(`Refusing to purge ${label} path that contains protected path: ${normalizedTarget}`);
330
+ }
331
+ }
332
+ }
333
+ //# sourceMappingURL=bot-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-manager.js","sourceRoot":"","sources":["../src/bot-manager.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,OAAO,UAAU;IACrB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,IAAI,EACrB,gBAAgB,GAAG,IAAI,EACvB,mBAAmB,GAAG,IAAI,EAC1B,kBAAkB,GAAG,IAAI,GAC1B;QACC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;QACxF,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAE9B,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,sBAAsB,CAAC,OAAO;QAC5B,IAAI,CAAC,mBAAmB,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAED,mBAAmB,CAAC,KAAK;QACvB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,UAAU,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACxC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK;QACV,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAK;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAK;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAK;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,YAAY,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAK;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,sBAAsB,CAAC;YACvC,QAAQ;YACR,UAAU;YACV,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAK;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC;IAED,kBAAkB,CAAC,KAAK,EAAE,gBAAgB;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC7C,OAAO,UAAU,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,eAAe;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAErC,IAAI,cAAc,IAAI,UAAU,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACnD,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;QAED,OAAO,UAAU,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,EAAE;YACF,OAAO,EAAE,IAAI;YACb,SAAS;YACT,cAAc;SACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAG,OAAO;aACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC;SAClD,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAW;QAC7B,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,WAAW;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,uBAAuB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,iBAAiB,CAAC,UAAU;QAC1B,OAAO,IAAI,eAAe,CAAC;YACzB,SAAS,EAAE,UAAU;YACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAO;QACjC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnD,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAO;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,aAAa;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,qBAAqB,CAAC,MAAM,EAAE;YAC5B,KAAK,EAAE,WAAW;YAClB,cAAc,EAAE;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI;gBACvB,OAAO,CAAC,GAAG,EAAE;gBACb,EAAE,CAAC,OAAO,EAAE;gBACZ,IAAI,CAAC,eAAe;gBACpB,IAAI,CAAC,cAAc;aACpB,CAAC,MAAM,CAAC,OAAO,CAAC;SAClB,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAEtD,SAAS,oBAAoB,CAAC,KAAK;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAO,EAAE,WAAW;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACpD,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,aAAa,EAAE,QAAQ;IACxC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,IAAI,mBAAmB,KAAK,cAAc,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACnD,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,OAAO,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;IAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC;IAC/C,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,oBAAoB,gBAAgB,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,gBAAgB,KAAK,aAAa,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,UAAU,gBAAgB,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,uCAAuC,gBAAgB,EAAE,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { type WorkspaceBoundaryPolicy } from "./workspace-policy.js";
2
+ export interface LoadBotRegistryOptions {
3
+ filePath: string;
4
+ dataDir: string;
5
+ defaultWorkspaceRoot: string;
6
+ defaultThreadMode: string;
7
+ defaultSharedThreadId: string;
8
+ defaultAllowedChatIds: Set<string>;
9
+ bootstrapTelegramToken: string;
10
+ defaultProviderKind: string;
11
+ workspacePolicy?: WorkspaceBoundaryPolicy | null;
12
+ resolveSecret?: ((name: string) => unknown) | null;
13
+ }
14
+ export interface LoadedBotRegistry {
15
+ filePath: string;
16
+ version: number;
17
+ bots: NormalizedBotDefinition[];
18
+ }
19
+ export interface NormalizedBotDefinition {
20
+ id: string;
21
+ name: string;
22
+ enabled: boolean;
23
+ autoStart: boolean;
24
+ workspaceRoot: string;
25
+ dataDir: string;
26
+ threadMode: "single" | "per_chat";
27
+ sharedThreadId: string;
28
+ provider: {
29
+ kind: string;
30
+ options: Record<string, unknown>;
31
+ };
32
+ kernelAccess: {
33
+ enabled: boolean;
34
+ allowedActions: string[];
35
+ allowedChatIds: string[];
36
+ };
37
+ capabilities: Array<{
38
+ id: string;
39
+ enabled: boolean;
40
+ manifestPath: string;
41
+ options: Record<string, unknown>;
42
+ }>;
43
+ channels: Array<{
44
+ kind: "telegram";
45
+ id: string;
46
+ token: string;
47
+ tokenEnv: string | null;
48
+ tokenSecretRef: string | null;
49
+ allowedChatIds: string[];
50
+ } | {
51
+ kind: "whatsapp";
52
+ id: string;
53
+ options: Record<string, unknown>;
54
+ } | {
55
+ kind: string;
56
+ id: string;
57
+ options: Record<string, unknown>;
58
+ }>;
59
+ }
60
+ export declare function loadBotRegistry({ filePath, dataDir, defaultWorkspaceRoot, defaultThreadMode, defaultSharedThreadId, defaultAllowedChatIds, bootstrapTelegramToken, defaultProviderKind, workspacePolicy, resolveSecret, }: LoadBotRegistryOptions): Promise<LoadedBotRegistry>;