@geminixiang/mikan 1.0.0-beta.23 → 1.0.0-beta.25
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/CHANGELOG.md +26 -0
- package/README.md +8 -12
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +9 -8
- package/dist/agent.js.map +1 -1
- package/dist/cli/boot.d.ts +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +15 -7
- package/dist/cli/boot.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +5 -2
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -12
- package/dist/config.js.map +1 -1
- package/dist/execution-resolver.d.ts +2 -1
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +7 -4
- package/dist/execution-resolver.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +87 -19
- package/dist/main.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +18 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -0
- package/dist/sandbox/firecracker.js +222 -0
- package/dist/sandbox/firecracker.js.map +1 -0
- package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
- package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
- package/dist/sandbox/gondolin-bootstrap.js +27 -0
- package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
- package/dist/sandbox/gondolin-contract.d.ts +125 -0
- package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
- package/dist/sandbox/gondolin-contract.js +155 -0
- package/dist/sandbox/gondolin-contract.js.map +1 -0
- package/dist/sandbox/gondolin-fleet.d.ts +104 -0
- package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
- package/dist/sandbox/gondolin-fleet.js +330 -0
- package/dist/sandbox/gondolin-fleet.js.map +1 -0
- package/dist/sandbox/gondolin-gateway.d.ts +86 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
- package/dist/sandbox/gondolin-gateway.js +407 -0
- package/dist/sandbox/gondolin-gateway.js.map +1 -0
- package/dist/sandbox/gondolin-inventory.d.ts +75 -0
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-inventory.js +257 -0
- package/dist/sandbox/gondolin-inventory.js.map +1 -0
- package/dist/sandbox/gondolin-join.d.ts +62 -0
- package/dist/sandbox/gondolin-join.d.ts.map +1 -0
- package/dist/sandbox/gondolin-join.js +261 -0
- package/dist/sandbox/gondolin-join.js.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
- package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
- package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
- package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
- package/dist/sandbox/gondolin-placement.d.ts +30 -0
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
- package/dist/sandbox/gondolin-placement.js +77 -0
- package/dist/sandbox/gondolin-placement.js.map +1 -0
- package/dist/sandbox/gondolin-recovery.d.ts +33 -0
- package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
- package/dist/sandbox/gondolin-recovery.js +39 -0
- package/dist/sandbox/gondolin-recovery.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +70 -0
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
- package/dist/sandbox/gondolin-remote.js +325 -0
- package/dist/sandbox/gondolin-remote.js.map +1 -0
- package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-client.js +323 -0
- package/dist/sandbox/gondolin-worker-client.js.map +1 -0
- package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
- package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker-main.js +22 -0
- package/dist/sandbox/gondolin-worker-main.js.map +1 -0
- package/dist/sandbox/gondolin-worker.d.ts +17 -0
- package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
- package/dist/sandbox/gondolin-worker.js +201 -0
- package/dist/sandbox/gondolin-worker.js.map +1 -0
- package/dist/sandbox/gondolin.d.ts +53 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -0
- package/dist/sandbox/gondolin.js +430 -0
- package/dist/sandbox/gondolin.js.map +1 -0
- package/dist/sandbox/index.d.ts +7 -6
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +9 -7
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +16 -12
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +3 -2
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/types.d.ts +63 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/policy.d.ts +3 -3
- package/dist/vault/policy.d.ts.map +1 -1
- package/dist/vault/policy.js +4 -6
- package/dist/vault/policy.js.map +1 -1
- package/package.json +3 -3
- package/dist/sandbox/agent-sandbox.d.ts +0 -18
- package/dist/sandbox/agent-sandbox.d.ts.map +0 -1
- package/dist/sandbox/agent-sandbox.js +0 -234
- package/dist/sandbox/agent-sandbox.js.map +0 -1
package/dist/main.js
CHANGED
|
@@ -17,7 +17,6 @@ import { startWebServer } from "./web/server.js";
|
|
|
17
17
|
import { InMemoryAdminTokenStore } from "./web/admin/store.js";
|
|
18
18
|
import { InMemoryLinkTokenStore } from "./web/login/store.js";
|
|
19
19
|
import { InMemorySessionViewTokenStore } from "./web/session-view/store.js";
|
|
20
|
-
import { configureAgentSandboxRuntime, shutdownAgentSandboxes, stopIdleAgentSandboxes, } from "./sandbox/agent-sandbox.js";
|
|
21
20
|
import { DockerContainerManager } from "./provisioner.js";
|
|
22
21
|
import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, resolveLinkBaseUrl, } from "./config.js";
|
|
23
22
|
import { configureHttpDispatcher, defaultAuthPath, defaultModelsJsonPath, parseHttpIdleTimeoutMs, } from "./harness/index.js";
|
|
@@ -27,6 +26,13 @@ import { ensureDirExists, isRecord, readJsonFileIfExists } from "./utils/file-gu
|
|
|
27
26
|
import { SandboxError, validateSandbox } from "./sandbox/index.js";
|
|
28
27
|
import { helpText, resolveBoot } from "./cli/boot.js";
|
|
29
28
|
import { envReport, noPlatformsMessage, platformIsActive } from "./env-manifest.js";
|
|
29
|
+
import { disconnectAllGondolinRuntimes, gondolinResources, stopIdleGondolinVms, sweepUnadoptedGondolinWorkers, } from "./sandbox/gondolin.js";
|
|
30
|
+
import { configureGondolinRuntime } from "./sandbox/gondolin-bootstrap.js";
|
|
31
|
+
import { gondolinInventory } from "./sandbox/gondolin-inventory.js";
|
|
32
|
+
import { gondolinFleet } from "./sandbox/gondolin-fleet.js";
|
|
33
|
+
import { gondolinGateway } from "./sandbox/gondolin-gateway.js";
|
|
34
|
+
import { gondolinJoin } from "./sandbox/gondolin-join.js";
|
|
35
|
+
import { checkWorkspaceExported } from "./sandbox/gondolin-nfs-advisory.js";
|
|
30
36
|
import { FileVaultManager } from "./vault/index.js";
|
|
31
37
|
import { runExtCommand } from "./cli/ext.js";
|
|
32
38
|
import { createConversationRuntime } from "./runtime/conversation-runtime.js";
|
|
@@ -147,6 +153,41 @@ if (plan.mode === "version") {
|
|
|
147
153
|
console.log(getVersion());
|
|
148
154
|
process.exit(0);
|
|
149
155
|
}
|
|
156
|
+
// Handle --worker-token: mint a one-time join token for a dial-home worker
|
|
157
|
+
if (plan.mode === "worker-token") {
|
|
158
|
+
const stateDir = plan.stateDir;
|
|
159
|
+
setEnvAliases("STATE_DIR", stateDir);
|
|
160
|
+
ensureSecureStateDir(stateDir);
|
|
161
|
+
gondolinJoin.configure(join(stateDir, "gondolin-gateway"));
|
|
162
|
+
try {
|
|
163
|
+
let gatewayPort = 8433;
|
|
164
|
+
let gatewayHost;
|
|
165
|
+
try {
|
|
166
|
+
const gateway = loadGlobalSettings().sandbox?.gondolin?.remote?.gateway;
|
|
167
|
+
if (gateway) {
|
|
168
|
+
gatewayPort = gateway.port;
|
|
169
|
+
gatewayHost = gateway.hostnames?.[0];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// settings are optional for minting; the CA lives in the state dir
|
|
174
|
+
}
|
|
175
|
+
const minted = await gondolinJoin.mintToken();
|
|
176
|
+
const host = gatewayHost ?? "<mikan-host>";
|
|
177
|
+
console.log("Worker join token (single use, expires in 15 minutes):");
|
|
178
|
+
console.log("");
|
|
179
|
+
console.log(` mikan-worker join https://${host}:${gatewayPort} \\`);
|
|
180
|
+
console.log(` --token ${minted.token} \\`);
|
|
181
|
+
console.log(` --ca-pin ${minted.fingerprint} \\`);
|
|
182
|
+
console.log(` --name <worker-name> --workspace-root <shared-workspace-path> \\`);
|
|
183
|
+
console.log(` --worker-entry /opt/mikan/dist/sandbox/gondolin-worker-main.js`);
|
|
184
|
+
process.exit(0);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
150
191
|
// Handle --onboard mode
|
|
151
192
|
if (plan.mode === "onboard") {
|
|
152
193
|
const stateDir = plan.stateDir;
|
|
@@ -207,7 +248,8 @@ if (vaultManager.isEnabled()) {
|
|
|
207
248
|
console.log(sandbox.type === "container"
|
|
208
249
|
? " Vault system enabled. Container vault active."
|
|
209
250
|
: sandbox.type === "image" ||
|
|
210
|
-
sandbox.type === "
|
|
251
|
+
sandbox.type === "gondolin" ||
|
|
252
|
+
sandbox.type === "firecracker" ||
|
|
211
253
|
sandbox.type === "cloudflare"
|
|
212
254
|
? " Vault system enabled. Conversation-scoped credential routing active."
|
|
213
255
|
: " Vault system enabled. Host mode will not inject vault env.");
|
|
@@ -221,13 +263,6 @@ const startupConfig = (() => {
|
|
|
221
263
|
}
|
|
222
264
|
})();
|
|
223
265
|
const sandboxSettings = startupConfig.sandbox;
|
|
224
|
-
if (sandbox.type === "agent-sandbox") {
|
|
225
|
-
const settings = sandboxSettings?.agentSandbox;
|
|
226
|
-
if (!settings) {
|
|
227
|
-
handleStartupError(new SandboxError("Error: agent-sandbox requires sandbox.agentSandbox settings with namespace and runtimeClassName"));
|
|
228
|
-
}
|
|
229
|
-
configureAgentSandboxRuntime(settings);
|
|
230
|
-
}
|
|
231
266
|
const sandboxLimits = sandboxSettings?.cpus || sandboxSettings?.memory
|
|
232
267
|
? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }
|
|
233
268
|
: undefined;
|
|
@@ -240,8 +275,26 @@ const provisioner = sandbox.type === "image"
|
|
|
240
275
|
boostLimits: sandboxBoostLimits,
|
|
241
276
|
})
|
|
242
277
|
: undefined;
|
|
243
|
-
|
|
244
|
-
|
|
278
|
+
if (sandbox.type === "gondolin") {
|
|
279
|
+
try {
|
|
280
|
+
configureGondolinRuntime({
|
|
281
|
+
stateDir,
|
|
282
|
+
limits: sandboxLimits,
|
|
283
|
+
boostLimits: sandboxBoostLimits,
|
|
284
|
+
remote: sandboxSettings?.gondolin?.remote,
|
|
285
|
+
requireRemote: sandbox.profile === "remote",
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
handleStartupError(error);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const resourceController = sandbox.type === "image"
|
|
293
|
+
? provisioner
|
|
294
|
+
: sandbox.type === "gondolin"
|
|
295
|
+
? gondolinResources
|
|
296
|
+
: undefined;
|
|
297
|
+
if (sandbox.type === "image" || sandbox.type === "gondolin") {
|
|
245
298
|
ensureDirExists(join(workingDir, "skills"));
|
|
246
299
|
ensureDirExists(join(workingDir, "events"));
|
|
247
300
|
try {
|
|
@@ -272,9 +325,23 @@ if (provisioner) {
|
|
|
272
325
|
await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
|
|
273
326
|
setInterval(() => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
|
|
274
327
|
}
|
|
275
|
-
if (sandbox.type === "
|
|
276
|
-
|
|
277
|
-
|
|
328
|
+
if (sandbox.type === "gondolin" && sandbox.profile === "remote") {
|
|
329
|
+
checkWorkspaceExported(workingDir, sandboxSettings?.gondolin?.remote?.gateway?.hostnames?.[0]);
|
|
330
|
+
await gondolinGateway.start();
|
|
331
|
+
await gondolinFleet.reconcile();
|
|
332
|
+
setInterval(() => {
|
|
333
|
+
void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
|
|
334
|
+
void gondolinFleet.reconcile();
|
|
335
|
+
}, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
|
|
336
|
+
}
|
|
337
|
+
else if (sandbox.type === "gondolin") {
|
|
338
|
+
gondolinInventory.touchHeartbeat();
|
|
339
|
+
await gondolinInventory.reconcile();
|
|
340
|
+
setInterval(() => {
|
|
341
|
+
gondolinInventory.touchHeartbeat();
|
|
342
|
+
void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
|
|
343
|
+
void sweepUnadoptedGondolinWorkers();
|
|
344
|
+
}, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
|
|
278
345
|
}
|
|
279
346
|
const botsByPlatform = {};
|
|
280
347
|
/**
|
|
@@ -365,9 +432,11 @@ const sandboxDesc = sandbox.type === "host"
|
|
|
365
432
|
? `container:${sandbox.container}`
|
|
366
433
|
: sandbox.type === "image"
|
|
367
434
|
? `image:${sandbox.image}`
|
|
368
|
-
: sandbox.type === "
|
|
369
|
-
? `
|
|
370
|
-
:
|
|
435
|
+
: sandbox.type === "gondolin"
|
|
436
|
+
? `gondolin:${sandbox.profile}`
|
|
437
|
+
: sandbox.type === "firecracker"
|
|
438
|
+
? `firecracker:${sandbox.vmId}`
|
|
439
|
+
: `cloudflare:${sandbox.sandboxId}`;
|
|
371
440
|
log.logStartup(workingDir, sandboxDesc);
|
|
372
441
|
logHarnessStartupSummary();
|
|
373
442
|
/**
|
|
@@ -504,9 +573,8 @@ eventsWatcher.start();
|
|
|
504
573
|
// Handle shutdown
|
|
505
574
|
async function shutdown() {
|
|
506
575
|
await handler.shutdown();
|
|
507
|
-
if (sandbox.type === "agent-sandbox")
|
|
508
|
-
await shutdownAgentSandboxes();
|
|
509
576
|
eventsWatcher.stop();
|
|
577
|
+
await disconnectAllGondolinRuntimes();
|
|
510
578
|
await Sentry.close(5000);
|
|
511
579
|
process.exit(0);
|
|
512
580
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport \"./observability/instrument.js\";\n\nimport { join } from \"path\";\nimport { mkdirSync, statSync, writeFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join as pathJoin } from \"path\";\nimport type {\n MessagingBot,\n PlatformNotifier,\n PlatformReactor,\n PlatformUploader,\n} from \"./adapter.js\";\nimport { DiscordMessagingBot } from \"./adapters/discord/bot.js\";\nimport { GithubMessagingBot } from \"./adapters/github/bot.js\";\nimport { createGithubToolPack } from \"./adapters/github/tool-pack.js\";\nimport type { PlatformGithubOps } from \"./adapters/github/types.js\";\nimport { GcpTokenProvider } from \"./adapters/github/gcp-auth.js\";\nimport { TelegramMessagingBot } from \"./adapters/telegram/bot.js\";\nimport { SlackMessagingBot as SlackMessagingBotClass } from \"./adapters/slack/bot.js\";\nimport type { PlatformToolPackFactory } from \"./tools/types.js\";\nimport { downloadChannel } from \"./cli/download.js\";\nimport { EventsWatcher } from \"./events.js\";\nimport * as log from \"./log.js\";\nimport { startWebServer } from \"./web/server.js\";\nimport { InMemoryAdminTokenStore } from \"./web/admin/store.js\";\nimport { InMemoryLinkTokenStore } from \"./web/login/store.js\";\nimport { InMemorySessionViewTokenStore } from \"./web/session-view/store.js\";\nimport {\n configureAgentSandboxRuntime,\n shutdownAgentSandboxes,\n stopIdleAgentSandboxes,\n} from \"./sandbox/agent-sandbox.js\";\nimport { DockerContainerManager } from \"./provisioner.js\";\nimport {\n assertStateDirOutsideWorkspace,\n createGlobalSettingsFile,\n loadGlobalSettings,\n MissingGlobalSettingsError,\n resolveLinkBaseUrl,\n} from \"./config.js\";\nimport {\n configureHttpDispatcher,\n defaultAuthPath,\n defaultModelsJsonPath,\n parseHttpIdleTimeoutMs,\n} from \"./harness/index.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { readEnv, setEnvAliases } from \"./utils/env.js\";\nimport { ensureDirExists, isRecord, readJsonFileIfExists } from \"./utils/file-guards.js\";\nimport { SandboxError, validateSandbox } from \"./sandbox/index.js\";\nimport { helpText, resolveBoot, type BootPlan } from \"./cli/boot.js\";\nimport { envReport, noPlatformsMessage, platformIsActive } from \"./env-manifest.js\";\nimport { FileVaultManager } from \"./vault/index.js\";\nimport { runExtCommand } from \"./cli/ext.js\";\nimport { createConversationRuntime } from \"./runtime/conversation-runtime.js\";\nimport { ChannelStore } from \"./store.js\";\nimport * as Sentry from \"@sentry/node\";\n\nfunction getVersion(): string {\n // Try to find package.json in the dist directory or parent\n const possiblePaths = [\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"package.json\"),\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\"),\n pathJoin(process.cwd(), \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n const pkg = readJsonFileIfExists(\n pkgPath,\n (value): value is { version?: unknown } => isRecord(value),\n () => \"Ignoring package.json while resolving version\",\n );\n if (typeof pkg?.version === \"string\" && pkg.version) return pkg.version;\n }\n return \"unknown\";\n}\n\nconst SLACK_APP_TOKEN = readEnv(\"SLACK_APP_TOKEN\");\nconst SLACK_BOT_TOKEN = readEnv(\"SLACK_BOT_TOKEN\");\nconst TELEGRAM_BOT_TOKEN = readEnv(\"TELEGRAM_BOT_TOKEN\");\nconst DISCORD_BOT_TOKEN = readEnv(\"DISCORD_BOT_TOKEN\");\nconst GITHUB_APP_ID = readEnv(\"GITHUB_APP_ID\");\nconst GITHUB_APP_PRIVATE_KEY = readEnv(\"GITHUB_APP_PRIVATE_KEY\");\nconst GITHUB_APP_PRIVATE_KEY_PATH = readEnv(\"GITHUB_APP_PRIVATE_KEY_PATH\");\nconst GITHUB_INSTALLATION_ID = readEnv(\"GITHUB_INSTALLATION_ID\");\nconst GITHUB_REPOS = readEnv(\"GITHUB_REPOS\");\nconst GITHUB_POLL_INTERVAL = readEnv(\"GITHUB_POLL_INTERVAL\");\nconst GOOGLE_APPLICATION_CREDENTIALS = readEnv(\"GOOGLE_APPLICATION_CREDENTIALS\");\nconst GOOGLE_CLOUD_PROJECT = readEnv(\"GOOGLE_CLOUD_PROJECT\");\n// Externally-visible base URL of the link/OAuth server; the env read and\n// trailing-slash normalization live in config.resolveLinkBaseUrl.\nconst LINK_BASE_URL = resolveLinkBaseUrl();\nconst LINK_PORT_RAW = readEnv(\"LINK_PORT\");\nconst LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;\n\nconst WORLD_WRITABLE_MODE = 0o002;\n\nfunction ensureSecureStateDir(path: string): void {\n let stat;\n try {\n stat = statSync(path);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n mkdirSync(path, { recursive: true, mode: 0o700 });\n return;\n }\n console.error(`Error: cannot access --state-dir ${path}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!stat.isDirectory()) {\n console.error(`Error: --state-dir ${path} exists but is not a directory`);\n process.exit(1);\n }\n\n if (stat.mode & WORLD_WRITABLE_MODE) {\n console.error(\n `Error: --state-dir ${path} is world-writable (mode ${(stat.mode & 0o777).toString(8)}). ` +\n `Credentials stored there would be exposed to other local users. ` +\n `Fix with: chmod 0700 ${path}`,\n );\n process.exit(1);\n }\n\n const euid = typeof process.geteuid === \"function\" ? process.geteuid() : undefined;\n if (euid !== undefined && stat.uid !== euid) {\n console.error(\n `Error: --state-dir ${path} is owned by uid ${stat.uid} but mikan is running as uid ${euid}. ` +\n `Run mikan as the directory owner or point --state-dir at a directory you own.`,\n );\n process.exit(1);\n }\n}\n\nfunction handleStartupError(error: unknown): never {\n if (error instanceof SandboxError) {\n for (const line of error.formatForCli()) {\n console.error(line);\n }\n process.exit(1);\n }\n if (error instanceof MissingGlobalSettingsError) {\n console.error(`Missing global settings: ${error.settingsPath}`);\n console.error(\"\");\n console.error(\"Run onboarding to create it:\");\n console.error(` mikan --onboard --state-dir ${stateDir}`);\n console.error(\"\");\n console.error(\"Then review the generated settings.json and start mikan again.\");\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n console.error(String(error));\n process.exit(1);\n}\n\nlet plan: BootPlan;\ntry {\n plan = resolveBoot();\n} catch (error) {\n handleStartupError(error);\n}\n\n// `mikan ext …` manages extensions and exits; handle it before the normal\n// bot-mode startup (which requires platform tokens).\nif (plan.mode === \"ext\") {\n const code = await runExtCommand(plan.extArgs ?? []);\n process.exit(code);\n}\n\n// Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle\n// timeouts so a stalled LLM stream errors out instead of hanging a session.\nconst httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv(\"HTTP_IDLE_TIMEOUT\"));\nconfigureHttpDispatcher(httpIdleTimeoutMs);\n\nif (plan.mode === \"help\") {\n console.log(helpText());\n process.exit(0);\n}\n\nif (plan.mode === \"env\") {\n console.log(envReport());\n process.exit(0);\n}\n\nif (plan.mode === \"version\") {\n console.log(getVersion());\n process.exit(0);\n}\n\n// Handle --onboard mode\nif (plan.mode === \"onboard\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n try {\n const settingsPath = createGlobalSettingsFile(stateDir);\n console.log(`Created global settings at ${settingsPath}`);\n console.log(\n `Review the file, then start mikan (workspace defaults to ${join(stateDir, \"workspace\")}).`,\n );\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --download mode (Slack only)\nif (plan.mode === \"download\" && plan.downloadChannel) {\n if (!SLACK_BOT_TOKEN) {\n console.error(\"Missing env: SLACK_BOT_TOKEN\");\n process.exit(1);\n }\n await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);\n process.exit(0);\n}\n\n// Normal bot mode - working dir is optional and defaults under the state dir\nconst sandbox = plan.sandbox;\nconst stateDir = plan.stateDir;\nconst workingDir = plan.workingDir;\nsetEnvAliases(\"STATE_DIR\", stateDir);\nensureSecureStateDir(stateDir);\nif (!plan.workingDirExplicit) {\n ensureDirExists(workingDir);\n}\ntry {\n assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);\n} catch (error) {\n handleStartupError(error);\n}\n\n// Validate platform tokens — activation rules live in the env manifest.\nconst hasSlack = platformIsActive(\"slack\");\nconst hasTelegram = platformIsActive(\"telegram\");\nconst hasDiscord = platformIsActive(\"discord\");\nconst hasGithub = platformIsActive(\"github\");\n\nif (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {\n console.error(noPlatformsMessage());\n process.exit(1);\n}\n\ntry {\n await validateSandbox(sandbox);\n} catch (error) {\n handleStartupError(error);\n}\n\nconst vaultManager = new FileVaultManager(stateDir);\nif (vaultManager.isEnabled()) {\n console.log(\n sandbox.type === \"container\"\n ? \" Vault system enabled. Container vault active.\"\n : sandbox.type === \"image\" ||\n sandbox.type === \"agent-sandbox\" ||\n sandbox.type === \"cloudflare\"\n ? \" Vault system enabled. Conversation-scoped credential routing active.\"\n : \" Vault system enabled. Host mode will not inject vault env.\",\n );\n}\n\nconst startupConfig = (() => {\n try {\n return loadGlobalSettings();\n } catch (error) {\n handleStartupError(error);\n }\n})();\nconst sandboxSettings = startupConfig.sandbox;\nif (sandbox.type === \"agent-sandbox\") {\n const settings = sandboxSettings?.agentSandbox;\n if (!settings) {\n handleStartupError(\n new SandboxError(\n \"Error: agent-sandbox requires sandbox.agentSandbox settings with namespace and runtimeClassName\",\n ),\n );\n }\n configureAgentSandboxRuntime(settings);\n}\nconst sandboxLimits =\n sandboxSettings?.cpus || sandboxSettings?.memory\n ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }\n : undefined;\nconst sandboxBoostLimits =\n sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory\n ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }\n : undefined;\n\nconst provisioner =\n sandbox.type === \"image\"\n ? new DockerContainerManager(sandbox.image, {\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n })\n : undefined;\nconst resourceController = sandbox.type === \"image\" ? provisioner : undefined;\n\nif (sandbox.type === \"image\" || sandbox.type === \"agent-sandbox\") {\n ensureDirExists(join(workingDir, \"skills\"));\n ensureDirExists(join(workingDir, \"events\"));\n try {\n writeFileSync(join(workingDir, \"MEMORY.md\"), \"\", { flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n }\n}\n\nconst linkTokenStore = new InMemoryLinkTokenStore();\nconst sessionViewTokenStore = new InMemorySessionViewTokenStore();\nconst adminTokenStore = new InMemoryAdminTokenStore();\nsetInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();\n\nfunction portalBaseUrl(): string | undefined {\n if (LINK_BASE_URL) return LINK_BASE_URL;\n if (LINK_PORT) return `http://localhost:${LINK_PORT}`;\n return undefined;\n}\n/** Idle timeout for managed sandboxes (10 minutes) */\nconst MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;\n\nif (provisioner) {\n await provisioner.reconcile();\n await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\n\nif (sandbox.type === \"agent-sandbox\") {\n await stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => void stopIdleAgentSandboxes(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\nconst botsByPlatform: Record<string, MessagingBot> = {};\n\n/**\n * Resolve which platform bot to use: an explicit platform, or the sole\n * running one. Mirrors event-file platform resolution.\n */\nfunction resolvePlatformBot(op: string, platform: string | undefined): [string, MessagingBot] {\n const available = Object.keys(botsByPlatform);\n const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);\n const bot = key ? botsByPlatform[key] : undefined;\n if (!bot) {\n throw new Error(\n platform\n ? `${op}: unknown platform '${platform}' (available: ${available.join(\", \") || \"none\"})`\n : `${op}: multiple platforms active (${available.join(\", \")}); specify platform`,\n );\n }\n return [key!, bot];\n}\n\n/** Extension `api.notify` backend: post into a conversation without a run. */\nconst platformNotifier: PlatformNotifier = async (conversationId, text, platform) => {\n const [key, bot] = resolvePlatformBot(\"notify\", platform);\n await bot.postMessage(conversationId, text);\n log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);\n};\n\n/** Extension `api.react` backend: add a reaction to a message. */\nconst platformReactor: PlatformReactor = async (conversationId, messageTs, emoji, platform) => {\n const [key, bot] = resolvePlatformBot(\"react\", platform);\n if (!bot.addReaction) {\n throw new Error(`react: platform '${key}' does not support reactions`);\n }\n await bot.addReaction(conversationId, messageTs, emoji);\n log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);\n};\n\n/** Extension `api.uploadFile` backend: send a host file into a conversation. */\nconst platformUploader: PlatformUploader = async (conversationId, filePath, title, platform) => {\n const [key, bot] = resolvePlatformBot(\"upload\", platform);\n if (!bot.uploadFile) {\n throw new Error(`upload: platform '${key}' does not support file uploads`);\n }\n await bot.uploadFile(conversationId, filePath, title);\n log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);\n};\n\n/** github_* tool backends: PR push/create and CI checks, host-side. */\nfunction requireGithubBot(op: string): GithubMessagingBot {\n const bot = botsByPlatform.github as GithubMessagingBot | undefined;\n if (!bot) {\n throw new Error(`${op}: the GitHub platform is not running`);\n }\n return bot;\n}\n\n/**\n * Platform capability pack factories — only when the corresponding bot is\n * configured. Factories, not instances: each runner materializes its own\n * pack so per-run bind state never crosses conversations.\n */\nfunction buildPlatformToolPackFactories(): PlatformToolPackFactory[] {\n if (!hasGithub) return [];\n const platformGithubOps: PlatformGithubOps = {\n pushAndCreatePr: (conversationId, request) =>\n requireGithubBot(\"github_pr\").ops.pushAndCreatePr(conversationId, request),\n getChecks: (conversationId, branch) =>\n requireGithubBot(\"github_checks\").ops.getChecks(conversationId, branch),\n getJobLog: (conversationId, jobId) =>\n requireGithubBot(\"github_checks\").ops.getJobLog(conversationId, jobId),\n getBuildLog: (conversationId, buildId) =>\n requireGithubBot(\"github_checks\").ops.getBuildLog(conversationId, buildId),\n replyToReviewThread: (conversationId, commentId, body) =>\n requireGithubBot(\"github_review_reply\").ops.replyToReviewThread(\n conversationId,\n commentId,\n body,\n ),\n syncRepo: (conversationId, branch) =>\n requireGithubBot(\"github_sync\").ops.syncRepo(conversationId, branch),\n readGithub: (conversationId, request) =>\n requireGithubBot(\"github_read\").ops.readGithub(conversationId, request),\n manageIssue: (conversationId, request) =>\n requireGithubBot(\"github_issue\").ops.manageIssue(conversationId, request),\n };\n return [() => createGithubToolPack(platformGithubOps)];\n}\n\nconst handler = createConversationRuntime({\n workingDir,\n sandbox,\n vaultManager,\n provisioner,\n resourceController,\n linkTokenStore,\n sessionViewTokenStore,\n adminTokenStore,\n portalBaseUrl: portalBaseUrl(),\n platformNotifier,\n platformReactor,\n platformUploader,\n platformToolPackFactories: buildPlatformToolPackFactories(),\n});\n\nconst sandboxDesc =\n sandbox.type === \"host\"\n ? \"host\"\n : sandbox.type === \"container\"\n ? `container:${sandbox.container}`\n : sandbox.type === \"image\"\n ? `image:${sandbox.image}`\n : sandbox.type === \"agent-sandbox\"\n ? `agent-sandbox:${sandbox.warmpool}`\n : `cloudflare:${sandbox.sandboxId}`;\nlog.logStartup(workingDir, sandboxDesc);\nlogHarnessStartupSummary();\n\n/**\n * One-look confirmation of the harness runtime surface, aimed at upgrade\n * verification: config moved from ~/.pi to ~/.mikan with no fallback, so a\n * missing auth.json here is the first thing to check when runs fail.\n */\nfunction logHarnessStartupSummary(): void {\n const proxy =\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy;\n log.logInfo(\n `HTTP dispatcher: idle timeout ${httpIdleTimeoutMs}ms${proxy ? `, proxy ${proxy}` : \", no proxy\"}`,\n );\n\n const authPath = defaultAuthPath();\n if (existsSync(authPath)) {\n try {\n const providers = Object.keys(JSON.parse(readFileSync(authPath, \"utf-8\")) as object);\n log.logInfo(`Harness auth: ${authPath} (providers: ${providers.join(\", \") || \"none\"})`);\n } catch {\n log.logWarning(`Harness auth: ${authPath} exists but is not valid JSON`);\n }\n } else {\n log.logInfo(`Harness auth: ${authPath} missing — provider keys come from env vars only`);\n }\n\n const modelsPath = defaultModelsJsonPath();\n log.logInfo(\n existsSync(modelsPath)\n ? `Harness models.json: ${modelsPath}`\n : `Harness models.json: none (${modelsPath}) — built-in providers only`,\n );\n}\n\nif (hasSlack) {\n const slackMessagingBotToken = SLACK_BOT_TOKEN;\n const slackAppToken = SLACK_APP_TOKEN;\n if (!slackMessagingBotToken || !slackAppToken) {\n throw new Error(\"Slack startup requires both SLACK_APP_TOKEN and SLACK_BOT_TOKEN\");\n }\n const sharedStore = new ChannelStore({ workingDir, botToken: slackMessagingBotToken });\n const slackMessagingBot = new SlackMessagingBotClass(handler, {\n appToken: slackAppToken,\n botToken: slackMessagingBotToken,\n workingDir,\n store: sharedStore,\n });\n botsByPlatform.slack = slackMessagingBot;\n log.logInfo(\"Platform: Slack\");\n}\nif (hasTelegram) {\n const telegramToken = TELEGRAM_BOT_TOKEN;\n if (!telegramToken) {\n throw new Error(\"Telegram startup requires TELEGRAM_BOT_TOKEN\");\n }\n const telegramMessagingBot = new TelegramMessagingBot(handler, {\n token: telegramToken,\n workingDir,\n });\n botsByPlatform.telegram = telegramMessagingBot;\n log.logInfo(\"Platform: Telegram\");\n}\nif (hasDiscord) {\n const discordToken = DISCORD_BOT_TOKEN;\n if (!discordToken) {\n throw new Error(\"Discord startup requires DISCORD_BOT_TOKEN\");\n }\n const discordMessagingBot = new DiscordMessagingBot(handler, {\n token: discordToken,\n workingDir,\n });\n botsByPlatform.discord = discordMessagingBot;\n log.logInfo(\"Platform: Discord\");\n}\nif (hasGithub) {\n if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {\n throw new Error(\"GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID\");\n }\n // Env vars flatten PEM newlines to literal `\\n`; a key file avoids that.\n const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH\n ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, \"utf-8\")\n : GITHUB_APP_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!githubPrivateKey) {\n throw new Error(\n \"GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH\",\n );\n }\n const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;\n const githubMessagingBot = new GithubMessagingBot(handler, {\n appId: GITHUB_APP_ID,\n privateKey: githubPrivateKey,\n installationId: GITHUB_INSTALLATION_ID,\n repos: GITHUB_REPOS\n ? GITHUB_REPOS.split(\",\")\n .map((repo) => repo.trim())\n .filter(Boolean)\n : [],\n pollIntervalMs:\n (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *\n 1000,\n workingDir,\n syncStatePath: join(stateDir, \"github-sync.json\"),\n // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud\n // Build logs in github_checks; without them external CI degrades to\n // guidance text. Credentials never enter the sandbox.\n cloudBuild: GOOGLE_APPLICATION_CREDENTIALS\n ? {\n tokenProvider: new GcpTokenProvider({\n credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,\n }),\n projectFallback: GOOGLE_CLOUD_PROJECT,\n }\n : undefined,\n });\n botsByPlatform.github = githubMessagingBot;\n log.logInfo(\n `Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? \" (Cloud Build logs enabled)\" : \"\"}`,\n );\n}\n\nif (LINK_PORT) {\n startWebServer({\n port: LINK_PORT,\n linkTokenStore,\n vaultManager,\n notify: async (platform, conversationId, message) => {\n const bot = botsByPlatform[platform];\n if (bot) await bot.postMessage(conversationId, message);\n },\n sessionViewTokenStore,\n sessionViewInteractive: { handler, botsByPlatform },\n adminOptions: { adminTokenStore, workingDir, runtime: handler, sandbox, botsByPlatform },\n });\n}\n\n// Start events watcher with explicit platform routing\nconst eventsWatcher = new EventsWatcher(join(workingDir, \"events\"), botsByPlatform);\nconst slackMessagingBot = botsByPlatform.slack as SlackMessagingBotClass | undefined;\nif (slackMessagingBot) {\n slackMessagingBot.setEventsWatcher(eventsWatcher);\n}\neventsWatcher.start();\n\n// Handle shutdown\nasync function shutdown(): Promise<void> {\n await handler.shutdown();\n if (sandbox.type === \"agent-sandbox\") await shutdownAgentSandboxes();\n eventsWatcher.stop();\n await Sentry.close(5000);\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\n// Start all bots\nawait Promise.all(\n Object.values(botsByPlatform).map((bot) =>\n bot.start().catch((err) => {\n log.logWarning(\"Failed to start bot\", err instanceof Error ? err.message : String(err));\n process.exit(1);\n }),\n ),\n);\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport \"./observability/instrument.js\";\n\nimport { join } from \"path\";\nimport { mkdirSync, statSync, writeFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join as pathJoin } from \"path\";\nimport type {\n MessagingBot,\n PlatformNotifier,\n PlatformReactor,\n PlatformUploader,\n} from \"./adapter.js\";\nimport { DiscordMessagingBot } from \"./adapters/discord/bot.js\";\nimport { GithubMessagingBot } from \"./adapters/github/bot.js\";\nimport { createGithubToolPack } from \"./adapters/github/tool-pack.js\";\nimport type { PlatformGithubOps } from \"./adapters/github/types.js\";\nimport { GcpTokenProvider } from \"./adapters/github/gcp-auth.js\";\nimport { TelegramMessagingBot } from \"./adapters/telegram/bot.js\";\nimport { SlackMessagingBot as SlackMessagingBotClass } from \"./adapters/slack/bot.js\";\nimport type { PlatformToolPackFactory } from \"./tools/types.js\";\nimport { downloadChannel } from \"./cli/download.js\";\nimport { EventsWatcher } from \"./events.js\";\nimport * as log from \"./log.js\";\nimport { startWebServer } from \"./web/server.js\";\nimport { InMemoryAdminTokenStore } from \"./web/admin/store.js\";\nimport { InMemoryLinkTokenStore } from \"./web/login/store.js\";\nimport { InMemorySessionViewTokenStore } from \"./web/session-view/store.js\";\nimport { DockerContainerManager } from \"./provisioner.js\";\nimport {\n assertStateDirOutsideWorkspace,\n createGlobalSettingsFile,\n loadGlobalSettings,\n MissingGlobalSettingsError,\n resolveLinkBaseUrl,\n} from \"./config.js\";\nimport {\n configureHttpDispatcher,\n defaultAuthPath,\n defaultModelsJsonPath,\n parseHttpIdleTimeoutMs,\n} from \"./harness/index.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { readEnv, setEnvAliases } from \"./utils/env.js\";\nimport { ensureDirExists, isRecord, readJsonFileIfExists } from \"./utils/file-guards.js\";\nimport { SandboxError, validateSandbox } from \"./sandbox/index.js\";\nimport { helpText, resolveBoot, type BootPlan } from \"./cli/boot.js\";\nimport { envReport, noPlatformsMessage, platformIsActive } from \"./env-manifest.js\";\nimport {\n disconnectAllGondolinRuntimes,\n gondolinResources,\n stopIdleGondolinVms,\n sweepUnadoptedGondolinWorkers,\n} from \"./sandbox/gondolin.js\";\nimport { configureGondolinRuntime } from \"./sandbox/gondolin-bootstrap.js\";\nimport { gondolinInventory } from \"./sandbox/gondolin-inventory.js\";\nimport { gondolinFleet } from \"./sandbox/gondolin-fleet.js\";\nimport { gondolinGateway } from \"./sandbox/gondolin-gateway.js\";\nimport { gondolinJoin } from \"./sandbox/gondolin-join.js\";\nimport { checkWorkspaceExported } from \"./sandbox/gondolin-nfs-advisory.js\";\nimport { FileVaultManager } from \"./vault/index.js\";\nimport { runExtCommand } from \"./cli/ext.js\";\nimport { createConversationRuntime } from \"./runtime/conversation-runtime.js\";\nimport { ChannelStore } from \"./store.js\";\nimport * as Sentry from \"@sentry/node\";\n\nfunction getVersion(): string {\n // Try to find package.json in the dist directory or parent\n const possiblePaths = [\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"package.json\"),\n pathJoin(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\"),\n pathJoin(process.cwd(), \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n const pkg = readJsonFileIfExists(\n pkgPath,\n (value): value is { version?: unknown } => isRecord(value),\n () => \"Ignoring package.json while resolving version\",\n );\n if (typeof pkg?.version === \"string\" && pkg.version) return pkg.version;\n }\n return \"unknown\";\n}\n\nconst SLACK_APP_TOKEN = readEnv(\"SLACK_APP_TOKEN\");\nconst SLACK_BOT_TOKEN = readEnv(\"SLACK_BOT_TOKEN\");\nconst TELEGRAM_BOT_TOKEN = readEnv(\"TELEGRAM_BOT_TOKEN\");\nconst DISCORD_BOT_TOKEN = readEnv(\"DISCORD_BOT_TOKEN\");\nconst GITHUB_APP_ID = readEnv(\"GITHUB_APP_ID\");\nconst GITHUB_APP_PRIVATE_KEY = readEnv(\"GITHUB_APP_PRIVATE_KEY\");\nconst GITHUB_APP_PRIVATE_KEY_PATH = readEnv(\"GITHUB_APP_PRIVATE_KEY_PATH\");\nconst GITHUB_INSTALLATION_ID = readEnv(\"GITHUB_INSTALLATION_ID\");\nconst GITHUB_REPOS = readEnv(\"GITHUB_REPOS\");\nconst GITHUB_POLL_INTERVAL = readEnv(\"GITHUB_POLL_INTERVAL\");\nconst GOOGLE_APPLICATION_CREDENTIALS = readEnv(\"GOOGLE_APPLICATION_CREDENTIALS\");\nconst GOOGLE_CLOUD_PROJECT = readEnv(\"GOOGLE_CLOUD_PROJECT\");\n// Externally-visible base URL of the link/OAuth server; the env read and\n// trailing-slash normalization live in config.resolveLinkBaseUrl.\nconst LINK_BASE_URL = resolveLinkBaseUrl();\nconst LINK_PORT_RAW = readEnv(\"LINK_PORT\");\nconst LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;\n\nconst WORLD_WRITABLE_MODE = 0o002;\n\nfunction ensureSecureStateDir(path: string): void {\n let stat;\n try {\n stat = statSync(path);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n mkdirSync(path, { recursive: true, mode: 0o700 });\n return;\n }\n console.error(`Error: cannot access --state-dir ${path}: ${(err as Error).message}`);\n process.exit(1);\n }\n\n if (!stat.isDirectory()) {\n console.error(`Error: --state-dir ${path} exists but is not a directory`);\n process.exit(1);\n }\n\n if (stat.mode & WORLD_WRITABLE_MODE) {\n console.error(\n `Error: --state-dir ${path} is world-writable (mode ${(stat.mode & 0o777).toString(8)}). ` +\n `Credentials stored there would be exposed to other local users. ` +\n `Fix with: chmod 0700 ${path}`,\n );\n process.exit(1);\n }\n\n const euid = typeof process.geteuid === \"function\" ? process.geteuid() : undefined;\n if (euid !== undefined && stat.uid !== euid) {\n console.error(\n `Error: --state-dir ${path} is owned by uid ${stat.uid} but mikan is running as uid ${euid}. ` +\n `Run mikan as the directory owner or point --state-dir at a directory you own.`,\n );\n process.exit(1);\n }\n}\n\nfunction handleStartupError(error: unknown): never {\n if (error instanceof SandboxError) {\n for (const line of error.formatForCli()) {\n console.error(line);\n }\n process.exit(1);\n }\n if (error instanceof MissingGlobalSettingsError) {\n console.error(`Missing global settings: ${error.settingsPath}`);\n console.error(\"\");\n console.error(\"Run onboarding to create it:\");\n console.error(` mikan --onboard --state-dir ${stateDir}`);\n console.error(\"\");\n console.error(\"Then review the generated settings.json and start mikan again.\");\n process.exit(1);\n }\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n }\n console.error(String(error));\n process.exit(1);\n}\n\nlet plan: BootPlan;\ntry {\n plan = resolveBoot();\n} catch (error) {\n handleStartupError(error);\n}\n\n// `mikan ext …` manages extensions and exits; handle it before the normal\n// bot-mode startup (which requires platform tokens).\nif (plan.mode === \"ext\") {\n const code = await runExtCommand(plan.extArgs ?? []);\n process.exit(code);\n}\n\n// Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle\n// timeouts so a stalled LLM stream errors out instead of hanging a session.\nconst httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv(\"HTTP_IDLE_TIMEOUT\"));\nconfigureHttpDispatcher(httpIdleTimeoutMs);\n\nif (plan.mode === \"help\") {\n console.log(helpText());\n process.exit(0);\n}\n\nif (plan.mode === \"env\") {\n console.log(envReport());\n process.exit(0);\n}\n\nif (plan.mode === \"version\") {\n console.log(getVersion());\n process.exit(0);\n}\n\n// Handle --worker-token: mint a one-time join token for a dial-home worker\nif (plan.mode === \"worker-token\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n gondolinJoin.configure(join(stateDir, \"gondolin-gateway\"));\n try {\n let gatewayPort = 8433;\n let gatewayHost: string | undefined;\n try {\n const gateway = loadGlobalSettings().sandbox?.gondolin?.remote?.gateway;\n if (gateway) {\n gatewayPort = gateway.port;\n gatewayHost = gateway.hostnames?.[0];\n }\n } catch {\n // settings are optional for minting; the CA lives in the state dir\n }\n const minted = await gondolinJoin.mintToken();\n const host = gatewayHost ?? \"<mikan-host>\";\n console.log(\"Worker join token (single use, expires in 15 minutes):\");\n console.log(\"\");\n console.log(` mikan-worker join https://${host}:${gatewayPort} \\\\`);\n console.log(` --token ${minted.token} \\\\`);\n console.log(` --ca-pin ${minted.fingerprint} \\\\`);\n console.log(` --name <worker-name> --workspace-root <shared-workspace-path> \\\\`);\n console.log(` --worker-entry /opt/mikan/dist/sandbox/gondolin-worker-main.js`);\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --onboard mode\nif (plan.mode === \"onboard\") {\n const stateDir = plan.stateDir;\n setEnvAliases(\"STATE_DIR\", stateDir);\n ensureSecureStateDir(stateDir);\n try {\n const settingsPath = createGlobalSettingsFile(stateDir);\n console.log(`Created global settings at ${settingsPath}`);\n console.log(\n `Review the file, then start mikan (workspace defaults to ${join(stateDir, \"workspace\")}).`,\n );\n process.exit(0);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\n// Handle --download mode (Slack only)\nif (plan.mode === \"download\" && plan.downloadChannel) {\n if (!SLACK_BOT_TOKEN) {\n console.error(\"Missing env: SLACK_BOT_TOKEN\");\n process.exit(1);\n }\n await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);\n process.exit(0);\n}\n\n// Normal bot mode - working dir is optional and defaults under the state dir\nconst sandbox = plan.sandbox;\nconst stateDir = plan.stateDir;\nconst workingDir = plan.workingDir;\nsetEnvAliases(\"STATE_DIR\", stateDir);\nensureSecureStateDir(stateDir);\nif (!plan.workingDirExplicit) {\n ensureDirExists(workingDir);\n}\ntry {\n assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);\n} catch (error) {\n handleStartupError(error);\n}\n\n// Validate platform tokens — activation rules live in the env manifest.\nconst hasSlack = platformIsActive(\"slack\");\nconst hasTelegram = platformIsActive(\"telegram\");\nconst hasDiscord = platformIsActive(\"discord\");\nconst hasGithub = platformIsActive(\"github\");\n\nif (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {\n console.error(noPlatformsMessage());\n process.exit(1);\n}\n\ntry {\n await validateSandbox(sandbox);\n} catch (error) {\n handleStartupError(error);\n}\n\nconst vaultManager = new FileVaultManager(stateDir);\nif (vaultManager.isEnabled()) {\n console.log(\n sandbox.type === \"container\"\n ? \" Vault system enabled. Container vault active.\"\n : sandbox.type === \"image\" ||\n sandbox.type === \"gondolin\" ||\n sandbox.type === \"firecracker\" ||\n sandbox.type === \"cloudflare\"\n ? \" Vault system enabled. Conversation-scoped credential routing active.\"\n : \" Vault system enabled. Host mode will not inject vault env.\",\n );\n}\n\nconst startupConfig = (() => {\n try {\n return loadGlobalSettings();\n } catch (error) {\n handleStartupError(error);\n }\n})();\nconst sandboxSettings = startupConfig.sandbox;\nconst sandboxLimits =\n sandboxSettings?.cpus || sandboxSettings?.memory\n ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }\n : undefined;\nconst sandboxBoostLimits =\n sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory\n ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }\n : undefined;\n\nconst provisioner =\n sandbox.type === \"image\"\n ? new DockerContainerManager(sandbox.image, {\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n })\n : undefined;\nif (sandbox.type === \"gondolin\") {\n try {\n configureGondolinRuntime({\n stateDir,\n limits: sandboxLimits,\n boostLimits: sandboxBoostLimits,\n remote: sandboxSettings?.gondolin?.remote,\n requireRemote: sandbox.profile === \"remote\",\n });\n } catch (error) {\n handleStartupError(error);\n }\n}\nconst resourceController =\n sandbox.type === \"image\"\n ? provisioner\n : sandbox.type === \"gondolin\"\n ? gondolinResources\n : undefined;\n\nif (sandbox.type === \"image\" || sandbox.type === \"gondolin\") {\n ensureDirExists(join(workingDir, \"skills\"));\n ensureDirExists(join(workingDir, \"events\"));\n try {\n writeFileSync(join(workingDir, \"MEMORY.md\"), \"\", { flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n }\n}\n\nconst linkTokenStore = new InMemoryLinkTokenStore();\nconst sessionViewTokenStore = new InMemorySessionViewTokenStore();\nconst adminTokenStore = new InMemoryAdminTokenStore();\nsetInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();\nsetInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();\n\nfunction portalBaseUrl(): string | undefined {\n if (LINK_BASE_URL) return LINK_BASE_URL;\n if (LINK_PORT) return `http://localhost:${LINK_PORT}`;\n return undefined;\n}\n/** Idle timeout for managed sandboxes (10 minutes) */\nconst MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;\n\nif (provisioner) {\n await provisioner.reconcile();\n await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n setInterval(\n () => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS),\n MANAGED_SANDBOX_IDLE_TIMEOUT_MS,\n ).unref();\n}\n\nif (sandbox.type === \"gondolin\" && sandbox.profile === \"remote\") {\n checkWorkspaceExported(workingDir, sandboxSettings?.gondolin?.remote?.gateway?.hostnames?.[0]);\n await gondolinGateway.start();\n await gondolinFleet.reconcile();\n setInterval(() => {\n void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n void gondolinFleet.reconcile();\n }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();\n} else if (sandbox.type === \"gondolin\") {\n gondolinInventory.touchHeartbeat();\n await gondolinInventory.reconcile();\n setInterval(() => {\n gondolinInventory.touchHeartbeat();\n void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);\n void sweepUnadoptedGondolinWorkers();\n }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();\n}\nconst botsByPlatform: Record<string, MessagingBot> = {};\n\n/**\n * Resolve which platform bot to use: an explicit platform, or the sole\n * running one. Mirrors event-file platform resolution.\n */\nfunction resolvePlatformBot(op: string, platform: string | undefined): [string, MessagingBot] {\n const available = Object.keys(botsByPlatform);\n const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);\n const bot = key ? botsByPlatform[key] : undefined;\n if (!bot) {\n throw new Error(\n platform\n ? `${op}: unknown platform '${platform}' (available: ${available.join(\", \") || \"none\"})`\n : `${op}: multiple platforms active (${available.join(\", \")}); specify platform`,\n );\n }\n return [key!, bot];\n}\n\n/** Extension `api.notify` backend: post into a conversation without a run. */\nconst platformNotifier: PlatformNotifier = async (conversationId, text, platform) => {\n const [key, bot] = resolvePlatformBot(\"notify\", platform);\n await bot.postMessage(conversationId, text);\n log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);\n};\n\n/** Extension `api.react` backend: add a reaction to a message. */\nconst platformReactor: PlatformReactor = async (conversationId, messageTs, emoji, platform) => {\n const [key, bot] = resolvePlatformBot(\"react\", platform);\n if (!bot.addReaction) {\n throw new Error(`react: platform '${key}' does not support reactions`);\n }\n await bot.addReaction(conversationId, messageTs, emoji);\n log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);\n};\n\n/** Extension `api.uploadFile` backend: send a host file into a conversation. */\nconst platformUploader: PlatformUploader = async (conversationId, filePath, title, platform) => {\n const [key, bot] = resolvePlatformBot(\"upload\", platform);\n if (!bot.uploadFile) {\n throw new Error(`upload: platform '${key}' does not support file uploads`);\n }\n await bot.uploadFile(conversationId, filePath, title);\n log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);\n};\n\n/** github_* tool backends: PR push/create and CI checks, host-side. */\nfunction requireGithubBot(op: string): GithubMessagingBot {\n const bot = botsByPlatform.github as GithubMessagingBot | undefined;\n if (!bot) {\n throw new Error(`${op}: the GitHub platform is not running`);\n }\n return bot;\n}\n\n/**\n * Platform capability pack factories — only when the corresponding bot is\n * configured. Factories, not instances: each runner materializes its own\n * pack so per-run bind state never crosses conversations.\n */\nfunction buildPlatformToolPackFactories(): PlatformToolPackFactory[] {\n if (!hasGithub) return [];\n const platformGithubOps: PlatformGithubOps = {\n pushAndCreatePr: (conversationId, request) =>\n requireGithubBot(\"github_pr\").ops.pushAndCreatePr(conversationId, request),\n getChecks: (conversationId, branch) =>\n requireGithubBot(\"github_checks\").ops.getChecks(conversationId, branch),\n getJobLog: (conversationId, jobId) =>\n requireGithubBot(\"github_checks\").ops.getJobLog(conversationId, jobId),\n getBuildLog: (conversationId, buildId) =>\n requireGithubBot(\"github_checks\").ops.getBuildLog(conversationId, buildId),\n replyToReviewThread: (conversationId, commentId, body) =>\n requireGithubBot(\"github_review_reply\").ops.replyToReviewThread(\n conversationId,\n commentId,\n body,\n ),\n syncRepo: (conversationId, branch) =>\n requireGithubBot(\"github_sync\").ops.syncRepo(conversationId, branch),\n readGithub: (conversationId, request) =>\n requireGithubBot(\"github_read\").ops.readGithub(conversationId, request),\n manageIssue: (conversationId, request) =>\n requireGithubBot(\"github_issue\").ops.manageIssue(conversationId, request),\n };\n return [() => createGithubToolPack(platformGithubOps)];\n}\n\nconst handler = createConversationRuntime({\n workingDir,\n sandbox,\n vaultManager,\n provisioner,\n resourceController,\n linkTokenStore,\n sessionViewTokenStore,\n adminTokenStore,\n portalBaseUrl: portalBaseUrl(),\n platformNotifier,\n platformReactor,\n platformUploader,\n platformToolPackFactories: buildPlatformToolPackFactories(),\n});\n\nconst sandboxDesc =\n sandbox.type === \"host\"\n ? \"host\"\n : sandbox.type === \"container\"\n ? `container:${sandbox.container}`\n : sandbox.type === \"image\"\n ? `image:${sandbox.image}`\n : sandbox.type === \"gondolin\"\n ? `gondolin:${sandbox.profile}`\n : sandbox.type === \"firecracker\"\n ? `firecracker:${sandbox.vmId}`\n : `cloudflare:${sandbox.sandboxId}`;\nlog.logStartup(workingDir, sandboxDesc);\nlogHarnessStartupSummary();\n\n/**\n * One-look confirmation of the harness runtime surface, aimed at upgrade\n * verification: config moved from ~/.pi to ~/.mikan with no fallback, so a\n * missing auth.json here is the first thing to check when runs fail.\n */\nfunction logHarnessStartupSummary(): void {\n const proxy =\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy;\n log.logInfo(\n `HTTP dispatcher: idle timeout ${httpIdleTimeoutMs}ms${proxy ? `, proxy ${proxy}` : \", no proxy\"}`,\n );\n\n const authPath = defaultAuthPath();\n if (existsSync(authPath)) {\n try {\n const providers = Object.keys(JSON.parse(readFileSync(authPath, \"utf-8\")) as object);\n log.logInfo(`Harness auth: ${authPath} (providers: ${providers.join(\", \") || \"none\"})`);\n } catch {\n log.logWarning(`Harness auth: ${authPath} exists but is not valid JSON`);\n }\n } else {\n log.logInfo(`Harness auth: ${authPath} missing — provider keys come from env vars only`);\n }\n\n const modelsPath = defaultModelsJsonPath();\n log.logInfo(\n existsSync(modelsPath)\n ? `Harness models.json: ${modelsPath}`\n : `Harness models.json: none (${modelsPath}) — built-in providers only`,\n );\n}\n\nif (hasSlack) {\n const slackMessagingBotToken = SLACK_BOT_TOKEN;\n const slackAppToken = SLACK_APP_TOKEN;\n if (!slackMessagingBotToken || !slackAppToken) {\n throw new Error(\"Slack startup requires both SLACK_APP_TOKEN and SLACK_BOT_TOKEN\");\n }\n const sharedStore = new ChannelStore({ workingDir, botToken: slackMessagingBotToken });\n const slackMessagingBot = new SlackMessagingBotClass(handler, {\n appToken: slackAppToken,\n botToken: slackMessagingBotToken,\n workingDir,\n store: sharedStore,\n });\n botsByPlatform.slack = slackMessagingBot;\n log.logInfo(\"Platform: Slack\");\n}\nif (hasTelegram) {\n const telegramToken = TELEGRAM_BOT_TOKEN;\n if (!telegramToken) {\n throw new Error(\"Telegram startup requires TELEGRAM_BOT_TOKEN\");\n }\n const telegramMessagingBot = new TelegramMessagingBot(handler, {\n token: telegramToken,\n workingDir,\n });\n botsByPlatform.telegram = telegramMessagingBot;\n log.logInfo(\"Platform: Telegram\");\n}\nif (hasDiscord) {\n const discordToken = DISCORD_BOT_TOKEN;\n if (!discordToken) {\n throw new Error(\"Discord startup requires DISCORD_BOT_TOKEN\");\n }\n const discordMessagingBot = new DiscordMessagingBot(handler, {\n token: discordToken,\n workingDir,\n });\n botsByPlatform.discord = discordMessagingBot;\n log.logInfo(\"Platform: Discord\");\n}\nif (hasGithub) {\n if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {\n throw new Error(\"GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID\");\n }\n // Env vars flatten PEM newlines to literal `\\n`; a key file avoids that.\n const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH\n ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, \"utf-8\")\n : GITHUB_APP_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!githubPrivateKey) {\n throw new Error(\n \"GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH\",\n );\n }\n const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;\n const githubMessagingBot = new GithubMessagingBot(handler, {\n appId: GITHUB_APP_ID,\n privateKey: githubPrivateKey,\n installationId: GITHUB_INSTALLATION_ID,\n repos: GITHUB_REPOS\n ? GITHUB_REPOS.split(\",\")\n .map((repo) => repo.trim())\n .filter(Boolean)\n : [],\n pollIntervalMs:\n (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *\n 1000,\n workingDir,\n syncStatePath: join(stateDir, \"github-sync.json\"),\n // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud\n // Build logs in github_checks; without them external CI degrades to\n // guidance text. Credentials never enter the sandbox.\n cloudBuild: GOOGLE_APPLICATION_CREDENTIALS\n ? {\n tokenProvider: new GcpTokenProvider({\n credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,\n }),\n projectFallback: GOOGLE_CLOUD_PROJECT,\n }\n : undefined,\n });\n botsByPlatform.github = githubMessagingBot;\n log.logInfo(\n `Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? \" (Cloud Build logs enabled)\" : \"\"}`,\n );\n}\n\nif (LINK_PORT) {\n startWebServer({\n port: LINK_PORT,\n linkTokenStore,\n vaultManager,\n notify: async (platform, conversationId, message) => {\n const bot = botsByPlatform[platform];\n if (bot) await bot.postMessage(conversationId, message);\n },\n sessionViewTokenStore,\n sessionViewInteractive: { handler, botsByPlatform },\n adminOptions: { adminTokenStore, workingDir, runtime: handler, sandbox, botsByPlatform },\n });\n}\n\n// Start events watcher with explicit platform routing\nconst eventsWatcher = new EventsWatcher(join(workingDir, \"events\"), botsByPlatform);\nconst slackMessagingBot = botsByPlatform.slack as SlackMessagingBotClass | undefined;\nif (slackMessagingBot) {\n slackMessagingBot.setEventsWatcher(eventsWatcher);\n}\neventsWatcher.start();\n\n// Handle shutdown\nasync function shutdown(): Promise<void> {\n await handler.shutdown();\n eventsWatcher.stop();\n await disconnectAllGondolinRuntimes();\n await Sentry.close(5000);\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\n// Start all bots\nawait Promise.all(\n Object.values(botsByPlatform).map((bot) =>\n bot.start().catch((err) => {\n log.logWarning(\"Failed to start bot\", err instanceof Error ? err.message : String(err));\n process.exit(1);\n }),\n ),\n);\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ExecOptions, ExecResult, Executor, FirecrackerSandboxConfig, RuntimePathContext, SandboxAdapter } from "./types.js";
|
|
2
|
+
export declare class FirecrackerExecutor implements Executor {
|
|
3
|
+
private vmId;
|
|
4
|
+
private hostPath;
|
|
5
|
+
private sshUser;
|
|
6
|
+
private sshPort;
|
|
7
|
+
private env?;
|
|
8
|
+
constructor(vmId: string, hostPath: string, sshUser?: string, sshPort?: number, env?: Record<string, string> | undefined);
|
|
9
|
+
exec(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
10
|
+
readFile(path: string, options?: ExecOptions): Promise<string>;
|
|
11
|
+
readFileBase64(path: string, options?: ExecOptions): Promise<string>;
|
|
12
|
+
writeFile(path: string, content: string, options?: ExecOptions): Promise<void>;
|
|
13
|
+
getWorkspacePath(_hostPath: string): string;
|
|
14
|
+
getPathContext(hostWorkspaceRoot: string): RuntimePathContext;
|
|
15
|
+
getSandboxConfig(): FirecrackerSandboxConfig;
|
|
16
|
+
}
|
|
17
|
+
export declare const firecrackerSandboxAdapter: SandboxAdapter<FirecrackerSandboxConfig>;
|
|
18
|
+
//# sourceMappingURL=firecracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecracker.d.ts","sourceRoot":"","sources":["../../src/sandbox/firecracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AA2FpB,qBAAa,mBAAoB,YAAW,QAAQ;IAEhD,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,GAAG,CAAC;IALd,YACU,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAe,EACxB,OAAO,GAAE,MAAW,EACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EAClC;IAEE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAqGtE;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1C;IAED,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAK5D;IAED,gBAAgB,IAAI,wBAAwB,CAQ3C;CACF;AAgBD,eAAO,MAAM,yBAAyB,EAAE,cAAc,CAAC,wBAAwB,CAO9E,CAAC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { SandboxError } from "./errors.js";
|
|
3
|
+
import { HostExecutor } from "./host.js";
|
|
4
|
+
import { execReadFile, execReadFileBase64, execWriteFile, execSimple, killProcessTree, shellEscape, } from "./utils.js";
|
|
5
|
+
function parseFirecrackerSandboxArg(value) {
|
|
6
|
+
if (!value.startsWith("firecracker:")) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const arg = value.slice("firecracker:".length);
|
|
10
|
+
// Format: firecracker:<vm-id>:<host-path>[:<ssh-user>[:<ssh-port>]]
|
|
11
|
+
// Example: firecracker:vm1:/home/user/workspace
|
|
12
|
+
// firecracker:vm1:/home/user/workspace:root
|
|
13
|
+
// firecracker:vm1:/home/user/workspace:root:22
|
|
14
|
+
const parts = arg.split(":");
|
|
15
|
+
if (parts.length < 2) {
|
|
16
|
+
throw new SandboxError("Error: firecracker sandbox requires vm-id and host-path\n" +
|
|
17
|
+
"Usage: firecracker:<vm-id>:<host-path>[:<ssh-user>[:<ssh-port>]]\n" +
|
|
18
|
+
"Example: firecracker:vm1:/home/user/workspace");
|
|
19
|
+
}
|
|
20
|
+
const vmId = parts[0];
|
|
21
|
+
const hostPath = parts[1];
|
|
22
|
+
const sshUser = parts[2] || "root";
|
|
23
|
+
const sshPort = parts[3] ? parseInt(parts[3], 10) : 22;
|
|
24
|
+
if (!vmId || !hostPath) {
|
|
25
|
+
throw new SandboxError("Error: firecracker sandbox requires vm-id and host-path");
|
|
26
|
+
}
|
|
27
|
+
if (isNaN(sshPort) || sshPort <= 0 || sshPort > 65535) {
|
|
28
|
+
throw new SandboxError("Error: invalid SSH port");
|
|
29
|
+
}
|
|
30
|
+
return { type: "firecracker", vmId, hostPath, sshUser, sshPort };
|
|
31
|
+
}
|
|
32
|
+
async function validateFirecrackerSandbox(config) {
|
|
33
|
+
// Check if fc-agent or firecracker CLI is available
|
|
34
|
+
try {
|
|
35
|
+
await execSimple("fc-agent", ["--version"]);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Try alternative: firecracker
|
|
39
|
+
try {
|
|
40
|
+
await execSimple("firecracker", ["--version"]);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new SandboxError("Error: Firecracker tools (fc-agent or firecracker) not found in PATH", ["Install firecracker: https://github.com/firecracker-microvm/firecracker"]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Check if VM is running using fc-agent
|
|
47
|
+
try {
|
|
48
|
+
const result = await execSimple("fc-agent", ["status", config.vmId]);
|
|
49
|
+
if (!result.includes("running") && !result.includes("Running")) {
|
|
50
|
+
throw new SandboxError(`Error: Firecracker VM '${config.vmId}' is not running.`, [
|
|
51
|
+
`Start it with: fc-agent start ${config.vmId}`,
|
|
52
|
+
]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof SandboxError) {
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
// Try alternative: firecracker-ctl or direct check
|
|
60
|
+
try {
|
|
61
|
+
await execSimple("firecracker-ctl", ["status", config.vmId]);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
console.error(`Warning: Could not verify if VM '${config.vmId}' is running.`);
|
|
65
|
+
console.error("Make sure the VM is started before running mikan.");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Verify host path exists
|
|
69
|
+
try {
|
|
70
|
+
await execSimple("ls", ["-d", config.hostPath]);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw new SandboxError(`Error: Host path '${config.hostPath}' does not exist.`);
|
|
74
|
+
}
|
|
75
|
+
console.log(` Firecracker VM '${config.vmId}' configured with workspace '${config.hostPath}'.`);
|
|
76
|
+
}
|
|
77
|
+
export class FirecrackerExecutor {
|
|
78
|
+
constructor(vmId, hostPath, sshUser = "root", sshPort = 22, env) {
|
|
79
|
+
this.vmId = vmId;
|
|
80
|
+
this.hostPath = hostPath;
|
|
81
|
+
this.sshUser = sshUser;
|
|
82
|
+
this.sshPort = sshPort;
|
|
83
|
+
this.env = env;
|
|
84
|
+
}
|
|
85
|
+
async exec(command, options) {
|
|
86
|
+
if (!this.env || Object.keys(this.env).length === 0) {
|
|
87
|
+
const sshCmd = this.sshPort === 22
|
|
88
|
+
? `ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${this.sshUser}@${this.vmId} sh -c ${shellEscape(command)}`
|
|
89
|
+
: `ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -p ${this.sshPort} ${this.sshUser}@${this.vmId} sh -c ${shellEscape(command)}`;
|
|
90
|
+
const hostExecutor = new HostExecutor();
|
|
91
|
+
return hostExecutor.exec(sshCmd, options);
|
|
92
|
+
}
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const sshArgs = ["-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10"];
|
|
95
|
+
if (this.sshPort !== 22) {
|
|
96
|
+
sshArgs.push("-p", String(this.sshPort));
|
|
97
|
+
}
|
|
98
|
+
sshArgs.push(`${this.sshUser}@${this.vmId}`, "sh", "-se");
|
|
99
|
+
const child = spawn("ssh", sshArgs, {
|
|
100
|
+
detached: true,
|
|
101
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
102
|
+
});
|
|
103
|
+
let stdout = "";
|
|
104
|
+
let stderr = "";
|
|
105
|
+
let timedOut = false;
|
|
106
|
+
let settled = false;
|
|
107
|
+
const timeoutHandle = options?.timeout && options.timeout > 0
|
|
108
|
+
? setTimeout(() => {
|
|
109
|
+
timedOut = true;
|
|
110
|
+
if (child.pid)
|
|
111
|
+
killProcessTree(child.pid);
|
|
112
|
+
}, options.timeout * 1000)
|
|
113
|
+
: undefined;
|
|
114
|
+
const onAbort = () => {
|
|
115
|
+
if (child.pid)
|
|
116
|
+
killProcessTree(child.pid);
|
|
117
|
+
};
|
|
118
|
+
if (options?.signal) {
|
|
119
|
+
if (options.signal.aborted) {
|
|
120
|
+
onAbort();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
options.signal.addEventListener("abort", onAbort, { once: true });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
child.on("error", (error) => {
|
|
127
|
+
if (settled)
|
|
128
|
+
return;
|
|
129
|
+
settled = true;
|
|
130
|
+
if (timeoutHandle)
|
|
131
|
+
clearTimeout(timeoutHandle);
|
|
132
|
+
if (options?.signal) {
|
|
133
|
+
options.signal.removeEventListener("abort", onAbort);
|
|
134
|
+
}
|
|
135
|
+
reject(error);
|
|
136
|
+
});
|
|
137
|
+
child.stdout?.on("data", (data) => {
|
|
138
|
+
stdout += data.toString();
|
|
139
|
+
if (stdout.length > 10 * 1024 * 1024) {
|
|
140
|
+
stdout = stdout.slice(0, 10 * 1024 * 1024);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
child.stderr?.on("data", (data) => {
|
|
144
|
+
stderr += data.toString();
|
|
145
|
+
if (stderr.length > 10 * 1024 * 1024) {
|
|
146
|
+
stderr = stderr.slice(0, 10 * 1024 * 1024);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
child.stdin?.on("error", (error) => {
|
|
150
|
+
stderr += `${error.message}\n`;
|
|
151
|
+
});
|
|
152
|
+
child.stdin?.end(buildRemoteScript(command, this.env));
|
|
153
|
+
child.on("close", (code) => {
|
|
154
|
+
if (settled)
|
|
155
|
+
return;
|
|
156
|
+
settled = true;
|
|
157
|
+
if (timeoutHandle)
|
|
158
|
+
clearTimeout(timeoutHandle);
|
|
159
|
+
if (options?.signal) {
|
|
160
|
+
options.signal.removeEventListener("abort", onAbort);
|
|
161
|
+
}
|
|
162
|
+
if (options?.signal?.aborted) {
|
|
163
|
+
reject(new Error(`${stdout}\n${stderr}\nCommand aborted`.trim()));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (timedOut) {
|
|
167
|
+
reject(new Error(`${stdout}\n${stderr}\nCommand timed out after ${options?.timeout} seconds`.trim()));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
resolve({ stdout, stderr, code: code ?? 0 });
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
readFile(path, options) {
|
|
175
|
+
return execReadFile(this, path, options);
|
|
176
|
+
}
|
|
177
|
+
readFileBase64(path, options) {
|
|
178
|
+
return execReadFileBase64(this, path, options);
|
|
179
|
+
}
|
|
180
|
+
writeFile(path, content, options) {
|
|
181
|
+
return execWriteFile(this, path, content, options);
|
|
182
|
+
}
|
|
183
|
+
getWorkspacePath(_hostPath) {
|
|
184
|
+
return "/workspace";
|
|
185
|
+
}
|
|
186
|
+
getPathContext(hostWorkspaceRoot) {
|
|
187
|
+
return {
|
|
188
|
+
hostWorkspaceRoot,
|
|
189
|
+
runtimeWorkspaceRoot: "/workspace",
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
getSandboxConfig() {
|
|
193
|
+
return {
|
|
194
|
+
type: "firecracker",
|
|
195
|
+
vmId: this.vmId,
|
|
196
|
+
hostPath: this.hostPath,
|
|
197
|
+
sshUser: this.sshUser,
|
|
198
|
+
sshPort: this.sshPort,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function buildRemoteScript(command, env) {
|
|
203
|
+
const exports = env
|
|
204
|
+
? Object.entries(env)
|
|
205
|
+
.map(([key, value]) => {
|
|
206
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
|
|
207
|
+
throw new SandboxError(`Invalid environment variable name for firecracker: ${key}`);
|
|
208
|
+
}
|
|
209
|
+
return `export ${key}=${shellEscape(value)}`;
|
|
210
|
+
})
|
|
211
|
+
.join("\n") + "\n"
|
|
212
|
+
: "";
|
|
213
|
+
return `${exports}${command}\n`;
|
|
214
|
+
}
|
|
215
|
+
export const firecrackerSandboxAdapter = {
|
|
216
|
+
type: "firecracker",
|
|
217
|
+
credentials: { env: true, fileMounts: false },
|
|
218
|
+
parse: parseFirecrackerSandboxArg,
|
|
219
|
+
validate: validateFirecrackerSandbox,
|
|
220
|
+
createExecutor: (config, env) => new FirecrackerExecutor(config.vmId, config.hostPath, config.sshUser, config.sshPort, env),
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=firecracker.js.map
|