summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-08-09 11:03:33 -0500
committerGitHub <[email protected]>2025-08-09 11:03:33 -0500
commite2fac991dc292053e835fc1dd7c25aaf025240f1 (patch)
tree439df3aec920ad412261389b85aa20a574093ec0
parent8ba35eadd47fe9f683ab1d43f6de5d3573c81d8d (diff)
downloadopencode-e2fac991dc292053e835fc1dd7c25aaf025240f1.tar.gz
opencode-e2fac991dc292053e835fc1dd7c25aaf025240f1.zip
better permissions ux when denying (#1747)
-rw-r--r--packages/opencode/src/session/index.ts23
1 files changed, 20 insertions, 3 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 494a39c4d..c02e7ce02 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -11,7 +11,6 @@ import {
type LanguageModelUsage,
type ProviderMetadata,
type ModelMessage,
- stepCountIs,
type StreamTextResult,
} from "ai"
@@ -41,6 +40,7 @@ import { mergeDeep, pipe, splitWhen } from "remeda"
import { ToolRegistry } from "../tool/registry"
import { Plugin } from "../plugin"
import { Agent } from "../agent/agent"
+import { Permission } from "../permission"
export namespace Session {
const log = Log.create({ service: "session" })
@@ -932,7 +932,18 @@ export namespace Session {
activeTools: Object.keys(tools).filter((x) => x !== "invalid"),
maxOutputTokens: outputLimit,
abortSignal: abort.signal,
- stopWhen: stepCountIs(1000),
+ stopWhen: async ({ steps }) => {
+ if (steps.length >= 1000) {
+ return true
+ }
+
+ // Check if processor flagged that we should stop
+ if (processor.getShouldStop()) {
+ return true
+ }
+
+ return false
+ },
providerOptions: {
[input.providerID]: {
...ProviderTransform.options(input.providerID, input.modelID),
@@ -983,10 +994,14 @@ export namespace Session {
function createProcessor(assistantMsg: MessageV2.Assistant, model: ModelsDev.Model) {
const toolcalls: Record<string, MessageV2.ToolPart> = {}
let snapshot: string | undefined
+ let shouldStop = false
return {
partFromToolCall(toolCallID: string) {
return toolcalls[toolCallID]
},
+ getShouldStop() {
+ return shouldStop
+ },
async process(stream: StreamTextResult<Record<string, AITool>, never>) {
try {
let currentText: MessageV2.TextPart | undefined
@@ -1063,6 +1078,9 @@ export namespace Session {
case "tool-error": {
const match = toolcalls[value.toolCallId]
if (match && match.state.status === "running") {
+ if (value.error instanceof Permission.RejectedError) {
+ shouldStop = true
+ }
await updatePart({
...match,
state: {
@@ -1079,7 +1097,6 @@ export namespace Session {
}
break
}
-
case "error":
throw value.error