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.
- package/LICENSE +21 -0
- package/README.md +215 -0
- package/apps/agent-engine/.env.example +41 -0
- package/apps/agent-engine/LICENSE +21 -0
- package/apps/agent-engine/README.md +57 -0
- package/apps/agent-engine/bot-registry.example.json +28 -0
- package/apps/agent-engine/capabilities/example/index.js +3 -0
- package/apps/agent-engine/capabilities/example/manifest.json +14 -0
- package/apps/agent-engine/dist/agent-worker.js +241 -0
- package/apps/agent-engine/dist/config.js +225 -0
- package/apps/agent-engine/dist/index.js +352 -0
- package/apps/agent-engine/dist/test/project-fingerprint.test.js +40 -0
- package/apps/agent-engine/dist/test/thread-id.test.js +12 -0
- package/apps/agent-engine/package.json +28 -0
- package/apps/control-plane/.env.example +25 -0
- package/apps/control-plane/README.md +35 -0
- package/apps/control-plane/bot-registry.example.json +40 -0
- package/apps/control-plane/capabilities/example/index.js +3 -0
- package/apps/control-plane/capabilities/example/manifest.json +14 -0
- package/apps/control-plane/dist/agent-worker.js +243 -0
- package/apps/control-plane/dist/channels/channel-factory.js +21 -0
- package/apps/control-plane/dist/channels/hub-ops-commands.js +752 -0
- package/apps/control-plane/dist/channels/telegram-channel.js +743 -0
- package/apps/control-plane/dist/channels/whatsapp-channel.js +35 -0
- package/apps/control-plane/dist/config.js +230 -0
- package/apps/control-plane/dist/copilot-hub.js +138 -0
- package/apps/control-plane/dist/index.js +349 -0
- package/apps/control-plane/dist/kernel/admin-contract.js +51 -0
- package/apps/control-plane/dist/test/project-fingerprint.test.js +40 -0
- package/apps/control-plane/dist/test/thread-id.test.js +12 -0
- package/apps/control-plane/package.json +27 -0
- package/package.json +89 -0
- package/packages/contracts/README.md +10 -0
- package/packages/contracts/dist/control-plane.d.ts +24 -0
- package/packages/contracts/dist/control-plane.js +37 -0
- package/packages/contracts/dist/control-plane.js.map +1 -0
- package/packages/contracts/dist/index.d.ts +1 -0
- package/packages/contracts/dist/index.js +2 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/package.json +27 -0
- package/packages/core/README.md +33 -0
- package/packages/core/dist/agent-supervisor.d.ts +39 -0
- package/packages/core/dist/agent-supervisor.js +552 -0
- package/packages/core/dist/agent-supervisor.js.map +1 -0
- package/packages/core/dist/bot-manager.d.ts +66 -0
- package/packages/core/dist/bot-manager.js +333 -0
- package/packages/core/dist/bot-manager.js.map +1 -0
- package/packages/core/dist/bot-registry.d.ts +60 -0
- package/packages/core/dist/bot-registry.js +381 -0
- package/packages/core/dist/bot-registry.js.map +1 -0
- package/packages/core/dist/bot-runtime.d.ts +135 -0
- package/packages/core/dist/bot-runtime.js +349 -0
- package/packages/core/dist/bot-runtime.js.map +1 -0
- package/packages/core/dist/bridge-service.d.ts +39 -0
- package/packages/core/dist/bridge-service.js +272 -0
- package/packages/core/dist/bridge-service.js.map +1 -0
- package/packages/core/dist/capability-manager.d.ts +18 -0
- package/packages/core/dist/capability-manager.js +335 -0
- package/packages/core/dist/capability-manager.js.map +1 -0
- package/packages/core/dist/capability-scaffold.d.ts +26 -0
- package/packages/core/dist/capability-scaffold.js +118 -0
- package/packages/core/dist/capability-scaffold.js.map +1 -0
- package/packages/core/dist/channel-factory.d.ts +6 -0
- package/packages/core/dist/channel-factory.js +22 -0
- package/packages/core/dist/channel-factory.js.map +1 -0
- package/packages/core/dist/codex-app-client.d.ts +56 -0
- package/packages/core/dist/codex-app-client.js +762 -0
- package/packages/core/dist/codex-app-client.js.map +1 -0
- package/packages/core/dist/codex-provider.d.ts +31 -0
- package/packages/core/dist/codex-provider.js +64 -0
- package/packages/core/dist/codex-provider.js.map +1 -0
- package/packages/core/dist/control-permission.d.ts +19 -0
- package/packages/core/dist/control-permission.js +106 -0
- package/packages/core/dist/control-permission.js.map +1 -0
- package/packages/core/dist/control-plane-actions.d.ts +1 -0
- package/packages/core/dist/control-plane-actions.js +2 -0
- package/packages/core/dist/control-plane-actions.js.map +1 -0
- package/packages/core/dist/example-capability.d.ts +17 -0
- package/packages/core/dist/example-capability.js +22 -0
- package/packages/core/dist/example-capability.js.map +1 -0
- package/packages/core/dist/extension-contract.d.ts +22 -0
- package/packages/core/dist/extension-contract.js +28 -0
- package/packages/core/dist/extension-contract.js.map +1 -0
- package/packages/core/dist/index.d.ts +26 -0
- package/packages/core/dist/index.js +27 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/instance-lock.d.ts +9 -0
- package/packages/core/dist/instance-lock.js +74 -0
- package/packages/core/dist/instance-lock.js.map +1 -0
- package/packages/core/dist/kernel-control-plane.d.ts +16 -0
- package/packages/core/dist/kernel-control-plane.js +500 -0
- package/packages/core/dist/kernel-control-plane.js.map +1 -0
- package/packages/core/dist/kernel-version.d.ts +1 -0
- package/packages/core/dist/kernel-version.js +2 -0
- package/packages/core/dist/kernel-version.js.map +1 -0
- package/packages/core/dist/project-fingerprint.d.ts +11 -0
- package/packages/core/dist/project-fingerprint.js +33 -0
- package/packages/core/dist/project-fingerprint.js.map +1 -0
- package/packages/core/dist/provider-factory.d.ts +7 -0
- package/packages/core/dist/provider-factory.js +21 -0
- package/packages/core/dist/provider-factory.js.map +1 -0
- package/packages/core/dist/secret-store.d.ts +18 -0
- package/packages/core/dist/secret-store.js +110 -0
- package/packages/core/dist/secret-store.js.map +1 -0
- package/packages/core/dist/state-store.d.ts +50 -0
- package/packages/core/dist/state-store.js +324 -0
- package/packages/core/dist/state-store.js.map +1 -0
- package/packages/core/dist/telegram-channel.d.ts +27 -0
- package/packages/core/dist/telegram-channel.js +951 -0
- package/packages/core/dist/telegram-channel.js.map +1 -0
- package/packages/core/dist/thread-id.d.ts +1 -0
- package/packages/core/dist/thread-id.js +12 -0
- package/packages/core/dist/thread-id.js.map +1 -0
- package/packages/core/dist/whatsapp-channel.d.ts +26 -0
- package/packages/core/dist/whatsapp-channel.js +36 -0
- package/packages/core/dist/whatsapp-channel.js.map +1 -0
- package/packages/core/dist/workspace-paths.d.ts +5 -0
- package/packages/core/dist/workspace-paths.js +77 -0
- package/packages/core/dist/workspace-paths.js.map +1 -0
- package/packages/core/dist/workspace-policy.d.ts +30 -0
- package/packages/core/dist/workspace-policy.js +104 -0
- package/packages/core/dist/workspace-policy.js.map +1 -0
- package/packages/core/package.json +126 -0
- package/scripts/cli.mjs +537 -0
- package/scripts/configure.mjs +254 -0
- package/scripts/ensure-shared-build.mjs +96 -0
- package/scripts/run-node-tests.mjs +52 -0
- 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":"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"}
|
|
@@ -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>;
|