diff --git a/apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift b/apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift index 3ca98cbbb..114091b1f 100644 --- a/apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift +++ b/apps/macos/Sources/ClawdbotProtocol/GatewayModels.swift @@ -760,6 +760,10 @@ public struct SessionsPatchParams: Codable, Sendable { public let reasoninglevel: AnyCodable? public let responseusage: AnyCodable? public let elevatedlevel: AnyCodable? + public let exechost: AnyCodable? + public let execsecurity: AnyCodable? + public let execask: AnyCodable? + public let execnode: AnyCodable? public let model: AnyCodable? public let spawnedby: AnyCodable? public let sendpolicy: AnyCodable? @@ -773,6 +777,10 @@ public struct SessionsPatchParams: Codable, Sendable { reasoninglevel: AnyCodable?, responseusage: AnyCodable?, elevatedlevel: AnyCodable?, + exechost: AnyCodable?, + execsecurity: AnyCodable?, + execask: AnyCodable?, + execnode: AnyCodable?, model: AnyCodable?, spawnedby: AnyCodable?, sendpolicy: AnyCodable?, @@ -785,6 +793,10 @@ public struct SessionsPatchParams: Codable, Sendable { self.reasoninglevel = reasoninglevel self.responseusage = responseusage self.elevatedlevel = elevatedlevel + self.exechost = exechost + self.execsecurity = execsecurity + self.execask = execask + self.execnode = execnode self.model = model self.spawnedby = spawnedby self.sendpolicy = sendpolicy @@ -798,6 +810,10 @@ public struct SessionsPatchParams: Codable, Sendable { case reasoninglevel = "reasoningLevel" case responseusage = "responseUsage" case elevatedlevel = "elevatedLevel" + case exechost = "execHost" + case execsecurity = "execSecurity" + case execask = "execAsk" + case execnode = "execNode" case model case spawnedby = "spawnedBy" case sendpolicy = "sendPolicy" diff --git a/src/agents/bootstrap-files.test.ts b/src/agents/bootstrap-files.test.ts index 272389118..cdd9efed5 100644 --- a/src/agents/bootstrap-files.test.ts +++ b/src/agents/bootstrap-files.test.ts @@ -2,10 +2,7 @@ import path from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { - resolveBootstrapContextForRun, - resolveBootstrapFilesForRun, -} from "./bootstrap-files.js"; +import { resolveBootstrapContextForRun, resolveBootstrapFilesForRun } from "./bootstrap-files.js"; import { makeTempWorkspace } from "../test-helpers/workspace.js"; import { clearInternalHooks, diff --git a/src/auto-reply/reply/directive-handling.impl.ts b/src/auto-reply/reply/directive-handling.impl.ts index 4d9321114..0189be238 100644 --- a/src/auto-reply/reply/directive-handling.impl.ts +++ b/src/auto-reply/reply/directive-handling.impl.ts @@ -1,4 +1,8 @@ -import { resolveAgentConfig, resolveAgentDir, resolveSessionAgentId } from "../../agents/agent-scope.js"; +import { + resolveAgentConfig, + resolveAgentDir, + resolveSessionAgentId, +} from "../../agents/agent-scope.js"; import type { ModelAliasIndex } from "../../agents/model-selection.js"; import { resolveSandboxRuntimeStatus } from "../../agents/sandbox.js"; import type { ClawdbotConfig } from "../../config/config.js"; @@ -50,9 +54,7 @@ function resolveExecDefaults(params: { (globalExec?.ask as ExecAsk | undefined) ?? "on-miss", node: - (params.sessionEntry?.execNode as string | undefined) ?? - agentExec?.node ?? - globalExec?.node, + (params.sessionEntry?.execNode as string | undefined) ?? agentExec?.node ?? globalExec?.node, }; } diff --git a/src/auto-reply/reply/exec/directive.ts b/src/auto-reply/reply/exec/directive.ts index 1e177ab7d..0356530db 100644 --- a/src/auto-reply/reply/exec/directive.ts +++ b/src/auto-reply/reply/exec/directive.ts @@ -20,13 +20,15 @@ type ExecDirectiveParse = { function normalizeExecHost(value?: string): ExecHost | undefined { const normalized = value?.trim().toLowerCase(); - if (normalized === "sandbox" || normalized === "gateway" || normalized === "node") return normalized; + if (normalized === "sandbox" || normalized === "gateway" || normalized === "node") + return normalized; return undefined; } function normalizeExecSecurity(value?: string): ExecSecurity | undefined { const normalized = value?.trim().toLowerCase(); - if (normalized === "deny" || normalized === "allowlist" || normalized === "full") return normalized; + if (normalized === "deny" || normalized === "allowlist" || normalized === "full") + return normalized; return undefined; } @@ -38,7 +40,10 @@ function normalizeExecAsk(value?: string): ExecAsk | undefined { return undefined; } -function parseExecDirectiveArgs(raw: string): Omit & { +function parseExecDirectiveArgs(raw: string): Omit< + ExecDirectiveParse, + "cleaned" | "hasDirective" +> & { consumed: number; } { let i = 0; @@ -76,8 +81,7 @@ function parseExecDirectiveArgs(raw: string): Omit { const eq = token.indexOf("="); const colon = token.indexOf(":"); - const idx = - eq === -1 ? colon : colon === -1 ? eq : Math.min(eq, colon); + const idx = eq === -1 ? colon : colon === -1 ? eq : Math.min(eq, colon); if (idx === -1) return null; const key = token.slice(0, idx).trim().toLowerCase(); const value = token.slice(idx + 1).trim(); diff --git a/src/auto-reply/reply/get-reply-directives.ts b/src/auto-reply/reply/get-reply-directives.ts index 13a1a6a73..bbdf033cc 100644 --- a/src/auto-reply/reply/get-reply-directives.ts +++ b/src/auto-reply/reply/get-reply-directives.ts @@ -66,9 +66,11 @@ function resolveExecOverrides(params: { directives: InlineDirectives; sessionEntry?: SessionEntry; }): ExecOverrides | undefined { - const host = params.directives.execHost ?? (params.sessionEntry?.execHost as ExecOverrides["host"]); + const host = + params.directives.execHost ?? (params.sessionEntry?.execHost as ExecOverrides["host"]); const security = - params.directives.execSecurity ?? (params.sessionEntry?.execSecurity as ExecOverrides["security"]); + params.directives.execSecurity ?? + (params.sessionEntry?.execSecurity as ExecOverrides["security"]); const ask = params.directives.execAsk ?? (params.sessionEntry?.execAsk as ExecOverrides["ask"]); const node = params.directives.execNode ?? params.sessionEntry?.execNode; if (!host && !security && !ask && !node) return undefined; diff --git a/src/gateway/openai-http.e2e.test.ts b/src/gateway/openai-http.e2e.test.ts index 08dc11bbc..022b384f6 100644 --- a/src/gateway/openai-http.e2e.test.ts +++ b/src/gateway/openai-http.e2e.test.ts @@ -340,8 +340,8 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { expect(res.status).toBe(200); const [opts] = agentCommand.mock.calls[0] ?? []; - const extraSystemPrompt = (opts as { extraSystemPrompt?: string } | undefined) - ?.extraSystemPrompt ?? ""; + const extraSystemPrompt = + (opts as { extraSystemPrompt?: string } | undefined)?.extraSystemPrompt ?? ""; expect(extraSystemPrompt).toBe("You are a helpful assistant."); } finally { await server.close({ reason: "test done" }); diff --git a/src/hooks/bundled/soul-evil/handler.ts b/src/hooks/bundled/soul-evil/handler.ts index 3b3d5446f..a8fe7c2c7 100644 --- a/src/hooks/bundled/soul-evil/handler.ts +++ b/src/hooks/bundled/soul-evil/handler.ts @@ -2,10 +2,7 @@ import type { ClawdbotConfig } from "../../../config/config.js"; import { isSubagentSessionKey } from "../../../routing/session-key.js"; import { resolveHookConfig } from "../../config.js"; import { isAgentBootstrapEvent, type HookHandler } from "../../hooks.js"; -import { - applySoulEvilOverride, - resolveSoulEvilConfigFromHook, -} from "../../soul-evil.js"; +import { applySoulEvilOverride, resolveSoulEvilConfigFromHook } from "../../soul-evil.js"; const HOOK_KEY = "soul-evil";