muonroi-cli 1.7.2 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/agent-harness-core/src/event-filter.js +1 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +8 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +16 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +88 -10
- package/dist/packages/agent-harness-core/src/protocol.d.ts +15 -0
- package/dist/packages/agent-harness-core/src/selector.js +2 -2
- package/dist/packages/agent-harness-core/src/transports/sidechannel.js +1 -1
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +1 -1
- package/dist/packages/agent-harness-opentui/src/install.js +1 -1
- package/dist/src/__test-stubs__/vitest-setup.js +4 -0
- package/dist/src/agent-harness/__tests__/mock-model.spec.js +54 -0
- package/dist/src/agent-harness/mock-model.d.ts +1 -1
- package/dist/src/agent-harness/mock-model.js +143 -6
- package/dist/src/agent-harness/test-spawn.js +3 -1
- package/dist/src/chat/chat-keychain.js +9 -1
- package/dist/src/cli/cost-forensics.js +7 -4
- package/dist/src/cli/keys.d.ts +2 -2
- package/dist/src/cli/keys.js +107 -28
- package/dist/src/cli/usage-report.js +2 -2
- package/dist/src/council/__tests__/abort-threading.test.d.ts +1 -0
- package/dist/src/council/__tests__/abort-threading.test.js +193 -0
- package/dist/src/council/__tests__/clarification-prompt.test.js +21 -1
- package/dist/src/council/__tests__/council-turn-length-emit.test.d.ts +1 -0
- package/dist/src/council/__tests__/council-turn-length-emit.test.js +130 -0
- package/dist/src/council/__tests__/debate-round-budget.test.d.ts +1 -0
- package/dist/src/council/__tests__/debate-round-budget.test.js +45 -0
- package/dist/src/council/__tests__/evaluator-metrics.test.js +3 -0
- package/dist/src/council/__tests__/post-debate-recommendation.test.d.ts +1 -0
- package/dist/src/council/__tests__/post-debate-recommendation.test.js +58 -0
- package/dist/src/council/__tests__/research-tools.test.js +4 -0
- package/dist/src/council/__tests__/round-tools.test.js +6 -0
- package/dist/src/council/clarifier-question-cap.test.d.ts +12 -0
- package/dist/src/council/clarifier-question-cap.test.js +73 -0
- package/dist/src/council/clarifier.d.ts +29 -1
- package/dist/src/council/clarifier.js +64 -1
- package/dist/src/council/debate-planner.d.ts +2 -1
- package/dist/src/council/debate-planner.js +5 -3
- package/dist/src/council/debate.d.ts +9 -0
- package/dist/src/council/debate.js +88 -8
- package/dist/src/council/index.d.ts +46 -1
- package/dist/src/council/index.js +125 -19
- package/dist/src/council/llm.js +41 -13
- package/dist/src/council/prompts.js +36 -1
- package/dist/src/council/types.d.ts +14 -1
- package/dist/src/ee/__tests__/export-transcripts.test.js +1 -1
- package/dist/src/ee/bridge.d.ts +3 -1
- package/dist/src/ee/bridge.js +9 -3
- package/dist/src/ee/bridge.test.js +1 -2
- package/dist/src/ee/client.js +15 -2
- package/dist/src/ee/recall-ledger.d.ts +20 -0
- package/dist/src/ee/recall-ledger.js +40 -1
- package/dist/src/ee/search.d.ts +25 -0
- package/dist/src/ee/search.js +73 -0
- package/dist/src/ee/types.d.ts +15 -1
- package/dist/src/ee/who-am-i.d.ts +41 -0
- package/dist/src/ee/who-am-i.js +143 -0
- package/dist/src/ee/who-am-i.test.d.ts +1 -0
- package/dist/src/ee/who-am-i.test.js +101 -0
- package/dist/src/flow/compaction/index.d.ts +1 -0
- package/dist/src/flow/compaction/index.js +4 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/headless/council-answers.js +1 -0
- package/dist/src/headless/output.d.ts +30 -1
- package/dist/src/headless/output.js +180 -0
- package/dist/src/headless/output.test.js +61 -1
- package/dist/src/hooks/index.js +48 -2
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +59 -62
- package/dist/src/lsp/client-normalize.test.d.ts +12 -0
- package/dist/src/lsp/client-normalize.test.js +34 -0
- package/dist/src/lsp/client.d.ts +1 -0
- package/dist/src/lsp/client.js +10 -2
- package/dist/src/lsp/manager.d.ts +1 -1
- package/dist/src/lsp/manager.js +13 -5
- package/dist/src/lsp/manager.test.js +41 -2
- package/dist/src/lsp/runtime.d.ts +1 -1
- package/dist/src/lsp/runtime.js +2 -2
- package/dist/src/maintain/__tests__/gh-create-pr.test.js +7 -3
- package/dist/src/maintain/__tests__/pr-builder.test.js +7 -3
- package/dist/src/mcp/__tests__/client-pool.spec.js +3 -3
- package/dist/src/mcp/__tests__/ee-tools.test.js +42 -14
- package/dist/src/mcp/__tests__/forensics-tools.test.js +3 -3
- package/dist/src/mcp/__tests__/lsp-tools.test.js +4 -4
- package/dist/src/mcp/auto-setup.js +0 -8
- package/dist/src/mcp/client-pool.d.ts +1 -1
- package/dist/src/mcp/client-pool.js +25 -9
- package/dist/src/mcp/ee-tools.d.ts +10 -0
- package/dist/src/mcp/ee-tools.js +34 -0
- package/dist/src/mcp/self-verify-jobs.d.ts +1 -0
- package/dist/src/mcp/self-verify-jobs.js +1 -3
- package/dist/src/mcp/self-verify-runner.js +1 -1
- package/dist/src/models/catalog-gemini.test.js +12 -10
- package/dist/src/models/catalog.json +106 -38
- package/dist/src/orchestrator/__tests__/auto-commit.test.d.ts +1 -0
- package/dist/src/orchestrator/__tests__/auto-commit.test.js +142 -0
- package/dist/src/orchestrator/__tests__/batch-turn-runner.test.js +3 -0
- package/dist/src/orchestrator/__tests__/delegations.test.d.ts +1 -0
- package/dist/src/orchestrator/__tests__/delegations.test.js +96 -0
- package/dist/src/orchestrator/__tests__/message-processor.test.js +2 -0
- package/dist/src/orchestrator/__tests__/prompts.test.d.ts +1 -0
- package/dist/src/orchestrator/__tests__/prompts.test.js +88 -0
- package/dist/src/orchestrator/__tests__/stream-runner.test.js +29 -0
- package/dist/src/orchestrator/__tests__/sub-session-delegation.test.d.ts +1 -0
- package/dist/src/orchestrator/__tests__/sub-session-delegation.test.js +507 -0
- package/dist/src/orchestrator/agent.test.js +5 -2
- package/dist/src/orchestrator/auto-commit.d.ts +110 -0
- package/dist/src/orchestrator/auto-commit.js +366 -0
- package/dist/src/orchestrator/batch-turn-runner.d.ts +3 -2
- package/dist/src/orchestrator/batch-turn-runner.js +2 -1
- package/dist/src/orchestrator/compaction-proposer-prompt.d.ts +8 -0
- package/dist/src/orchestrator/compaction-proposer-prompt.js +43 -0
- package/dist/src/orchestrator/compaction.d.ts +22 -0
- package/dist/src/orchestrator/compaction.js +42 -0
- package/dist/src/orchestrator/delegations.d.ts +1 -0
- package/dist/src/orchestrator/delegations.js +41 -0
- package/dist/src/orchestrator/error-utils.js +27 -2
- package/dist/src/orchestrator/message-processor.d.ts +23 -5
- package/dist/src/orchestrator/message-processor.js +226 -2573
- package/dist/src/orchestrator/orchestrator.d.ts +11 -2
- package/dist/src/orchestrator/orchestrator.js +530 -43
- package/dist/src/orchestrator/pending-calls.js +2 -1
- package/dist/src/orchestrator/preprocessor.d.ts +13 -0
- package/dist/src/orchestrator/preprocessor.js +146 -0
- package/dist/src/orchestrator/prompts.d.ts +16 -0
- package/dist/src/orchestrator/prompts.js +130 -67
- package/dist/src/orchestrator/safety-askcard.d.ts +66 -0
- package/dist/src/orchestrator/safety-askcard.js +74 -0
- package/dist/src/orchestrator/sandbox.test.js +8 -5
- package/dist/src/orchestrator/scope-ceiling.js +1 -1
- package/dist/src/orchestrator/stall-watchdog.d.ts +47 -0
- package/dist/src/orchestrator/stall-watchdog.js +23 -0
- package/dist/src/orchestrator/stall-watchdog.test.js +36 -1
- package/dist/src/orchestrator/stream-runner.js +52 -30
- package/dist/src/orchestrator/sub-agent-cap.d.ts +2 -0
- package/dist/src/orchestrator/sub-agent-cap.js +12 -4
- package/dist/src/orchestrator/sub-agent-model-tier.js +1 -1
- package/dist/src/orchestrator/subagent-compactor.d.ts +21 -0
- package/dist/src/orchestrator/subagent-compactor.js +148 -24
- package/dist/src/orchestrator/subagent-compactor.spec.js +249 -1
- package/dist/src/orchestrator/text-tool-call-detector.d.ts +9 -5
- package/dist/src/orchestrator/text-tool-call-detector.js +16 -12
- package/dist/src/orchestrator/text-tool-call-detector.test.js +66 -8
- package/dist/src/orchestrator/tool-args-repair.js +1 -1
- package/dist/src/orchestrator/tool-engine.d.ts +153 -0
- package/dist/src/orchestrator/tool-engine.js +3138 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +3 -0
- package/dist/src/pil/__tests__/discovery-types.test.js +15 -4
- package/dist/src/pil/__tests__/discovery.test.js +89 -145
- package/dist/src/pil/__tests__/dual-run.test.js +2 -0
- package/dist/src/pil/__tests__/layer1-intent-trace.test.js +3 -0
- package/dist/src/pil/__tests__/layer1-intent.test.js +3 -0
- package/dist/src/pil/__tests__/layer16-clarity.test.js +35 -32
- package/dist/src/pil/__tests__/layer18-acceptance.test.js +1 -78
- package/dist/src/pil/__tests__/layer2_5-ponytail.test.d.ts +1 -0
- package/dist/src/pil/__tests__/layer2_5-ponytail.test.js +53 -0
- package/dist/src/pil/__tests__/layer3-ee-injection.test.js +67 -4
- package/dist/src/pil/__tests__/layer3-injected-chunk.test.js +14 -2
- package/dist/src/pil/__tests__/layer4-gsd.test.js +30 -0
- package/dist/src/pil/__tests__/layer5-context.test.js +39 -1
- package/dist/src/pil/__tests__/layer6-output.test.js +30 -2
- package/dist/src/pil/__tests__/llm-classify.test.js +79 -1
- package/dist/src/pil/__tests__/orchestrator-integration.test.js +3 -1
- package/dist/src/pil/__tests__/pipeline.test.js +11 -8
- package/dist/src/pil/__tests__/response-tools.test.js +52 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +5 -3
- package/dist/src/pil/agent-operating-contract.test.js +2 -2
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +1 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/config.d.ts +20 -0
- package/dist/src/pil/config.js +35 -0
- package/dist/src/pil/discovery-types.d.ts +32 -9
- package/dist/src/pil/discovery.d.ts +3 -3
- package/dist/src/pil/discovery.js +138 -244
- package/dist/src/pil/index.d.ts +1 -1
- package/dist/src/pil/index.js +1 -1
- package/dist/src/pil/layer1-intent.d.ts +9 -1
- package/dist/src/pil/layer1-intent.js +62 -7
- package/dist/src/pil/layer1-intent.test.js +112 -2
- package/dist/src/pil/layer15-context-scan.js +1 -1
- package/dist/src/pil/layer16-clarity.d.ts +21 -25
- package/dist/src/pil/layer16-clarity.js +52 -88
- package/dist/src/pil/layer18-acceptance.d.ts +13 -3
- package/dist/src/pil/layer18-acceptance.js +1 -75
- package/dist/src/pil/layer2-personality.js +7 -8
- package/dist/src/pil/layer2_5-ponytail.d.ts +2 -0
- package/dist/src/pil/layer2_5-ponytail.js +41 -0
- package/dist/src/pil/layer3-ee-injection.js +180 -14
- package/dist/src/pil/layer4-gsd.js +22 -8
- package/dist/src/pil/layer5-context.d.ts +1 -0
- package/dist/src/pil/layer5-context.js +26 -11
- package/dist/src/pil/layer6-output.js +23 -5
- package/dist/src/pil/llm-classify.d.ts +11 -0
- package/dist/src/pil/llm-classify.js +196 -3
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +4 -3
- package/dist/src/pil/pipeline.js +15 -1
- package/dist/src/pil/response-tools.d.ts +16 -0
- package/dist/src/pil/response-tools.js +41 -0
- package/dist/src/pil/schema.d.ts +8 -0
- package/dist/src/pil/schema.js +24 -3
- package/dist/src/pil/task-tier-map.js +7 -7
- package/dist/src/pil/types.d.ts +9 -3
- package/dist/src/product-loop/__tests__/discovery-interview.test.js +103 -1
- package/dist/src/product-loop/__tests__/gather-selectable-alts.test.js +34 -0
- package/dist/src/product-loop/__tests__/sprint-self-verify.test.js +12 -12
- package/dist/src/product-loop/discovery-interview.d.ts +20 -0
- package/dist/src/product-loop/discovery-interview.js +121 -7
- package/dist/src/product-loop/gather.js +19 -5
- package/dist/src/product-loop/loop-driver.js +2 -2
- package/dist/src/product-loop/sprint-self-verify.js +2 -2
- package/dist/src/providers/__tests__/reasoning-roundtrip.test.js +12 -0
- package/dist/src/providers/auth/__tests__/gemini-oauth.test.d.ts +1 -5
- package/dist/src/providers/auth/__tests__/gemini-oauth.test.js +1 -5
- package/dist/src/providers/auth/gcloud.d.ts +28 -0
- package/dist/src/providers/auth/gcloud.js +102 -0
- package/dist/src/providers/auth/gemini-oauth.d.ts +46 -19
- package/dist/src/providers/auth/gemini-oauth.js +292 -105
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -1
- package/dist/src/providers/auth/grok-oauth.js +1 -1
- package/dist/src/providers/auth/registry.js +28 -6
- package/dist/src/providers/gemini.d.ts +1 -1
- package/dist/src/providers/gemini.js +10 -3
- package/dist/src/providers/keychain.d.ts +2 -2
- package/dist/src/providers/keychain.js +20 -2
- package/dist/src/providers/openai.js +5 -1
- package/dist/src/providers/runtime.d.ts +1 -1
- package/dist/src/providers/runtime.js +11 -2
- package/dist/src/providers/siliconflow-sse-repair.js +1 -1
- package/dist/src/providers/strategies/google.strategy.d.ts +9 -2
- package/dist/src/providers/strategies/google.strategy.js +159 -9
- package/dist/src/providers/strategies/thinking-mode.js +19 -6
- package/dist/src/providers/types.d.ts +1 -1
- package/dist/src/router/decide.test.js +40 -8
- package/dist/src/router/step-router.d.ts +20 -0
- package/dist/src/router/step-router.js +73 -0
- package/dist/src/self-qa/agentic-loop.js +30 -21
- package/dist/src/self-qa/orchestrator.js +5 -5
- package/dist/src/self-qa/scenario-planner.js +1 -1
- package/dist/src/self-qa/spec-emitter.js +4 -4
- package/dist/src/storage/__tests__/hierarchical-session.test.d.ts +1 -0
- package/dist/src/storage/__tests__/hierarchical-session.test.js +161 -0
- package/dist/src/storage/__tests__/sweep-stale-pending.test.js +2 -2
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/migrations.js +13 -1
- package/dist/src/storage/transcript-response-entry.test.js +18 -5
- package/dist/src/storage/transcript-view.js +7 -1
- package/dist/src/storage/transcript.d.ts +3 -0
- package/dist/src/storage/transcript.js +254 -73
- package/dist/src/storage/ui-interaction-log.d.ts +17 -0
- package/dist/src/storage/usage.js +22 -5
- package/dist/src/tools/__tests__/native-tools.test.js +6 -0
- package/dist/src/tools/bash.d.ts +36 -23
- package/dist/src/tools/bash.js +59 -301
- package/dist/src/tools/bash.test.js +2 -257
- package/dist/src/tools/file-tracker.d.ts +5 -0
- package/dist/src/tools/file-tracker.js +14 -0
- package/dist/src/tools/file.js +2 -0
- package/dist/src/tools/git-safety.d.ts +38 -1
- package/dist/src/tools/git-safety.js +94 -4
- package/dist/src/tools/git-safety.test.js +45 -1
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +66 -1
- package/dist/src/tools/registry-bash-empty-command.test.js +4 -3
- package/dist/src/tools/registry-git-safety.test.js +17 -6
- package/dist/src/tools/registry.d.ts +6 -0
- package/dist/src/tools/registry.js +215 -13
- package/dist/src/types/index.d.ts +8 -2
- package/dist/src/ui/app.d.ts +1 -0
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/components/council-question-card.js +1 -0
- package/dist/src/ui/components/message-view.js +37 -3
- package/dist/src/ui/components/structured-response-view.js +7 -0
- package/dist/src/ui/components/task-list-panel.js +3 -12
- package/dist/src/ui/containers/chat-feed.d.ts +40 -0
- package/dist/src/ui/containers/chat-feed.js +66 -0
- package/dist/src/ui/containers/modals-layer.d.ts +87 -0
- package/dist/src/ui/containers/modals-layer.js +18 -0
- package/dist/src/ui/slash/__tests__/menu-parity.test.d.ts +1 -0
- package/dist/src/ui/slash/__tests__/menu-parity.test.js +1 -0
- package/dist/src/ui/slash/__tests__/ponytail.test.d.ts +1 -0
- package/dist/src/ui/slash/__tests__/ponytail.test.js +37 -0
- package/dist/src/ui/slash/expand.js +14 -1
- package/dist/src/ui/slash/export.js +16 -1
- package/dist/src/ui/slash/menu-items.js +1 -0
- package/dist/src/ui/slash/ponytail.d.ts +2 -0
- package/dist/src/ui/slash/ponytail.js +19 -0
- package/dist/src/ui/status-bar/store.js +0 -1
- package/dist/src/ui/status-bar/store.test.js +2 -2
- package/dist/src/ui/use-app-logic.d.ts +26 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/relaunch.js +1 -1
- package/dist/src/ui/utils/text.d.ts +11 -0
- package/dist/src/ui/utils/text.js +21 -1
- package/dist/src/ui/utils/text.test.js +25 -1
- package/dist/src/ui/utils/tools.js +3 -1
- package/dist/src/usage/cost-log.js +2 -2
- package/dist/src/usage/estimator.d.ts +14 -0
- package/dist/src/usage/estimator.js +22 -0
- package/dist/src/utils/__tests__/compaction-caps.test.d.ts +21 -0
- package/dist/src/utils/__tests__/compaction-caps.test.js +187 -0
- package/dist/src/utils/__tests__/llm-deadline-abort.test.d.ts +1 -0
- package/dist/src/utils/__tests__/llm-deadline-abort.test.js +33 -0
- package/dist/src/utils/__tests__/llm-deadline.test.js +16 -4
- package/dist/src/utils/__tests__/logger.test.d.ts +1 -0
- package/dist/src/utils/__tests__/logger.test.js +115 -0
- package/dist/src/utils/__tests__/settings-agent-first.test.d.ts +1 -0
- package/dist/src/utils/__tests__/settings-agent-first.test.js +48 -0
- package/dist/src/utils/install-manager.d.ts +1 -0
- package/dist/src/utils/install-manager.js +76 -7
- package/dist/src/utils/install-manager.test.js +43 -1
- package/dist/src/utils/llm-deadline.d.ts +9 -1
- package/dist/src/utils/llm-deadline.js +31 -2
- package/dist/src/utils/logger.d.ts +28 -0
- package/dist/src/utils/logger.js +171 -0
- package/dist/src/utils/permission-mode.d.ts +33 -0
- package/dist/src/utils/permission-mode.js +164 -3
- package/dist/src/utils/permission-mode.test.js +92 -1
- package/dist/src/utils/settings.d.ts +36 -32
- package/dist/src/utils/settings.js +151 -123
- package/dist/src/utils/update-checker.test.js +5 -1
- package/package.json +1 -1
|
@@ -39,10 +39,32 @@ describe("detectTextEmittedToolCall", () => {
|
|
|
39
39
|
expect(detectTextEmittedToolCall('<invoke name="read_file"><parameter name="path">a</parameter></invoke>').detected).toBe(true);
|
|
40
40
|
expect(detectTextEmittedToolCall("<function_calls>...").detected).toBe(true);
|
|
41
41
|
});
|
|
42
|
-
it("detects the DeepSeek-native DSML leak (
|
|
42
|
+
it("detects the DeepSeek-native DSML leak (│invoke …) and extracts the tool name", () => {
|
|
43
43
|
// Live: storyflow_ui explore-A/B, deepseek T3 (session 799f0508e830) emitted
|
|
44
44
|
// this as text and made no real tool call → empty, silent turn. The generic
|
|
45
45
|
// <invoke matcher misses it because `<` is followed by the U+FF5C sentinel.
|
|
46
|
+
const text = `<│tool_calls>
|
|
47
|
+
<│invoke name="read_file">
|
|
48
|
+
<│parameter name="file_path" string="true">src/app/foo.html</│parameter>
|
|
49
|
+
</│invoke>
|
|
50
|
+
</│tool_calls>`;
|
|
51
|
+
const r = detectTextEmittedToolCall(text);
|
|
52
|
+
expect(r.detected).toBe(true);
|
|
53
|
+
expect(r.tool).toBe("read_file");
|
|
54
|
+
});
|
|
55
|
+
it("detects the newer DeepSeek DSML format with │ DSML │ sentinel (2026-06-23+ leak)", () => {
|
|
56
|
+
// Newer DSML format where the model inserts "DSML" text between bars:
|
|
57
|
+
// <│ DSML │invoke name="read_file">...</│ DSML │invoke>
|
|
58
|
+
const text = `<│tool_calls>
|
|
59
|
+
<│ DSML │invoke name="read_file">
|
|
60
|
+
<│ DSML │parameter name="file_path" string="true">D:\\sources\\Core\\muonroi-cli\\biome.json</│ DSML │parameter>
|
|
61
|
+
</│ DSML │invoke>
|
|
62
|
+
</│tool_calls>`;
|
|
63
|
+
const r = detectTextEmittedToolCall(text);
|
|
64
|
+
expect(r.detected).toBe(true);
|
|
65
|
+
expect(r.tool).toBe("read_file");
|
|
66
|
+
});
|
|
67
|
+
it("detects the double-bar DeepSeek DSML format with || sentinel", () => {
|
|
46
68
|
const text = `<||DSML||tool_calls>
|
|
47
69
|
<||DSML||invoke name="read_file">
|
|
48
70
|
<||DSML||parameter name="file_path" string="true">src/app/foo.html</||DSML||parameter>
|
|
@@ -52,6 +74,24 @@ describe("detectTextEmittedToolCall", () => {
|
|
|
52
74
|
expect(r.detected).toBe(true);
|
|
53
75
|
expect(r.tool).toBe("read_file");
|
|
54
76
|
});
|
|
77
|
+
it("parses double-bar DSML blocks with || DSML || sentinel format", () => {
|
|
78
|
+
const text = `<||DSML||invoke name="read_file">
|
|
79
|
+
<||DSML||parameter name="file_path" string="true">src/app/foo.html</||DSML||parameter>
|
|
80
|
+
</||DSML||invoke>`;
|
|
81
|
+
const calls = parseDsmlToolCalls(text);
|
|
82
|
+
expect(calls).toHaveLength(1);
|
|
83
|
+
expect(calls[0].name).toBe("read_file");
|
|
84
|
+
expect(calls[0].args.file_path).toBe("src/app/foo.html");
|
|
85
|
+
});
|
|
86
|
+
it("parses DSML blocks with │ DSML │ sentinel format", () => {
|
|
87
|
+
const text = `<│ DSML │invoke name="read_file">
|
|
88
|
+
<│ DSML │parameter name="file_path" string="true">src/app.ts</│ DSML │parameter>
|
|
89
|
+
</│ DSML │invoke>`;
|
|
90
|
+
const calls = parseDsmlToolCalls(text);
|
|
91
|
+
expect(calls).toHaveLength(1);
|
|
92
|
+
expect(calls[0].name).toBe("read_file");
|
|
93
|
+
expect(calls[0].args.file_path).toBe("src/app.ts");
|
|
94
|
+
});
|
|
55
95
|
it("does NOT fire on a bare inline mention of a tool name (no invocation shape)", () => {
|
|
56
96
|
// Precision: a prose mention must not be flagged — it would wrongly mark a
|
|
57
97
|
// legitimate final answer as a broken tool call.
|
|
@@ -60,12 +100,12 @@ describe("detectTextEmittedToolCall", () => {
|
|
|
60
100
|
expect(detectTextEmittedToolCall("I edited the file and ran the tests; everything passes.").detected).toBe(false);
|
|
61
101
|
});
|
|
62
102
|
it("parseDsmlToolCalls extracts name + args from the DSML block (for targeted re-steer)", () => {
|
|
63
|
-
const text =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
103
|
+
const text = `<│tool_calls>
|
|
104
|
+
<│invoke name="read_file">
|
|
105
|
+
<│parameter name="file_path" string="true">src/app/foo.html</│parameter>
|
|
106
|
+
<│parameter name="start_line" string="false">25</│parameter>
|
|
107
|
+
</│invoke>
|
|
108
|
+
</│tool_calls>`;
|
|
69
109
|
const calls = parseDsmlToolCalls(text);
|
|
70
110
|
expect(calls).toHaveLength(1);
|
|
71
111
|
expect(calls[0].name).toBe("read_file");
|
|
@@ -73,7 +113,7 @@ describe("detectTextEmittedToolCall", () => {
|
|
|
73
113
|
expect(calls[0].args.start_line).toBe("25");
|
|
74
114
|
});
|
|
75
115
|
it("parseDsmlToolCalls handles multiple invoke blocks and returns [] for non-DSML text", () => {
|
|
76
|
-
const text =
|
|
116
|
+
const text = `<│invoke name="read_file"><│parameter name="file_path">a.ts</│parameter></│invoke><│invoke name="edit_file"><│parameter name="path">b.ts</│parameter></│invoke>`;
|
|
77
117
|
const calls = parseDsmlToolCalls(text);
|
|
78
118
|
expect(calls.map((c) => c.name)).toEqual(["read_file", "edit_file"]);
|
|
79
119
|
expect(parseDsmlToolCalls("just a normal answer")).toEqual([]);
|
|
@@ -85,5 +125,23 @@ describe("detectTextEmittedToolCall", () => {
|
|
|
85
125
|
// Angular template with self-closing/nested tags must not match a tool tag.
|
|
86
126
|
expect(detectTextEmittedToolCall('<span *ngIf="!story.cover" class="placeholder">{{ title }}</span>').detected).toBe(false);
|
|
87
127
|
});
|
|
128
|
+
it("detects and parses Gemini-style ASCII DSML leak with spaces and standard pipes", () => {
|
|
129
|
+
const text = `Tôi cần xác nhận ecosystem có những extension gì trước khi sửa - không đoán, phải đọc source thật.
|
|
130
|
+
|
|
131
|
+
< | | DSML | | tool_calls>
|
|
132
|
+
< | | DSML | | invoke name="mcp_filesystem__search_files">
|
|
133
|
+
< | | DSML | | parameter name="pattern" string="true">Serilog</ | | DSML | | parameter>
|
|
134
|
+
< | | DSML | | parameter name="path" string="true">D:\\sources\\Core\\muonroi-building-block\\src</ | | DSML | | parameter>
|
|
135
|
+
</ | | DSML | | invoke>
|
|
136
|
+
</ | | DSML | | tool_calls>`;
|
|
137
|
+
const r = detectTextEmittedToolCall(text);
|
|
138
|
+
expect(r.detected).toBe(true);
|
|
139
|
+
expect(r.tool).toBe("mcp_filesystem__search_files");
|
|
140
|
+
const calls = parseDsmlToolCalls(text);
|
|
141
|
+
expect(calls).toHaveLength(1);
|
|
142
|
+
expect(calls[0].name).toBe("mcp_filesystem__search_files");
|
|
143
|
+
expect(calls[0].args.pattern).toBe("Serilog");
|
|
144
|
+
expect(calls[0].args.path).toBe("D:\\sources\\Core\\muonroi-building-block\\src");
|
|
145
|
+
});
|
|
88
146
|
});
|
|
89
147
|
//# sourceMappingURL=text-tool-call-detector.test.js.map
|
|
@@ -180,7 +180,7 @@ function insertMissingCloseQuote(s) {
|
|
|
180
180
|
const prefix = out.slice(0, m.index);
|
|
181
181
|
if (!isInsideOpenString(prefix))
|
|
182
182
|
continue;
|
|
183
|
-
result += out.slice(lastIndex, m.index) + m[1]
|
|
183
|
+
result += `${out.slice(lastIndex, m.index) + m[1]}"${m[2]}${m[3]}`;
|
|
184
184
|
lastIndex = m.index + m[0].length;
|
|
185
185
|
matched = true;
|
|
186
186
|
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { type ModelMessage } from "ai";
|
|
2
|
+
import { getModelInfo } from "../models/registry.js";
|
|
3
|
+
import { type resolveModelRuntime } from "../providers/runtime.js";
|
|
4
|
+
import type { ProviderId } from "../providers/types.js";
|
|
5
|
+
import { type SessionStore } from "../storage/index.js";
|
|
6
|
+
import type { SessionInfo, StreamChunk, SubagentStatus } from "../types/index.js";
|
|
7
|
+
import { type PermissionMode } from "../utils/permission-mode.js";
|
|
8
|
+
import type { AbortContext } from "./abort.js";
|
|
9
|
+
import type { LegacyProvider, ProcessMessageObserver } from "./agent-options.js";
|
|
10
|
+
import type { CouncilManager } from "./council-manager.js";
|
|
11
|
+
import type { CrossTurnDedup } from "./cross-turn-dedup.js";
|
|
12
|
+
import type { PendingCallsLog } from "./pending-calls.js";
|
|
13
|
+
import type { ReadPathBudget } from "./read-path-budget.js";
|
|
14
|
+
import type { SafetyOverrideAskInfo, SafetyOverrideVerdict } from "./safety-askcard.js";
|
|
15
|
+
import { type ToolLoopCapAsk } from "./tool-loop-cap.js";
|
|
16
|
+
import type { TurnRunnerDepsBase } from "./turn-runner-deps.js";
|
|
17
|
+
/**
|
|
18
|
+
* Dependency surface the MessageProcessor needs to reach back into Agent
|
|
19
|
+
* state without holding a circular reference. Properties expose array
|
|
20
|
+
* references (mutating push() must affect the same array the Agent reads on
|
|
21
|
+
* subsequent turns). Method callbacks delegate to Agent private methods.
|
|
22
|
+
*/
|
|
23
|
+
export interface MessageProcessorDeps extends TurnRunnerDepsBase {
|
|
24
|
+
readonly isSubSession?: boolean;
|
|
25
|
+
/** Live messageSeqs array (mutated by push; parallel to messages). */
|
|
26
|
+
readonly messageSeqs: Array<number | null>;
|
|
27
|
+
/** Session bookkeeping. */
|
|
28
|
+
readonly session: SessionInfo | null;
|
|
29
|
+
readonly sessionStore: SessionStore | null;
|
|
30
|
+
readonly modelId: string;
|
|
31
|
+
readonly providerId: ProviderId;
|
|
32
|
+
readonly batchApi: boolean;
|
|
33
|
+
readonly permissionMode: PermissionMode;
|
|
34
|
+
readonly externalAbortContext: AbortContext | null;
|
|
35
|
+
readonly pendingCalls: PendingCallsLog | null;
|
|
36
|
+
readonly councilManager: CouncilManager;
|
|
37
|
+
readonly crossTurnDedup: CrossTurnDedup | null;
|
|
38
|
+
readonly readBudget: ReadPathBudget | null;
|
|
39
|
+
readonly priorWarningIdsInSession: Set<string>;
|
|
40
|
+
readonly sessionEEGuidance: Map<string, {
|
|
41
|
+
toolName: string;
|
|
42
|
+
message: string;
|
|
43
|
+
why: string;
|
|
44
|
+
confidence: number;
|
|
45
|
+
}>;
|
|
46
|
+
readonly flowReady: Promise<void> | null;
|
|
47
|
+
getAbortController(): AbortController | null;
|
|
48
|
+
setAbortController(ctrl: AbortController | null): void;
|
|
49
|
+
getSessionStartHookFired(): boolean;
|
|
50
|
+
setSessionStartHookFired(v: boolean): void;
|
|
51
|
+
getPlanContext(): string | null;
|
|
52
|
+
setPlanContext(v: string | null): void;
|
|
53
|
+
getResumeDigest(): string | null;
|
|
54
|
+
setResumeDigest(v: string | null): void;
|
|
55
|
+
getActiveRunId(): string | null;
|
|
56
|
+
getPendingCwdNote(): string | null;
|
|
57
|
+
setPendingCwdNote(v: string | null): void;
|
|
58
|
+
setPilActive(v: boolean): void;
|
|
59
|
+
setPilEnrichmentDelta(n: number): void;
|
|
60
|
+
setCurrentCallId(id: string): void;
|
|
61
|
+
setLastPromptBreakdown(b: {
|
|
62
|
+
systemChars: number;
|
|
63
|
+
staticPrefixChars: number;
|
|
64
|
+
dynamicSuffixChars: number;
|
|
65
|
+
playwrightGuidanceChars: number;
|
|
66
|
+
messagesChars: number;
|
|
67
|
+
messagesCount: number;
|
|
68
|
+
toolsChars: number;
|
|
69
|
+
toolsCount: number;
|
|
70
|
+
} | null): void;
|
|
71
|
+
setTurnUserGoalExcerpt(v: string): void;
|
|
72
|
+
setTurnAssistantReasoning(v: string): void;
|
|
73
|
+
appendTurnAssistantReasoning(delta: string): void;
|
|
74
|
+
getTurnAssistantReasoning(): string;
|
|
75
|
+
setPriorWarningIdsInSession(s: Set<string>): void;
|
|
76
|
+
setMessages(messages: ModelMessage[]): void;
|
|
77
|
+
requireProvider(): LegacyProvider;
|
|
78
|
+
emitSubagentStatus(status: SubagentStatus | null): void;
|
|
79
|
+
consultParentSession?: (question: string) => Promise<string>;
|
|
80
|
+
fireHook(input: unknown, signal?: AbortSignal): Promise<{
|
|
81
|
+
blocked: boolean;
|
|
82
|
+
blockingErrors: Array<{
|
|
83
|
+
command: string;
|
|
84
|
+
stderr: string;
|
|
85
|
+
}>;
|
|
86
|
+
preventContinuation: boolean;
|
|
87
|
+
additionalContexts: string[];
|
|
88
|
+
results: import("../hooks/types.js").HookResult[];
|
|
89
|
+
eeMatches: import("../hooks/types.js").EEMatchEntry[];
|
|
90
|
+
}>;
|
|
91
|
+
consumeBackgroundNotifications(): Promise<string[]>;
|
|
92
|
+
initOAuthProvider(): Promise<void>;
|
|
93
|
+
buildRecentTurnsSummary(): string | null;
|
|
94
|
+
estimateProjectSize(): "small" | "medium" | "large" | null;
|
|
95
|
+
countFilesTouched(): number;
|
|
96
|
+
respondToToolApproval(approvalId: string, approved: boolean): void;
|
|
97
|
+
/**
|
|
98
|
+
* Tool-loop cap askcard hook (Claude-Code-style "continue?" prompt).
|
|
99
|
+
*
|
|
100
|
+
* Fires when the streamText loop reaches `maxToolRounds`. Returning
|
|
101
|
+
* `"continue"` raises the cap by `bumpBy` and lets the loop run; `"stop"`
|
|
102
|
+
* halts gracefully (no error). When undefined the loop hard-stops as before
|
|
103
|
+
* — preserves backward compat for batch / headless paths that have no UI to
|
|
104
|
+
* surface the askcard.
|
|
105
|
+
*/
|
|
106
|
+
/**
|
|
107
|
+
* Live-queue steering drain (UI-provided). Returns and CLEARS any messages
|
|
108
|
+
* the user typed while this turn is streaming, so prepareStep can inject them
|
|
109
|
+
* mid-turn. Undefined / returns [] → no steering (legacy deferred queue).
|
|
110
|
+
*/
|
|
111
|
+
drainSteerMessages?: () => {
|
|
112
|
+
text: string;
|
|
113
|
+
}[];
|
|
114
|
+
appendMidTurnMessages?: (msgs: ModelMessage[]) => void;
|
|
115
|
+
askToolLoopContinue?: ToolLoopCapAsk;
|
|
116
|
+
/** Safety override handler — invoked when a tool call is blocked by the safety filter. */
|
|
117
|
+
askSafetyOverride?: (info: SafetyOverrideAskInfo) => Promise<SafetyOverrideVerdict>;
|
|
118
|
+
runCouncilV2(userMessage: string, opts: {
|
|
119
|
+
skipClarification: boolean;
|
|
120
|
+
observer?: ProcessMessageObserver;
|
|
121
|
+
userModelMessage: ModelMessage;
|
|
122
|
+
}): AsyncGenerator<StreamChunk, void, unknown>;
|
|
123
|
+
processMessage(userMessage: string, observer?: ProcessMessageObserver, images?: Array<{
|
|
124
|
+
path: string;
|
|
125
|
+
mediaType: string;
|
|
126
|
+
base64: string;
|
|
127
|
+
}>): AsyncGenerator<StreamChunk, void, unknown>;
|
|
128
|
+
processMessageBatchTurn(args: {
|
|
129
|
+
userModelMessage: ModelMessage;
|
|
130
|
+
userEnrichedMessage: ModelMessage;
|
|
131
|
+
observer?: ProcessMessageObserver;
|
|
132
|
+
provider: LegacyProvider;
|
|
133
|
+
subagents: unknown[];
|
|
134
|
+
system: string;
|
|
135
|
+
runtime: ReturnType<typeof resolveModelRuntime>;
|
|
136
|
+
modelInfo: ReturnType<typeof getModelInfo>;
|
|
137
|
+
signal: AbortSignal;
|
|
138
|
+
}): AsyncGenerator<StreamChunk, void, unknown>;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Rewrites tool-result parts in the AI SDK's final response history if the
|
|
142
|
+
* user manually approved a safety-blocked command. This ensures the model sees
|
|
143
|
+
* its own retry context accurately (as a success) rather than a repeated block
|
|
144
|
+
* message, avoiding infinite retry loops or hallucinated failures.
|
|
145
|
+
*/
|
|
146
|
+
export declare function rewriteSafetyApprovedToolResults<T extends {
|
|
147
|
+
role: string;
|
|
148
|
+
content?: any;
|
|
149
|
+
}>(messages: T[]): T[];
|
|
150
|
+
export interface ToolEngineArgs {
|
|
151
|
+
[key: string]: any;
|
|
152
|
+
}
|
|
153
|
+
export declare function executeToolEngine(args: ToolEngineArgs): AsyncGenerator<StreamChunk, void, unknown>;
|