diff --git a/src/acp/server.ts b/src/acp/server.ts index 1093b89dc17..e47c292df82 100644 --- a/src/acp/server.ts +++ b/src/acp/server.ts @@ -1,8 +1,7 @@ #!/usr/bin/env node -import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"; import { Readable, Writable } from "node:stream"; import { fileURLToPath } from "node:url"; -import type { AcpServerOptions } from "./types.js"; +import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"; import { loadConfig } from "../config/config.js"; import { resolveGatewayAuth } from "../gateway/auth.js"; import { buildGatewayConnectionDetails } from "../gateway/call.js"; @@ -11,6 +10,7 @@ import { isMainModule } from "../infra/is-main.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; import { readSecretFromFile } from "./secret-file.js"; import { AcpGatewayAgent } from "./translator.js"; +import type { AcpServerOptions } from "./types.js"; export function serveAcpGateway(opts: AcpServerOptions = {}): Promise { const cfg = loadConfig(); diff --git a/src/acp/translator.prompt-prefix.test.ts b/src/acp/translator.prompt-prefix.test.ts index 42bb24bdd33..a10d7499b7a 100644 --- a/src/acp/translator.prompt-prefix.test.ts +++ b/src/acp/translator.prompt-prefix.test.ts @@ -1,6 +1,6 @@ -import type { AgentSideConnection, PromptRequest } from "@agentclientprotocol/sdk"; import os from "node:os"; import path from "node:path"; +import type { AgentSideConnection, PromptRequest } from "@agentclientprotocol/sdk"; import { describe, expect, it, vi } from "vitest"; import type { GatewayClient } from "../gateway/client.js"; import { createInMemorySessionStore } from "./session.js"; diff --git a/src/acp/translator.ts b/src/acp/translator.ts index 6d01cdb5214..bc51509e776 100644 --- a/src/acp/translator.ts +++ b/src/acp/translator.ts @@ -1,3 +1,4 @@ +import { randomUUID } from "node:crypto"; import type { Agent, AgentSideConnection, @@ -19,7 +20,6 @@ import type { StopReason, } from "@agentclientprotocol/sdk"; import { PROTOCOL_VERSION } from "@agentclientprotocol/sdk"; -import { randomUUID } from "node:crypto"; import type { GatewayClient } from "../gateway/client.js"; import type { EventFrame } from "../gateway/protocol/index.js"; import type { SessionsListResult } from "../gateway/session-utils.js"; diff --git a/src/agents/bash-tools.exec.ts b/src/agents/bash-tools.exec.ts index 03ac2023c5b..e5b9c5eb822 100644 --- a/src/agents/bash-tools.exec.ts +++ b/src/agents/bash-tools.exec.ts @@ -1,11 +1,6 @@ -import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core"; import fs from "node:fs/promises"; import path from "node:path"; -import type { - ExecElevatedDefaults, - ExecToolDefaults, - ExecToolDetails, -} from "./bash-tools.exec-types.js"; +import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core"; import { type ExecHost, maxAsk, minSecurity, resolveSafeBins } from "../infra/exec-approvals.js"; import { getTrustedSafeBinDirs } from "../infra/exec-safe-bin-trust.js"; import { @@ -33,6 +28,11 @@ import { execSchema, validateHostEnv, } from "./bash-tools.exec-runtime.js"; +import type { + ExecElevatedDefaults, + ExecToolDefaults, + ExecToolDetails, +} from "./bash-tools.exec-types.js"; import { buildSandboxEnv, clampWithDefault, diff --git a/src/agents/openclaw-tools.ts b/src/agents/openclaw-tools.ts index 1c99a6dce5f..41f059fb6a7 100644 --- a/src/agents/openclaw-tools.ts +++ b/src/agents/openclaw-tools.ts @@ -1,12 +1,12 @@ import type { OpenClawConfig } from "../config/config.js"; -import type { GatewayMessageChannel } from "../utils/message-channel.js"; -import type { SandboxFsBridge } from "./sandbox/fs-bridge.js"; -import type { AnyAgentTool } from "./tools/common.js"; import { resolvePluginTools } from "../plugins/tools.js"; +import type { GatewayMessageChannel } from "../utils/message-channel.js"; import { resolveSessionAgentId } from "./agent-scope.js"; +import type { SandboxFsBridge } from "./sandbox/fs-bridge.js"; import { createAgentsListTool } from "./tools/agents-list-tool.js"; import { createBrowserTool } from "./tools/browser-tool.js"; import { createCanvasTool } from "./tools/canvas-tool.js"; +import type { AnyAgentTool } from "./tools/common.js"; import { createCronTool } from "./tools/cron-tool.js"; import { createGatewayTool } from "./tools/gateway-tool.js"; import { createImageTool } from "./tools/image-tool.js"; diff --git a/src/agents/pi-tools.ts b/src/agents/pi-tools.ts index a5de24a34f5..ff4d3a0d3dd 100644 --- a/src/agents/pi-tools.ts +++ b/src/agents/pi-tools.ts @@ -7,9 +7,6 @@ import { } from "@mariozechner/pi-coding-agent"; import type { OpenClawConfig } from "../config/config.js"; import type { ToolLoopDetectionConfig } from "../config/types.tools.js"; -import type { ModelAuthMode } from "./model-auth.js"; -import type { AnyAgentTool } from "./pi-tools.types.js"; -import type { SandboxContext } from "./sandbox.js"; import { logWarn } from "../logger.js"; import { getPluginToolMeta } from "../plugins/tools.js"; import { isSubagentSessionKey } from "../routing/session-key.js"; @@ -24,6 +21,7 @@ import { } from "./bash-tools.js"; import { listChannelAgentTools } from "./channel-tools.js"; import { resolveImageSanitizationLimits } from "./image-sanitization.js"; +import type { ModelAuthMode } from "./model-auth.js"; import { createOpenClawTools } from "./openclaw-tools.js"; import { wrapToolWithAbortSignal } from "./pi-tools.abort.js"; import { wrapToolWithBeforeToolCallHook } from "./pi-tools.before-tool-call.js"; @@ -46,6 +44,8 @@ import { wrapToolParamNormalization, } from "./pi-tools.read.js"; import { cleanToolSchemaForGemini, normalizeToolParameters } from "./pi-tools.schema.js"; +import type { AnyAgentTool } from "./pi-tools.types.js"; +import type { SandboxContext } from "./sandbox.js"; import { getSubagentDepthFromSessionStore } from "./subagent-depth.js"; import { applyToolPolicyPipeline, diff --git a/src/agents/tools/cron-tool.e2e.test.ts b/src/agents/tools/cron-tool.e2e.test.ts index 713c61b9d8c..be059290ead 100644 --- a/src/agents/tools/cron-tool.e2e.test.ts +++ b/src/agents/tools/cron-tool.e2e.test.ts @@ -1,6 +1,18 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { callGatewayMock } = vi.hoisted(() => ({ + callGatewayMock: vi.fn(), +})); + +vi.mock("../../gateway/call.js", () => ({ + callGateway: (opts: unknown) => callGatewayMock(opts), +})); + +vi.mock("../agent-scope.js", () => ({ + resolveSessionAgentId: () => "agent-123", +})); + import { createCronTool } from "./cron-tool.js"; -import { callGatewayMock } from "./cron-tool.test-harness.js"; describe("cron tool", () => { async function executeAddAndReadDelivery(params: { diff --git a/src/agents/tools/cron-tool.flat-params.test.ts b/src/agents/tools/cron-tool.flat-params.test.ts index 5d88bda6e8d..4a7c17753b3 100644 --- a/src/agents/tools/cron-tool.flat-params.test.ts +++ b/src/agents/tools/cron-tool.flat-params.test.ts @@ -1,6 +1,18 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const { callGatewayMock } = vi.hoisted(() => ({ + callGatewayMock: vi.fn(), +})); + +vi.mock("../../gateway/call.js", () => ({ + callGateway: (opts: unknown) => callGatewayMock(opts), +})); + +vi.mock("../agent-scope.js", () => ({ + resolveSessionAgentId: () => "agent-123", +})); + import { createCronTool } from "./cron-tool.js"; -import { callGatewayMock } from "./cron-tool.test-harness.js"; describe("cron tool flat-params", () => { beforeEach(() => { diff --git a/src/agents/tools/message-tool.ts b/src/agents/tools/message-tool.ts index f2d2616badb..d361cc76f34 100644 --- a/src/agents/tools/message-tool.ts +++ b/src/agents/tools/message-tool.ts @@ -1,6 +1,4 @@ import { Type } from "@sinclair/typebox"; -import type { OpenClawConfig } from "../../config/config.js"; -import type { AnyAgentTool } from "./common.js"; import { BLUEBUBBLES_GROUP_ACTIONS } from "../../channels/plugins/bluebubbles-actions.js"; import { listChannelMessageActions, @@ -13,6 +11,7 @@ import { CHANNEL_MESSAGE_ACTION_NAMES, type ChannelMessageActionName, } from "../../channels/plugins/types.js"; +import type { OpenClawConfig } from "../../config/config.js"; import { loadConfig } from "../../config/config.js"; import { GATEWAY_CLIENT_IDS, GATEWAY_CLIENT_MODES } from "../../gateway/protocol/client-info.js"; import { getToolResult, runMessageAction } from "../../infra/outbound/message-action-runner.js"; @@ -23,6 +22,7 @@ import { normalizeMessageChannel } from "../../utils/message-channel.js"; import { resolveSessionAgentId } from "../agent-scope.js"; import { listChannelSupportedActions } from "../channel-tools.js"; import { channelTargetSchema, channelTargetsSchema, stringEnum } from "../schema/typebox.js"; +import type { AnyAgentTool } from "./common.js"; import { jsonResult, readNumberParam, readStringParam } from "./common.js"; import { resolveGatewayOptions } from "./gateway.js"; diff --git a/src/channels/plugins/actions/discord/handle-action.guild-admin.ts b/src/channels/plugins/actions/discord/handle-action.guild-admin.ts index 38911094101..688698dd6bd 100644 --- a/src/channels/plugins/actions/discord/handle-action.guild-admin.ts +++ b/src/channels/plugins/actions/discord/handle-action.guild-admin.ts @@ -1,5 +1,4 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; -import type { ChannelMessageActionContext } from "../../types.js"; import { readNumberParam, readStringArrayParam, @@ -10,6 +9,7 @@ import { readDiscordModerationCommand, } from "../../../../agents/tools/discord-actions-moderation-shared.js"; import { handleDiscordAction } from "../../../../agents/tools/discord-actions.js"; +import type { ChannelMessageActionContext } from "../../types.js"; type Ctx = Pick< ChannelMessageActionContext, diff --git a/src/channels/plugins/actions/discord/handle-action.ts b/src/channels/plugins/actions/discord/handle-action.ts index af737223f1d..a2711dc0dec 100644 --- a/src/channels/plugins/actions/discord/handle-action.ts +++ b/src/channels/plugins/actions/discord/handle-action.ts @@ -1,5 +1,4 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; -import type { ChannelMessageActionContext } from "../../types.js"; import { readNumberParam, readStringArrayParam, @@ -7,6 +6,7 @@ import { } from "../../../../agents/tools/common.js"; import { handleDiscordAction } from "../../../../agents/tools/discord-actions.js"; import { resolveDiscordChannelId } from "../../../../discord/targets.js"; +import type { ChannelMessageActionContext } from "../../types.js"; import { tryHandleDiscordMessageActionGuildAdmin } from "./handle-action.guild-admin.js"; const providerId = "discord"; diff --git a/src/cli/acp-cli.option-collisions.test.ts b/src/cli/acp-cli.option-collisions.test.ts index cd2e74f0e1a..a891dabbfa8 100644 --- a/src/cli/acp-cli.option-collisions.test.ts +++ b/src/cli/acp-cli.option-collisions.test.ts @@ -1,7 +1,7 @@ -import { Command } from "commander"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; +import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; const runAcpClientInteractive = vi.fn(async (_opts: unknown) => {}); diff --git a/src/cli/hooks-cli.ts b/src/cli/hooks-cli.ts index dfa578cc9bd..5187938e7df 100644 --- a/src/cli/hooks-cli.ts +++ b/src/cli/hooks-cli.ts @@ -1,10 +1,9 @@ -import type { Command } from "commander"; import fs from "node:fs"; import fsp from "node:fs/promises"; import path from "node:path"; -import type { OpenClawConfig } from "../config/config.js"; -import type { HookEntry } from "../hooks/types.js"; +import type { Command } from "commander"; import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; +import type { OpenClawConfig } from "../config/config.js"; import { loadConfig, writeConfigFile } from "../config/io.js"; import { buildWorkspaceHookStatus, @@ -17,6 +16,7 @@ import { resolveHookInstallDir, } from "../hooks/install.js"; import { recordHookInstall } from "../hooks/installs.js"; +import type { HookEntry } from "../hooks/types.js"; import { loadWorkspaceHookEntries } from "../hooks/workspace.js"; import { resolveArchiveKind } from "../infra/archive.js"; import { buildPluginStatusReport } from "../plugins/status.js"; diff --git a/src/cli/plugins-cli.ts b/src/cli/plugins-cli.ts index dba4b58b824..32b55855842 100644 --- a/src/cli/plugins-cli.ts +++ b/src/cli/plugins-cli.ts @@ -1,15 +1,15 @@ -import type { Command } from "commander"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { Command } from "commander"; import type { OpenClawConfig } from "../config/config.js"; -import type { PluginRecord } from "../plugins/registry.js"; import { loadConfig, writeConfigFile } from "../config/config.js"; import { resolveStateDir } from "../config/paths.js"; import { resolveArchiveKind } from "../infra/archive.js"; import { installPluginFromNpmSpec, installPluginFromPath } from "../plugins/install.js"; import { recordPluginInstall } from "../plugins/installs.js"; import { clearPluginManifestRegistryCache } from "../plugins/manifest-registry.js"; +import type { PluginRecord } from "../plugins/registry.js"; import { applyExclusiveSlotSelection } from "../plugins/slots.js"; import { resolvePluginSourceRoots, formatPluginSourceForTable } from "../plugins/source-display.js"; import { buildPluginStatusReport } from "../plugins/status.js"; diff --git a/src/commands/onboarding/plugin-install.ts b/src/commands/onboarding/plugin-install.ts index 9714d18550e..eb7f672ed15 100644 --- a/src/commands/onboarding/plugin-install.ts +++ b/src/commands/onboarding/plugin-install.ts @@ -1,16 +1,16 @@ import fs from "node:fs"; import path from "node:path"; +import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agents/agent-scope.js"; import type { ChannelPluginCatalogEntry } from "../../channels/plugins/catalog.js"; import type { OpenClawConfig } from "../../config/config.js"; -import type { RuntimeEnv } from "../../runtime.js"; -import type { WizardPrompter } from "../../wizard/prompts.js"; -import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agents/agent-scope.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; import { enablePluginInConfig } from "../../plugins/enable.js"; import { installPluginFromNpmSpec } from "../../plugins/install.js"; import { recordPluginInstall } from "../../plugins/installs.js"; import { loadOpenClawPlugins } from "../../plugins/loader.js"; import { createPluginLoaderLogger } from "../../plugins/logger.js"; +import type { RuntimeEnv } from "../../runtime.js"; +import type { WizardPrompter } from "../../wizard/prompts.js"; type InstallChoice = "npm" | "local" | "skip"; diff --git a/src/discord/send.permissions.ts b/src/discord/send.permissions.ts index dccee90f0c5..2dd743bcb07 100644 --- a/src/discord/send.permissions.ts +++ b/src/discord/send.permissions.ts @@ -1,8 +1,8 @@ import type { RequestClient } from "@buape/carbon"; import type { APIChannel, APIGuild, APIGuildMember, APIRole } from "discord-api-types/v10"; import { ChannelType, PermissionFlagsBits, Routes } from "discord-api-types/v10"; -import type { DiscordPermissionsSummary, DiscordReactOpts } from "./send.types.js"; import { resolveDiscordRest } from "./client.js"; +import type { DiscordPermissionsSummary, DiscordReactOpts } from "./send.types.js"; const PERMISSION_ENTRIES = Object.entries(PermissionFlagsBits).filter( ([, value]) => typeof value === "bigint", diff --git a/src/infra/outbound/message-action-runner.ts b/src/infra/outbound/message-action-runner.ts index 20cdad8ec44..4095a4993d9 100644 --- a/src/infra/outbound/message-action-runner.ts +++ b/src/infra/outbound/message-action-runner.ts @@ -1,12 +1,4 @@ import type { AgentToolResult } from "@mariozechner/pi-agent-core"; -import type { - ChannelId, - ChannelMessageActionName, - ChannelThreadingToolContext, -} from "../../channels/plugins/types.js"; -import type { OpenClawConfig } from "../../config/config.js"; -import type { OutboundSendDeps } from "./deliver.js"; -import type { MessagePollResult, MessageSendResult } from "./message.js"; import { resolveSessionAgentId } from "../../agents/agent-scope.js"; import { readNumberParam, @@ -15,6 +7,12 @@ import { } from "../../agents/tools/common.js"; import { parseReplyDirectives } from "../../auto-reply/reply/reply-directives.js"; import { dispatchChannelMessageAction } from "../../channels/plugins/message-actions.js"; +import type { + ChannelId, + ChannelMessageActionName, + ChannelThreadingToolContext, +} from "../../channels/plugins/types.js"; +import type { OpenClawConfig } from "../../config/config.js"; import { isDeliverableMessageChannel, normalizeMessageChannel, @@ -27,6 +25,7 @@ import { resolveMessageChannelSelection, } from "./channel-selection.js"; import { applyTargetToParams } from "./channel-target.js"; +import type { OutboundSendDeps } from "./deliver.js"; import { hydrateSendAttachmentParams, hydrateSetGroupIconParams, @@ -40,6 +39,7 @@ import { resolveTelegramAutoThreadId, } from "./message-action-params.js"; import { actionHasTarget, actionRequiresTarget } from "./message-action-spec.js"; +import type { MessagePollResult, MessageSendResult } from "./message.js"; import { applyCrossContextDecoration, buildCrossContextDecoration, diff --git a/src/plugins/install.e2e.test.ts b/src/plugins/install.e2e.test.ts index ca36983491c..4c6955ea27d 100644 --- a/src/plugins/install.e2e.test.ts +++ b/src/plugins/install.e2e.test.ts @@ -1,8 +1,8 @@ -import JSZip from "jszip"; import { randomUUID } from "node:crypto"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import JSZip from "jszip"; import * as tar from "tar"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import * as skillScanner from "../security/skill-scanner.js"; diff --git a/src/security/audit-extra.async.ts b/src/security/audit-extra.async.ts index aa70b6575c8..2b61bf1e9de 100644 --- a/src/security/audit-extra.async.ts +++ b/src/security/audit-extra.async.ts @@ -5,25 +5,23 @@ */ import fs from "node:fs/promises"; import path from "node:path"; -import type { SandboxToolPolicy } from "../agents/sandbox/types.js"; -import type { OpenClawConfig, ConfigFileSnapshot } from "../config/config.js"; -import type { AgentToolsConfig } from "../config/types.tools.js"; -import type { SkillScanFinding } from "./skill-scanner.js"; -import type { ExecFn } from "./windows-acl.js"; import { resolveDefaultAgentId } from "../agents/agent-scope.js"; import { isToolAllowedByPolicies } from "../agents/pi-tools.policy.js"; import { resolveSandboxConfigForAgent, resolveSandboxToolPolicyForAgent, } from "../agents/sandbox.js"; +import type { SandboxToolPolicy } from "../agents/sandbox/types.js"; import { loadWorkspaceSkillEntries } from "../agents/skills.js"; import { resolveToolProfilePolicy } from "../agents/tool-policy.js"; import { listAgentWorkspaceDirs } from "../agents/workspace-dirs.js"; import { MANIFEST_KEY } from "../compat/legacy-names.js"; import { resolveNativeSkillsEnabled } from "../config/commands.js"; +import type { OpenClawConfig, ConfigFileSnapshot } from "../config/config.js"; import { createConfigIO } from "../config/config.js"; import { collectIncludePathsRecursive } from "../config/includes-scan.js"; import { resolveOAuthDir } from "../config/paths.js"; +import type { AgentToolsConfig } from "../config/types.tools.js"; import { normalizePluginsConfig } from "../plugins/config-state.js"; import { normalizeAgentId } from "../routing/session-key.js"; import { @@ -34,7 +32,9 @@ import { } from "./audit-fs.js"; import { pickSandboxToolPolicy } from "./audit-tool-policy.js"; import { extensionUsesSkippedScannerPath, isPathInside } from "./scan-paths.js"; +import type { SkillScanFinding } from "./skill-scanner.js"; import * as skillScanner from "./skill-scanner.js"; +import type { ExecFn } from "./windows-acl.js"; export type SecurityAuditFinding = { checkId: string; diff --git a/src/security/audit.test.ts b/src/security/audit.test.ts index 20d59dd3d80..3585a7b69a3 100644 --- a/src/security/audit.test.ts +++ b/src/security/audit.test.ts @@ -4,8 +4,8 @@ import path from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import type { ChannelPlugin } from "../channels/plugins/types.js"; import type { OpenClawConfig } from "../config/config.js"; -import type { SecurityAuditOptions, SecurityAuditReport } from "./audit.js"; import { collectPluginsCodeSafetyFindings } from "./audit-extra.js"; +import type { SecurityAuditOptions, SecurityAuditReport } from "./audit.js"; import { runSecurityAudit } from "./audit.js"; import * as skillScanner from "./skill-scanner.js"; diff --git a/src/security/audit.ts b/src/security/audit.ts index d6eb84b5e10..2fc4d000919 100644 --- a/src/security/audit.ts +++ b/src/security/audit.ts @@ -1,10 +1,9 @@ -import type { OpenClawConfig } from "../config/config.js"; -import type { ExecFn } from "./windows-acl.js"; import { resolveSandboxConfigForAgent } from "../agents/sandbox.js"; import { resolveBrowserConfig, resolveProfile } from "../browser/config.js"; import { resolveBrowserControlAuth } from "../browser/control-auth.js"; import { listChannelPlugins } from "../channels/plugins/index.js"; import { formatCliCommand } from "../cli/command-format.js"; +import type { OpenClawConfig } from "../config/config.js"; import { resolveConfigPath, resolveStateDir } from "../config/paths.js"; import { resolveGatewayAuth } from "../gateway/auth.js"; import { buildGatewayConnectionDetails } from "../gateway/call.js"; @@ -38,6 +37,7 @@ import { inspectPathPermissions, } from "./audit-fs.js"; import { DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./dangerous-tools.js"; +import type { ExecFn } from "./windows-acl.js"; export type SecurityAuditSeverity = "info" | "warn" | "critical";