From de95e414d11a52634baa163b42cef833c0029392 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Apr 2026 02:14:29 +0100 Subject: [PATCH] style: format stale source files --- .../amazon-bedrock-mantle/index.test.ts | 6 +- .../register.sync.runtime.ts | 2 +- extensions/amazon-bedrock/discovery.test.ts | 3 +- extensions/amazon-bedrock/discovery.ts | 7 +- extensions/amazon-bedrock/index.test.ts | 71 +++++++-------- .../amazon-bedrock/register.sync.runtime.ts | 12 ++- .../openshell/src/openshell-core.test.ts | 87 ++++++++++--------- .../anthropic-family-cache-semantics.ts | 8 +- src/agents/simple-completion-runtime.ts | 2 +- 9 files changed, 97 insertions(+), 101 deletions(-) diff --git a/extensions/amazon-bedrock-mantle/index.test.ts b/extensions/amazon-bedrock-mantle/index.test.ts index 72675640f89..b3aa7ef5559 100644 --- a/extensions/amazon-bedrock-mantle/index.test.ts +++ b/extensions/amazon-bedrock-mantle/index.test.ts @@ -24,9 +24,9 @@ describe("amazon-bedrock-mantle provider plugin", () => { expect( provider.classifyFailoverReason?.({ errorMessage: "some other error" } as never), ).toBeUndefined(); - expect( - provider.classifyFailoverReason?.({ errorMessage: "overloaded_error" } as never), - ).toBe("overloaded"); + expect(provider.classifyFailoverReason?.({ errorMessage: "overloaded_error" } as never)).toBe( + "overloaded", + ); }); it("provides a custom stream only for Mantle Anthropic models", async () => { diff --git a/extensions/amazon-bedrock-mantle/register.sync.runtime.ts b/extensions/amazon-bedrock-mantle/register.sync.runtime.ts index 1948226b9b3..a974fa0c17f 100644 --- a/extensions/amazon-bedrock-mantle/register.sync.runtime.ts +++ b/extensions/amazon-bedrock-mantle/register.sync.runtime.ts @@ -1,11 +1,11 @@ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/plugin-entry"; -import { createMantleAnthropicStreamFn } from "./mantle-anthropic.runtime.js"; import { mergeImplicitMantleProvider, resolveImplicitMantleProvider, resolveMantleBearerToken, resolveMantleRuntimeBearerToken, } from "./discovery.js"; +import { createMantleAnthropicStreamFn } from "./mantle-anthropic.runtime.js"; export function registerBedrockMantlePlugin(api: OpenClawPluginApi): void { const providerId = "amazon-bedrock-mantle"; diff --git a/extensions/amazon-bedrock/discovery.test.ts b/extensions/amazon-bedrock/discovery.test.ts index 5d03e0d273b..e28b729c2c0 100644 --- a/extensions/amazon-bedrock/discovery.test.ts +++ b/extensions/amazon-bedrock/discovery.test.ts @@ -132,7 +132,8 @@ describe("bedrock discovery", () => { type: "SYSTEM_DEFINED", models: [ { - modelArn: "arn:aws:bedrock:ap-northeast-1::foundation-model/example.unknown-text-v1:0", + modelArn: + "arn:aws:bedrock:ap-northeast-1::foundation-model/example.unknown-text-v1:0", }, ], }, diff --git a/extensions/amazon-bedrock/discovery.ts b/extensions/amazon-bedrock/discovery.ts index a8b020ab747..aaf96a1fa7f 100644 --- a/extensions/amazon-bedrock/discovery.ts +++ b/extensions/amazon-bedrock/discovery.ts @@ -395,9 +395,10 @@ function resolveInferenceProfiles( reasoning: baseModel?.reasoning ?? false, input: baseModel?.input ?? ["text"], cost: baseModel?.cost ?? DEFAULT_COST, - contextWindow: baseModel?.contextWindow - ?? resolveKnownContextWindow(baseModelId ?? profile.inferenceProfileId ?? "") - ?? defaults.contextWindow, + contextWindow: + baseModel?.contextWindow ?? + resolveKnownContextWindow(baseModelId ?? profile.inferenceProfileId ?? "") ?? + defaults.contextWindow, maxTokens: baseModel?.maxTokens ?? defaults.maxTokens, }); } diff --git a/extensions/amazon-bedrock/index.test.ts b/extensions/amazon-bedrock/index.test.ts index ab574b77aba..2ce44f04a63 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/extensions/amazon-bedrock/index.test.ts @@ -7,9 +7,7 @@ import type { PluginRuntime } from "../../src/plugins/runtime/types.js"; import { registerSingleProviderPlugin } from "../../test/helpers/plugins/plugin-registration.js"; import amazonBedrockPlugin from "./index.js"; -type InferenceProfileResult = - | { models?: Array<{ modelArn?: string }> } - | Error; +type InferenceProfileResult = { models?: Array<{ modelArn?: string }> } | Error; const inferenceProfileResults: InferenceProfileResult[] = []; const bedrockClientConfigs: Array> = []; @@ -376,10 +374,11 @@ describe("amazon-bedrock provider plugin", () => { streamFn: spyStreamFn, } as never); - const result = wrapped?.(modelDescriptor, { messages: [] } as never, options) as unknown as Record< - string, - unknown - >; + const result = wrapped?.( + modelDescriptor, + { messages: [] } as never, + options, + ) as unknown as Record; if (typeof result?.onPayload === "function") { await ( @@ -393,9 +392,7 @@ describe("amazon-bedrock provider plugin", () => { const provider = await registerWithConfig(undefined); const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; await callWrappedStreamWithPayload( @@ -410,7 +407,10 @@ describe("amazon-bedrock provider plugin", () => { expect(system).toHaveLength(2); expect(system[1]).toEqual({ cachePoint: { type: "default" } }); - const messages = payload.messages as Array<{ role: string; content: Array> }>; + const messages = payload.messages as Array<{ + role: string; + content: Array>; + }>; const lastUserContent = messages[0].content; expect(lastUserContent).toHaveLength(2); expect(lastUserContent[1]).toEqual({ cachePoint: { type: "default" } }); @@ -420,9 +420,7 @@ describe("amazon-bedrock provider plugin", () => { const provider = await registerWithConfig(undefined); const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; await callWrappedStreamWithPayload( @@ -441,9 +439,7 @@ describe("amazon-bedrock provider plugin", () => { const provider = await registerWithConfig(undefined); const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; await callWrappedStreamWithPayload( @@ -478,7 +474,10 @@ describe("amazon-bedrock provider plugin", () => { const system = payload.system as Array>; expect(system).toHaveLength(2); - const messages = payload.messages as Array<{ role: string; content: Array> }>; + const messages = payload.messages as Array<{ + role: string; + content: Array>; + }>; expect(messages[0].content).toHaveLength(2); }); @@ -486,9 +485,7 @@ describe("amazon-bedrock provider plugin", () => { const provider = await registerWithConfig(undefined); const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; // Regular model IDs contain "claude" so pi-ai handles caching natively. @@ -517,9 +514,7 @@ describe("amazon-bedrock provider plugin", () => { const oldClaudeModel = "anthropic.claude-3-opus-20240229-v1:0"; const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; // Claude 3 Opus is not in pi-ai's supportsPromptCaching list, but it's @@ -546,9 +541,7 @@ describe("amazon-bedrock provider plugin", () => { const provider = await registerWithConfig(undefined); const payload: Record = { system: [{ text: "You are helpful." }], - messages: [ - { role: "user", content: [{ text: "Hello" }] }, - ], + messages: [{ role: "user", content: [{ text: "Hello" }] }], }; await callWrappedStreamWithPayload( @@ -584,7 +577,10 @@ describe("amazon-bedrock provider plugin", () => { payload, ); - const messages = payload.messages as Array<{ role: string; content: Array> }>; + const messages = payload.messages as Array<{ + role: string; + content: Array>; + }>; // First user message should NOT have a cache point expect(messages[0].content).toHaveLength(1); // Assistant message untouched @@ -661,17 +657,14 @@ describe("amazon-bedrock provider plugin", () => { it("retries opaque profile lookup after a transient failure instead of caching the fallback", async () => { const modelId = "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/z27qyso459dc"; - inferenceProfileResults.push( - new Error("throttled"), - { - models: [ - { - modelArn: - "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6-20250514-v1:0", - }, - ], - }, - ); + inferenceProfileResults.push(new Error("throttled"), { + models: [ + { + modelArn: + "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6-20250514-v1:0", + }, + ], + }); const provider = await registerWithConfig(undefined); const firstPayload: Record = { system: [{ text: "You are helpful." }], diff --git a/extensions/amazon-bedrock/register.sync.runtime.ts b/extensions/amazon-bedrock/register.sync.runtime.ts index c930807f6f9..f4981f21173 100644 --- a/extensions/amazon-bedrock/register.sync.runtime.ts +++ b/extensions/amazon-bedrock/register.sync.runtime.ts @@ -96,7 +96,8 @@ function piAiWouldInjectCachePoints(modelId: string): boolean { * System-defined profiles (us., eu., global.) and base model IDs always * contain the model name and are handled by pi-ai natively. */ -const BEDROCK_APP_INFERENCE_PROFILE_RE = /^arn:aws(-cn|-us-gov)?:bedrock:.*:application-inference-profile\//i; +const BEDROCK_APP_INFERENCE_PROFILE_RE = + /^arn:aws(-cn|-us-gov)?:bedrock:.*:application-inference-profile\//i; function isBedrockAppInferenceProfile(modelId: string): boolean { return BEDROCK_APP_INFERENCE_PROFILE_RE.test(modelId); @@ -172,9 +173,7 @@ async function resolveAppProfileCacheEligible( const models = resp.models ?? []; const eligible = models.length > 0 && - models.every((m: { modelArn?: string }) => - resolvedModelSupportsCaching(m.modelArn ?? ""), - ); + models.every((m: { modelArn?: string }) => resolvedModelSupportsCaching(m.modelArn ?? "")); appProfileCacheEligibleCache.set(modelId, eligible); return eligible; } catch { @@ -374,9 +373,8 @@ export function registerAmazonBedrockPlugin(api: OpenClawPluginApi): void { // to also teach resolveAnthropicCacheRetentionFamily about opaque profiles // (tracked separately). In practice, users with app inference profiles // want caching enabled, so defaulting to "short" is the safer behavior. - const cacheRetention = typeof merged.cacheRetention === "string" - ? merged.cacheRetention - : "short"; + const cacheRetention = + typeof merged.cacheRetention === "string" ? merged.cacheRetention : "short"; if (heuristicMatch) { // Fast path: ARN heuristic already identified this as Claude. diff --git a/extensions/openshell/src/openshell-core.test.ts b/extensions/openshell/src/openshell-core.test.ts index e54e76c2f0e..b3d25985757 100644 --- a/extensions/openshell/src/openshell-core.test.ts +++ b/extensions/openshell/src/openshell-core.test.ts @@ -382,7 +382,9 @@ describe("openshell fs bridges", () => { const { createOpenShellFsBridge } = await import("./fs-bridge.js"); const bridge = createOpenShellFsBridge({ sandbox, backend }); - const readlinkSpy = vi.spyOn(fs, "readlink").mockRejectedValue(new Error("fd path unavailable")); + const readlinkSpy = vi + .spyOn(fs, "readlink") + .mockRejectedValue(new Error("fd path unavailable")); try { await expect(bridge.readFile({ filePath: "subdir/secret.txt" })).resolves.toEqual( @@ -401,43 +403,45 @@ describe("openshell fs bridges", () => { it.skipIf(process.platform === "win32")( "rejects fallback reads when path stats report an unknown device id", async () => { - const workspaceDir = await makeTempDir("openclaw-openshell-fs-"); - const targetPath = path.join(workspaceDir, "subdir", "secret.txt"); - await fs.mkdir(path.join(workspaceDir, "subdir"), { recursive: true }); - await fs.writeFile(targetPath, "inside", "utf8"); + const workspaceDir = await makeTempDir("openclaw-openshell-fs-"); + const targetPath = path.join(workspaceDir, "subdir", "secret.txt"); + await fs.mkdir(path.join(workspaceDir, "subdir"), { recursive: true }); + await fs.writeFile(targetPath, "inside", "utf8"); - const backend = createMirrorBackendMock(); - const sandbox = createSandboxTestContext({ - overrides: { - backendId: "openshell", - workspaceDir, - agentWorkspaceDir: workspaceDir, - containerWorkdir: "/sandbox", - }, - }); + const backend = createMirrorBackendMock(); + const sandbox = createSandboxTestContext({ + overrides: { + backendId: "openshell", + workspaceDir, + agentWorkspaceDir: workspaceDir, + containerWorkdir: "/sandbox", + }, + }); - const { createOpenShellFsBridge } = await import("./fs-bridge.js"); - const bridge = createOpenShellFsBridge({ sandbox, backend }); - const readlinkSpy = vi.spyOn(fs, "readlink").mockRejectedValue(new Error("fd path unavailable")); - const originalStat = fs.stat.bind(fs); - const statSpy = vi.spyOn(fs, "stat").mockImplementation(async (...args) => { - const stat = await originalStat(...args); - if (args[0] === targetPath) { - return cloneStatWithDev(stat, 0); + const { createOpenShellFsBridge } = await import("./fs-bridge.js"); + const bridge = createOpenShellFsBridge({ sandbox, backend }); + const readlinkSpy = vi + .spyOn(fs, "readlink") + .mockRejectedValue(new Error("fd path unavailable")); + const originalStat = fs.stat.bind(fs); + const statSpy = vi.spyOn(fs, "stat").mockImplementation(async (...args) => { + const stat = await originalStat(...args); + if (args[0] === targetPath) { + return cloneStatWithDev(stat, 0); + } + return stat; + }); + + try { + await expect(bridge.readFile({ filePath: "subdir/secret.txt" })).rejects.toThrow( + "Sandbox boundary checks failed", + ); + expect(readlinkSpy).toHaveBeenCalled(); + expect(statSpy).toHaveBeenCalledWith(targetPath); + } finally { + statSpy.mockRestore(); + readlinkSpy.mockRestore(); } - return stat; - }); - - try { - await expect(bridge.readFile({ filePath: "subdir/secret.txt" })).rejects.toThrow( - "Sandbox boundary checks failed", - ); - expect(readlinkSpy).toHaveBeenCalled(); - expect(statSpy).toHaveBeenCalledWith(targetPath); - } finally { - statSpy.mockRestore(); - readlinkSpy.mockRestore(); - } }, ); @@ -474,7 +478,9 @@ describe("openshell fs bridges", () => { }) as unknown as typeof fs.open); // Force the fallback verification path even on Linux so the ancestor-walk // guard is exercised directly. - const readlinkSpy = vi.spyOn(fs, "readlink").mockRejectedValue(new Error("fd path unavailable")); + const readlinkSpy = vi + .spyOn(fs, "readlink") + .mockRejectedValue(new Error("fd path unavailable")); try { await expect(bridge.readFile({ filePath: "subdir/secret.txt" })).rejects.toThrow( @@ -512,12 +518,13 @@ describe("openshell fs bridges", () => { }, }); - const { createOpenShellFsBridge, setReadOpenFlagsResolverForTest } = await import( - "./fs-bridge.js" - ); + const { createOpenShellFsBridge, setReadOpenFlagsResolverForTest } = + await import("./fs-bridge.js"); const bridge = createOpenShellFsBridge({ sandbox, backend }); // Force the fallback path so the leaf-lstat guard is exercised. - const readlinkSpy = vi.spyOn(fs, "readlink").mockRejectedValue(new Error("fd path unavailable")); + const readlinkSpy = vi + .spyOn(fs, "readlink") + .mockRejectedValue(new Error("fd path unavailable")); // Simulate a host that lacks `O_NOFOLLOW` (e.g. Windows) without touching // the non-configurable native `fs.constants` data property. The bridge // exposes a test-only seam for exactly this case. diff --git a/src/agents/pi-embedded-runner/anthropic-family-cache-semantics.ts b/src/agents/pi-embedded-runner/anthropic-family-cache-semantics.ts index 117562ee897..b700e752d0d 100644 --- a/src/agents/pi-embedded-runner/anthropic-family-cache-semantics.ts +++ b/src/agents/pi-embedded-runner/anthropic-family-cache-semantics.ts @@ -89,12 +89,8 @@ export function resolveAnthropicCacheRetentionFamily(params: { // cacheRetention, honor it — the extension's GetInferenceProfile resolution // handles the actual model detection at runtime. if ( - BEDROCK_APP_INFERENCE_PROFILE_ARN_RE.test( - normalizeLowercaseStringOrEmpty(params.modelId), - ) && - normalizeLowercaseStringOrEmpty(params.modelId).includes( - ":application-inference-profile/", - ) + BEDROCK_APP_INFERENCE_PROFILE_ARN_RE.test(normalizeLowercaseStringOrEmpty(params.modelId)) && + normalizeLowercaseStringOrEmpty(params.modelId).includes(":application-inference-profile/") ) { return "anthropic-bedrock"; } diff --git a/src/agents/simple-completion-runtime.ts b/src/agents/simple-completion-runtime.ts index 86060849cf0..6bb66dc0675 100644 --- a/src/agents/simple-completion-runtime.ts +++ b/src/agents/simple-completion-runtime.ts @@ -1,6 +1,7 @@ import { complete, type Api, type Model } from "@mariozechner/pi-ai"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { formatErrorMessage } from "../infra/errors.js"; +import { prepareProviderRuntimeAuth } from "../plugins/provider-runtime.runtime.js"; import { resolveAgentDir, resolveAgentEffectiveModelPrimary } from "./agent-scope.js"; import { DEFAULT_PROVIDER } from "./defaults.js"; import { @@ -15,7 +16,6 @@ import { resolveModelRefFromString, } from "./model-selection.js"; import { resolveModel } from "./pi-embedded-runner/model.js"; -import { prepareProviderRuntimeAuth } from "../plugins/provider-runtime.runtime.js"; type SimpleCompletionAuthStorage = { setRuntimeApiKey: (provider: string, apiKey: string) => void;