@aiden-ade/sandbox-agent 0.1.59 → 0.1.60
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/dist/__tests__/binding-switch-git.test.d.ts +2 -0
- package/dist/__tests__/binding-switch-git.test.d.ts.map +1 -0
- package/dist/__tests__/binding-switch-git.test.js +610 -0
- package/dist/__tests__/binding-switch-git.test.js.map +1 -0
- package/dist/__tests__/cli-ensure-install.test.d.ts +2 -0
- package/dist/__tests__/cli-ensure-install.test.d.ts.map +1 -0
- package/dist/__tests__/cli-ensure-install.test.js +109 -0
- package/dist/__tests__/cli-ensure-install.test.js.map +1 -0
- package/dist/__tests__/cli-executable.test.d.ts +2 -0
- package/dist/__tests__/cli-executable.test.d.ts.map +1 -0
- package/dist/__tests__/cli-executable.test.js +129 -0
- package/dist/__tests__/cli-executable.test.js.map +1 -0
- package/dist/__tests__/cli-help.test.d.ts +2 -0
- package/dist/__tests__/cli-help.test.d.ts.map +1 -0
- package/dist/__tests__/cli-help.test.js +34 -0
- package/dist/__tests__/cli-help.test.js.map +1 -0
- package/dist/__tests__/computer-readiness.test.d.ts +2 -0
- package/dist/__tests__/computer-readiness.test.d.ts.map +1 -0
- package/dist/__tests__/computer-readiness.test.js +63 -0
- package/dist/__tests__/computer-readiness.test.js.map +1 -0
- package/dist/__tests__/core-agent-workflow-context.test.d.ts +2 -0
- package/dist/__tests__/core-agent-workflow-context.test.d.ts.map +1 -0
- package/dist/__tests__/core-agent-workflow-context.test.js +139 -0
- package/dist/__tests__/core-agent-workflow-context.test.js.map +1 -0
- package/dist/__tests__/daemon-reconcile-ask.test.d.ts +2 -0
- package/dist/__tests__/daemon-reconcile-ask.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-reconcile-ask.test.js +86 -0
- package/dist/__tests__/daemon-reconcile-ask.test.js.map +1 -0
- package/dist/__tests__/daemon-socket.integration.test.d.ts +2 -0
- package/dist/__tests__/daemon-socket.integration.test.d.ts.map +1 -0
- package/dist/__tests__/daemon-socket.integration.test.js +450 -0
- package/dist/__tests__/daemon-socket.integration.test.js.map +1 -0
- package/dist/__tests__/daemon.test.d.ts +2 -0
- package/dist/__tests__/daemon.test.d.ts.map +1 -0
- package/dist/__tests__/daemon.test.js +3975 -0
- package/dist/__tests__/daemon.test.js.map +1 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.d.ts +2 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.d.ts.map +1 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.js +129 -0
- package/dist/__tests__/ensure-shared-checkout-branch.test.js.map +1 -0
- package/dist/__tests__/event-outbox-persist-failure.test.d.ts +2 -0
- package/dist/__tests__/event-outbox-persist-failure.test.d.ts.map +1 -0
- package/dist/__tests__/event-outbox-persist-failure.test.js +84 -0
- package/dist/__tests__/event-outbox-persist-failure.test.js.map +1 -0
- package/dist/__tests__/event-outbox.test.d.ts +2 -0
- package/dist/__tests__/event-outbox.test.d.ts.map +1 -0
- package/dist/__tests__/event-outbox.test.js +256 -0
- package/dist/__tests__/event-outbox.test.js.map +1 -0
- package/dist/__tests__/fake-provider-cli.test.d.ts +2 -0
- package/dist/__tests__/fake-provider-cli.test.d.ts.map +1 -0
- package/dist/__tests__/fake-provider-cli.test.js +46 -0
- package/dist/__tests__/fake-provider-cli.test.js.map +1 -0
- package/dist/__tests__/generated-images.test.d.ts +2 -0
- package/dist/__tests__/generated-images.test.d.ts.map +1 -0
- package/dist/__tests__/generated-images.test.js +132 -0
- package/dist/__tests__/generated-images.test.js.map +1 -0
- package/dist/__tests__/lifecycle-logger.test.d.ts +2 -0
- package/dist/__tests__/lifecycle-logger.test.d.ts.map +1 -0
- package/dist/__tests__/lifecycle-logger.test.js +49 -0
- package/dist/__tests__/lifecycle-logger.test.js.map +1 -0
- package/dist/__tests__/local-skill-scan.test.d.ts +2 -0
- package/dist/__tests__/local-skill-scan.test.d.ts.map +1 -0
- package/dist/__tests__/local-skill-scan.test.js +91 -0
- package/dist/__tests__/local-skill-scan.test.js.map +1 -0
- package/dist/__tests__/local-workspace-migration.test.d.ts +2 -0
- package/dist/__tests__/local-workspace-migration.test.d.ts.map +1 -0
- package/dist/__tests__/local-workspace-migration.test.js +195 -0
- package/dist/__tests__/local-workspace-migration.test.js.map +1 -0
- package/dist/__tests__/mcp-inspect-timeout.test.d.ts +2 -0
- package/dist/__tests__/mcp-inspect-timeout.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-inspect-timeout.test.js +97 -0
- package/dist/__tests__/mcp-inspect-timeout.test.js.map +1 -0
- package/dist/__tests__/mcp-readiness.test.d.ts +2 -0
- package/dist/__tests__/mcp-readiness.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-readiness.test.js +267 -0
- package/dist/__tests__/mcp-readiness.test.js.map +1 -0
- package/dist/__tests__/mcp-registration-cli.test.d.ts +2 -0
- package/dist/__tests__/mcp-registration-cli.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-registration-cli.test.js +71 -0
- package/dist/__tests__/mcp-registration-cli.test.js.map +1 -0
- package/dist/__tests__/mcp-registration.test.d.ts +2 -0
- package/dist/__tests__/mcp-registration.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-registration.test.js +426 -0
- package/dist/__tests__/mcp-registration.test.js.map +1 -0
- package/dist/__tests__/model-scan-runner.test.d.ts +2 -0
- package/dist/__tests__/model-scan-runner.test.d.ts.map +1 -0
- package/dist/__tests__/model-scan-runner.test.js +67 -0
- package/dist/__tests__/model-scan-runner.test.js.map +1 -0
- package/dist/__tests__/network-diagnostics.test.d.ts +2 -0
- package/dist/__tests__/network-diagnostics.test.d.ts.map +1 -0
- package/dist/__tests__/network-diagnostics.test.js +26 -0
- package/dist/__tests__/network-diagnostics.test.js.map +1 -0
- package/dist/__tests__/observable-map.test.d.ts +2 -0
- package/dist/__tests__/observable-map.test.d.ts.map +1 -0
- package/dist/__tests__/observable-map.test.js +54 -0
- package/dist/__tests__/observable-map.test.js.map +1 -0
- package/dist/__tests__/provider-auth-preflight.test.d.ts +2 -0
- package/dist/__tests__/provider-auth-preflight.test.d.ts.map +1 -0
- package/dist/__tests__/provider-auth-preflight.test.js +123 -0
- package/dist/__tests__/provider-auth-preflight.test.js.map +1 -0
- package/dist/__tests__/provider-model-discovery.test.d.ts +2 -0
- package/dist/__tests__/provider-model-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/provider-model-discovery.test.js +472 -0
- package/dist/__tests__/provider-model-discovery.test.js.map +1 -0
- package/dist/__tests__/remove-worktrees-if-clean.test.d.ts +2 -0
- package/dist/__tests__/remove-worktrees-if-clean.test.d.ts.map +1 -0
- package/dist/__tests__/remove-worktrees-if-clean.test.js +221 -0
- package/dist/__tests__/remove-worktrees-if-clean.test.js.map +1 -0
- package/dist/__tests__/resume-fallback-env.test.d.ts +2 -0
- package/dist/__tests__/resume-fallback-env.test.d.ts.map +1 -0
- package/dist/__tests__/resume-fallback-env.test.js +28 -0
- package/dist/__tests__/resume-fallback-env.test.js.map +1 -0
- package/dist/__tests__/run-journal.test.d.ts +2 -0
- package/dist/__tests__/run-journal.test.d.ts.map +1 -0
- package/dist/__tests__/run-journal.test.js +121 -0
- package/dist/__tests__/run-journal.test.js.map +1 -0
- package/dist/__tests__/run-start-gate.test.d.ts +2 -0
- package/dist/__tests__/run-start-gate.test.d.ts.map +1 -0
- package/dist/__tests__/run-start-gate.test.js +29 -0
- package/dist/__tests__/run-start-gate.test.js.map +1 -0
- package/dist/__tests__/runtime-capabilities-sync.test.d.ts +2 -0
- package/dist/__tests__/runtime-capabilities-sync.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-capabilities-sync.test.js +66 -0
- package/dist/__tests__/runtime-capabilities-sync.test.js.map +1 -0
- package/dist/__tests__/runtime-config.test.d.ts +2 -0
- package/dist/__tests__/runtime-config.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-config.test.js +102 -0
- package/dist/__tests__/runtime-config.test.js.map +1 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.d.ts +2 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.js +159 -0
- package/dist/__tests__/runtime-presenter-heartbeat.test.js.map +1 -0
- package/dist/__tests__/sandbox-outbox.test.d.ts +2 -0
- package/dist/__tests__/sandbox-outbox.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox-outbox.test.js +214 -0
- package/dist/__tests__/sandbox-outbox.test.js.map +1 -0
- package/dist/__tests__/sandbox-workflow-context.test.d.ts +2 -0
- package/dist/__tests__/sandbox-workflow-context.test.d.ts.map +1 -0
- package/dist/__tests__/sandbox-workflow-context.test.js +396 -0
- package/dist/__tests__/sandbox-workflow-context.test.js.map +1 -0
- package/dist/__tests__/service-manager.test.d.ts +2 -0
- package/dist/__tests__/service-manager.test.d.ts.map +1 -0
- package/dist/__tests__/service-manager.test.js +50 -0
- package/dist/__tests__/service-manager.test.js.map +1 -0
- package/dist/__tests__/sleep-inhibitor.test.d.ts +2 -0
- package/dist/__tests__/sleep-inhibitor.test.d.ts.map +1 -0
- package/dist/__tests__/sleep-inhibitor.test.js +236 -0
- package/dist/__tests__/sleep-inhibitor.test.js.map +1 -0
- package/dist/__tests__/status-local-workspace.test.d.ts +2 -0
- package/dist/__tests__/status-local-workspace.test.d.ts.map +1 -0
- package/dist/__tests__/status-local-workspace.test.js +121 -0
- package/dist/__tests__/status-local-workspace.test.js.map +1 -0
- package/dist/__tests__/suspension-detector.test.d.ts +2 -0
- package/dist/__tests__/suspension-detector.test.d.ts.map +1 -0
- package/dist/__tests__/suspension-detector.test.js +112 -0
- package/dist/__tests__/suspension-detector.test.js.map +1 -0
- package/dist/__tests__/web-presenter-parent-events.test.d.ts +2 -0
- package/dist/__tests__/web-presenter-parent-events.test.d.ts.map +1 -0
- package/dist/__tests__/web-presenter-parent-events.test.js +130 -0
- package/dist/__tests__/web-presenter-parent-events.test.js.map +1 -0
- package/dist/__tests__/workspace-relocation.test.d.ts +2 -0
- package/dist/__tests__/workspace-relocation.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-relocation.test.js +66 -0
- package/dist/__tests__/workspace-relocation.test.js.map +1 -0
- package/dist/__tests__/workspace-run-lease.test.d.ts +2 -0
- package/dist/__tests__/workspace-run-lease.test.d.ts.map +1 -0
- package/dist/__tests__/workspace-run-lease.test.js +230 -0
- package/dist/__tests__/workspace-run-lease.test.js.map +1 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.d.ts +2 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.js +61 -0
- package/dist/__tests__/ws-client-heartbeat-volatile.test.js.map +1 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.d.ts +2 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.js +109 -0
- package/dist/__tests__/ws-client-heartbeat.integration.test.js.map +1 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.d.ts +2 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.d.ts.map +1 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.js +167 -0
- package/dist/__tests__/ws-client-user-message-ack.integration.test.js.map +1 -0
- package/dist/aiden-system-prompt.d.ts +6 -0
- package/dist/aiden-system-prompt.d.ts.map +1 -0
- package/dist/aiden-system-prompt.js +6 -0
- package/dist/aiden-system-prompt.js.map +1 -0
- package/dist/binding-switch-git.d.ts +26 -0
- package/dist/binding-switch-git.d.ts.map +1 -0
- package/dist/binding-switch-git.js +973 -0
- package/dist/binding-switch-git.js.map +1 -0
- package/dist/cli-ensure-install.d.ts +39 -0
- package/dist/cli-ensure-install.d.ts.map +1 -0
- package/dist/cli-ensure-install.js +133 -0
- package/dist/cli-ensure-install.js.map +1 -0
- package/dist/cli-executable.d.ts +97 -0
- package/dist/cli-executable.d.ts.map +1 -0
- package/dist/cli-executable.js +432 -0
- package/dist/cli-executable.js.map +1 -0
- package/dist/cli-help.d.ts +7 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +49 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/computer-readiness.d.ts +42 -0
- package/dist/computer-readiness.d.ts.map +1 -0
- package/dist/computer-readiness.js +191 -0
- package/dist/computer-readiness.js.map +1 -0
- package/dist/core-agent.d.ts +47 -0
- package/dist/core-agent.d.ts.map +1 -0
- package/dist/core-agent.js +364 -0
- package/dist/core-agent.js.map +1 -0
- package/dist/daemon.d.ts +392 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +4711 -0
- package/dist/daemon.js.map +1 -0
- package/dist/event-outbox.d.ts +83 -0
- package/dist/event-outbox.d.ts.map +1 -0
- package/dist/event-outbox.js +440 -0
- package/dist/event-outbox.js.map +1 -0
- package/dist/fake-provider-cli.d.ts +13 -0
- package/dist/fake-provider-cli.d.ts.map +1 -0
- package/dist/fake-provider-cli.js +53 -0
- package/dist/fake-provider-cli.js.map +1 -0
- package/dist/generated-images.d.ts +2 -0
- package/dist/generated-images.d.ts.map +1 -0
- package/dist/generated-images.js +2 -0
- package/dist/generated-images.js.map +1 -0
- package/dist/index.cjs +129 -29
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +209 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle-logger.d.ts +25 -0
- package/dist/lifecycle-logger.d.ts.map +1 -0
- package/dist/lifecycle-logger.js +73 -0
- package/dist/lifecycle-logger.js.map +1 -0
- package/dist/local-skill-scan.d.ts +21 -0
- package/dist/local-skill-scan.d.ts.map +1 -0
- package/dist/local-skill-scan.js +109 -0
- package/dist/local-skill-scan.js.map +1 -0
- package/dist/local-workspace-migration.d.ts +68 -0
- package/dist/local-workspace-migration.d.ts.map +1 -0
- package/dist/local-workspace-migration.js +157 -0
- package/dist/local-workspace-migration.js.map +1 -0
- package/dist/mcp-readiness.d.ts +59 -0
- package/dist/mcp-readiness.d.ts.map +1 -0
- package/dist/mcp-readiness.js +202 -0
- package/dist/mcp-readiness.js.map +1 -0
- package/dist/mcp-registration.d.ts +75 -0
- package/dist/mcp-registration.d.ts.map +1 -0
- package/dist/mcp-registration.js +563 -0
- package/dist/mcp-registration.js.map +1 -0
- package/dist/model-scan-runner.d.ts +15 -0
- package/dist/model-scan-runner.d.ts.map +1 -0
- package/dist/model-scan-runner.js +51 -0
- package/dist/model-scan-runner.js.map +1 -0
- package/dist/network-diagnostics.d.ts +8 -0
- package/dist/network-diagnostics.d.ts.map +1 -0
- package/dist/network-diagnostics.js +56 -0
- package/dist/network-diagnostics.js.map +1 -0
- package/dist/observable-map.d.ts +25 -0
- package/dist/observable-map.d.ts.map +1 -0
- package/dist/observable-map.js +42 -0
- package/dist/observable-map.js.map +1 -0
- package/dist/provider-auth-preflight.d.ts +22 -0
- package/dist/provider-auth-preflight.d.ts.map +1 -0
- package/dist/provider-auth-preflight.js +110 -0
- package/dist/provider-auth-preflight.js.map +1 -0
- package/dist/provider-model-discovery.d.ts +38 -0
- package/dist/provider-model-discovery.d.ts.map +1 -0
- package/dist/provider-model-discovery.js +519 -0
- package/dist/provider-model-discovery.js.map +1 -0
- package/dist/resume-fallback-env.d.ts +20 -0
- package/dist/resume-fallback-env.d.ts.map +1 -0
- package/dist/resume-fallback-env.js +30 -0
- package/dist/resume-fallback-env.js.map +1 -0
- package/dist/run-journal.d.ts +53 -0
- package/dist/run-journal.d.ts.map +1 -0
- package/dist/run-journal.js +193 -0
- package/dist/run-journal.js.map +1 -0
- package/dist/run-start-gate.d.ts +9 -0
- package/dist/run-start-gate.d.ts.map +1 -0
- package/dist/run-start-gate.js +24 -0
- package/dist/run-start-gate.js.map +1 -0
- package/dist/runtime-backends.d.ts +2 -0
- package/dist/runtime-backends.d.ts.map +1 -0
- package/dist/runtime-backends.js +2 -0
- package/dist/runtime-backends.js.map +1 -0
- package/dist/runtime-capabilities-sync.d.ts +33 -0
- package/dist/runtime-capabilities-sync.d.ts.map +1 -0
- package/dist/runtime-capabilities-sync.js +56 -0
- package/dist/runtime-capabilities-sync.js.map +1 -0
- package/dist/runtime-config.d.ts +24 -0
- package/dist/runtime-config.d.ts.map +1 -0
- package/dist/runtime-config.js +124 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/sandbox-outbox.d.ts +122 -0
- package/dist/sandbox-outbox.d.ts.map +1 -0
- package/dist/sandbox-outbox.js +180 -0
- package/dist/sandbox-outbox.js.map +1 -0
- package/dist/sandbox.d.ts +44 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +438 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/service-manager.d.ts +28 -0
- package/dist/service-manager.d.ts.map +1 -0
- package/dist/service-manager.js +259 -0
- package/dist/service-manager.js.map +1 -0
- package/dist/sleep-inhibitor.d.ts +111 -0
- package/dist/sleep-inhibitor.d.ts.map +1 -0
- package/dist/sleep-inhibitor.js +412 -0
- package/dist/sleep-inhibitor.js.map +1 -0
- package/dist/suspension-detector.d.ts +48 -0
- package/dist/suspension-detector.d.ts.map +1 -0
- package/dist/suspension-detector.js +89 -0
- package/dist/suspension-detector.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +15 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +50 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/web-presenter.d.ts +55 -0
- package/dist/web-presenter.d.ts.map +1 -0
- package/dist/web-presenter.js +265 -0
- package/dist/web-presenter.js.map +1 -0
- package/dist/workspace-relocation.d.ts +22 -0
- package/dist/workspace-relocation.d.ts.map +1 -0
- package/dist/workspace-relocation.js +90 -0
- package/dist/workspace-relocation.js.map +1 -0
- package/dist/workspace-run-lease.d.ts +97 -0
- package/dist/workspace-run-lease.d.ts.map +1 -0
- package/dist/workspace-run-lease.js +241 -0
- package/dist/workspace-run-lease.js.map +1 -0
- package/dist/ws-client.d.ts +194 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +282 -0
- package/dist/ws-client.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { classifyMcpCliInspection, getMcpCliInspectionPlan, } from "@alan-ai/agent-core";
|
|
6
|
+
import { alanMcpConfigFilesForBackend, buildAlanMcpServers, mergeAlanMcpCodexToml, mergeAlanMcpJsonConfig, stripCodexAlanMcpSection, } from "@alan-ai/shared/agent";
|
|
7
|
+
import { parse as parseToml } from "smol-toml";
|
|
8
|
+
import { getDaemonCliEnvironment, resolveBackendRuntimeCommand, runCliVersionProbeAsync, } from "./cli-executable.js";
|
|
9
|
+
const CONFIG_LOCK_STALE_MS = 30_000;
|
|
10
|
+
const CONFIG_LOCK_WAIT_MS = 2_000;
|
|
11
|
+
const CONFIG_LOCK_POLL_MS = 20;
|
|
12
|
+
/** Successful CLI inspect results are reused so consecutive sends do not re-run
|
|
13
|
+
* slow `cursor-agent mcp list` / `claude mcp list` probes on Electron main. */
|
|
14
|
+
const MCP_INSPECT_CACHE_TTL_MS = 60_000;
|
|
15
|
+
const mcpInspectCache = new Map();
|
|
16
|
+
function compactProviderVersion(output) {
|
|
17
|
+
const firstLine = output
|
|
18
|
+
.split(/\r?\n/)
|
|
19
|
+
.map((line) => line.trim())
|
|
20
|
+
.find(Boolean);
|
|
21
|
+
return firstLine?.slice(0, 120);
|
|
22
|
+
}
|
|
23
|
+
function mcpInspectCacheKey(backendKind, expectedUrl, home) {
|
|
24
|
+
return `${backendKind}::${expectedUrl}::${home}`;
|
|
25
|
+
}
|
|
26
|
+
function providerLoadStatusForBackend(backendKind) {
|
|
27
|
+
// Current CLI inspections parse human-readable display output. Even a clean
|
|
28
|
+
// result proves only that the provider can see an Alan config entry, not that
|
|
29
|
+
// it approved and loaded the tools for the upcoming prompt.
|
|
30
|
+
return getMcpCliInspectionPlan(backendKind) ? "indeterminate" : "unsupported";
|
|
31
|
+
}
|
|
32
|
+
/** Test-only: clear the successful-inspect cache between cases. */
|
|
33
|
+
export function __resetMcpInspectCache() {
|
|
34
|
+
mcpInspectCache.clear();
|
|
35
|
+
}
|
|
36
|
+
export const inspectAlanMcpThroughProviderCli = async (backendKind, expectedUrl, home) => {
|
|
37
|
+
const plan = getMcpCliInspectionPlan(backendKind);
|
|
38
|
+
if (!plan)
|
|
39
|
+
return { ok: true, verification: { method: "file" } };
|
|
40
|
+
const cacheKey = mcpInspectCacheKey(backendKind, expectedUrl, home);
|
|
41
|
+
const cached = mcpInspectCache.get(cacheKey);
|
|
42
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
43
|
+
return cached.result;
|
|
44
|
+
}
|
|
45
|
+
const env = {
|
|
46
|
+
...getDaemonCliEnvironment(),
|
|
47
|
+
HOME: home,
|
|
48
|
+
USERPROFILE: home,
|
|
49
|
+
};
|
|
50
|
+
const executable = resolveBackendRuntimeCommand(backendKind, env);
|
|
51
|
+
const command = [plan.command, ...plan.args].join(" ");
|
|
52
|
+
if (!executable) {
|
|
53
|
+
const classification = classifyMcpCliInspection(plan, {
|
|
54
|
+
status: null,
|
|
55
|
+
stdout: "",
|
|
56
|
+
stderr: "",
|
|
57
|
+
error: new Error("provider CLI unavailable"),
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
issue: classification.ok ? undefined : classification.issue,
|
|
62
|
+
verification: { method: "cli", command },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Must stay async: desktop embeds this daemon in Electron main, and
|
|
66
|
+
// `cursor-agent mcp list` / `claude mcp list` commonly take 3–5s (they probe
|
|
67
|
+
// every configured MCP server). spawnSync freezes the whole Alan UI.
|
|
68
|
+
const versionProbe = await runCliVersionProbeAsync(executable, env);
|
|
69
|
+
if (versionProbe.error || versionProbe.status !== 0) {
|
|
70
|
+
const classification = classifyMcpCliInspection(plan, {
|
|
71
|
+
status: versionProbe.status,
|
|
72
|
+
stdout: "",
|
|
73
|
+
stderr: "",
|
|
74
|
+
error: versionProbe.error ?? new Error("provider version unavailable"),
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
ok: false,
|
|
78
|
+
issue: classification.ok ? undefined : classification.issue,
|
|
79
|
+
verification: { method: "cli", command },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const providerVersion = compactProviderVersion(versionProbe.stdout);
|
|
83
|
+
// The MCP inspection command (`mcp list` / `mcp get alan`) is network-bound, not
|
|
84
|
+
// a quick `--version`: cursor-agent/codex probe EVERY configured MCP server with
|
|
85
|
+
// a live connection attempt. A user with several slow or unreachable third-party
|
|
86
|
+
// servers (unrelated to Alan) can push it well past the 3s version-probe budget,
|
|
87
|
+
// so give it a generous, env-tunable window.
|
|
88
|
+
const inspectTimeoutMs = Number(process.env.ALAN_MCP_INSPECT_TIMEOUT_MS) || 20_000;
|
|
89
|
+
const probe = await runCliVersionProbeAsync(executable, env, plan.args, inspectTimeoutMs);
|
|
90
|
+
// A probe TIMEOUT is not proof the Alan tools are missing — it usually means an
|
|
91
|
+
// UNRELATED MCP server was slow. Treating it as a hard failure kills a healthy
|
|
92
|
+
// run whose Alan config is already written and verified at the file level. So on
|
|
93
|
+
// a timeout (spawn killed by SIGTERM with a null exit code), fall back to the
|
|
94
|
+
// file-level registration check instead of rejecting the run. A definitive
|
|
95
|
+
// result (non-zero exit, or a clean list that omits Alan) still fails as before.
|
|
96
|
+
const timedOut = probe.status === null &&
|
|
97
|
+
(probe.signal === "SIGTERM" ||
|
|
98
|
+
probe.error?.code === "ETIMEDOUT");
|
|
99
|
+
if (timedOut) {
|
|
100
|
+
// File-only verification: pass a no-op inspector so verifyAlanMcpRegistered
|
|
101
|
+
// checks config presence + a usable Alan URL WITHOUT re-spawning the CLI
|
|
102
|
+
// (which would just time out again on the same slow unrelated servers).
|
|
103
|
+
const fileCheck = await verifyAlanMcpRegistered(backendKind, home, async () => ({
|
|
104
|
+
ok: true,
|
|
105
|
+
verification: { method: "file" },
|
|
106
|
+
}));
|
|
107
|
+
console.warn("[alan-agent] MCP CLI inspection timed out; falling back to file check", {
|
|
108
|
+
backendKind,
|
|
109
|
+
command,
|
|
110
|
+
inspectTimeoutMs,
|
|
111
|
+
fileOk: fileCheck.ok,
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
ok: fileCheck.ok,
|
|
115
|
+
issue: fileCheck.ok
|
|
116
|
+
? undefined
|
|
117
|
+
: {
|
|
118
|
+
code: "provider_mcp_repair_required",
|
|
119
|
+
command,
|
|
120
|
+
message: `Alan tools could not be verified for ${plan.providerLabel}. Repair Alan tools, then retry.`,
|
|
121
|
+
},
|
|
122
|
+
verification: { method: "file", command, providerVersion },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const classification = classifyMcpCliInspection(plan, {
|
|
126
|
+
status: probe.status,
|
|
127
|
+
stdout: probe.stdout,
|
|
128
|
+
stderr: probe.stderr,
|
|
129
|
+
error: probe.error,
|
|
130
|
+
}, expectedUrl, providerVersion);
|
|
131
|
+
const result = {
|
|
132
|
+
ok: classification.ok,
|
|
133
|
+
issue: classification.ok ? undefined : classification.issue,
|
|
134
|
+
verification: { method: "cli", command, providerVersion },
|
|
135
|
+
};
|
|
136
|
+
if (result.ok) {
|
|
137
|
+
mcpInspectCache.set(cacheKey, {
|
|
138
|
+
expiresAt: Date.now() + MCP_INSPECT_CACHE_TTL_MS,
|
|
139
|
+
result,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
};
|
|
144
|
+
async function waitForConfigLock(lockPath) {
|
|
145
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
146
|
+
const startedAt = Date.now();
|
|
147
|
+
while (true) {
|
|
148
|
+
try {
|
|
149
|
+
mkdirSync(lockPath);
|
|
150
|
+
return () => rmSync(lockPath, { recursive: true, force: true });
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
|
|
154
|
+
if (code !== "EEXIST")
|
|
155
|
+
throw error;
|
|
156
|
+
try {
|
|
157
|
+
if (Date.now() - statSync(lockPath).mtimeMs > CONFIG_LOCK_STALE_MS) {
|
|
158
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (Date.now() - startedAt >= CONFIG_LOCK_WAIT_MS) {
|
|
166
|
+
throw new Error(`Alan could not safely update ${lockPath.slice(0, -".alan-lock".length)}`);
|
|
167
|
+
}
|
|
168
|
+
// Non-blocking async sleep — Atomics.wait stalls Electron main (desktop
|
|
169
|
+
// embeds this daemon in-process) and was the other half of the beachball.
|
|
170
|
+
await new Promise((resolve) => setTimeout(resolve, CONFIG_LOCK_POLL_MS));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function saveMalformedBackup(path, content) {
|
|
175
|
+
const hash = createHash("sha256").update(content).digest("hex").slice(0, 12);
|
|
176
|
+
const backupPath = `${path}.alan-backup-${hash}`;
|
|
177
|
+
if (!existsSync(backupPath))
|
|
178
|
+
copyFileSync(path, backupPath);
|
|
179
|
+
return backupPath;
|
|
180
|
+
}
|
|
181
|
+
function parseJsonObject(path, content) {
|
|
182
|
+
try {
|
|
183
|
+
const parsed = JSON.parse(content);
|
|
184
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Report one actionable error below after retaining an exact backup.
|
|
190
|
+
}
|
|
191
|
+
const backupPath = saveMalformedBackup(path, content);
|
|
192
|
+
throw new Error(`Existing config is malformed; no changes were applied. Review the backup at ${backupPath}`);
|
|
193
|
+
}
|
|
194
|
+
function mergeJsonConfig(path, existingContent, desiredContent) {
|
|
195
|
+
// A freshly-created provider config may exist as a zero-byte placeholder.
|
|
196
|
+
// Treat whitespace-only content as an absent config so the first Alan MCP
|
|
197
|
+
// registration can initialize it; non-empty malformed files still fail
|
|
198
|
+
// closed and retain their reviewable backup.
|
|
199
|
+
const normalizedExisting = existingContent?.trim() ? existingContent : null;
|
|
200
|
+
if (normalizedExisting !== null) {
|
|
201
|
+
// Validate + backup before merge (shared helper would otherwise throw without backup).
|
|
202
|
+
parseJsonObject(path, normalizedExisting);
|
|
203
|
+
}
|
|
204
|
+
return mergeAlanMcpJsonConfig(normalizedExisting, desiredContent);
|
|
205
|
+
}
|
|
206
|
+
function assertValidExistingToml(path, content) {
|
|
207
|
+
try {
|
|
208
|
+
const parsed = parseToml(content);
|
|
209
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Report one actionable error below after retaining an exact backup.
|
|
214
|
+
}
|
|
215
|
+
const backupPath = saveMalformedBackup(path, content);
|
|
216
|
+
throw new Error(`Existing config is malformed; no changes were applied. Review the backup at ${backupPath}`);
|
|
217
|
+
}
|
|
218
|
+
function mergeCodexAlanSection(path, existingContent, desiredContent) {
|
|
219
|
+
if (existingContent === null || existingContent.trim() === "")
|
|
220
|
+
return desiredContent;
|
|
221
|
+
assertValidExistingToml(path, existingContent);
|
|
222
|
+
const merged = mergeAlanMcpCodexToml(existingContent, desiredContent);
|
|
223
|
+
try {
|
|
224
|
+
parseToml(merged);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
throw new Error(`Alan could not safely merge ${path}; no changes were applied`);
|
|
228
|
+
}
|
|
229
|
+
return merged;
|
|
230
|
+
}
|
|
231
|
+
function atomicWriteManagedConfig(path, content) {
|
|
232
|
+
const pendingPath = `${path}.alan-pending-${process.pid}-${randomBytes(6).toString("hex")}`;
|
|
233
|
+
try {
|
|
234
|
+
writeFileSync(pendingPath, content, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
235
|
+
renameSync(pendingPath, path);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
rmSync(pendingPath, { force: true });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Ensure the Alan MCP server is registered in the config files the given CLI
|
|
243
|
+
* backend reads, BEFORE the CLI is spawned. This is the sandbox agent's own
|
|
244
|
+
* responsibility on every run — provision-time injection alone goes stale.
|
|
245
|
+
* Current APIs provide a run-lifecycle broker reference; older APIs may still
|
|
246
|
+
* provide direct headers, so this renderer intentionally supports both during
|
|
247
|
+
* rollout.
|
|
248
|
+
*
|
|
249
|
+
* Files whose top-level JSON carries other CLI state (e.g. ~/.claude.json) are
|
|
250
|
+
* merged on the MCP key rather than clobbered.
|
|
251
|
+
*/
|
|
252
|
+
export async function ensureAlanMcpRegistered(backendKind, registration, home = homedir(), inspectCli = inspectAlanMcpThroughProviderCli) {
|
|
253
|
+
try {
|
|
254
|
+
const mcpServers = buildAlanMcpServers(registration);
|
|
255
|
+
const files = alanMcpConfigFilesForBackend(backendKind, mcpServers, home);
|
|
256
|
+
const paths = [];
|
|
257
|
+
for (const file of files) {
|
|
258
|
+
mkdirSync(dirname(file.path), { recursive: true });
|
|
259
|
+
const releaseLock = await waitForConfigLock(`${file.path}.alan-lock`);
|
|
260
|
+
try {
|
|
261
|
+
const current = existsSync(file.path) ? readFileSync(file.path, "utf8") : null;
|
|
262
|
+
const content = file.path.endsWith(".toml")
|
|
263
|
+
? mergeCodexAlanSection(file.path, current, file.content)
|
|
264
|
+
: mergeJsonConfig(file.path, current, file.content);
|
|
265
|
+
if (current !== content)
|
|
266
|
+
atomicWriteManagedConfig(file.path, content);
|
|
267
|
+
paths.push(file.path);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
releaseLock();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Read back the complete effective registration. A URL-only check can pass
|
|
274
|
+
// with a missing or stale run-reference header, which leaves the provider
|
|
275
|
+
// configured but unable to authenticate any Alan tool call.
|
|
276
|
+
const fileOk = paths.length > 0 &&
|
|
277
|
+
paths.every((p) => registrationsMatch(readAlanMcpRegistration(p), registration));
|
|
278
|
+
if (!fileOk) {
|
|
279
|
+
const issue = {
|
|
280
|
+
code: "mcp_config_repair_required",
|
|
281
|
+
message: "Alan tools configuration is missing or incompatible. Repair Alan tools, then retry.",
|
|
282
|
+
};
|
|
283
|
+
return { ok: false, paths, error: issue.message, issue };
|
|
284
|
+
}
|
|
285
|
+
if (inspectCli !== inspectAlanMcpThroughProviderCli) {
|
|
286
|
+
const inspection = await inspectCli(backendKind, registration.url, home);
|
|
287
|
+
if (!inspection.ok) {
|
|
288
|
+
return {
|
|
289
|
+
ok: false,
|
|
290
|
+
paths,
|
|
291
|
+
error: inspection.issue?.message ?? "Alan tools could not be verified",
|
|
292
|
+
issue: inspection.issue,
|
|
293
|
+
verification: inspection.verification,
|
|
294
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
ok: true,
|
|
299
|
+
paths,
|
|
300
|
+
verification: inspection.verification,
|
|
301
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
void Promise.resolve(inspectCli(backendKind, registration.url, home)).then((inspection) => {
|
|
305
|
+
if (!inspection.ok) {
|
|
306
|
+
console.warn("[alan-agent] Background MCP CLI inspection failed after file registration", {
|
|
307
|
+
backendKind,
|
|
308
|
+
error: inspection.issue?.message ?? "unknown",
|
|
309
|
+
command: inspection.verification.command,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}, (err) => {
|
|
313
|
+
console.warn("[alan-agent] Background MCP CLI inspection errored", err);
|
|
314
|
+
});
|
|
315
|
+
return {
|
|
316
|
+
ok: true,
|
|
317
|
+
paths,
|
|
318
|
+
verification: { method: "file" },
|
|
319
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
return { ok: false, paths: [], error: err instanceof Error ? err.message : String(err) };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* When a run arrives WITHOUT per-run MCP config (older API), verify that the
|
|
328
|
+
* provision-time registration actually exists for this backend so a missing
|
|
329
|
+
* config surfaces as a loud warning instead of a silently toolless agent.
|
|
330
|
+
*/
|
|
331
|
+
export async function verifyAlanMcpRegistered(backendKind, home = homedir(), inspectCli = inspectAlanMcpThroughProviderCli) {
|
|
332
|
+
const files = alanMcpConfigFilesForBackend(backendKind, {}, home);
|
|
333
|
+
const missing = files.map((f) => f.path).filter((p) => !existsSync(p));
|
|
334
|
+
const presentEntries = files
|
|
335
|
+
.map((file) => ({
|
|
336
|
+
path: file.path,
|
|
337
|
+
registration: existsSync(file.path) ? readAlanMcpRegistration(file.path) : null,
|
|
338
|
+
}))
|
|
339
|
+
.filter((entry) => existsSync(entry.path));
|
|
340
|
+
let invalid = presentEntries
|
|
341
|
+
.filter((entry) => !entry.registration || !hasUsableRegistrationCredential(entry.registration.headers))
|
|
342
|
+
.map((entry) => entry.path);
|
|
343
|
+
const registrationKeys = new Set(presentEntries.flatMap((entry) => entry.registration ? [registrationComparisonKey(entry.registration)] : []));
|
|
344
|
+
if (registrationKeys.size > 1)
|
|
345
|
+
invalid = presentEntries.map((entry) => entry.path);
|
|
346
|
+
if (missing.length > 0 || invalid.length > 0) {
|
|
347
|
+
const issue = {
|
|
348
|
+
code: "mcp_config_repair_required",
|
|
349
|
+
message: "Alan tools configuration is missing or incompatible. Repair Alan tools, then retry.",
|
|
350
|
+
};
|
|
351
|
+
return { ok: false, missing, invalid, error: issue.message, issue };
|
|
352
|
+
}
|
|
353
|
+
const expectedUrl = presentEntries.find((entry) => entry.registration)?.registration?.url;
|
|
354
|
+
if (!expectedUrl) {
|
|
355
|
+
const issue = {
|
|
356
|
+
code: "mcp_config_repair_required",
|
|
357
|
+
message: "Alan tools configuration is missing or incompatible. Repair Alan tools, then retry.",
|
|
358
|
+
};
|
|
359
|
+
return { ok: false, missing, invalid, error: issue.message, issue };
|
|
360
|
+
}
|
|
361
|
+
// Same hot-path rule as ensure: file presence + usable URL is enough to start.
|
|
362
|
+
// Custom inspectors (tests / timeout fallback) still await CLI verification.
|
|
363
|
+
if (inspectCli !== inspectAlanMcpThroughProviderCli) {
|
|
364
|
+
const inspection = await inspectCli(backendKind, expectedUrl, home);
|
|
365
|
+
return inspection.ok
|
|
366
|
+
? {
|
|
367
|
+
ok: true,
|
|
368
|
+
missing,
|
|
369
|
+
invalid,
|
|
370
|
+
verification: inspection.verification,
|
|
371
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
372
|
+
}
|
|
373
|
+
: {
|
|
374
|
+
ok: false,
|
|
375
|
+
missing,
|
|
376
|
+
invalid,
|
|
377
|
+
error: inspection.issue?.message ?? "Alan tools could not be verified",
|
|
378
|
+
issue: inspection.issue,
|
|
379
|
+
verification: inspection.verification,
|
|
380
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
void Promise.resolve(inspectCli(backendKind, expectedUrl, home)).then((inspection) => {
|
|
384
|
+
if (!inspection.ok) {
|
|
385
|
+
console.warn("[alan-agent] Background MCP CLI inspection failed during verify", {
|
|
386
|
+
backendKind,
|
|
387
|
+
error: inspection.issue?.message ?? "unknown",
|
|
388
|
+
command: inspection.verification.command,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}, (err) => {
|
|
392
|
+
console.warn("[alan-agent] Background MCP CLI inspection errored during verify", err);
|
|
393
|
+
});
|
|
394
|
+
return {
|
|
395
|
+
ok: true,
|
|
396
|
+
missing,
|
|
397
|
+
invalid,
|
|
398
|
+
verification: { method: "file" },
|
|
399
|
+
providerLoadStatus: providerLoadStatusForBackend(backendKind),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/** Remove the `alan` server key from a JSON CLI config, preserving every other
|
|
403
|
+
* server and all unrelated top-level state. The server is nested under either
|
|
404
|
+
* `mcpServers` (Claude/Cursor/Factory/Antigravity) or `mcp` (opencode). */
|
|
405
|
+
function removeAlanFromJsonConfig(path, existingContent) {
|
|
406
|
+
const config = parseJsonObject(path, existingContent);
|
|
407
|
+
for (const containerKey of ["mcpServers", "mcp"]) {
|
|
408
|
+
const container = config[containerKey];
|
|
409
|
+
if (container && typeof container === "object" && !Array.isArray(container)) {
|
|
410
|
+
delete container.alan;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return JSON.stringify(config);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Remove the per-run Alan MCP entry from the CLI config files a backend reads.
|
|
417
|
+
* Symmetric counterpart to {@link ensureAlanMcpRegistered}: registration writes
|
|
418
|
+
* a run-scoped `x-alan-run-reference` into shared config (e.g. `~/.claude.json`),
|
|
419
|
+
* so once no run needs it the entry MUST be removed — otherwise the now-inactive
|
|
420
|
+
* reference lingers and every later local CLI session fails to connect with
|
|
421
|
+
* `401 Inactive MCP run reference`. Best-effort and never throws: a failure to
|
|
422
|
+
* clean one file is logged via the returned `errors` and the next run's
|
|
423
|
+
* registration overwrites the entry regardless.
|
|
424
|
+
*/
|
|
425
|
+
export async function unregisterAlanMcp(backendKind, home = homedir()) {
|
|
426
|
+
const removedPaths = [];
|
|
427
|
+
const errors = [];
|
|
428
|
+
// Server map is irrelevant for removal — we only need the per-backend paths.
|
|
429
|
+
const files = alanMcpConfigFilesForBackend(backendKind, {}, home);
|
|
430
|
+
for (const file of files) {
|
|
431
|
+
if (!existsSync(file.path))
|
|
432
|
+
continue;
|
|
433
|
+
const releaseLock = await waitForConfigLock(`${file.path}.alan-lock`);
|
|
434
|
+
try {
|
|
435
|
+
const current = readFileSync(file.path, "utf8");
|
|
436
|
+
let next;
|
|
437
|
+
if (file.path.endsWith(".toml")) {
|
|
438
|
+
const stripped = stripCodexAlanMcpSection(current);
|
|
439
|
+
next = stripped ? `${stripped}\n` : "";
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
next = removeAlanFromJsonConfig(file.path, current);
|
|
443
|
+
}
|
|
444
|
+
if (next !== current) {
|
|
445
|
+
atomicWriteManagedConfig(file.path, next);
|
|
446
|
+
removedPaths.push(file.path);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
errors.push(err instanceof Error ? err.message : String(err));
|
|
451
|
+
}
|
|
452
|
+
finally {
|
|
453
|
+
releaseLock();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return { removedPaths, errors };
|
|
457
|
+
}
|
|
458
|
+
function isHttpUrl(value) {
|
|
459
|
+
if (typeof value !== "string")
|
|
460
|
+
return false;
|
|
461
|
+
try {
|
|
462
|
+
const url = new URL(value);
|
|
463
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Read a header table back out of a provider config.
|
|
471
|
+
*
|
|
472
|
+
* An absent table reads as `{}` rather than a parse failure, mirroring the
|
|
473
|
+
* writers: `buildAlanMcpServers` omits the header key entirely when there are
|
|
474
|
+
* no headers, so treating "absent" as malformed would make such a registration
|
|
475
|
+
* fail the readback of the very file it just wrote correctly.
|
|
476
|
+
*/
|
|
477
|
+
function readStringHeaders(value) {
|
|
478
|
+
if (value === undefined)
|
|
479
|
+
return {};
|
|
480
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
481
|
+
return null;
|
|
482
|
+
const entries = Object.entries(value);
|
|
483
|
+
if (entries.some((entry) => typeof entry[1] !== "string"))
|
|
484
|
+
return null;
|
|
485
|
+
return Object.fromEntries(entries);
|
|
486
|
+
}
|
|
487
|
+
function normalizeHttpUrl(value) {
|
|
488
|
+
if (!isHttpUrl(value))
|
|
489
|
+
return null;
|
|
490
|
+
return new URL(value).href;
|
|
491
|
+
}
|
|
492
|
+
function registrationComparisonKey(registration) {
|
|
493
|
+
return JSON.stringify({
|
|
494
|
+
url: normalizeHttpUrl(registration.url),
|
|
495
|
+
headers: Object.entries(registration.headers).sort(([a], [b]) => a.localeCompare(b)),
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
function registrationsMatch(actual, expected) {
|
|
499
|
+
return (actual !== null && registrationComparisonKey(actual) === registrationComparisonKey(expected));
|
|
500
|
+
}
|
|
501
|
+
function hasUsableRegistrationCredential(headers) {
|
|
502
|
+
const normalized = new Map(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value.trim()]));
|
|
503
|
+
return Boolean(normalized.get("x-alan-run-reference") || normalized.get("authorization"));
|
|
504
|
+
}
|
|
505
|
+
/** Parse the complete effective Alan registration from a provider config file. */
|
|
506
|
+
export function readAlanMcpRegistration(path) {
|
|
507
|
+
const content = readFileSync(path, "utf8");
|
|
508
|
+
if (path.endsWith(".toml")) {
|
|
509
|
+
try {
|
|
510
|
+
const parsed = parseToml(content);
|
|
511
|
+
const servers = parsed.mcp_servers;
|
|
512
|
+
if (!servers || typeof servers !== "object" || Array.isArray(servers))
|
|
513
|
+
return null;
|
|
514
|
+
const alan = servers.alan;
|
|
515
|
+
if (!alan || typeof alan !== "object" || Array.isArray(alan))
|
|
516
|
+
return null;
|
|
517
|
+
const server = alan;
|
|
518
|
+
const url = normalizeHttpUrl(server.url);
|
|
519
|
+
const headers = readStringHeaders(server.http_headers);
|
|
520
|
+
return url && headers ? { url, headers } : null;
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
try {
|
|
527
|
+
const parsed = JSON.parse(content);
|
|
528
|
+
const collectionKey = path.endsWith("/.config/opencode/opencode.json") ? "mcp" : "mcpServers";
|
|
529
|
+
const collection = parsed?.[collectionKey];
|
|
530
|
+
if (!collection || typeof collection !== "object" || Array.isArray(collection))
|
|
531
|
+
return null;
|
|
532
|
+
const alan = collection.alan;
|
|
533
|
+
if (!alan || typeof alan !== "object" || Array.isArray(alan))
|
|
534
|
+
return null;
|
|
535
|
+
const server = alan;
|
|
536
|
+
const headers = readStringHeaders(server.headers);
|
|
537
|
+
if (!headers)
|
|
538
|
+
return null;
|
|
539
|
+
if (path.endsWith("/.config/opencode/opencode.json")) {
|
|
540
|
+
const url = server.type === "remote" ? normalizeHttpUrl(server.url) : null;
|
|
541
|
+
return url ? { url, headers } : null;
|
|
542
|
+
}
|
|
543
|
+
if (path.endsWith("/.factory/mcp.json")) {
|
|
544
|
+
const url = server.type === "http" && server.disabled !== true ? normalizeHttpUrl(server.url) : null;
|
|
545
|
+
return url ? { url, headers } : null;
|
|
546
|
+
}
|
|
547
|
+
if (path.endsWith("/.gemini/settings.json") ||
|
|
548
|
+
path.endsWith("/antigravity-cli/settings.json")) {
|
|
549
|
+
const url = normalizeHttpUrl(server.httpUrl);
|
|
550
|
+
return url ? { url, headers } : null;
|
|
551
|
+
}
|
|
552
|
+
if (path.endsWith("/.gemini/config/mcp_config.json")) {
|
|
553
|
+
const url = normalizeHttpUrl(server.serverUrl);
|
|
554
|
+
return url ? { url, headers } : null;
|
|
555
|
+
}
|
|
556
|
+
const url = server.type === "http" ? normalizeHttpUrl(server.url) : null;
|
|
557
|
+
return url ? { url, headers } : null;
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
return null;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=mcp-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registration.js","sourceRoot":"","sources":["../src/mcp-registration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type RuntimeCapabilitiesPayload } from "./runtime-capabilities-sync.js";
|
|
2
|
+
export interface RuntimeModelScanContext {
|
|
3
|
+
refreshModels: () => Promise<void>;
|
|
4
|
+
getCapabilities: () => RuntimeCapabilitiesPayload;
|
|
5
|
+
getBaseMetadata: () => Promise<Record<string, unknown>>;
|
|
6
|
+
publishCredentials?: {
|
|
7
|
+
apiUrl: string;
|
|
8
|
+
runtimeId: string;
|
|
9
|
+
runtimeToken: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function runRuntimeModelScan(context: RuntimeModelScanContext, options?: {
|
|
13
|
+
force?: boolean;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=model-scan-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-scan-runner.d.ts","sourceRoot":"","sources":["../src/model-scan-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,0BAA0B,EAEhC,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,eAAe,EAAE,MAAM,0BAA0B,CAAC;IAClD,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,kBAAkB,CAAC,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { buildModelsScanMetadata, getModelScanInFlight, publishRuntimeCapabilities, setModelScanInFlight, } from "./runtime-capabilities-sync.js";
|
|
2
|
+
export async function runRuntimeModelScan(context, options) {
|
|
3
|
+
if (!options?.force) {
|
|
4
|
+
const inFlight = getModelScanInFlight();
|
|
5
|
+
if (inFlight)
|
|
6
|
+
return inFlight;
|
|
7
|
+
}
|
|
8
|
+
const scan = (async () => {
|
|
9
|
+
const pendingMetadata = {
|
|
10
|
+
...(await context.getBaseMetadata()),
|
|
11
|
+
...buildModelsScanMetadata("pending"),
|
|
12
|
+
};
|
|
13
|
+
await publishRuntimeCapabilities({
|
|
14
|
+
capabilities: context.getCapabilities(),
|
|
15
|
+
metadata: pendingMetadata,
|
|
16
|
+
...context.publishCredentials,
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
await context.refreshModels();
|
|
20
|
+
const completeMetadata = {
|
|
21
|
+
...(await context.getBaseMetadata()),
|
|
22
|
+
...buildModelsScanMetadata("complete"),
|
|
23
|
+
};
|
|
24
|
+
await publishRuntimeCapabilities({
|
|
25
|
+
capabilities: context.getCapabilities(),
|
|
26
|
+
metadata: completeMetadata,
|
|
27
|
+
...context.publishCredentials,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32
|
+
const failedMetadata = {
|
|
33
|
+
...(await context.getBaseMetadata()),
|
|
34
|
+
...buildModelsScanMetadata("failed", message),
|
|
35
|
+
};
|
|
36
|
+
await publishRuntimeCapabilities({
|
|
37
|
+
capabilities: context.getCapabilities(),
|
|
38
|
+
metadata: failedMetadata,
|
|
39
|
+
...context.publishCredentials,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
})();
|
|
43
|
+
setModelScanInFlight(scan);
|
|
44
|
+
try {
|
|
45
|
+
await scan;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
setModelScanInFlight(null);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=model-scan-runner.js.map
|