diff --git a/canvas/src/components/tabs/ConfigTab.tsx b/canvas/src/components/tabs/ConfigTab.tsx index 6563a621..645edc25 100644 --- a/canvas/src/components/tabs/ConfigTab.tsx +++ b/canvas/src/components/tabs/ConfigTab.tsx @@ -176,7 +176,7 @@ export function deriveProvidersFromModels(models: ModelSpec[]): string[] { // exactly the point of the platform adaptor. The deep `~/.hermes/ // config.yaml` on the container is a separate runtime-internal file, // not this one. -const RUNTIMES_WITH_OWN_CONFIG = new Set(["external", "kimi", "kimi-cli"]); +const RUNTIMES_WITH_OWN_CONFIG = new Set(["external", "kimi", "kimi-cli", "openclaw"]); const FALLBACK_RUNTIME_OPTIONS: RuntimeOption[] = [ { value: "", label: "LangGraph (default)", models: [], providers: [] }, diff --git a/canvas/src/lib/api.ts b/canvas/src/lib/api.ts index 3ae5f413..83c6b065 100644 --- a/canvas/src/lib/api.ts +++ b/canvas/src/lib/api.ts @@ -8,14 +8,18 @@ import { getTenantSlug } from "./tenant"; export const PLATFORM_URL = process.env.NEXT_PUBLIC_PLATFORM_URL ?? "http://localhost:8080"; -// 15s is long enough for slow CP queries but short enough that a -// hung backend doesn't leave the UI spinning forever. The abort -// propagates through AbortController so React components can observe -// the error and render a retry affordance. Callers that know the -// endpoint is intentionally slow (org import walks a tree of -// workspaces with server-side pacing) can pass `timeoutMs` to -// override. -const DEFAULT_TIMEOUT_MS = 15_000; +// 35s is long enough for the slowest server-side path (EIC SSH +// tunnel for tenant EC2 file operations, bounded server-side by +// `eicFileOpTimeout = 30 * time.Second` in +// workspace-server/internal/handlers/template_files_eic.go) so the +// canvas surfaces the server's real error instead of aborting first +// with a generic timeout. Shorter values caused "Save & Restart" to +// time out at the client before the backend returned its 5xx. The +// abort still propagates through AbortController so React components +// can render a retry affordance. Callers that know an endpoint is +// intentionally slow (org import walks a tree of workspaces with +// server-side pacing) can pass `timeoutMs` to override. +const DEFAULT_TIMEOUT_MS = 35_000; export interface RequestOptions { timeoutMs?: number;