diff --git a/internal/js/helpers/stream-tool-sieve/parse.js b/internal/js/helpers/stream-tool-sieve/parse.js index def46db..f1efdda 100644 --- a/internal/js/helpers/stream-tool-sieve/parse.js +++ b/internal/js/helpers/stream-tool-sieve/parse.js @@ -263,14 +263,6 @@ function filterToolCalls(parsed, toolNames) { } out.push({ name: tc.name, input: tc.input || {} }); } - if (out.length === 0 && parsed.length > 0) { - for (const tc of parsed) { - if (!tc || !tc.name) { - continue; - } - out.push({ name: tc.name, input: tc.input || {} }); - } - } return out; } diff --git a/tests/node/stream-tool-sieve.test.js b/tests/node/stream-tool-sieve.test.js index e96716b..2fc2ecc 100644 --- a/tests/node/stream-tool-sieve.test.js +++ b/tests/node/stream-tool-sieve.test.js @@ -52,11 +52,19 @@ test('parseToolCalls keeps non-object argument strings as _raw (Go parity)', () ]); }); -test('parseToolCalls still intercepts unknown schema names to avoid leaks', () => { +test('parseToolCalls drops unknown schema names when toolNames is provided', () => { const payload = JSON.stringify({ tool_calls: [{ name: 'not_in_schema', input: { q: 'go' } }], }); const calls = parseToolCalls(payload, ['search']); + assert.equal(calls.length, 0); +}); + +test('parseToolCalls keeps unknown names when toolNames is empty', () => { + const payload = JSON.stringify({ + tool_calls: [{ name: 'not_in_schema', input: { q: 'go' } }], + }); + const calls = parseToolCalls(payload, []); assert.equal(calls.length, 1); assert.equal(calls[0].name, 'not_in_schema'); }); diff --git a/tests/scripts/run-unit-node.sh b/tests/scripts/run-unit-node.sh index 515a961..69ddf4e 100755 --- a/tests/scripts/run-unit-node.sh +++ b/tests/scripts/run-unit-node.sh @@ -5,4 +5,18 @@ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)" cd "$ROOT_DIR" ./tests/scripts/check-node-split-syntax.sh -node --test tests/node/stream-tool-sieve.test.js tests/node/chat-stream.test.js tests/node/js_compat_test.js "$@" + +# Keep Node's file-level test scheduling serial to avoid intermittent cross-file +# interference when multiple suites import mutable module singletons. +NODE_TEST_LOG="$(mktemp)" +cleanup() { + rm -f "$NODE_TEST_LOG" +} +trap cleanup EXIT + +if ! node --test --test-concurrency=1 tests/node/stream-tool-sieve.test.js tests/node/chat-stream.test.js tests/node/js_compat_test.js "$@" 2>&1 | tee "$NODE_TEST_LOG"; then + echo + echo "[run-unit-node] Node tests failed. 失败摘要如下:" + rg -n "^(not ok|# fail)|ERR_TEST_FAILURE" "$NODE_TEST_LOG" || true + exit 1 +fi