fix(prompt-gate): harden internal prompt dispatch

This commit is contained in:
YeonGyu-Kim
2026-05-19 16:02:18 +09:00
parent 6c63372ef9
commit 1492bffd20
49 changed files with 1488 additions and 141 deletions
+3 -2
View File
@@ -1,6 +1,6 @@
import type { PluginInput } from "@opencode-ai/plugin"
import { clearSessionAgent, setSessionAgent, subagentSessions, syncSubagentSessions } from "../../features/claude-code-session-state"
import { dispatchInternalPrompt } from "../../hooks/shared/prompt-async-gate"
import { dispatchInternalPrompt, isInternalPromptDispatchAccepted } from "../../hooks/shared/prompt-async-gate"
import { getAgentToolRestrictions, log } from "../../shared"
import { getAgentDisplayName, stripAgentListSortPrefix } from "../../shared/agent-display-names"
import {
@@ -140,6 +140,7 @@ export async function executeSync(
sessionID,
source: "call-omo-agent:sync",
settleMs: 0,
queueBehavior: "defer",
input: {
path: { id: sessionID },
body: {
@@ -155,7 +156,7 @@ export async function executeSync(
if (promptResult.status === "failed") {
throw promptResult.error
}
if (promptResult.status !== "dispatched") {
if (!isInternalPromptDispatchAccepted(promptResult)) {
throw new Error(`promptAsync skipped by gate: ${promptResult.status}`)
}
} catch (error) {
@@ -170,6 +170,8 @@ export async function executeSyncContinuation(
tools,
parts: [{ type: "text", text: effectivePrompt }],
},
}, {
queueBehavior: "defer",
})
} catch (promptError) {
if (toastManager) {
@@ -110,11 +110,13 @@ export async function sendSyncPrompt(
try {
const routedPromptArgs = routePromptRetry(promptArgs, input.directory)
await deps.promptWithModelSuggestionRetry(client, routedPromptArgs)
await deps.promptWithModelSuggestionRetry(client, routedPromptArgs, { queueBehavior: "defer" })
} catch (promptError) {
if (isOracleAgent(input.agentToUse) && isUnexpectedEofError(promptError)) {
try {
await deps.promptSyncWithModelSuggestionRetry(client, routePromptSyncRetry(promptArgs, input.directory))
await deps.promptSyncWithModelSuggestionRetry(client, routePromptSyncRetry(promptArgs, input.directory), {
queueBehavior: "defer",
})
return null
} catch (oracleRetryError) {
if (!isPromptGateReservedError(oracleRetryError)) {
@@ -78,6 +78,8 @@ Original error: ${createResult.error}`
...(agentModel ? { model: { providerID: agentModel.providerID, modelID: agentModel.modelID } } : {}),
...(agentVariant ? { variant: agentVariant } : {}),
},
}, {
queueBehavior: "defer",
})
} catch (promptError) {
log("[look_at] Prompt error (ignored, will still fetch messages):", promptError)