UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

231 lines (230 loc) 10.4 kB
import { l as redactToolDetail } from "./redact-DduLliKq.js"; import "./errors-BXgSefBE.js"; import { y as truncateUtf16Safe } from "./utils-CCC-BEJH.js"; import "./version-Crcn9X9T.js"; import { t as createSubsystemLogger } from "./subsystem-BzXSmsuh.js"; import "./agent-scope-MrLta7Pq.js"; import "./registry-DJ-L47Jb.js"; import { v as listCodexAppServerExtensionFactories } from "./registry-CYsBNH12.js"; import { c as joinPresentTextSegments, t as getGlobalHookRunner } from "./hook-runner-global-BnyQREr6.js"; import "./registry-Dca-zXEr.js"; import "./transcript-Cw-EfeYD.js"; import "./transcript-events-DTn-thXR.js"; import "./session-write-lock-D4phDYfI.js"; import "./model-auth-DVfmdW0b.js"; import { p as queueEmbeddedAgentMessageWithOutcome } from "./runs-B4dP_Q30.js"; import "./usage-C67Kbb7n.js"; import "./heartbeat-tool-response-D6-_RNEN.js"; import "./logger-B8odRltZ.js"; import "./tools-oBw0X8xm.js"; import "./agent-tools.before-tool-call-BkVrW03y.js"; import "./gateway-Dq9H8-iz.js"; import "./nodes-utils-CTBPI5uk.js"; import { r as resolveToolDisplay, t as formatToolDetail } from "./tool-display-CX5DV8AV.js"; import "./streaming-_TVeMLGC.js"; import "./sandbox-BQ4p-0vf.js"; import "./bootstrap-files-DiRvjZAg.js"; import "./embedded-agent-messaging-CprZBAme.js"; import "./embedded-agent-subscribe.tools-CeNC5LI1.js"; import { s as buildAgentHookContext } from "./lifecycle-hook-helpers-BiRlZKs7.js"; import "./tool-schema-projection-DRzFBr6V.js"; import "./tools-C5Dgo3sN.js"; import "./tool-result-middleware-B3Hdp_cV.js"; import { p as wrapPluginSystemContextSection } from "./attempt.prompt-helpers-CgpMNs9B.js"; import "./context-engine-lifecycle-CVy46YJP.js"; import "./attempt.tool-run-context-CJUiBo7z.js"; import "./attempt-tool-construction-plan-C32M6pQQ.js"; import "./result-fallback-classifier-vfh2jCL6.js"; import "./build-LOkd5u9D.js"; import "./agent-dir-compat-BqOAVSjO.js"; import "./hook-helpers-B1pwlijz.js"; import "./native-hook-relay-Df3cOSaT.js"; //#region src/agents/harness/prompt-compaction-hook-helpers.ts /** * Agent harness prompt and compaction hook helpers. * * Harness runtimes use this to run plugin hooks around prompt construction and * compaction while keeping hook failures non-fatal. */ const log$1 = createSubsystemLogger("agents/harness"); /** Runs before-prompt hooks and returns the adjusted prompt fields. */ async function resolveAgentHarnessBeforePromptBuildResult(params) { const hookRunner = getGlobalHookRunner(); if (!hookRunner?.hasHooks("before_prompt_build") && !hookRunner?.hasHooks("before_agent_start")) return { prompt: params.prompt, developerInstructions: params.developerInstructions }; const hookCtx = buildAgentHookContext(params.ctx); const promptEvent = { prompt: params.prompt, messages: params.messages }; const promptBuildResult = hookRunner.hasHooks("before_prompt_build") ? await hookRunner.runBeforePromptBuild(promptEvent, hookCtx).catch((error) => { log$1.warn(`before_prompt_build hook failed: ${String(error)}`); }) : void 0; const beforeAgentStartResult = hookRunner.hasHooks("before_agent_start") ? await hookRunner.runBeforeAgentStart(promptEvent, hookCtx).catch((error) => { log$1.warn(`deprecated before_agent_start hook failed during prompt build: ${String(error)}`); }) : void 0; const systemPrompt = resolvePromptBuildSystemPrompt({ developerInstructions: params.developerInstructions, promptBuildResult, beforeAgentStartResult }); return { prompt: joinPresentTextSegments([ promptBuildResult?.prependContext, beforeAgentStartResult?.prependContext, params.prompt ]) ?? params.prompt, developerInstructions: joinPresentTextSegments([ wrapPluginSystemContextSection(promptBuildResult?.prependSystemContext), wrapPluginSystemContextSection(beforeAgentStartResult?.prependSystemContext), systemPrompt, wrapPluginSystemContextSection(promptBuildResult?.appendSystemContext), wrapPluginSystemContextSection(beforeAgentStartResult?.appendSystemContext) ]) ?? systemPrompt }; } function resolvePromptBuildSystemPrompt(params) { if (typeof params.promptBuildResult?.systemPrompt === "string") return params.promptBuildResult.systemPrompt; if (typeof params.beforeAgentStartResult?.systemPrompt === "string") return params.beforeAgentStartResult.systemPrompt; return params.developerInstructions; } /** Runs best-effort before-compaction hooks for a harness session. */ async function runAgentHarnessBeforeCompactionHook(params) { const hookRunner = getGlobalHookRunner(); if (!hookRunner?.hasHooks("before_compaction")) return; try { await hookRunner.runBeforeCompaction({ messageCount: params.messages.length, messages: params.messages, sessionFile: params.sessionFile }, buildAgentHookContext(params.ctx)); } catch (error) { log$1.warn(`before_compaction hook failed: ${String(error)}`); } } /** Runs best-effort after-compaction hooks for a harness session. */ async function runAgentHarnessAfterCompactionHook(params) { const hookRunner = getGlobalHookRunner(); if (!hookRunner?.hasHooks("after_compaction")) return; try { await hookRunner.runAfterCompaction({ messageCount: params.messages.length, compactedCount: params.compactedCount, sessionFile: params.sessionFile }, buildAgentHookContext(params.ctx)); } catch (error) { log$1.warn(`after_compaction hook failed: ${String(error)}`); } } //#endregion //#region src/agents/harness/codex-app-server-extensions.ts /** * Codex app-server extension runner. * * Harness integration uses this to let registered extensions observe and adjust * tool results before they are returned to the agent runtime. */ const log = createSubsystemLogger("agents/harness"); /** Creates a runner that applies registered Codex app-server tool-result extensions. */ function createCodexAppServerToolResultExtensionRunner(ctx, factories = listCodexAppServerExtensionFactories()) { const handlers = []; const runtime = { on(event, handler) { if (event === "tool_result") handlers.push(handler); } }; const initPromise = (async () => { for (const factory of factories) await factory(runtime); })(); return { async applyToolResultExtensions(event) { await initPromise; let current = event.result; for (const handler of handlers) try { const next = await handler({ ...event, result: current }, ctx); if (next?.result) current = next.result; } catch (error) { const detail = error instanceof Error ? error.message : String(error); log.warn(`[codex] tool_result extension failed for ${event.toolName}: ${detail}`); } return current; } }; } //#endregion //#region src/plugin-sdk/agent-harness-runtime.ts /** Default truncation limit for user-facing tool progress output. */ const TOOL_PROGRESS_OUTPUT_MAX_CHARS = 8e3; /** * @deprecated Active-run queueing is an internal runtime concern. This legacy * boolean API only reports immediate queue eligibility and cannot observe async * runtime rejection; runtime-owned delivery paths should use acceptance-aware * steering instead of public SDK queueing. */ function queueAgentHarnessMessage(sessionId, text, options) { return queueEmbeddedAgentMessageWithOutcome(sessionId, text, options).queued; } /** Detect prompt image references and load them through the same limits used by embedded runs. */ async function detectAndLoadAgentHarnessPromptImages(params) { const [{ resolveImageSanitizationLimits }, { detectAndLoadPromptImages }, { MAX_IMAGE_BYTES }] = await Promise.all([ import("./image-sanitization-BghTEphW.js"), import("./images-CUVaLD2I.js"), import("./media-core/constants.js") ]); return detectAndLoadPromptImages({ prompt: params.prompt, workspaceDir: params.workspaceDir, model: params.model, existingImages: params.existingImages, imageOrder: params.imageOrder, maxBytes: MAX_IMAGE_BYTES, maxDimensionPx: resolveImageSanitizationLimits(params.config).maxDimensionPx, workspaceOnly: params.workspaceOnly, localRoots: params.localRoots, sandbox: params.sandbox }); } /** Load Codex bundle MCP thread config without forcing the heavy config module into SDK imports. */ async function loadCodexBundleMcpThreadConfig(params) { const { loadCodexBundleMcpThreadConfig: load } = await import("./codex-mcp-config-DB62Pgk0.js"); return load(params); } /** Infer compact display metadata for one tool invocation from its name and arguments. */ function inferToolMetaFromArgs(toolName, args, options) { return formatToolDetail(resolveToolDisplay({ name: toolName, args, detailMode: options?.detailMode })); } /** * Prepare verbose tool output for user-facing progress messages. */ function formatToolProgressOutput(output, options) { const trimmed = output.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim(); if (!trimmed) return; const redacted = redactToolDetail(trimmed); const maxChars = options?.maxChars ?? 8e3; if (redacted.length <= maxChars) return redacted; return `${truncateUtf16Safe(redacted, maxChars)}\n...(truncated)...`; } /** * Classify terminal harness turns that completed without assistant output that * should advance fallback. Deliberate silent replies such as NO_REPLY count as * intentional output, while whitespace-only text remains fallback-eligible. * This is intentionally SDK-level so plugin harness adapters such as Codex * preserve the same OpenClaw-owned fallback signals as the built-in OpenClaw path * without re-implementing terminal-result policy. */ function classifyAgentHarnessTerminalOutcome(params) { if (!params.turnCompleted || params.promptError !== void 0 && params.promptError !== null || hasVisibleAssistantText(params.assistantTexts)) return; if (params.planText?.trim()) return "planning-only"; if (params.reasoningText?.trim()) return "reasoning-only"; return "empty"; } function hasVisibleAssistantText(assistantTexts) { return assistantTexts.some((text) => text.trim().length > 0); } //#endregion export { inferToolMetaFromArgs as a, createCodexAppServerToolResultExtensionRunner as c, runAgentHarnessBeforeCompactionHook as d, formatToolProgressOutput as i, resolveAgentHarnessBeforePromptBuildResult as l, classifyAgentHarnessTerminalOutcome as n, loadCodexBundleMcpThreadConfig as o, detectAndLoadAgentHarnessPromptImages as r, queueAgentHarnessMessage as s, TOOL_PROGRESS_OUTPUT_MAX_CHARS as t, runAgentHarnessAfterCompactionHook as u };