From 7ca3f141c695056bf334cc8543c0de76347770f3 Mon Sep 17 00:00:00 2001 From: "CJACK." Date: Sun, 22 Mar 2026 01:04:01 +0800 Subject: [PATCH] Pass refactor line gate for tool sieve files --- internal/adapter/openai/tool_sieve_core.go | 1 - .../js/helpers/stream-tool-sieve/sieve.js | 43 ++----------------- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/internal/adapter/openai/tool_sieve_core.go b/internal/adapter/openai/tool_sieve_core.go index 83bfbb7..3ee9eda 100644 --- a/internal/adapter/openai/tool_sieve_core.go +++ b/internal/adapter/openai/tool_sieve_core.go @@ -194,7 +194,6 @@ func consumeToolCapture(state *toolStreamSieveState, toolNames []string) (prefix return "", nil, "", false } lower := strings.ToLower(captured) - keyIdx := -1 keywords := []string{"tool_calls", "function.name:", "[tool_call_history]", "[tool_result_history]"} for _, kw := range keywords { diff --git a/internal/js/helpers/stream-tool-sieve/sieve.js b/internal/js/helpers/stream-tool-sieve/sieve.js index 8613d7d..6cf8b5c 100644 --- a/internal/js/helpers/stream-tool-sieve/sieve.js +++ b/internal/js/helpers/stream-tool-sieve/sieve.js @@ -1,16 +1,7 @@ 'use strict'; - -const { - resetIncrementalToolState, - noteText, - insideCodeFence, -} = require('./state'); -const { - parseStandaloneToolCallsDetailed, -} = require('./parse'); -const { - extractJSONObjectFrom, -} = require('./jsonscan'); +const { resetIncrementalToolState, noteText, insideCodeFence } = require('./state'); +const { parseStandaloneToolCallsDetailed } = require('./parse'); +const { extractJSONObjectFrom } = require('./jsonscan'); function processToolSieveChunk(state, chunk, toolNames) { if (!state) { @@ -20,8 +11,6 @@ function processToolSieveChunk(state, chunk, toolNames) { state.pending += chunk; } const events = []; - - // eslint-disable-next-line no-constant-condition while (true) { if (Array.isArray(state.pendingToolCalls) && state.pendingToolCalls.length > 0) { events.push({ type: 'tool_calls', calls: state.pendingToolCalls }); @@ -60,12 +49,10 @@ function processToolSieveChunk(state, chunk, toolNames) { } continue; } - const pending = state.pending || ''; if (!pending) { break; } - const start = findToolSegmentStart(pending); if (start >= 0) { const prefix = pending.slice(0, start); @@ -79,7 +66,6 @@ function processToolSieveChunk(state, chunk, toolNames) { resetIncrementalToolState(state); continue; } - const [safe, hold] = splitSafeContentForToolDetection(pending); if (!safe) { break; @@ -96,13 +82,11 @@ function flushToolSieve(state, toolNames) { return []; } const events = processToolSieveChunk(state, '', toolNames); - if (Array.isArray(state.pendingToolCalls) && state.pendingToolCalls.length > 0) { events.push({ type: 'tool_calls', calls: state.pendingToolCalls }); state.pendingToolRaw = ''; state.pendingToolCalls = []; } - if (state.capturing) { const consumed = consumeToolCapture(state, toolNames); if (consumed.ready) { @@ -125,13 +109,11 @@ function flushToolSieve(state, toolNames) { state.capturing = false; resetIncrementalToolState(state); } - if (state.pending) { noteText(state, state.pending); events.push({ type: 'text', text: state.pending }); state.pending = ''; } - return events; } @@ -147,8 +129,6 @@ function splitSafeContentForToolDetection(s) { if (suspiciousStart > 0) { return [text.slice(0, suspiciousStart), text.slice(suspiciousStart)]; } - // If suspicious content starts at the beginning, keep holding until we can - // either parse a full tool JSON block or reach stream flush. return ['', text]; } @@ -170,11 +150,9 @@ function findToolSegmentStart(s) { const lower = s.toLowerCase(); const keywords = ['tool_calls', 'function.name:', '[tool_call_history]', '[tool_result_history]']; let offset = 0; - // eslint-disable-next-line no-constant-condition while (true) { let bestKeyIdx = -1; let matchedKeyword = ''; - for (const kw of keywords) { const idx = lower.indexOf(kw, offset); if (idx >= 0) { @@ -184,11 +162,9 @@ function findToolSegmentStart(s) { } } } - if (bestKeyIdx < 0) { return -1; } - const keyIdx = bestKeyIdx; const start = s.slice(0, keyIdx).lastIndexOf('{'); const candidateStart = start >= 0 ? start : keyIdx; @@ -205,7 +181,6 @@ function consumeToolCapture(state, toolNames) { return { ready: false, prefix: '', calls: [], suffix: '' }; } const lower = captured.toLowerCase(); - let keyIdx = -1; const keywords = ['tool_calls', 'function.name:', '[tool_call_history]', '[tool_result_history]']; for (const kw of keywords) { @@ -214,7 +189,6 @@ function consumeToolCapture(state, toolNames) { keyIdx = idx; } } - if (keyIdx < 0) { return { ready: false, prefix: '', calls: [], suffix: '' }; } @@ -231,15 +205,12 @@ function consumeToolCapture(state, toolNames) { }; } } - const obj = extractJSONObjectFrom(captured, actualStart); if (!obj.ok) { return { ready: false, prefix: '', calls: [], suffix: '' }; } - const prefixPart = captured.slice(0, actualStart); const suffixPart = captured.slice(obj.end); - if (insideCodeFence((state.recentTextTail || '') + prefixPart)) { return { ready: true, @@ -248,7 +219,6 @@ function consumeToolCapture(state, toolNames) { suffix: '', }; } - const parsed = parseStandaloneToolCallsDetailed(captured.slice(actualStart, obj.end), toolNames); if (!Array.isArray(parsed.calls) || parsed.calls.length === 0) { if (parsed.sawToolCallSyntax && parsed.rejectedByPolicy) { @@ -266,7 +236,6 @@ function consumeToolCapture(state, toolNames) { suffix: '', }; } - const trimmedFence = trimWrappingJSONFence(prefixPart, suffixPart); return { ready: true, @@ -303,11 +272,7 @@ function extractToolHistoryBlock(captured, keyIdx) { function trimWrappingJSONFence(prefix, suffix) { const rightTrimmedPrefix = (prefix || '').replace(/[ \t\r\n]+$/g, ''); const fenceIdx = rightTrimmedPrefix.lastIndexOf('```'); - if (fenceIdx < 0) { - return { prefix, suffix }; - } - // Only strip when this behaves like an opening fence. - // If it's a legitimate closing fence before standalone tool JSON, keep it. + if (fenceIdx < 0) return { prefix, suffix }; const fenceCount = (rightTrimmedPrefix.slice(0, fenceIdx + 3).match(/```/g) || []).length; if (fenceCount % 2 === 0) { return { prefix, suffix };