@symerian/symi 2.6.0 → 2.6.2
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/{agents-Bi50kp6u.js → agents-qLMWAYwU.js} +4 -4
- package/dist/{agents.config-BcTeP94V.js → agents.config-BfjAwFCr.js} +1 -1
- package/dist/{agents.config-Duce7lam.js → agents.config-BmdFH4J5.js} +1 -1
- package/dist/{audio-preflight-DHTaS5U1.js → audio-preflight-BVaaZWkg.js} +4 -4
- package/dist/{audio-preflight-C40mKAp7.js → audio-preflight-CPBOQV4I.js} +4 -4
- package/dist/{auth-choice-Dyq-0MNq.js → auth-choice-D1u_GPfQ.js} +1 -1
- package/dist/{auth-choice-BFIBR4l9.js → auth-choice-zFq3WRQ0.js} +1 -1
- package/dist/{banner-D50f_0qf.js → banner-DpH44qlJ.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +6 -6
- package/dist/bundled/session-memory/handler.js +6 -6
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-BFqaanEt.js → channel-options-0iOfzVR3.js} +1 -1
- package/dist/{channel-options-BvBcjqyk.js → channel-options-C8tKm8re.js} +1 -1
- package/dist/{channel-web-BQtFg4IP.js → channel-web-DYinYBz4.js} +1 -1
- package/dist/{channels-cli-BuTH-iVi.js → channels-cli-93tLT17t.js} +4 -4
- package/dist/{channels-cli-BYFQdWnL.js → channels-cli-C8HgSMTH.js} +4 -4
- package/dist/{chrome-DYZwl5Gv.js → chrome-D2SKJnR7.js} +5 -5
- package/dist/{chrome-CDJYxX5a.js → chrome-DkaXoP36.js} +5 -5
- package/dist/{cli-r2L-UK6y.js → cli-BYJyRW2M.js} +1 -1
- package/dist/{cli-eOBlVLcC.js → cli-DapZXGSB.js} +1 -1
- package/dist/{command-registry-D-pwcAIW.js → command-registry-9EhYc6da.js} +9 -9
- package/dist/{completion-cli-DIx7KyOG.js → completion-cli-BFZv3K5D.js} +2 -2
- package/dist/{completion-cli-DMO2OGTm.js → completion-cli-CCeQlMlC.js} +1 -1
- package/dist/{config-cli-BsDxqYDU.js → config-cli-DbWMIBUz.js} +1 -1
- package/dist/{config-cli-seaVWVru.js → config-cli-Dv2mtIeM.js} +1 -1
- package/dist/{configure-BmPwuHXL.js → configure-B8zV6Hxj.js} +3 -3
- package/dist/{configure-CqbKA0_V.js → configure-CVQf2UJE.js} +3 -3
- package/dist/{deliver-BH0l3UKW.js → deliver-C-37cZUe.js} +1 -1
- package/dist/{deliver-dODxSv3b.js → deliver-C46-vyqg.js} +1 -1
- package/dist/{doctor-completion-DMjs7-Qa.js → doctor-completion-BunqvoqZ.js} +1 -1
- package/dist/{doctor-completion-C2IV3lKi.js → doctor-completion-CLeX1kaN.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +6 -6
- package/dist/{gateway-cli-BanaeKQ_.js → gateway-cli-Co-tp-WC.js} +9 -9
- package/dist/{gateway-cli-C-J_s559.js → gateway-cli-DMey_29a.js} +9 -9
- package/dist/{glass-ui-ws-DUzp9m0D.js → glass-ui-ws-C4O227UO.js} +7 -7
- package/dist/{glass-ui-ws-DK7x3Tz7.js → glass-ui-ws-CKb1jTZR.js} +7 -7
- package/dist/{health-DK6rAOhC.js → health-CDGOsNeD.js} +1 -1
- package/dist/{health-BpHgCv-u.js → health-CM1asUG8.js} +1 -1
- package/dist/{hooks-cli-D-75G_66.js → hooks-cli-DFKB3Z6X.js} +2 -2
- package/dist/{hooks-cli-Cin_3tFg.js → hooks-cli-Tx0TzSju.js} +2 -2
- package/dist/{image-CXu8W39c.js → image-CuzFLQWC.js} +1 -1
- package/dist/{image-CHzdaNJ4.js → image-DcpMiprB.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/llm-slug-generator.js +6 -6
- package/dist/{models-CeKIXf5B.js → models-CiqHYwje.js} +2 -2
- package/dist/{models-cli-2NcPKR9A.js → models-cli-B-b-gBKG.js} +2 -2
- package/dist/{models-cli-DN4AVlpI.js → models-cli-B4ATSsNS.js} +3 -3
- package/dist/{onboard-BukRqcRH.js → onboard-B_ECX48L.js} +2 -2
- package/dist/{onboard-BcxDiUl_.js → onboard-DcnGZKZX.js} +2 -2
- package/dist/{onboard-channels-DS6s341R.js → onboard-channels-FFQPpuEN.js} +1 -1
- package/dist/{onboard-channels-HPxu77wp.js → onboard-channels-pfSGhg_C.js} +1 -1
- package/dist/{onboarding-DI-o_sax.js → onboarding-BU14cspo.js} +3 -3
- package/dist/{onboarding-B8uz24jt.js → onboarding-jhZxQcZ3.js} +3 -3
- package/dist/{onboarding.finalize-CfE_AEto.js → onboarding.finalize-B8oOMfHc.js} +6 -6
- package/dist/{onboarding.finalize-Bn2e61yb.js → onboarding.finalize-ByZT4dF5.js} +5 -5
- package/dist/{pi-embedded-B5qBa69e.js → pi-embedded-BY9AnmoP.js} +203 -27
- package/dist/{pi-embedded-helpers-lgx_U5KS.js → pi-embedded-helpers-B8kqLWns.js} +4 -4
- package/dist/{pi-embedded-helpers-pubKo8HQ.js → pi-embedded-helpers-CfqDGQ9J.js} +4 -4
- package/dist/{plugin-registry-NIUxULTk.js → plugin-registry-CNf1_8hj.js} +1 -1
- package/dist/{plugin-registry-cj99EI0k.js → plugin-registry-DXWJkJX6.js} +1 -1
- package/dist/plugin-sdk/{accounts-BtaOa4z_.js → accounts-BToL3HlP.js} +1 -1
- package/dist/plugin-sdk/{accounts-Ddm33hQm.js → accounts-D9zGZU5t.js} +3 -3
- package/dist/plugin-sdk/{accounts-s-AdhXVR.js → accounts-Dtszw3Zn.js} +1 -1
- package/dist/plugin-sdk/{active-listener-BXYeALs0.js → active-listener-bEk__wbB.js} +1 -1
- package/dist/plugin-sdk/{agent-scope-CYYpcO9W.js → agent-scope-C3gMMKCU.js} +2 -2
- package/dist/plugin-sdk/agents/model-token-filter.d.ts +10 -0
- package/dist/plugin-sdk/agents/pi-tools.validate-wrapper.d.ts +23 -0
- package/dist/plugin-sdk/agents/pi-tools.validate.d.ts +26 -0
- package/dist/plugin-sdk/agents/tool-loop-detection.d.ts +3 -1
- package/dist/plugin-sdk/{api-key-rotation-D_sMvI5W.js → api-key-rotation-CVBMpnPc.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-VpItkiy3.js → audio-preflight-DoQQKlxa.js} +24 -24
- package/dist/plugin-sdk/{bindings-C7hRtgYW.js → bindings-BbwoUGPx.js} +2 -2
- package/dist/plugin-sdk/{channel-activity-DoC1xtDu.js → channel-activity-Ji7f0gqq.js} +1 -1
- package/dist/plugin-sdk/{channel-web-CSd16cDi.js → channel-web-DZQQ0mzN.js} +22 -22
- package/dist/plugin-sdk/{chrome-B7RdxmJ0.js → chrome-C7c_0I5M.js} +3 -3
- package/dist/plugin-sdk/{chunk-Dw2XBYXv.js → chunk-jvk9axTQ.js} +1 -1
- package/dist/plugin-sdk/{command-format-GKSevep4.js → command-format-DSdvQ_M5.js} +1 -1
- package/dist/plugin-sdk/{commands-registry-COIaslGl.js → commands-registry-CQFbmUMs.js} +4 -4
- package/dist/plugin-sdk/config/model-profiles.d.ts +2 -0
- package/dist/plugin-sdk/{config-KlTNfkFF.js → config-DDkdiUOR.js} +9 -9
- package/dist/plugin-sdk/{deliver-BZ99UKQq.js → deliver-BZ6iNLl7.js} +10 -10
- package/dist/plugin-sdk/{diagnostic-05pm5Rxi.js → diagnostic-mFf4i4G9.js} +1 -1
- package/dist/plugin-sdk/{image-CLOPx7yW.js → image-BOYy0Ump.js} +4 -4
- package/dist/plugin-sdk/{image-ops-BlQR__MN.js → image-ops-Bnp6LXEx.js} +1 -1
- package/dist/plugin-sdk/index.js +53 -53
- package/dist/plugin-sdk/infra/diagnostic-events.d.ts +1 -1
- package/dist/plugin-sdk/{ir-BJ6BHE5b.js → ir-Fb3qpcis.js} +4 -4
- package/dist/plugin-sdk/{local-roots-BHLNSI8U.js → local-roots-Ckk1QfzI.js} +3 -3
- package/dist/plugin-sdk/logging/diagnostic-session-state.d.ts +2 -0
- package/dist/plugin-sdk/logging/diagnostic.d.ts +1 -1
- package/dist/plugin-sdk/{login-DQMXuxOk.js → login-Bh3DZPam.js} +7 -7
- package/dist/plugin-sdk/{login-qr-BjVZSoCi.js → login-qr-DbR7odSr.js} +9 -9
- package/dist/plugin-sdk/{manager-CBSBFuFz.js → manager-DckktAQ3.js} +8 -8
- package/dist/plugin-sdk/{manifest-registry-CPnHl_K3.js → manifest-registry-B3ugY9-f.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-BoYFajMu.js → markdown-tables-Dfaqilz6.js} +1 -1
- package/dist/plugin-sdk/{message-channel-COTAJzHd.js → message-channel-BdI5Ra9S.js} +1 -1
- package/dist/plugin-sdk/{model-selection-CsbEfrS0.js → model-selection-OpU8HN50.js} +4 -4
- package/dist/plugin-sdk/{outbound-attachment-CnslKL38.js → outbound-attachment-DnVQfTG2.js} +2 -2
- package/dist/plugin-sdk/{outbound-B0e8KdaR.js → outbound-rF6G8Xpr.js} +7 -7
- package/dist/plugin-sdk/{pi-auth-json-qWi7ZIYV.js → pi-auth-json-CJk8t14T.js} +5 -5
- package/dist/plugin-sdk/{pi-embedded-helpers-CW630epe.js → pi-embedded-helpers-BveUP4hk.js} +17 -17
- package/dist/plugin-sdk/{plugins-BNByVCIH.js → plugins-BbAvhC25.js} +4 -4
- package/dist/plugin-sdk/{pw-ai-CnbPIPY9.js → pw-ai-DjGUsee-.js} +8 -8
- package/dist/plugin-sdk/{qmd-manager-CH0XbIHf.js → qmd-manager-mjKcdwVr.js} +4 -4
- package/dist/plugin-sdk/{registry-D0xTnUWt.js → registry--_pGht6S.js} +2 -2
- package/dist/plugin-sdk/{replies-LLcQL3w6.js → replies-fI39rPGa.js} +3 -3
- package/dist/plugin-sdk/{reply-CkqSfQZN.js → reply-DvZeyOVA.js} +263 -87
- package/dist/plugin-sdk/{reply-prefix-uxfMZW4p.js → reply-prefix-BHuV5t70.js} +1 -1
- package/dist/plugin-sdk/{resolve-outbound-target-BiyAyTWz.js → resolve-outbound-target-BkCUbYGV.js} +2 -2
- package/dist/plugin-sdk/{resolve-route-B3CCBumQ.js → resolve-route-D3JH_D2N.js} +3 -3
- package/dist/plugin-sdk/{retry-CwQ_iIj8.js → retry-ilSJqnz9.js} +1 -1
- package/dist/plugin-sdk/{runner-CGBT7tgF.js → runner-BVqnEfNe.js} +9 -9
- package/dist/plugin-sdk/{send-C5h_YxNb.js → send-BHbXh8Ly.js} +7 -7
- package/dist/plugin-sdk/{send-pYqe432l.js → send-BMfJIhCk.js} +6 -6
- package/dist/plugin-sdk/{send-B2CEnVLL.js → send-BtANzsAo.js} +6 -6
- package/dist/plugin-sdk/{send-CjOBB3Vo.js → send-Bxdu6ZZy.js} +10 -10
- package/dist/plugin-sdk/{send-CRsR8-vO.js → send-D6LMZJ_h.js} +10 -10
- package/dist/plugin-sdk/{session-BsOrxiMj.js → session-kI0tzViQ.js} +4 -4
- package/dist/plugin-sdk/{skill-commands-ff_01_r3.js → skill-commands-DCNXVERE.js} +5 -5
- package/dist/plugin-sdk/{skills-_yTP47Cd.js → skills-B1GeRYlu.js} +7 -7
- package/dist/plugin-sdk/{sqlite-CxAR5ttJ.js → sqlite-Cq_7Cg4E.js} +1 -1
- package/dist/plugin-sdk/{store-BdrNabcU.js → store-Do3t33-c.js} +2 -2
- package/dist/plugin-sdk/{subsystem-B2uDN3TV.js → subsystem-Coz2AgU8.js} +1 -1
- package/dist/plugin-sdk/{tables-DNwXwNFa.js → tables-DR0NmBeH.js} +1 -1
- package/dist/plugin-sdk/{target-errors-Paro1BjP.js → target-errors-B7YyMnIi.js} +2 -2
- package/dist/plugin-sdk/{thinking-CXqf7WTe.js → thinking-DCNUIAHY.js} +5 -5
- package/dist/plugin-sdk/{tokens-bC3UVmVH.js → tokens-CWMflosr.js} +1 -1
- package/dist/plugin-sdk/{tool-images-HJ2sfZDV.js → tool-images-D7Lno-TE.js} +2 -2
- package/dist/plugin-sdk/{tool-loop-detection-BVA6fax-.js → tool-loop-detection-DU5sTIKg.js} +55 -5
- package/dist/plugin-sdk/web-BCsJFuQu.js +65 -0
- package/dist/plugin-sdk/{whatsapp-actions-DfseosPO.js → whatsapp-actions-CcBzDuL-.js} +21 -21
- package/dist/{plugins-cli-CcjxxESJ.js → plugins-cli-BiedlZMy.js} +2 -2
- package/dist/{plugins-cli-D8hhTHZD.js → plugins-cli-C9TYM40P.js} +2 -2
- package/dist/{program-D09h71pS.js → program-bnWda72r.js} +7 -7
- package/dist/{program-context-CLJSWBZr.js → program-context-CY1jWc5A.js} +17 -17
- package/dist/{prompt-select-styled-DQqZEGoo.js → prompt-select-styled-BEnZY8wI.js} +4 -4
- package/dist/{prompt-select-styled-zRUqu0c8.js → prompt-select-styled-B_lFTtqp.js} +4 -4
- package/dist/{provider-auth-helpers-LzJ2WQIc.js → provider-auth-helpers-DApJuzBd.js} +1 -1
- package/dist/{provider-auth-helpers-16r2WHNe.js → provider-auth-helpers-DcNKxc7D.js} +1 -1
- package/dist/{push-apns-DJddAK3u.js → push-apns-CKKHlj6j.js} +1 -1
- package/dist/{push-apns-B5xZKIxK.js → push-apns-DA7UMNQH.js} +1 -1
- package/dist/{pw-ai-De-KR9_s.js → pw-ai-1htA-NnS.js} +1 -1
- package/dist/{pw-ai-B5asscAD.js → pw-ai-m0mj2KWK.js} +1 -1
- package/dist/{register.agent-D7NKuUkY.js → register.agent-8lxVlmzQ.js} +5 -5
- package/dist/{register.agent-CP_sigRh.js → register.agent-ulu0VmOg.js} +6 -6
- package/dist/{register.configure-BEsGd0PR.js → register.configure-45--Sly1.js} +6 -6
- package/dist/{register.configure-BjRLNatb.js → register.configure-rq0h5r3X.js} +6 -6
- package/dist/{register.maintenance-DD6TNFtV.js → register.maintenance-CXbxRtWI.js} +8 -8
- package/dist/{register.maintenance-CN6KUuX7.js → register.maintenance-DyEJx7NY.js} +7 -7
- package/dist/{register.message-DEUcNly1.js → register.message-C7Yh1uky.js} +2 -2
- package/dist/{register.message-DMVC_Sqm.js → register.message-CiN_pt6K.js} +2 -2
- package/dist/{register.onboard-CP6RP90V.js → register.onboard-BWaRkbei.js} +4 -4
- package/dist/{register.onboard-J1pgV7lz.js → register.onboard-e_2hc2Rm.js} +4 -4
- package/dist/{register.setup-Dhc3jKpK.js → register.setup-BIIFHtF7.js} +4 -4
- package/dist/{register.setup-BeHpW3xI.js → register.setup-zwh90Vn-.js} +4 -4
- package/dist/{register.status-health-sessions-b-lWNsTM.js → register.status-health-sessions-D6t5maEr.js} +3 -3
- package/dist/{register.status-health-sessions-DDkC0aoW.js → register.status-health-sessions-O-sVAFHE.js} +3 -3
- package/dist/{register.subclis-BJqiT8Q2.js → register.subclis-DOiZocR6.js} +9 -9
- package/dist/{reply-D40cmAci.js → reply-05js8eGB.js} +189 -13
- package/dist/{run-main-BruREeZ6.js → run-main-u-Eyc8Wm.js} +14 -14
- package/dist/{runner-DUBExAb5.js → runner-BcQ0sF9T.js} +1 -1
- package/dist/{runner-WAG0M5s9.js → runner-CU9l0uJh.js} +1 -1
- package/dist/{server-methods-K-0MHs8x.js → server-methods-Bvl1xubo.js} +7 -7
- package/dist/{server-methods-Cyw_WS3A.js → server-methods-Dds-iEoY.js} +7 -7
- package/dist/{server-node-events-89R9Ryky.js → server-node-events-Qp-gJMET.js} +2 -2
- package/dist/{server-node-events-RA8RurtC.js → server-node-events-qGqpsPxm.js} +2 -2
- package/dist/{status-DHJLMwQN.js → status-BATOXGRi.js} +2 -2
- package/dist/{status-CtNKWuzg.js → status-BRSo-LY3.js} +2 -2
- package/dist/{status-Kv_hsY8N.js → status-BqQ9mm64.js} +1 -1
- package/dist/{status-BSMEjz4q.js → status-CfYa1Q9K.js} +1 -1
- package/dist/{subagent-registry-Cb5e_x99.js → subagent-registry-lbDgDwLy.js} +189 -13
- package/dist/{tool-loop-detection-BgbtzUGc.js → tool-loop-detection-C7TCF2V2.js} +53 -3
- package/dist/{tool-loop-detection-BU3fbtCd.js → tool-loop-detection-D7qjFnRh.js} +53 -3
- package/dist/{tool-loop-detection-B6j1r-Wk.js → tool-loop-detection-DPVtQOfM.js} +53 -3
- package/dist/{tool-loop-detection-D0kUzUGu.js → tool-loop-detection-DR_rrIA1.js} +53 -3
- package/dist/{unified-runner-CkJLTsTK.js → unified-runner-B4ICXRlg.js} +203 -27
- package/dist/{update-cli-CrRBoiVU.js → update-cli-BOaP4XyQ.js} +8 -8
- package/dist/{update-cli-Bl66LJZ4.js → update-cli-R8-SSkbS.js} +7 -7
- package/dist/{update-runner-DxpSPK-f.js → update-runner-B8UmqtLI.js} +1 -1
- package/dist/{update-runner-FgrqoxvV.js → update-runner-CWJ4pC1b.js} +1 -1
- package/dist/{web-BYRKX5Ln.js → web-BWybtnEa.js} +2 -2
- package/dist/{web-RePh7lRy.js → web-CQH9fSkH.js} +6 -6
- package/dist/{web-Czp0JS6-.js → web-CSrDbJJ7.js} +1 -1
- package/dist/{web-D99WHLTL.js → web-DBFW0ejP.js} +6 -6
- package/package.json +1 -1
- package/dist/plugin-sdk/web-DdTTil50.js +0 -65
|
@@ -12,7 +12,7 @@ import { f as GATEWAY_CLIENT_CAPS, g as hasGatewayClientCap, i as isGatewayMessa
|
|
|
12
12
|
import { c as writeJsonAtomic, o as createAsyncLock, s as readJsonFile } from "./pairing-token-Byh6drgn.js";
|
|
13
13
|
import { s as pickPrimaryLanIPv4 } from "./net-DZ5Ayk-W.js";
|
|
14
14
|
import { i as normalizeInputProvenance } from "./input-provenance-D0lNkCf6.js";
|
|
15
|
-
import { $n as resolveTtsAutoMode, B as dispatchInboundMessage, C as resolveAgentDeliveryPlan, Cn as enqueueSystemEvent, Cr as onAgentEvent, D as createOutboundSendDeps, Dt as normalizeCronJobPatch, Et as normalizeCronJobCreate, G as BARE_SESSION_RESET_PROMPT, Gn as stopSubagentsForRequester, Gt as persistBrowserProxyFiles, In as resolveAgentTimeoutMs, Jn as resolveUserTimezone, Qn as resolveTtsApiKey, Sn as parseVerboseOverride, V as createReplyDispatcher, Vn as formatZonedTimestamp, Wn as isAbortTrigger, Wt as applyBrowserProxyPaths, Xn as isTtsEnabled, Y as abortEmbeddedPiRun, Yn as getTtsProvider, Z as waitForEmbeddedPiRunEnd, Zn as isTtsProviderConfigured, Zt as scheduleGatewaySigusr1Restart, a as listSubagentRunsForRequester, ar as textToSpeech, bn as applyModelOverrideToSessionEntry, c as clearSessionQueues, ct as resolveOutboundSessionRoute, dt as resolveOutboundTarget, en as unbindThreadBindingsBySessionKey, er as resolveTtsConfig, hn as resolveSendPolicy, i as listDescendantRunsForRequester, ir as setTtsProvider, m as loadSymiPlugins, mn as normalizeSendPolicy, nr as resolveTtsProviderOrder, or as OPENAI_TTS_MODELS, rn as loadProviderUsageSummary, rr as setTtsEnabled, sr as OPENAI_TTS_VOICES, st as ensureOutboundSessionEntry, tn as normalizeGroupActivation, tr as resolveTtsPrefsPath, w as resolveAgentOutboundTarget, wn as isSystemEventContextChanged, wr as registerAgentRunContext, wt as writeRestartSentinel, x as agentCommand, xn as applyVerboseOverride, yt as formatDoctorNonInteractiveHint } from "./subagent-registry-
|
|
15
|
+
import { $n as resolveTtsAutoMode, B as dispatchInboundMessage, C as resolveAgentDeliveryPlan, Cn as enqueueSystemEvent, Cr as onAgentEvent, D as createOutboundSendDeps, Dt as normalizeCronJobPatch, Et as normalizeCronJobCreate, G as BARE_SESSION_RESET_PROMPT, Gn as stopSubagentsForRequester, Gt as persistBrowserProxyFiles, In as resolveAgentTimeoutMs, Jn as resolveUserTimezone, Qn as resolveTtsApiKey, Sn as parseVerboseOverride, V as createReplyDispatcher, Vn as formatZonedTimestamp, Wn as isAbortTrigger, Wt as applyBrowserProxyPaths, Xn as isTtsEnabled, Y as abortEmbeddedPiRun, Yn as getTtsProvider, Z as waitForEmbeddedPiRunEnd, Zn as isTtsProviderConfigured, Zt as scheduleGatewaySigusr1Restart, a as listSubagentRunsForRequester, ar as textToSpeech, bn as applyModelOverrideToSessionEntry, c as clearSessionQueues, ct as resolveOutboundSessionRoute, dt as resolveOutboundTarget, en as unbindThreadBindingsBySessionKey, er as resolveTtsConfig, hn as resolveSendPolicy, i as listDescendantRunsForRequester, ir as setTtsProvider, m as loadSymiPlugins, mn as normalizeSendPolicy, nr as resolveTtsProviderOrder, or as OPENAI_TTS_MODELS, rn as loadProviderUsageSummary, rr as setTtsEnabled, sr as OPENAI_TTS_VOICES, st as ensureOutboundSessionEntry, tn as normalizeGroupActivation, tr as resolveTtsPrefsPath, w as resolveAgentOutboundTarget, wn as isSystemEventContextChanged, wr as registerAgentRunContext, wt as writeRestartSentinel, x as agentCommand, xn as applyVerboseOverride, yt as formatDoctorNonInteractiveHint } from "./subagent-registry-lbDgDwLy.js";
|
|
16
16
|
import { F as resolveMainSessionKey, I as resolveMainSessionKeyFromConfig, J as normalizeSessionDeliveryFields, N as resolveAgentMainSessionKey, P as resolveExplicitAgentSessionKey, R as snapshotSessionOrigin, S as stripEnvelopeFromMessages, _ as capArrayByJsonBytes, d as updateSessionStore, g as archiveSessionTranscripts, h as archiveFileOnDisk, o as loadSessionStore, t as extractDeliveryInfo, v as readSessionMessages, x as resolveSessionTranscriptCandidates, y as readSessionPreviewItemsFromTranscript } from "./sessions-CJXnZVjR.js";
|
|
17
17
|
import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
|
|
18
18
|
import { n as createBrowserRouteDispatcher } from "./with-timeout-Di0nddLY.js";
|
|
@@ -37,14 +37,14 @@ import { t as WizardCancelledError } from "./prompts-m1IJwIAx.js";
|
|
|
37
37
|
import { t as resolveChannelDefaultAccountId } from "./helpers-cLP5YLeQ.js";
|
|
38
38
|
import { t as buildChannelAccountSnapshot } from "./status-BUedPCLb.js";
|
|
39
39
|
import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-Byo5jCLN.js";
|
|
40
|
-
import { r as getStatusSummary } from "./status-
|
|
41
|
-
import { c as setHeartbeatsEnabled } from "./health-
|
|
40
|
+
import { r as getStatusSummary } from "./status-BRSo-LY3.js";
|
|
41
|
+
import { c as setHeartbeatsEnabled } from "./health-CM1asUG8.js";
|
|
42
42
|
import { m as normalizeUpdateChannel } from "./update-check-ZdimP1aU.js";
|
|
43
|
-
import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-
|
|
44
|
-
import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-
|
|
43
|
+
import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-CKKHlj6j.js";
|
|
44
|
+
import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BfjAwFCr.js";
|
|
45
45
|
import { t as resolveSystemRunCommand } from "./system-run-command-ByVa3txU.js";
|
|
46
46
|
import { t as installSkill } from "./skills-install-1ZdwGTnh.js";
|
|
47
|
-
import { t as runGatewayUpdate } from "./update-runner-
|
|
47
|
+
import { t as runGatewayUpdate } from "./update-runner-B8UmqtLI.js";
|
|
48
48
|
import { spawnSync } from "node:child_process";
|
|
49
49
|
import * as os$1 from "node:os";
|
|
50
50
|
import os from "node:os";
|
|
@@ -6851,7 +6851,7 @@ const nodeHandlers = {
|
|
|
6851
6851
|
const p = params;
|
|
6852
6852
|
const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
|
|
6853
6853
|
await respondUnavailableOnThrow(respond, async () => {
|
|
6854
|
-
const { handleNodeEvent } = await import("./server-node-events-
|
|
6854
|
+
const { handleNodeEvent } = await import("./server-node-events-Qp-gJMET.js");
|
|
6855
6855
|
const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
|
|
6856
6856
|
await handleNodeEvent({
|
|
6857
6857
|
deps: context.deps,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { g as resolveStateDir, t as CONFIG_PATH } from "./paths-Cqn-zk3M.js";
|
|
2
2
|
import { D as isPlainObject, U as getResolvedLoggerSettings, r as clamp, y as resolveUserPath } from "./utils-B-0b9bGM.js";
|
|
3
3
|
import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./thinking-EAliFiVK.js";
|
|
4
|
-
import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-
|
|
4
|
+
import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-05js8eGB.js";
|
|
5
5
|
import { S as parseAgentSessionKey, l as resolveAgentIdFromSessionKey, m as DEFAULT_ACCOUNT_ID, o as classifySessionKeyShape, s as normalizeAgentId, t as DEFAULT_AGENT_ID, x as isSubagentSessionKey } from "./session-key-DCt45XZa.js";
|
|
6
6
|
import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
|
|
7
7
|
import { C as createInternalHookEvent, T as triggerInternalHook, d as getActivePluginRegistry, r as DEFAULT_CHAT_CHANNEL, t as CHANNEL_IDS } from "./registry-Cja8eT7G.js";
|
|
@@ -39,14 +39,14 @@ import { t as WizardCancelledError } from "./prompts-Xu2Sveka.js";
|
|
|
39
39
|
import { t as resolveChannelDefaultAccountId } from "./helpers-BcGbMZD1.js";
|
|
40
40
|
import { t as buildChannelAccountSnapshot } from "./status-BrV-afZE.js";
|
|
41
41
|
import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-CrITRV6w.js";
|
|
42
|
-
import { n as getStatusSummary } from "./status-
|
|
43
|
-
import { s as setHeartbeatsEnabled } from "./health-
|
|
42
|
+
import { n as getStatusSummary } from "./status-BATOXGRi.js";
|
|
43
|
+
import { s as setHeartbeatsEnabled } from "./health-CDGOsNeD.js";
|
|
44
44
|
import { m as normalizeUpdateChannel } from "./update-check-CtckACbb.js";
|
|
45
|
-
import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-
|
|
46
|
-
import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-
|
|
45
|
+
import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-DA7UMNQH.js";
|
|
46
|
+
import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BmdFH4J5.js";
|
|
47
47
|
import { t as resolveSystemRunCommand } from "./system-run-command-ByVa3txU.js";
|
|
48
48
|
import { t as installSkill } from "./skills-install-D67isO1L.js";
|
|
49
|
-
import { t as runGatewayUpdate } from "./update-runner-
|
|
49
|
+
import { t as runGatewayUpdate } from "./update-runner-CWJ4pC1b.js";
|
|
50
50
|
import * as fs$2 from "node:fs";
|
|
51
51
|
import fs from "node:fs";
|
|
52
52
|
import * as os$1 from "node:os";
|
|
@@ -6853,7 +6853,7 @@ const nodeHandlers = {
|
|
|
6853
6853
|
const p = params;
|
|
6854
6854
|
const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
|
|
6855
6855
|
await respondUnavailableOnThrow(respond, async () => {
|
|
6856
|
-
const { handleNodeEvent } = await import("./server-node-events-
|
|
6856
|
+
const { handleNodeEvent } = await import("./server-node-events-qGqpsPxm.js");
|
|
6857
6857
|
const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
|
|
6858
6858
|
await handleNodeEvent({
|
|
6859
6859
|
deps: context.deps,
|
|
@@ -14,7 +14,7 @@ import "./client-DMBZpU6X.js";
|
|
|
14
14
|
import "./call-BcE47FtD.js";
|
|
15
15
|
import "./message-channel-C9dERklz.js";
|
|
16
16
|
import "./pairing-token-Byh6drgn.js";
|
|
17
|
-
import { Cn as enqueueSystemEvent, T as createOutboundSendDeps, dn as requestHeartbeatNow, dt as resolveOutboundTarget, x as agentCommand } from "./subagent-registry-
|
|
17
|
+
import { Cn as enqueueSystemEvent, T as createOutboundSendDeps, dn as requestHeartbeatNow, dt as resolveOutboundTarget, x as agentCommand } from "./subagent-registry-lbDgDwLy.js";
|
|
18
18
|
import { d as updateSessionStore } from "./sessions-CJXnZVjR.js";
|
|
19
19
|
import "./tokens-Csntmwwn.js";
|
|
20
20
|
import { r as normalizeChannelId } from "./plugins-CwSlLxM8.js";
|
|
@@ -98,7 +98,7 @@ import "./onboard-helpers-_pit1NZW.js";
|
|
|
98
98
|
import "./prompt-style-DwCXob2h.js";
|
|
99
99
|
import "./pairing-labels-D1HDboV2.js";
|
|
100
100
|
import "./pi-tools.policy-De00gPXt.js";
|
|
101
|
-
import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-
|
|
101
|
+
import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-CKKHlj6j.js";
|
|
102
102
|
import { randomUUID } from "node:crypto";
|
|
103
103
|
|
|
104
104
|
//#region src/gateway/server-node-events.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "./paths-Cqn-zk3M.js";
|
|
2
2
|
import "./utils-B-0b9bGM.js";
|
|
3
3
|
import "./thinking-EAliFiVK.js";
|
|
4
|
-
import { Et as agentCommand, Mt as resolveOutboundTarget, Pt as createOutboundSendDeps, b as resolveGatewaySessionStoreTarget, st as requestHeartbeatNow, v as loadSessionEntry, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys } from "./reply-
|
|
4
|
+
import { Et as agentCommand, Mt as resolveOutboundTarget, Pt as createOutboundSendDeps, b as resolveGatewaySessionStoreTarget, st as requestHeartbeatNow, v as loadSessionEntry, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys } from "./reply-05js8eGB.js";
|
|
5
5
|
import { c as normalizeMainKey } from "./session-key-DCt45XZa.js";
|
|
6
6
|
import "./registry-Cja8eT7G.js";
|
|
7
7
|
import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
|
|
@@ -102,7 +102,7 @@ import "./pi-tools.policy-CIDBbw6x.js";
|
|
|
102
102
|
import "./control-service-Bz7rxLWq.js";
|
|
103
103
|
import "./stagger-BUClb97_.js";
|
|
104
104
|
import "./channel-selection-DuWs0Aak.js";
|
|
105
|
-
import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-
|
|
105
|
+
import { c as parseMessageWithAttachments, l as formatForLog, r as registerApnsToken, s as normalizeRpcAttachmentsToChatAttachments } from "./push-apns-DA7UMNQH.js";
|
|
106
106
|
import { randomUUID } from "node:crypto";
|
|
107
107
|
|
|
108
108
|
//#region src/gateway/server-node-events.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { u as resolveGatewayPort } from "./paths-Cqn-zk3M.js";
|
|
2
2
|
import { B as theme, k as info, z as isRich } from "./utils-B-0b9bGM.js";
|
|
3
|
-
import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-
|
|
3
|
+
import { B as summarizeRestartSentinel, Jt as sha256HexPrefix, _t as formatUsageReportLines, a as buildChannelSummary, gt as loadProviderUsageSummary, h as listAgentsForGateway, m as classifySessionKey, o as buildChannelAccountSnapshot, pr as lookupContextTokens, s as formatChannelAllowFrom, wr as peekSystemEvents, x as resolveSessionModelRef, z as readRestartSentinel } from "./reply-05js8eGB.js";
|
|
4
4
|
import { S as parseAgentSessionKey } from "./session-key-DCt45XZa.js";
|
|
5
5
|
import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
|
|
6
6
|
import { n as runExec } from "./exec-CWkblSrI.js";
|
|
@@ -28,7 +28,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-CR9445g5.j
|
|
|
28
28
|
import { t as readLastGatewayErrorLine } from "./diagnostics-BAMlsVVX.js";
|
|
29
29
|
import { t as renderTable } from "./table-BTgkRafz.js";
|
|
30
30
|
import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-CrITRV6w.js";
|
|
31
|
-
import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-
|
|
31
|
+
import { a as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-CDGOsNeD.js";
|
|
32
32
|
import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-CtckACbb.js";
|
|
33
33
|
import { t as resolveNodeService } from "./node-service-Cxz4e-Qd.js";
|
|
34
34
|
import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-yQZNwAF2.js";
|
|
@@ -9,7 +9,7 @@ import { c as resolveAgentWorkspaceDir } from "./agent-scope-D-jRCY0d.js";
|
|
|
9
9
|
import { t as buildWorkspaceSkillStatus } from "./skills-status-DKXJ-tbi.js";
|
|
10
10
|
import { H as VERSION, i as loadConfig, o as readConfigFileSnapshot } from "./config-DHBLS1Hl.js";
|
|
11
11
|
import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-BcE47FtD.js";
|
|
12
|
-
import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-
|
|
12
|
+
import { En as peekSystemEvents, St as summarizeRestartSentinel, cn as buildChannelAccountSnapshot, in as formatUsageReportLines, ln as formatChannelAllowFrom, nt as sha256HexPrefix, rn as loadProviderUsageSummary, sn as buildChannelSummary, xt as readRestartSentinel } from "./subagent-registry-lbDgDwLy.js";
|
|
13
13
|
import { F as resolveMainSessionKey, j as resolveFreshSessionTotalTokens, o as loadSessionStore } from "./sessions-CJXnZVjR.js";
|
|
14
14
|
import { n as listChannelPlugins } from "./plugins-CwSlLxM8.js";
|
|
15
15
|
import { o as getTailnetHostname, s as readTailscaleStatusJson } from "./tailscale-CbbvYNVw.js";
|
|
@@ -29,7 +29,7 @@ import { t as formatRuntimeStatusWithDetails } from "./runtime-status-hFVEC3wO.j
|
|
|
29
29
|
import { t as readLastGatewayErrorLine } from "./diagnostics-CS1ov_hH.js";
|
|
30
30
|
import { t as renderTable } from "./table-D01d2GuY.js";
|
|
31
31
|
import { a as resolveGatewayProbeAuth$1, c as probeGateway, t as runSecurityAudit } from "./audit-Byo5jCLN.js";
|
|
32
|
-
import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-
|
|
32
|
+
import { o as resolveHeartbeatSummaryForAgent, t as formatHealthChannelLines } from "./health-CM1asUG8.js";
|
|
33
33
|
import { g as resolveUpdateChannelDisplay, i as formatGitInstallLabel, m as normalizeUpdateChannel, t as checkUpdateStatus } from "./update-check-ZdimP1aU.js";
|
|
34
34
|
import { t as resolveNodeService } from "./node-service-fcZExd22.js";
|
|
35
35
|
import { n as redactSecrets, t as formatGatewayAuthUsed } from "./format-DVLB9DNB.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-
|
|
1
|
+
import { dt as createPluginLoaderLogger, ft as loadSymiPlugins } from "./reply-05js8eGB.js";
|
|
2
2
|
import { t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
|
|
3
3
|
import { D as resolveDefaultAgentWorkspaceDir, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-CgUHAtCo.js";
|
|
4
4
|
import { i as loadConfig } from "./config-CHwyw6l5.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { o as createSubsystemLogger } from "./entry.js";
|
|
2
2
|
import { D as resolveDefaultAgentWorkspaceDir, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId } from "./agent-scope-D-jRCY0d.js";
|
|
3
3
|
import { i as loadConfig } from "./config-DHBLS1Hl.js";
|
|
4
|
-
import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-
|
|
4
|
+
import { m as loadSymiPlugins, p as createPluginLoaderLogger } from "./subagent-registry-lbDgDwLy.js";
|
|
5
5
|
|
|
6
6
|
//#region src/plugins/status.ts
|
|
7
7
|
const log = createSubsystemLogger("plugins");
|
|
@@ -32327,7 +32327,8 @@ const BUILTIN_PROFILES = [
|
|
|
32327
32327
|
"<end_of_turn>"
|
|
32328
32328
|
],
|
|
32329
32329
|
suppressMonologue: true,
|
|
32330
|
-
hasStructuredThinking: false
|
|
32330
|
+
hasStructuredThinking: false,
|
|
32331
|
+
validateToolArgs: true
|
|
32331
32332
|
},
|
|
32332
32333
|
promptAdditions: [
|
|
32333
32334
|
"CRITICAL OUTPUT RULES:",
|
|
@@ -32337,7 +32338,8 @@ const BUILTIN_PROFILES = [
|
|
|
32337
32338
|
"- Do not write verification checklists, self-assessments, or numbered assessment lists after your answer.",
|
|
32338
32339
|
"- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
|
|
32339
32340
|
"- If you need to verify your work, do so before writing your response, not after.",
|
|
32340
|
-
"- Send brief progress updates on long tasks so the user knows you are active."
|
|
32341
|
+
"- Send brief progress updates on long tasks so the user knows you are active.",
|
|
32342
|
+
"- When calling tools, provide arguments as clean values only. Never include <|, |>, or XML-like tags in tool argument values. For exec/bash commands, provide only valid shell syntax."
|
|
32341
32343
|
],
|
|
32342
32344
|
ui: {
|
|
32343
32345
|
badge: "Local",
|
|
@@ -32361,7 +32363,8 @@ const BUILTIN_PROFILES = [
|
|
|
32361
32363
|
filters: {
|
|
32362
32364
|
stripPatterns: [],
|
|
32363
32365
|
suppressMonologue: false,
|
|
32364
|
-
hasStructuredThinking: true
|
|
32366
|
+
hasStructuredThinking: true,
|
|
32367
|
+
validateToolArgs: false
|
|
32365
32368
|
},
|
|
32366
32369
|
promptAdditions: [],
|
|
32367
32370
|
ui: {
|
|
@@ -32395,7 +32398,8 @@ const BUILTIN_PROFILES = [
|
|
|
32395
32398
|
"^\\s*<bos>\\s*"
|
|
32396
32399
|
],
|
|
32397
32400
|
suppressMonologue: true,
|
|
32398
|
-
hasStructuredThinking: false
|
|
32401
|
+
hasStructuredThinking: false,
|
|
32402
|
+
validateToolArgs: true
|
|
32399
32403
|
},
|
|
32400
32404
|
promptAdditions: [
|
|
32401
32405
|
"CRITICAL OUTPUT RULES:",
|
|
@@ -32406,7 +32410,8 @@ const BUILTIN_PROFILES = [
|
|
|
32406
32410
|
"- Do not write 'Verification:', 'Requirements:', 'Status Check:', or 'Everything is correct'.",
|
|
32407
32411
|
"- If you need to verify your work, do so before writing your response, not after.",
|
|
32408
32412
|
"- Keep planning and reasoning internal. Only speak when you have a result or need user input.",
|
|
32409
|
-
"- When working on multi-step tasks, send a brief one-line status update so the user knows you are active."
|
|
32413
|
+
"- When working on multi-step tasks, send a brief one-line status update so the user knows you are active.",
|
|
32414
|
+
"- When calling tools, provide arguments as clean values only. Never include <|, |>, or XML-like tags in tool argument values. For exec/bash commands, provide only valid shell syntax."
|
|
32410
32415
|
],
|
|
32411
32416
|
ui: {
|
|
32412
32417
|
badge: "CoreWeave",
|
|
@@ -32434,7 +32439,8 @@ const FALLBACK_PROFILE = {
|
|
|
32434
32439
|
filters: {
|
|
32435
32440
|
stripPatterns: [],
|
|
32436
32441
|
suppressMonologue: false,
|
|
32437
|
-
hasStructuredThinking: false
|
|
32442
|
+
hasStructuredThinking: false,
|
|
32443
|
+
validateToolArgs: false
|
|
32438
32444
|
},
|
|
32439
32445
|
promptAdditions: [],
|
|
32440
32446
|
ui: {
|
|
@@ -32861,6 +32867,19 @@ function stripModelTokensAggressive(text, modelId) {
|
|
|
32861
32867
|
}
|
|
32862
32868
|
return result;
|
|
32863
32869
|
}
|
|
32870
|
+
/**
|
|
32871
|
+
* Clean residual fragments left after aggressive token stripping.
|
|
32872
|
+
* After `<|` and `|>` are removed, orphaned `<`, `"`, `|` can remain
|
|
32873
|
+
* at string boundaries (e.g., `<<|"|uname -a` → `<"uname -a`).
|
|
32874
|
+
*
|
|
32875
|
+
* Conservative: only trims leading junk before what looks like a command,
|
|
32876
|
+
* and trailing junk. Does NOT touch content in the middle of the string.
|
|
32877
|
+
* Preserves heredoc syntax (`<<EOF`, `<<"EOF"`) via negative lookahead.
|
|
32878
|
+
*/
|
|
32879
|
+
function cleanResidualTokenFragments(text) {
|
|
32880
|
+
if (!text) return text;
|
|
32881
|
+
return text.replace(/^[<"|]+(?!<[A-Z_])(?=[a-zA-Z0-9/~$.(])/gm, "").replace(/[<"|]+$/gm, "").trim();
|
|
32882
|
+
}
|
|
32864
32883
|
|
|
32865
32884
|
//#endregion
|
|
32866
32885
|
//#region src/agents/output-normalizer.ts
|
|
@@ -32946,10 +32965,14 @@ function detectRepetition(text, minBlock) {
|
|
|
32946
32965
|
const searchStart = sampleStart + minBlock;
|
|
32947
32966
|
return text.indexOf(sample, searchStart) >= 0;
|
|
32948
32967
|
}
|
|
32968
|
+
function sanitizeStringValue(value, modelId) {
|
|
32969
|
+
const stripped = stripModelTokensAggressive(value, modelId);
|
|
32970
|
+
return isGemmaModel$1(modelId) ? cleanResidualTokenFragments(stripped) : stripped;
|
|
32971
|
+
}
|
|
32949
32972
|
function sanitizeArgs(args, modelId) {
|
|
32950
32973
|
const result = {};
|
|
32951
|
-
for (const [key, value] of Object.entries(args)) if (typeof value === "string") result[key] =
|
|
32952
|
-
else if (Array.isArray(value)) result[key] = value.map((item) => typeof item === "string" ?
|
|
32974
|
+
for (const [key, value] of Object.entries(args)) if (typeof value === "string") result[key] = sanitizeStringValue(value, modelId);
|
|
32975
|
+
else if (Array.isArray(value)) result[key] = value.map((item) => typeof item === "string" ? sanitizeStringValue(item, modelId) : item && typeof item === "object" ? sanitizeArgs(item, modelId) : item);
|
|
32953
32976
|
else if (value && typeof value === "object") result[key] = sanitizeArgs(value, modelId);
|
|
32954
32977
|
else result[key] = value;
|
|
32955
32978
|
return result;
|
|
@@ -35243,7 +35266,7 @@ async function recordLoopOutcome(args) {
|
|
|
35243
35266
|
if (!args.ctx?.sessionKey) return;
|
|
35244
35267
|
try {
|
|
35245
35268
|
const { getDiagnosticSessionState } = await import("./diagnostic-session-state-CIjIGxEE.js").then((n) => n.n);
|
|
35246
|
-
const { recordToolCallOutcome } = await import("./tool-loop-detection-
|
|
35269
|
+
const { recordToolCallOutcome } = await import("./tool-loop-detection-D7qjFnRh.js");
|
|
35247
35270
|
recordToolCallOutcome(getDiagnosticSessionState({
|
|
35248
35271
|
sessionKey: args.ctx.sessionKey,
|
|
35249
35272
|
sessionId: args.ctx?.agentId
|
|
@@ -35265,7 +35288,7 @@ async function runBeforeToolCallHook(args) {
|
|
|
35265
35288
|
if (args.ctx?.sessionKey) {
|
|
35266
35289
|
const { getDiagnosticSessionState } = await import("./diagnostic-session-state-CIjIGxEE.js").then((n) => n.n);
|
|
35267
35290
|
const { logToolLoopAction } = await import("./diagnostic-Ci8Xsc_Y.js").then((n) => n.n);
|
|
35268
|
-
const { detectToolCallLoop, recordToolCall } = await import("./tool-loop-detection-
|
|
35291
|
+
const { detectToolCallLoop, recordToolCall } = await import("./tool-loop-detection-D7qjFnRh.js");
|
|
35269
35292
|
const sessionState = getDiagnosticSessionState({
|
|
35270
35293
|
sessionKey: args.ctx.sessionKey,
|
|
35271
35294
|
sessionId: args.ctx?.agentId
|
|
@@ -35536,6 +35559,135 @@ function toClientToolDefinitions(tools, onClientToolCall, hookContext) {
|
|
|
35536
35559
|
});
|
|
35537
35560
|
}
|
|
35538
35561
|
|
|
35562
|
+
//#endregion
|
|
35563
|
+
//#region src/agents/pi-tools.validate.ts
|
|
35564
|
+
/**
|
|
35565
|
+
* Tool argument validation — validates that exec/bash commands contain
|
|
35566
|
+
* valid shell syntax after model token sanitization.
|
|
35567
|
+
*
|
|
35568
|
+
* Gated on ModelProfile.filters.validateToolArgs — only active for
|
|
35569
|
+
* models known to leak control tokens into structured output (Gemma, Ollama).
|
|
35570
|
+
*
|
|
35571
|
+
* @module
|
|
35572
|
+
*/
|
|
35573
|
+
/**
|
|
35574
|
+
* Validate that a command string contains extractable valid shell syntax.
|
|
35575
|
+
* Returns the cleaned command if valid, or an error reason if not.
|
|
35576
|
+
*
|
|
35577
|
+
* Does NOT attempt to parse the full shell grammar — just checks for
|
|
35578
|
+
* obvious corruption (residual control tokens, empty commands).
|
|
35579
|
+
* Preserves heredocs, redirects, pipes, and other legitimate shell syntax.
|
|
35580
|
+
*/
|
|
35581
|
+
function validateShellCommand(command) {
|
|
35582
|
+
if (!command || !command.trim()) return {
|
|
35583
|
+
valid: false,
|
|
35584
|
+
cleaned: "",
|
|
35585
|
+
reason: "empty command"
|
|
35586
|
+
};
|
|
35587
|
+
let cleaned = cleanResidualTokenFragments(command);
|
|
35588
|
+
if (/(?:^|[^<])<\|/.test(cleaned) || /\|>/.test(cleaned)) {
|
|
35589
|
+
cleaned = cleaned.replace(/<\|[^|>]*(?:\|>)?/g, "").trim();
|
|
35590
|
+
cleaned = cleanResidualTokenFragments(cleaned);
|
|
35591
|
+
}
|
|
35592
|
+
if (!cleaned || !cleaned.trim()) return {
|
|
35593
|
+
valid: false,
|
|
35594
|
+
cleaned: "",
|
|
35595
|
+
reason: "command is empty after removing control tokens"
|
|
35596
|
+
};
|
|
35597
|
+
if (!/[a-zA-Z0-9_/.~-]/.test(cleaned)) return {
|
|
35598
|
+
valid: false,
|
|
35599
|
+
cleaned,
|
|
35600
|
+
reason: "no recognizable shell command found"
|
|
35601
|
+
};
|
|
35602
|
+
return {
|
|
35603
|
+
valid: true,
|
|
35604
|
+
cleaned: cleaned.trim()
|
|
35605
|
+
};
|
|
35606
|
+
}
|
|
35607
|
+
|
|
35608
|
+
//#endregion
|
|
35609
|
+
//#region src/agents/pi-tools.validate-wrapper.ts
|
|
35610
|
+
const EXEC_TOOL_NAMES = new Set(["exec", "bash"]);
|
|
35611
|
+
const FILE_TOOL_NAMES = new Set([
|
|
35612
|
+
"write",
|
|
35613
|
+
"read",
|
|
35614
|
+
"edit",
|
|
35615
|
+
"patch",
|
|
35616
|
+
"file_write",
|
|
35617
|
+
"file_edit",
|
|
35618
|
+
"write_file",
|
|
35619
|
+
"edit_file",
|
|
35620
|
+
"create_file"
|
|
35621
|
+
]);
|
|
35622
|
+
const FILE_PATH_KEYS = [
|
|
35623
|
+
"file_path",
|
|
35624
|
+
"path",
|
|
35625
|
+
"filePath"
|
|
35626
|
+
];
|
|
35627
|
+
/**
|
|
35628
|
+
* Wrap tools with argument validation. Exec/bash commands and file paths
|
|
35629
|
+
* are validated. Other tools pass through unchanged.
|
|
35630
|
+
*
|
|
35631
|
+
* Call this AFTER tools are created and the model profile is resolved.
|
|
35632
|
+
*/
|
|
35633
|
+
function wrapToolsWithArgValidation(tools, profile) {
|
|
35634
|
+
if (!profile.filters?.validateToolArgs) return tools;
|
|
35635
|
+
return tools.map((tool) => wrapToolWithArgValidation(tool));
|
|
35636
|
+
}
|
|
35637
|
+
/**
|
|
35638
|
+
* Clean a file path by stripping control token fragments.
|
|
35639
|
+
* Returns null if the path is irreparably corrupted (empty after cleanup).
|
|
35640
|
+
*/
|
|
35641
|
+
function cleanFilePath(filePath) {
|
|
35642
|
+
let cleaned = filePath.replace(/<\|[^|>]*(?:\|>)?/g, "");
|
|
35643
|
+
cleaned = cleanResidualTokenFragments(cleaned);
|
|
35644
|
+
cleaned = cleaned.trim();
|
|
35645
|
+
if (!cleaned || !/[a-zA-Z0-9/._~-]/.test(cleaned)) return {
|
|
35646
|
+
valid: false,
|
|
35647
|
+
cleaned
|
|
35648
|
+
};
|
|
35649
|
+
return {
|
|
35650
|
+
valid: true,
|
|
35651
|
+
cleaned
|
|
35652
|
+
};
|
|
35653
|
+
}
|
|
35654
|
+
/**
|
|
35655
|
+
* Wrap a single tool with argument validation.
|
|
35656
|
+
*/
|
|
35657
|
+
function wrapToolWithArgValidation(tool) {
|
|
35658
|
+
const toolName = (tool.name ?? "").toLowerCase().trim();
|
|
35659
|
+
const isExecTool = EXEC_TOOL_NAMES.has(toolName);
|
|
35660
|
+
const isFileTool = FILE_TOOL_NAMES.has(toolName);
|
|
35661
|
+
if (!isExecTool && !isFileTool) return tool;
|
|
35662
|
+
const originalExecute = tool.execute;
|
|
35663
|
+
return {
|
|
35664
|
+
...tool,
|
|
35665
|
+
execute(toolCallId, params, ...rest) {
|
|
35666
|
+
if (isExecTool) {
|
|
35667
|
+
const command = params.command ?? params.cmd;
|
|
35668
|
+
if (typeof command !== "string") return originalExecute.call(tool, toolCallId, params, ...rest);
|
|
35669
|
+
const result = validateShellCommand(command);
|
|
35670
|
+
if (!result.valid) return Promise.resolve({ output: `Error: ${result.reason}. The command appears to contain model control tokens. Please provide a clean shell command without any <|, |>, or XML-like tags. Only valid shell syntax is accepted.` });
|
|
35671
|
+
if (result.cleaned !== command) return originalExecute.call(tool, toolCallId, {
|
|
35672
|
+
...params,
|
|
35673
|
+
command: result.cleaned
|
|
35674
|
+
}, ...rest);
|
|
35675
|
+
return originalExecute.call(tool, toolCallId, params, ...rest);
|
|
35676
|
+
}
|
|
35677
|
+
const pathKey = FILE_PATH_KEYS.find((k) => typeof params[k] === "string");
|
|
35678
|
+
if (!pathKey) return originalExecute.call(tool, toolCallId, params, ...rest);
|
|
35679
|
+
const rawPath = params[pathKey];
|
|
35680
|
+
if (!rawPath.includes("<|") && !rawPath.includes("|>") && !/^[<"|]/.test(rawPath)) return originalExecute.call(tool, toolCallId, params, ...rest);
|
|
35681
|
+
const pathResult = cleanFilePath(rawPath);
|
|
35682
|
+
if (!pathResult.valid) return Promise.resolve({ output: `Error: file path "${rawPath}" contains model control tokens and could not be cleaned. Please provide a clean file path without any <|, |>, or XML-like tags.` });
|
|
35683
|
+
return originalExecute.call(tool, toolCallId, {
|
|
35684
|
+
...params,
|
|
35685
|
+
[pathKey]: pathResult.cleaned
|
|
35686
|
+
}, ...rest);
|
|
35687
|
+
}
|
|
35688
|
+
};
|
|
35689
|
+
}
|
|
35690
|
+
|
|
35539
35691
|
//#endregion
|
|
35540
35692
|
//#region src/agents/plan-mode.ts
|
|
35541
35693
|
/**
|
|
@@ -39488,10 +39640,11 @@ async function runEmbeddedAttempt(params) {
|
|
|
39488
39640
|
await resourceLoader.reload();
|
|
39489
39641
|
}
|
|
39490
39642
|
const hookRunner = getGlobalHookRunner();
|
|
39491
|
-
const { builtInTools, customTools } = splitSdkTools({
|
|
39643
|
+
const { builtInTools: rawBuiltInTools, customTools } = splitSdkTools({
|
|
39492
39644
|
tools,
|
|
39493
39645
|
sandboxEnabled: !!sandbox?.enabled
|
|
39494
39646
|
});
|
|
39647
|
+
const builtInTools = wrapToolsWithArgValidation(rawBuiltInTools, modelProfile);
|
|
39495
39648
|
let clientToolCallDetected = null;
|
|
39496
39649
|
const clientToolLoopDetection = resolveToolLoopDetectionConfig({
|
|
39497
39650
|
cfg: params.config,
|
|
@@ -39700,6 +39853,10 @@ async function runEmbeddedAttempt(params) {
|
|
|
39700
39853
|
});
|
|
39701
39854
|
};
|
|
39702
39855
|
const streamMonitor = createStreamMonitor(modelProfile);
|
|
39856
|
+
const TOOL_ERROR_ABORT_THRESHOLD = 5;
|
|
39857
|
+
const TOOL_ERROR_WARN_THRESHOLD = 3;
|
|
39858
|
+
let consecutiveToolErrors = 0;
|
|
39859
|
+
let lastErrorToolName = "";
|
|
39703
39860
|
const subscription = subscribeEmbeddedPiSession({
|
|
39704
39861
|
session: activeSession,
|
|
39705
39862
|
runId: params.runId,
|
|
@@ -39721,6 +39878,25 @@ async function runEmbeddedAttempt(params) {
|
|
|
39721
39878
|
onAgentEvent: (evt) => {
|
|
39722
39879
|
armSymipulseTimer();
|
|
39723
39880
|
params.onAgentEvent?.(evt);
|
|
39881
|
+
if (evt.stream === "tool" && !aborted) {
|
|
39882
|
+
const phase = typeof evt.data?.phase === "string" ? evt.data.phase : "";
|
|
39883
|
+
const toolName = typeof evt.data?.name === "string" ? evt.data.name : "";
|
|
39884
|
+
const isError = evt.data?.isError === true;
|
|
39885
|
+
if (phase === "result" && toolName) {
|
|
39886
|
+
if (isError && toolName === lastErrorToolName) consecutiveToolErrors++;
|
|
39887
|
+
else if (isError) {
|
|
39888
|
+
consecutiveToolErrors = 1;
|
|
39889
|
+
lastErrorToolName = toolName;
|
|
39890
|
+
} else {
|
|
39891
|
+
consecutiveToolErrors = 0;
|
|
39892
|
+
lastErrorToolName = "";
|
|
39893
|
+
}
|
|
39894
|
+
if (consecutiveToolErrors >= TOOL_ERROR_ABORT_THRESHOLD) {
|
|
39895
|
+
log$4.error(`Agent-loop circuit breaker: ${toolName} failed ${consecutiveToolErrors} consecutive times. Aborting run ${params.runId}.`);
|
|
39896
|
+
abortRun(false, /* @__PURE__ */ new Error(`Tool ${toolName} failed ${consecutiveToolErrors} consecutive times. The model may be generating corrupted tool arguments. Run aborted to prevent infinite loop.`));
|
|
39897
|
+
} else if (consecutiveToolErrors === TOOL_ERROR_WARN_THRESHOLD) log$4.warn(`Agent-loop tool error warning: ${toolName} failed ${consecutiveToolErrors} times consecutively. runId=${params.runId}`);
|
|
39898
|
+
}
|
|
39899
|
+
}
|
|
39724
39900
|
if (evt.stream === "assistant" && typeof evt.data?.text === "string" && !aborted) {
|
|
39725
39901
|
streamMonitor.onChunk(evt.data.text);
|
|
39726
39902
|
if (streamMonitor.shouldStop()) log$4.debug(`stream monitor detection (log-only, no abort): runId=${params.runId} reason=${streamMonitor.getStopReason()}`);
|
|
@@ -52836,7 +53012,7 @@ function isVoiceChannelType(type) {
|
|
|
52836
53012
|
function createDefaultDeps() {
|
|
52837
53013
|
return {
|
|
52838
53014
|
sendMessageWhatsApp: async (...args) => {
|
|
52839
|
-
const { sendMessageWhatsApp } = await import("./web-
|
|
53015
|
+
const { sendMessageWhatsApp } = await import("./web-CSrDbJJ7.js");
|
|
52840
53016
|
return await sendMessageWhatsApp(...args);
|
|
52841
53017
|
},
|
|
52842
53018
|
sendMessageTelegram: async (...args) => {
|
|
@@ -68150,7 +68326,7 @@ function loadWebLoginQr() {
|
|
|
68150
68326
|
return webLoginQrPromise;
|
|
68151
68327
|
}
|
|
68152
68328
|
function loadWebChannel() {
|
|
68153
|
-
webChannelPromise ??= import("./web-
|
|
68329
|
+
webChannelPromise ??= import("./web-CSrDbJJ7.js");
|
|
68154
68330
|
return webChannelPromise;
|
|
68155
68331
|
}
|
|
68156
68332
|
function loadWhatsAppActions() {
|
|
@@ -9,6 +9,8 @@ const TOOL_CALL_HISTORY_SIZE = 30;
|
|
|
9
9
|
const WARNING_THRESHOLD = 10;
|
|
10
10
|
const CRITICAL_THRESHOLD = 20;
|
|
11
11
|
const GLOBAL_CIRCUIT_BREAKER_THRESHOLD = 30;
|
|
12
|
+
const CONSECUTIVE_FAILURE_WARNING_THRESHOLD = 3;
|
|
13
|
+
const CONSECUTIVE_FAILURE_CRITICAL_THRESHOLD = 5;
|
|
12
14
|
const DEFAULT_LOOP_DETECTION_CONFIG = {
|
|
13
15
|
enabled: false,
|
|
14
16
|
historySize: TOOL_CALL_HISTORY_SIZE,
|
|
@@ -18,8 +20,11 @@ const DEFAULT_LOOP_DETECTION_CONFIG = {
|
|
|
18
20
|
detectors: {
|
|
19
21
|
genericRepeat: true,
|
|
20
22
|
knownPollNoProgress: true,
|
|
21
|
-
pingPong: true
|
|
22
|
-
|
|
23
|
+
pingPong: true,
|
|
24
|
+
consecutiveFailure: true
|
|
25
|
+
},
|
|
26
|
+
consecutiveFailureWarningThreshold: CONSECUTIVE_FAILURE_WARNING_THRESHOLD,
|
|
27
|
+
consecutiveFailureCriticalThreshold: CONSECUTIVE_FAILURE_CRITICAL_THRESHOLD
|
|
23
28
|
};
|
|
24
29
|
function asPositiveInt(value, fallback) {
|
|
25
30
|
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) return fallback;
|
|
@@ -37,10 +42,13 @@ function resolveLoopDetectionConfig(config) {
|
|
|
37
42
|
warningThreshold,
|
|
38
43
|
criticalThreshold,
|
|
39
44
|
globalCircuitBreakerThreshold,
|
|
45
|
+
consecutiveFailureWarningThreshold: asPositiveInt(config?.consecutiveFailureWarningThreshold, DEFAULT_LOOP_DETECTION_CONFIG.consecutiveFailureWarningThreshold),
|
|
46
|
+
consecutiveFailureCriticalThreshold: asPositiveInt(config?.consecutiveFailureCriticalThreshold, DEFAULT_LOOP_DETECTION_CONFIG.consecutiveFailureCriticalThreshold),
|
|
40
47
|
detectors: {
|
|
41
48
|
genericRepeat: config?.detectors?.genericRepeat ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,
|
|
42
49
|
knownPollNoProgress: config?.detectors?.knownPollNoProgress ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,
|
|
43
|
-
pingPong: config?.detectors?.pingPong ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong
|
|
50
|
+
pingPong: config?.detectors?.pingPong ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong,
|
|
51
|
+
consecutiveFailure: (config?.detectors)?.consecutiveFailure ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.consecutiveFailure
|
|
44
52
|
}
|
|
45
53
|
};
|
|
46
54
|
}
|
|
@@ -218,6 +226,22 @@ function canonicalPairKey(signatureA, signatureB) {
|
|
|
218
226
|
return [signatureA, signatureB].toSorted().join("|");
|
|
219
227
|
}
|
|
220
228
|
/**
|
|
229
|
+
* Count consecutive error results for a specific tool, walking backward from
|
|
230
|
+
* the most recent call. A success or a call to a different tool resets the streak.
|
|
231
|
+
* Only counts entries that have been resolved (have a resultHash or isError flag).
|
|
232
|
+
*/
|
|
233
|
+
function getConsecutiveFailureStreak(history, toolName) {
|
|
234
|
+
let count = 0;
|
|
235
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
236
|
+
const entry = history[i];
|
|
237
|
+
if (entry.toolName !== toolName) break;
|
|
238
|
+
if (entry.resultHash === void 0 && entry.isError === void 0) break;
|
|
239
|
+
if (!entry.isError) break;
|
|
240
|
+
count++;
|
|
241
|
+
}
|
|
242
|
+
return count;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
221
245
|
* Detect if an agent is stuck in a repetitive tool call loop.
|
|
222
246
|
* Checks if the same tool+params combination has been called excessively.
|
|
223
247
|
*/
|
|
@@ -230,6 +254,31 @@ function detectToolCallLoop(state, toolName, params, config) {
|
|
|
230
254
|
const noProgressStreak = noProgress.count;
|
|
231
255
|
const knownPollTool = isKnownPollToolCall(toolName, params);
|
|
232
256
|
const pingPong = getPingPongStreak(history, currentHash);
|
|
257
|
+
if (resolvedConfig.detectors.consecutiveFailure) {
|
|
258
|
+
const failureStreak = getConsecutiveFailureStreak(history, toolName);
|
|
259
|
+
if (failureStreak >= resolvedConfig.consecutiveFailureCriticalThreshold) {
|
|
260
|
+
log.error(`Consecutive failure circuit breaker: ${toolName} failed ${failureStreak} times in a row`);
|
|
261
|
+
return {
|
|
262
|
+
stuck: true,
|
|
263
|
+
level: "critical",
|
|
264
|
+
detector: "consecutive_failure",
|
|
265
|
+
count: failureStreak,
|
|
266
|
+
message: `CRITICAL: ${toolName} has failed ${failureStreak} consecutive times. Stop calling this tool. Explain to the user what you were trying to do and why it failed.`,
|
|
267
|
+
warningKey: `consecutive-failure:${toolName}`
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (failureStreak >= resolvedConfig.consecutiveFailureWarningThreshold) {
|
|
271
|
+
log.warn(`Consecutive failure warning: ${toolName} failed ${failureStreak} times in a row`);
|
|
272
|
+
return {
|
|
273
|
+
stuck: true,
|
|
274
|
+
level: "warning",
|
|
275
|
+
detector: "consecutive_failure",
|
|
276
|
+
count: failureStreak,
|
|
277
|
+
message: `WARNING: You have failed to call ${toolName} ${failureStreak} times consecutively. Stop retrying and explain to the user what you were trying to do. The tool arguments may contain invalid syntax from model control tokens.`,
|
|
278
|
+
warningKey: `consecutive-failure:${toolName}`
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
233
282
|
if (noProgressStreak >= resolvedConfig.globalCircuitBreakerThreshold) {
|
|
234
283
|
log.error(`Global circuit breaker triggered: ${toolName} repeated ${noProgressStreak} times with no progress`);
|
|
235
284
|
return {
|
|
@@ -334,6 +383,7 @@ function recordToolCallOutcome(state, params) {
|
|
|
334
383
|
if (call.toolName !== params.toolName || call.argsHash !== argsHash) continue;
|
|
335
384
|
if (call.resultHash !== void 0) continue;
|
|
336
385
|
call.resultHash = resultHash;
|
|
386
|
+
call.isError = params.error !== void 0;
|
|
337
387
|
matched = true;
|
|
338
388
|
break;
|
|
339
389
|
}
|