squidclaw 3.0.13 → 3.0.14
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/{accounts-PhtBJ8mA.js → accounts-BjEXPlGc.js} +1 -1
- package/dist/{accounts-Xp5W2xrR.js → accounts-CyBVeR-N.js} +1 -1
- package/dist/{accounts-BFC1okn9.js → accounts-D095MOmG.js} +7 -7
- package/dist/{acp-cli-Dt95OPXW.js → acp-cli-Dd2joFFS.js} +8 -8
- package/dist/{agent-scope-tUxfsPYq.js → agent-scope-C1XMay0T.js} +17 -17
- package/dist/{agents.config-DNPisWCH.js → agents.config-CRKsD30n.js} +2 -2
- package/dist/{api-key-rotation-Y59kKrr0.js → api-key-rotation-BcKKu9kK.js} +1 -1
- package/dist/{audio-preflight-DeBM0nTy.js → audio-preflight-g9rsstMv.js} +34 -34
- package/dist/{audio-transcription-runner-B7oPsr3U.js → audio-transcription-runner-Bnl3Ubjo.js} +23 -23
- package/dist/{audit-Bq3iosCf.js → audit-B4s_5Gn1.js} +29 -29
- package/dist/{auth-HYiP0mxx.js → auth-DHSeaNcB.js} +1 -1
- package/dist/{auth-choice-Du_pIfBh.js → auth-choice-C-7c5Td_.js} +13 -13
- package/dist/{auth-choice-CX8TDXmp.js → auth-choice-D7LiN5Ju.js} +11 -11
- package/dist/{auth-choice.apply-helpers-DRfHu1d8.js → auth-choice.apply-helpers-CxO2Wbq-.js} +1 -1
- package/dist/{auth-token-BQRI3c6e.js → auth-token-BxYYHBlc.js} +1 -1
- package/dist/{bonjour-discovery-BenDpM0y.js → bonjour-discovery-mtNewKSx.js} +1 -1
- package/dist/{browser-cli-Et8PyJjA.js → browser-cli-I1fzIVmS.js} +12 -12
- package/dist/build-info.json +2 -2
- package/dist/{call-DbkLm3eP.js → call-DkR5OGhh.js} +10 -10
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-account-context-C_WQRa6U.js → channel-account-context-e4ysObLI.js} +5 -5
- package/dist/{channel-activity-7kixHIgY.js → channel-activity-CCjlTlcN.js} +1 -1
- package/dist/{channel-options-D0TjqxeO.js → channel-options-BL5mHe-R.js} +3 -3
- package/dist/{channel-selection-BwbXcgj2.js → channel-selection-D_20zq3H.js} +1 -1
- package/dist/{channel-web-lfZ3VOOl.js → channel-web-C7Iij0H0.js} +16 -16
- package/dist/{channels-cli-Hr4vekE6.js → channels-cli-BMiEn81Y.js} +92 -92
- package/dist/{channels-status-issues-DeoqSoo-.js → channels-status-issues-N9kzQrD8.js} +1 -1
- package/dist/{chrome-gIqO4t7T.js → chrome-BNfSmFAM.js} +4 -4
- package/dist/{clawbot-cli-C-jGxnTq.js → clawbot-cli-B6-68gsT.js} +11 -11
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-BH62lCfL.js → cli-ByaubO_B.js} +72 -72
- package/dist/{client-CeaUCJtL.js → client-BURktNyH.js} +2 -2
- package/dist/{command-secret-targets-BF4WzaME.js → command-secret-targets-WwcPUFAf.js} +4 -4
- package/dist/{commands-CD6EMOiw.js → commands-CiY9HjRt.js} +1 -1
- package/dist/{commands-registry-DCUj1QOi.js → commands-registry-0bpX7A_Q.js} +3 -3
- package/dist/{completion-cli-BIY_jjYY.js → completion-cli-8PdK97J-.js} +12 -12
- package/dist/{config-cli-DvNViMXW.js → config-cli-ClomIMw7.js} +7 -7
- package/dist/{config-guard-DwgnWjmj.js → config-guard-rLrk7eSS.js} +16 -16
- package/dist/{config-validation-CcqZ--gE.js → config-validation-BQEaXMk7.js} +3 -3
- package/dist/{configure-B5Zuhebc.js → configure-CoXGul3l.js} +17 -17
- package/dist/{control-ui-assets-x69xyZH-.js → control-ui-assets-Bz7TCLpb.js} +1 -1
- package/dist/{cron-cli-Bv-X4msQ.js → cron-cli-C3iKBccc.js} +11 -11
- package/dist/{daemon-cli-B-8-rGND.js → daemon-cli-BVcrlw5o.js} +15 -15
- package/dist/{daemon-install-2y4HHhYl.js → daemon-install-CXDWHEEO.js} +4 -4
- package/dist/{daemon-install-helpers-Cdo6Pryw.js → daemon-install-helpers-a4pGEsbA.js} +11 -11
- package/dist/{deliver-CVl43oM1.js → deliver-B1sllFkh.js} +7 -7
- package/dist/deliver-runtime-CaV7seKv.js +61 -0
- package/dist/deps-send-discord.runtime-DbS5pxta.js +36 -0
- package/dist/deps-send-imessage.runtime-Ji753_F7.js +35 -0
- package/dist/deps-send-signal.runtime-DLJqvPLf.js +34 -0
- package/dist/deps-send-slack.runtime-DrFxeZ1I.js +32 -0
- package/dist/{deps-send-telegram.runtime-C9lz8bf0.js → deps-send-telegram.runtime-CF-Ylrvr.js} +16 -16
- package/dist/deps-send-whatsapp.runtime-BOE0Ke6v.js +118 -0
- package/dist/{devices-cli-BT8K0hdG.js → devices-cli-Dn_norz3.js} +8 -8
- package/dist/{diagnostic-5bqrhGEp.js → diagnostic-CNl71AzW.js} +1 -1
- package/dist/{diagnostics-C0CazfQM.js → diagnostics-DZ99A0EW.js} +5 -5
- package/dist/{directory-cli-BZcT9ie1.js → directory-cli-ZzwXkW89.js} +7 -7
- package/dist/{dns-cli-CPYaeASu.js → dns-cli-DipYQjtY.js} +5 -5
- package/dist/{dock-CVTqzMqE.js → dock-C7N1CmcP.js} +4 -4
- package/dist/{docs-cli-C50vGyDh.js → docs-cli-C-Izm9Tb.js} +4 -4
- package/dist/{doctor-completion-Emprau8v.js → doctor-completion-CGmYWy0n.js} +2 -2
- package/dist/{doctor-config-flow-DSA-JE3n.js → doctor-config-flow-DDWA3Z2D.js} +15 -15
- package/dist/{enable-CAYj5OhY.js → enable-RJyJVP_B.js} +1 -1
- package/dist/{exec-approvals-allowlist-BO4EEQUI.js → exec-approvals-allowlist-Bu_oaDJC.js} +1 -1
- package/dist/{exec-approvals-cli-DSOHdWJR.js → exec-approvals-cli-Csducy9L.js} +16 -16
- package/dist/{exec-safe-bin-runtime-policy-CSnpe1AT.js → exec-safe-bin-runtime-policy-DRQwt8kj.js} +2 -2
- package/dist/{fetch-guard-VcWeni3c.js → fetch-guard-DNykKlIv.js} +1 -1
- package/dist/{fs-safe-CjHYKGbt.js → fs-safe-CKHYu4Vz.js} +24 -24
- package/dist/{gateway-cli-B2fScwuY.js → gateway-cli-CUph5Eqo.js} +152 -152
- package/dist/{gateway-rpc-DpqZnhyz.js → gateway-rpc-DoKw40aG.js} +1 -1
- package/dist/{health-BZcB9SMe.js → health-Cia3g9r1.js} +11 -11
- package/dist/{hooks-cli-BylHgZ52.js → hooks-cli-LDbU3XMU.js} +80 -80
- package/dist/{hooks-status-DqGd74DG.js → hooks-status-Dd_iWcBZ.js} +1 -1
- package/dist/{image-CulZw1up.js → image-D2a7rcK1.js} +5 -5
- package/dist/{image-ops-BpsIdA2j.js → image-ops-BIWika4g.js} +10 -10
- package/dist/image-runtime-DTxVPe7Z.js +55 -0
- package/dist/index.js +82 -82
- package/dist/{inspect-D5T8Bbzl.js → inspect-C3PHuODr.js} +4 -4
- package/dist/{install-safe-path-BoN-MLvX.js → install-safe-path-iCmVuopp.js} +25 -25
- package/dist/{installs-CPHMcmNj.js → installs-CyjlehlR.js} +9 -9
- package/dist/{ipv4-Bwl9ruCP.js → ipv4-CWVOQw5T.js} +1 -1
- package/dist/{ir-xnftdkOo.js → ir-BPM7rQYq.js} +8 -8
- package/dist/{issue-format-8t_ncgFx.js → issue-format-sA05c-6t.js} +1 -1
- package/dist/{json-files-DIEpaxUj.js → json-files-D6M304Qd.js} +8 -8
- package/dist/{lifecycle-core-DKiBjZdv.js → lifecycle-core-DsfZ6965.js} +5 -5
- package/dist/{local-roots-BrxGyJnb.js → local-roots-CMxJ8L4w.js} +3 -3
- package/dist/{login-CxDYXbgx.js → login-BjtBaVVG.js} +3 -3
- package/dist/{login-qr-zf4B1lpU.js → login-qr-JfRlpd7I.js} +6 -6
- package/dist/{logs-cli-CJAe1_dv.js → logs-cli-gv2Ql7GE.js} +9 -9
- package/dist/{manager-DBgRFvYb.js → manager-XeZQ6ws7.js} +14 -14
- package/dist/{manager-runtime-Dl31cGh-.js → manager-runtime-BvGqzQIY.js} +9 -9
- package/dist/{manifest-registry-Cx3mB9zS.js → manifest-registry-BaUPjNKb.js} +1 -1
- package/dist/{memory-cli-Bhoc-n_1.js → memory-cli-BUJHSsW6.js} +12 -12
- package/dist/{model-DYzjrxpA.js → model-Jy6fO59G.js} +2 -2
- package/dist/{model-catalog-kpDOW8eY.js → model-catalog-BfoWgIDd.js} +3 -3
- package/dist/{model-picker-BZwK54QT.js → model-picker-CxmHVCE1.js} +4 -4
- package/dist/{model-selection-ZV3PuYVR.js → model-selection-QgM_TOjC.js} +16 -16
- package/dist/{models-cli-BIxlIOFr.js → models-cli-DlbNL6it.js} +81 -81
- package/dist/{models-config-BLdDYoxi.js → models-config-DOD5jluc.js} +6 -6
- package/dist/{node-cli-6uYJccbd.js → node-cli-uJ5lFzxj.js} +33 -33
- package/dist/{node-command-policy-CKTXVa3D.js → node-command-policy-CwVo8Z1X.js} +1 -1
- package/dist/{node-service-DGPVb5ri.js → node-service-xGYkt3vb.js} +1 -1
- package/dist/{nodes-cli-CXLRfAYx.js → nodes-cli-eauCMbSr.js} +16 -16
- package/dist/{nodes-screen-C-tuRhA1.js → nodes-screen-iR_FzGNs.js} +7 -7
- package/dist/{npm-pack-install-DgSn7djE.js → npm-pack-install-s-mP9K0z.js} +18 -18
- package/dist/{npm-resolution-gw3vFNTB.js → npm-resolution-Ck7yFIM2.js} +4 -4
- package/dist/{onboard-CCaYDSO2.js → onboard-aISMp4Kt.js} +6 -6
- package/dist/{onboard-channels-DQnP5d3Y.js → onboard-channels-CELkEQUS.js} +21 -21
- package/dist/{onboard-custom-CJohrPzT.js → onboard-custom-BmAzWYbD.js} +4 -4
- package/dist/{onboard-helpers-Bcs_1b81.js → onboard-helpers-DRk4Y5uA.js} +10 -10
- package/dist/{onboard-hooks-A23nqe_3.js → onboard-hooks-lk1sMnDf.js} +4 -4
- package/dist/{onboard-remote-Hf9sTDHl.js → onboard-remote-Bj9cR8kF.js} +4 -4
- package/dist/{onboard-skills-Cpc8o6sG.js → onboard-skills-eRpyQ1la.js} +4 -4
- package/dist/{onboarding-wx00blu5.js → onboarding-Bl4RDn6W.js} +14 -14
- package/dist/{onboarding.finalize-B8wqvggG.js → onboarding.finalize-Bm7_INHb.js} +85 -85
- package/dist/{onboarding.gateway-config-CvWq5i_X.js → onboarding.gateway-config-BPyk6gwr.js} +18 -18
- package/dist/{onboarding.secret-input-CIN4p8mg.js → onboarding.secret-input-DlDt-I2O.js} +1 -1
- package/dist/{openai-model-default-BYfJa19m.js → openai-model-default-DnYP1Em1.js} +2 -2
- package/dist/{outbound-B3RZI-ai.js → outbound-BQtnr_z2.js} +3 -3
- package/dist/{outbound-attachment-BATDqOuj.js → outbound-attachment-WnXMTJC4.js} +2 -2
- package/dist/{pairing-cli-FMIw0yL6.js → pairing-cli-BsU-YnVT.js} +8 -8
- package/dist/{pairing-labels-MH31IXn_.js → pairing-labels-BXfoinTP.js} +1 -1
- package/dist/{pairing-store-KII9MIZX.js → pairing-store-C1FvWpDK.js} +3 -3
- package/dist/{path-alias-guards-B7H6jIIw.js → path-alias-guards-CCRXJArp.js} +3 -3
- package/dist/{path-safety-3wUzDqI9.js → path-safety-BWiXz6D4.js} +1 -1
- package/dist/{paths-BguvT84s.js → paths-Bg6h1q3v.js} +9 -9
- package/dist/{pi-embedded-helpers-D8WkqLZt.js → pi-embedded-helpers-DctimJJI.js} +6 -6
- package/dist/{pi-model-discovery-Bfyzj3Lq.js → pi-model-discovery-D63dINOn.js} +1 -1
- package/dist/{pi-model-discovery-runtime-nh-zh_Bp.js → pi-model-discovery-runtime-CcXGQcru.js} +5 -5
- package/dist/{pi-tools.before-tool-call.runtime-D4V6gUzq.js → pi-tools.before-tool-call.runtime-BMb_b90y.js} +5 -5
- package/dist/{pi-tools.policy-DCE9mhtw.js → pi-tools.policy-CXvZtJB7.js} +5 -5
- package/dist/{plugin-auto-enable-BJw5Rcbx.js → plugin-auto-enable-DMABTEO-.js} +3 -3
- package/dist/{plugin-registry-V0H8DaZf.js → plugin-registry-BSlUIHKX.js} +3 -3
- package/dist/plugin-sdk/accounts-B6gye1Jd.js +46 -0
- package/dist/plugin-sdk/accounts-C-BT6Po7.js +288 -0
- package/dist/plugin-sdk/accounts-DQDXV8eB.js +35 -0
- package/dist/plugin-sdk/active-listener-DZCohPuZ.js +50 -0
- package/dist/plugin-sdk/api-key-rotation-CrX0fvDj.js +181 -0
- package/dist/plugin-sdk/audio-preflight-xnWAFqH-.js +69 -0
- package/dist/plugin-sdk/audio-transcription-runner-BDmtq7-q.js +2176 -0
- package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +58 -0
- package/dist/plugin-sdk/channel-activity-JjLRpUa_.js +94 -0
- package/dist/plugin-sdk/channel-web-DNWsxhYh.js +2256 -0
- package/dist/plugin-sdk/chrome-B5PWOUbr.js +2415 -0
- package/dist/plugin-sdk/commands-registry-BKeyJUxK.js +1125 -0
- package/dist/plugin-sdk/config-FhBFLsNm.js +17911 -0
- package/dist/plugin-sdk/deliver-DEbTlzFy.js +1694 -0
- package/dist/plugin-sdk/deliver-runtime-CO2uP-r9.js +32 -0
- package/dist/plugin-sdk/deps-send-discord.runtime-DIPW0tR4.js +23 -0
- package/dist/plugin-sdk/deps-send-imessage.runtime-ByGjRa1H.js +22 -0
- package/dist/plugin-sdk/deps-send-signal.runtime-Ca1awu4L.js +21 -0
- package/dist/plugin-sdk/deps-send-slack.runtime-CRzWCVkC.js +19 -0
- package/dist/plugin-sdk/deps-send-telegram.runtime-BWyavKp9.js +24 -0
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-cC_XvHV8.js +57 -0
- package/dist/plugin-sdk/diagnostic-Dv9S12vm.js +319 -0
- package/dist/plugin-sdk/errors-B8oJXuCF.js +54 -0
- package/dist/plugin-sdk/fetch-guard-W_A4uSz2.js +156 -0
- package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +352 -0
- package/dist/plugin-sdk/image-BSFy8d1M.js +2310 -0
- package/dist/plugin-sdk/image-ops-DN17S88I.js +584 -0
- package/dist/plugin-sdk/image-runtime-5YO31sjU.js +25 -0
- package/dist/plugin-sdk/imessage.js +2 -2
- package/dist/plugin-sdk/index.js +50 -50
- package/dist/plugin-sdk/ir-JaPZ0yKH.js +1296 -0
- package/dist/plugin-sdk/local-roots-BTW3ifco.js +186 -0
- package/dist/plugin-sdk/logger-DDdrdbDu.js +1163 -0
- package/dist/plugin-sdk/login-BXGRny-S.js +57 -0
- package/dist/plugin-sdk/login-qr-DTs92ap8.js +320 -0
- package/dist/plugin-sdk/manager-DzFj9oHX.js +3917 -0
- package/dist/plugin-sdk/manager-runtime-DrpyZvO0.js +15 -0
- package/dist/plugin-sdk/mattermost.js +3 -3
- package/dist/plugin-sdk/outbound-CQ7uBBML.js +212 -0
- package/dist/plugin-sdk/outbound-attachment-dTE6EVdX.js +19 -0
- package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +43 -0
- package/dist/plugin-sdk/paths-C6W4VHoa.js +166 -0
- package/dist/plugin-sdk/pi-embedded-helpers-CfzQPXDC.js +9627 -0
- package/dist/plugin-sdk/pi-model-discovery-Bt6B0MAj.js +134 -0
- package/dist/plugin-sdk/pi-model-discovery-runtime-BcgXpTmL.js +8 -0
- package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-DYJQxhuo.js +354 -0
- package/dist/plugin-sdk/plugins-6NxPd6TS.js +864 -0
- package/dist/plugin-sdk/proxy-fetch-ZPEvp58f.js +38 -0
- package/dist/plugin-sdk/pw-ai-BFK39pwE.js +1938 -0
- package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +1448 -0
- package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +1011 -0
- package/dist/plugin-sdk/redact-BoNEjbpF.js +319 -0
- package/dist/plugin-sdk/reply-DgcrQBKL.js +98828 -0
- package/dist/plugin-sdk/resolve-outbound-target-CbaJ-kc2.js +40 -0
- package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +1994 -0
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-jkgyeVsN.js +10 -0
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DdLJJ1YC.js +19 -0
- package/dist/plugin-sdk/send-BSoMbeqA.js +3135 -0
- package/dist/plugin-sdk/send-Byyfc20_.js +503 -0
- package/dist/plugin-sdk/send-CI-xWEs7.js +2587 -0
- package/dist/plugin-sdk/send-DzP9EJqK.js +540 -0
- package/dist/plugin-sdk/send-MlSZ82sA.js +414 -0
- package/dist/plugin-sdk/session-DFy97tfW.js +169 -0
- package/dist/plugin-sdk/signal.js +2 -2
- package/dist/plugin-sdk/skill-commands-yum46YuA.js +342 -0
- package/dist/plugin-sdk/skills-DUphJGKn.js +1428 -0
- package/dist/plugin-sdk/slash-commands.runtime-5UW5KLyR.js +13 -0
- package/dist/plugin-sdk/slash-dispatch.runtime-4oQ2P_qo.js +52 -0
- package/dist/plugin-sdk/slash-skill-commands.runtime-y_mOLyS7.js +16 -0
- package/dist/plugin-sdk/ssrf-B3XRWBsP.js +202 -0
- package/dist/plugin-sdk/store-DFvIhzWZ.js +81 -0
- package/dist/plugin-sdk/subagent-registry-runtime-DtKXhKtl.js +52 -0
- package/dist/plugin-sdk/tables-bDM_jlLP.js +55 -0
- package/dist/{target-errors-DlzVutaL.js → plugin-sdk/target-errors-BVBW25Y3.js} +4 -4
- package/dist/plugin-sdk/thinking-Bu-w5mW5.js +1206 -0
- package/dist/plugin-sdk/tokens-CTIYTLWu.js +52 -0
- package/dist/plugin-sdk/tool-images-D0G_giwP.js +274 -0
- package/dist/plugin-sdk/web-DSXk7XCb.js +56 -0
- package/dist/plugin-sdk/whatsapp-actions-BOyA0Uuj.js +80 -0
- package/dist/{plugins-Cl_3OCyK.js → plugins-H53_4Gxb.js} +2 -2
- package/dist/{plugins-cli-CN2fty5U.js → plugins-cli-CQkxWdnt.js} +82 -82
- package/dist/{ports-Bop51hz6.js → ports-CKXuQJST.js} +2 -2
- package/dist/{ports-6i8smH3e.js → ports-CXjhFS7T.js} +1 -1
- package/dist/{program-context-ehHvCw9L.js → program-context-tphS7xu7.js} +41 -41
- package/dist/{prompt-select-styled-CSMviLJY.js → prompt-select-styled-DL2p1pfi.js} +40 -40
- package/dist/{provider-auth-helpers-CgNWlsqs.js → provider-auth-helpers-BqWiy-r-.js} +5 -5
- package/dist/{proxy-env-CRD7fbqp.js → proxy-env-D1tz4Z6a.js} +1 -1
- package/dist/{push-apns-DoYzx3tH.js → push-apns-C-YdARdy.js} +5 -5
- package/dist/{pw-ai-yKJj32B4.js → pw-ai-SVeR5d2o.js} +18 -18
- package/dist/{qmd-manager-AYDUTXmc.js → qmd-manager-B-XXhWVw.js} +20 -20
- package/dist/{qr-cli-cikAHfYn.js → qr-cli-B4fjHvn1.js} +2 -2
- package/dist/{query-expansion-CV2Z4_mS.js → query-expansion-Bf60ekMj.js} +12 -12
- package/dist/{redact-snapshot-C9T1079O.js → redact-snapshot-DRqM8Vla.js} +1 -1
- package/dist/{register.agent-BlxoyQt0.js → register.agent-BdiM0qkl.js} +97 -97
- package/dist/register.configure-wANXDbzQ.js +164 -0
- package/dist/{register.maintenance-C-Yv2mHK.js → register.maintenance-CMAt3Nl8.js} +93 -93
- package/dist/{register.message-CUNXtFOj.js → register.message-CbxQ5lgi.js} +73 -73
- package/dist/{register.onboard-BKXm1mL7.js → register.onboard-CbiTdKQX.js} +18 -18
- package/dist/{register.setup-DaT9AIAz.js → register.setup-KhsHMx2v.js} +21 -21
- package/dist/{register.status-health-sessions-7yZmSvUL.js → register.status-health-sessions-Bw5YDa_s.js} +86 -86
- package/dist/{reply-CeUYZhWu.js → reply-BWXzPVSJ.js} +149 -149
- package/dist/{rpc-BDpuIniF.js → rpc-DlN_W_L1.js} +1 -1
- package/dist/{runtime-Dw7Yw4OJ.js → runtime-Ci7mtLvH.js} +3 -3
- package/dist/{runtime-config-collectors-jhc1wDBg.js → runtime-config-collectors-CKmGmTQ5.js} +1 -1
- package/dist/{runtime-whatsapp-login.runtime-f293Z_er.js → runtime-whatsapp-login.runtime-Bxqt5jiO.js} +7 -7
- package/dist/runtime-whatsapp-outbound.runtime-B-UsXwvb.js +32 -0
- package/dist/{sandbox-BgsD1lf7.js → sandbox-Cuk1IWYT.js} +18 -18
- package/dist/{sandbox-cli-BnvmhiN9.js → sandbox-cli-BxgFeoAD.js} +25 -25
- package/dist/{secrets-cli-D7-K7P82.js → secrets-cli-DODLX29x.js} +11 -11
- package/dist/{security-cli-BFJAgNYH.js → security-cli-Ch83VrLP.js} +42 -42
- package/dist/{send-BvlkshC1.js → send-BfVgGHK6.js} +6 -6
- package/dist/{send-tK0H9nwq.js → send-Bw8LNCit.js} +5 -5
- package/dist/{send-CDms2FQA.js → send-C9UJKBSM.js} +4 -4
- package/dist/{send-CPFNtAP8.js → send-DX_fR45p.js} +11 -11
- package/dist/{send-C3Aeswif.js → send-FTQaNJPj.js} +8 -8
- package/dist/{server-OfKJG6Bo.js → server-Q9nnn04D.js} +20 -20
- package/dist/{server-context-B-0KzcZE.js → server-context-CX28l04l.js} +12 -12
- package/dist/{server-lifecycle-D6VNKVvQ.js → server-lifecycle-yAUMTJhv.js} +2 -2
- package/dist/{server-middleware-7cXowO4W.js → server-middleware-DIc4WJOS.js} +1 -1
- package/dist/{server-node-events-DWQhNK-0.js → server-node-events-qU3NTncQ.js} +73 -73
- package/dist/{service-Dk-UMipf.js → service-D4y0_Q5Z.js} +15 -15
- package/dist/{session-Da18ilJ0.js → session-CZJ5Ux6-.js} +1 -1
- package/dist/{sessions-CmjcNTJ3.js → sessions-C5H_BZSr.js} +15 -15
- package/dist/{shared-BzY0v0tS.js → shared-CxdBWgym.js} +3 -3
- package/dist/{shared-BcB-feC8.js → shared-DwNtcoQg.js} +1 -1
- package/dist/{skill-commands-BEWkEml_.js → skill-commands-BSRPnzXp.js} +5 -5
- package/dist/{skill-scanner-Bb5SMbCz.js → skill-scanner-rdr9cQew.js} +6 -6
- package/dist/{skills-Rnr7zPen.js → skills-BnBOxX1c.js} +3 -3
- package/dist/{skills-cli-BowIIIzH.js → skills-cli-CUgeYV1y.js} +5 -5
- package/dist/{skills-install-BLNCKuex.js → skills-install-BE04CZ6e.js} +6 -6
- package/dist/{skills-status-BCU-5otB.js → skills-status-DQw98BkG.js} +1 -1
- package/dist/{slash-commands.runtime-BgVgQ-Eh.js → slash-commands.runtime-BPtL2Qev.js} +11 -11
- package/dist/slash-dispatch.runtime-Cf9dq1k6.js +113 -0
- package/dist/{slash-skill-commands.runtime-4dOiU6U0.js → slash-skill-commands.runtime-9BYoANpd.js} +15 -15
- package/dist/{squidclaw-root-BcB7vo9M.js → squidclaw-root-CnE19yKj.js} +8 -8
- package/dist/{status-COTRBaam.js → status-rb5Jz-VU.js} +26 -26
- package/dist/{status.update-BUql4yz-.js → status.update-BNODJGA9.js} +2 -2
- package/dist/{store-aa15VM42.js → store-PDMRmC5Z.js} +5 -5
- package/dist/subagent-registry-runtime-CTiA365B.js +113 -0
- package/dist/{system-cli-CgCUbH_M.js → system-cli-DJYyTO07.js} +9 -9
- package/dist/{system-run-command-Ny1SbbOD.js → system-run-command-BgnCyvrj.js} +1 -1
- package/dist/{systemd-zbKl2Q3E.js → systemd-fP8tz4aL.js} +9 -9
- package/dist/{systemd-hints-C9_7ouv7.js → systemd-hints-BG_t__ZD.js} +6 -6
- package/dist/{systemd-linger-BM6JyzAr.js → systemd-linger-DgK8uuKY.js} +1 -1
- package/dist/{tables-jZMI8hLl.js → tables-DUSFF9-W.js} +1 -1
- package/dist/{tailnet-gTCqUBfJ.js → tailnet-CLkKVwDq.js} +1 -1
- package/dist/target-errors-BxwxgIDk.js +195 -0
- package/dist/{tool-images-DTl_LHMa.js → tool-images-FhSCiY-o.js} +1 -1
- package/dist/{tui-kDK-MAOc.js → tui-BMOMT-ma.js} +6 -6
- package/dist/{tui-cli-Dxy6fKkU.js → tui-cli-kqZ_-2Mz.js} +32 -32
- package/dist/{update-ZUTn6Jsu.js → update-blK9j2ag.js} +3 -3
- package/dist/{update-cli-D_QEiKyz.js → update-cli-gLKrP8UQ.js} +102 -102
- package/dist/{update-runner-DOXPSA_-.js → update-runner-C2UrF4oZ.js} +16 -16
- package/dist/web-VmjeceHS.js +117 -0
- package/dist/{webhooks-cli-D1iehjkP.js → webhooks-cli-BEXPBILa.js} +6 -6
- package/dist/{whatsapp-actions-hN5bwjWU.js → whatsapp-actions-DhiV181U.js} +17 -17
- package/dist/{with-timeout-BjaANd4G.js → with-timeout-BCAfkt03.js} +3 -3
- package/dist/{workspace-BITWyKG4.js → workspace-B-k5DNiQ.js} +1 -1
- package/dist/{workspace-dirs-B7O9BAHp.js → workspace-dirs-B2dNahfe.js} +1 -1
- package/dist/{ws-Bx8lpC1N.js → ws-DKt5HoA5.js} +2 -2
- package/dist/{wsl-wYxPJ8EO.js → wsl-CgxzAzRe.js} +2 -2
- package/package.json +1 -1
- package/dist/deliver-runtime-uwleBPlq.js +0 -61
- package/dist/deps-send-discord.runtime-CuZGpA7H.js +0 -36
- package/dist/deps-send-imessage.runtime-ByVW2alP.js +0 -35
- package/dist/deps-send-signal.runtime-Dl4GaCbQ.js +0 -34
- package/dist/deps-send-slack.runtime-BEV10FHj.js +0 -32
- package/dist/deps-send-whatsapp.runtime-Di0SEPNK.js +0 -118
- package/dist/image-runtime-B5Q4J9w2.js +0 -55
- package/dist/register.configure-CGptmTVZ.js +0 -164
- package/dist/runtime-whatsapp-outbound.runtime-uDhEmWe1.js +0 -32
- package/dist/slash-dispatch.runtime-D83FVeU7.js +0 -113
- package/dist/subagent-registry-runtime-CrT5RSO9.js +0 -113
- package/dist/web-DtSq_aUB.js +0 -117
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
|
|
2
|
+
import { Er as ensureAuthProfileStore, jn as normalizeProviderId } from "./config-FhBFLsNm.js";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import * as PiCodingAgent from "@mariozechner/pi-coding-agent";
|
|
6
|
+
|
|
7
|
+
//#region src/agents/pi-auth-credentials.ts
|
|
8
|
+
function convertAuthProfileCredentialToPi(cred) {
|
|
9
|
+
if (cred.type === "api_key") {
|
|
10
|
+
const key = typeof cred.key === "string" ? cred.key.trim() : "";
|
|
11
|
+
if (!key) return null;
|
|
12
|
+
return {
|
|
13
|
+
type: "api_key",
|
|
14
|
+
key
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (cred.type === "token") {
|
|
18
|
+
const token = typeof cred.token === "string" ? cred.token.trim() : "";
|
|
19
|
+
if (!token) return null;
|
|
20
|
+
if (typeof cred.expires === "number" && Number.isFinite(cred.expires) && Date.now() >= cred.expires) return null;
|
|
21
|
+
return {
|
|
22
|
+
type: "api_key",
|
|
23
|
+
key: token
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (cred.type === "oauth") {
|
|
27
|
+
const access = typeof cred.access === "string" ? cred.access.trim() : "";
|
|
28
|
+
const refresh = typeof cred.refresh === "string" ? cred.refresh.trim() : "";
|
|
29
|
+
if (!access || !refresh || !Number.isFinite(cred.expires) || cred.expires <= 0) return null;
|
|
30
|
+
return {
|
|
31
|
+
type: "oauth",
|
|
32
|
+
access,
|
|
33
|
+
refresh,
|
|
34
|
+
expires: cred.expires
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function resolvePiCredentialMapFromStore(store) {
|
|
40
|
+
const credentials = {};
|
|
41
|
+
for (const credential of Object.values(store.profiles)) {
|
|
42
|
+
const provider = normalizeProviderId(String(credential.provider ?? "")).trim();
|
|
43
|
+
if (!provider || credentials[provider]) continue;
|
|
44
|
+
const converted = convertAuthProfileCredentialToPi(credential);
|
|
45
|
+
if (converted) credentials[provider] = converted;
|
|
46
|
+
}
|
|
47
|
+
return credentials;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/agents/pi-model-discovery.ts
|
|
52
|
+
var pi_model_discovery_exports = /* @__PURE__ */ __exportAll({
|
|
53
|
+
AuthStorage: () => PiAuthStorageClass,
|
|
54
|
+
ModelRegistry: () => PiModelRegistryClass,
|
|
55
|
+
discoverAuthStorage: () => discoverAuthStorage,
|
|
56
|
+
discoverModels: () => discoverModels
|
|
57
|
+
});
|
|
58
|
+
const PiAuthStorageClass = PiCodingAgent.AuthStorage;
|
|
59
|
+
const PiModelRegistryClass = PiCodingAgent.ModelRegistry;
|
|
60
|
+
function createInMemoryAuthStorageBackend(initialData) {
|
|
61
|
+
let snapshot = JSON.stringify(initialData, null, 2);
|
|
62
|
+
return { withLock(update) {
|
|
63
|
+
const { result, next } = update(snapshot);
|
|
64
|
+
if (typeof next === "string") snapshot = next;
|
|
65
|
+
return result;
|
|
66
|
+
} };
|
|
67
|
+
}
|
|
68
|
+
function isRecord(value) {
|
|
69
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
70
|
+
}
|
|
71
|
+
function scrubLegacyStaticAuthJsonEntries(pathname) {
|
|
72
|
+
if (process.env.SQUIDCLAW_AUTH_STORE_READONLY === "1") return;
|
|
73
|
+
if (!fs.existsSync(pathname)) return;
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = JSON.parse(fs.readFileSync(pathname, "utf8"));
|
|
77
|
+
} catch {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!isRecord(parsed)) return;
|
|
81
|
+
let changed = false;
|
|
82
|
+
for (const [provider, value] of Object.entries(parsed)) {
|
|
83
|
+
if (!isRecord(value)) continue;
|
|
84
|
+
if (value.type !== "api_key") continue;
|
|
85
|
+
delete parsed[provider];
|
|
86
|
+
changed = true;
|
|
87
|
+
}
|
|
88
|
+
if (!changed) return;
|
|
89
|
+
if (Object.keys(parsed).length === 0) {
|
|
90
|
+
fs.rmSync(pathname, { force: true });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
fs.writeFileSync(pathname, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
|
|
94
|
+
fs.chmodSync(pathname, 384);
|
|
95
|
+
}
|
|
96
|
+
function createAuthStorage(AuthStorageLike, path, creds) {
|
|
97
|
+
const withInMemory = AuthStorageLike;
|
|
98
|
+
if (typeof withInMemory.inMemory === "function") return withInMemory.inMemory(creds);
|
|
99
|
+
const withFromStorage = AuthStorageLike;
|
|
100
|
+
if (typeof withFromStorage.fromStorage === "function") {
|
|
101
|
+
const backendCtor = PiCodingAgent.InMemoryAuthStorageBackend;
|
|
102
|
+
const backend = typeof backendCtor === "function" ? new backendCtor() : createInMemoryAuthStorageBackend(creds);
|
|
103
|
+
backend.withLock(() => ({
|
|
104
|
+
result: void 0,
|
|
105
|
+
next: JSON.stringify(creds, null, 2)
|
|
106
|
+
}));
|
|
107
|
+
return withFromStorage.fromStorage(backend);
|
|
108
|
+
}
|
|
109
|
+
const withFactory = AuthStorageLike;
|
|
110
|
+
const withRuntimeOverride = typeof withFactory.create === "function" ? withFactory.create(path) : new AuthStorageLike(path);
|
|
111
|
+
if (typeof withRuntimeOverride.setRuntimeApiKey === "function") for (const [provider, credential] of Object.entries(creds)) {
|
|
112
|
+
if (credential.type === "api_key") {
|
|
113
|
+
withRuntimeOverride.setRuntimeApiKey(provider, credential.key);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
withRuntimeOverride.setRuntimeApiKey(provider, credential.access);
|
|
117
|
+
}
|
|
118
|
+
return withRuntimeOverride;
|
|
119
|
+
}
|
|
120
|
+
function resolvePiCredentials(agentDir) {
|
|
121
|
+
return resolvePiCredentialMapFromStore(ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false }));
|
|
122
|
+
}
|
|
123
|
+
function discoverAuthStorage(agentDir) {
|
|
124
|
+
const credentials = resolvePiCredentials(agentDir);
|
|
125
|
+
const authPath = path.join(agentDir, "auth.json");
|
|
126
|
+
scrubLegacyStaticAuthJsonEntries(authPath);
|
|
127
|
+
return createAuthStorage(PiAuthStorageClass, authPath, credentials);
|
|
128
|
+
}
|
|
129
|
+
function discoverModels(authStorage, agentDir) {
|
|
130
|
+
return new PiModelRegistryClass(authStorage, path.join(agentDir, "models.json"));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
export { discoverModels as n, pi_model_discovery_exports as r, discoverAuthStorage as t };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./run-with-concurrency-5DMu9szx.js";
|
|
2
|
+
import "./paths-8xF5kDne.js";
|
|
3
|
+
import "./github-copilot-token-Dy-0-Kh3.js";
|
|
4
|
+
import "./config-FhBFLsNm.js";
|
|
5
|
+
import "./logger-DDdrdbDu.js";
|
|
6
|
+
import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-Bt6B0MAj.js";
|
|
7
|
+
|
|
8
|
+
export { discoverAuthStorage, discoverModels };
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import "./run-with-concurrency-5DMu9szx.js";
|
|
2
|
+
import "./paths-8xF5kDne.js";
|
|
3
|
+
import "./github-copilot-token-Dy-0-Kh3.js";
|
|
4
|
+
import "./config-FhBFLsNm.js";
|
|
5
|
+
import { P as isPlainObject, a as createSubsystemLogger } from "./logger-DDdrdbDu.js";
|
|
6
|
+
import { p as getDiagnosticSessionState, s as logToolLoopAction } from "./diagnostic-Dv9S12vm.js";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
|
|
9
|
+
//#region src/agents/tool-loop-detection.ts
|
|
10
|
+
const log = createSubsystemLogger("agents/loop-detection");
|
|
11
|
+
const TOOL_CALL_HISTORY_SIZE = 30;
|
|
12
|
+
const WARNING_THRESHOLD = 10;
|
|
13
|
+
const CRITICAL_THRESHOLD = 20;
|
|
14
|
+
const GLOBAL_CIRCUIT_BREAKER_THRESHOLD = 30;
|
|
15
|
+
const DEFAULT_LOOP_DETECTION_CONFIG = {
|
|
16
|
+
enabled: false,
|
|
17
|
+
historySize: TOOL_CALL_HISTORY_SIZE,
|
|
18
|
+
warningThreshold: WARNING_THRESHOLD,
|
|
19
|
+
criticalThreshold: CRITICAL_THRESHOLD,
|
|
20
|
+
globalCircuitBreakerThreshold: GLOBAL_CIRCUIT_BREAKER_THRESHOLD,
|
|
21
|
+
detectors: {
|
|
22
|
+
genericRepeat: true,
|
|
23
|
+
knownPollNoProgress: true,
|
|
24
|
+
pingPong: true
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function asPositiveInt(value, fallback) {
|
|
28
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) return fallback;
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function resolveLoopDetectionConfig(config) {
|
|
32
|
+
let warningThreshold = asPositiveInt(config?.warningThreshold, DEFAULT_LOOP_DETECTION_CONFIG.warningThreshold);
|
|
33
|
+
let criticalThreshold = asPositiveInt(config?.criticalThreshold, DEFAULT_LOOP_DETECTION_CONFIG.criticalThreshold);
|
|
34
|
+
let globalCircuitBreakerThreshold = asPositiveInt(config?.globalCircuitBreakerThreshold, DEFAULT_LOOP_DETECTION_CONFIG.globalCircuitBreakerThreshold);
|
|
35
|
+
if (criticalThreshold <= warningThreshold) criticalThreshold = warningThreshold + 1;
|
|
36
|
+
if (globalCircuitBreakerThreshold <= criticalThreshold) globalCircuitBreakerThreshold = criticalThreshold + 1;
|
|
37
|
+
return {
|
|
38
|
+
enabled: config?.enabled ?? DEFAULT_LOOP_DETECTION_CONFIG.enabled,
|
|
39
|
+
historySize: asPositiveInt(config?.historySize, DEFAULT_LOOP_DETECTION_CONFIG.historySize),
|
|
40
|
+
warningThreshold,
|
|
41
|
+
criticalThreshold,
|
|
42
|
+
globalCircuitBreakerThreshold,
|
|
43
|
+
detectors: {
|
|
44
|
+
genericRepeat: config?.detectors?.genericRepeat ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.genericRepeat,
|
|
45
|
+
knownPollNoProgress: config?.detectors?.knownPollNoProgress ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.knownPollNoProgress,
|
|
46
|
+
pingPong: config?.detectors?.pingPong ?? DEFAULT_LOOP_DETECTION_CONFIG.detectors.pingPong
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Hash a tool call for pattern matching.
|
|
52
|
+
* Uses tool name + deterministic JSON serialization digest of params.
|
|
53
|
+
*/
|
|
54
|
+
function hashToolCall(toolName, params) {
|
|
55
|
+
return `${toolName}:${digestStable(params)}`;
|
|
56
|
+
}
|
|
57
|
+
function stableStringify(value) {
|
|
58
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
59
|
+
if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
|
|
60
|
+
const obj = value;
|
|
61
|
+
return `{${Object.keys(obj).toSorted().map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(",")}}`;
|
|
62
|
+
}
|
|
63
|
+
function digestStable(value) {
|
|
64
|
+
const serialized = stableStringifyFallback(value);
|
|
65
|
+
return createHash("sha256").update(serialized).digest("hex");
|
|
66
|
+
}
|
|
67
|
+
function stableStringifyFallback(value) {
|
|
68
|
+
try {
|
|
69
|
+
return stableStringify(value);
|
|
70
|
+
} catch {
|
|
71
|
+
if (value === null || value === void 0) return `${value}`;
|
|
72
|
+
if (typeof value === "string") return value;
|
|
73
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") return `${value}`;
|
|
74
|
+
if (value instanceof Error) return `${value.name}:${value.message}`;
|
|
75
|
+
return Object.prototype.toString.call(value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function isKnownPollToolCall(toolName, params) {
|
|
79
|
+
if (toolName === "command_status") return true;
|
|
80
|
+
if (toolName !== "process" || !isPlainObject(params)) return false;
|
|
81
|
+
const action = params.action;
|
|
82
|
+
return action === "poll" || action === "log";
|
|
83
|
+
}
|
|
84
|
+
function extractTextContent(result) {
|
|
85
|
+
if (!isPlainObject(result) || !Array.isArray(result.content)) return "";
|
|
86
|
+
return result.content.filter((entry) => isPlainObject(entry) && typeof entry.type === "string" && typeof entry.text === "string").map((entry) => entry.text).join("\n").trim();
|
|
87
|
+
}
|
|
88
|
+
function formatErrorForHash(error) {
|
|
89
|
+
if (error instanceof Error) return error.message || error.name;
|
|
90
|
+
if (typeof error === "string") return error;
|
|
91
|
+
if (typeof error === "number" || typeof error === "boolean" || typeof error === "bigint") return `${error}`;
|
|
92
|
+
return stableStringify(error);
|
|
93
|
+
}
|
|
94
|
+
function hashToolOutcome(toolName, params, result, error) {
|
|
95
|
+
if (error !== void 0) return `error:${digestStable(formatErrorForHash(error))}`;
|
|
96
|
+
if (!isPlainObject(result)) return result === void 0 ? void 0 : digestStable(result);
|
|
97
|
+
const details = isPlainObject(result.details) ? result.details : {};
|
|
98
|
+
const text = extractTextContent(result);
|
|
99
|
+
if (isKnownPollToolCall(toolName, params) && toolName === "process" && isPlainObject(params)) {
|
|
100
|
+
const action = params.action;
|
|
101
|
+
if (action === "poll") return digestStable({
|
|
102
|
+
action,
|
|
103
|
+
status: details.status,
|
|
104
|
+
exitCode: details.exitCode ?? null,
|
|
105
|
+
exitSignal: details.exitSignal ?? null,
|
|
106
|
+
aggregated: details.aggregated ?? null,
|
|
107
|
+
text
|
|
108
|
+
});
|
|
109
|
+
if (action === "log") return digestStable({
|
|
110
|
+
action,
|
|
111
|
+
status: details.status,
|
|
112
|
+
totalLines: details.totalLines ?? null,
|
|
113
|
+
totalChars: details.totalChars ?? null,
|
|
114
|
+
truncated: details.truncated ?? null,
|
|
115
|
+
exitCode: details.exitCode ?? null,
|
|
116
|
+
exitSignal: details.exitSignal ?? null,
|
|
117
|
+
text
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return digestStable({
|
|
121
|
+
details,
|
|
122
|
+
text
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function getNoProgressStreak(history, toolName, argsHash) {
|
|
126
|
+
let streak = 0;
|
|
127
|
+
let latestResultHash;
|
|
128
|
+
for (let i = history.length - 1; i >= 0; i -= 1) {
|
|
129
|
+
const record = history[i];
|
|
130
|
+
if (!record || record.toolName !== toolName || record.argsHash !== argsHash) continue;
|
|
131
|
+
if (typeof record.resultHash !== "string" || !record.resultHash) continue;
|
|
132
|
+
if (!latestResultHash) {
|
|
133
|
+
latestResultHash = record.resultHash;
|
|
134
|
+
streak = 1;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (record.resultHash !== latestResultHash) break;
|
|
138
|
+
streak += 1;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
count: streak,
|
|
142
|
+
latestResultHash
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function getPingPongStreak(history, currentSignature) {
|
|
146
|
+
const last = history.at(-1);
|
|
147
|
+
if (!last) return {
|
|
148
|
+
count: 0,
|
|
149
|
+
noProgressEvidence: false
|
|
150
|
+
};
|
|
151
|
+
let otherSignature;
|
|
152
|
+
let otherToolName;
|
|
153
|
+
for (let i = history.length - 2; i >= 0; i -= 1) {
|
|
154
|
+
const call = history[i];
|
|
155
|
+
if (!call) continue;
|
|
156
|
+
if (call.argsHash !== last.argsHash) {
|
|
157
|
+
otherSignature = call.argsHash;
|
|
158
|
+
otherToolName = call.toolName;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!otherSignature || !otherToolName) return {
|
|
163
|
+
count: 0,
|
|
164
|
+
noProgressEvidence: false
|
|
165
|
+
};
|
|
166
|
+
let alternatingTailCount = 0;
|
|
167
|
+
for (let i = history.length - 1; i >= 0; i -= 1) {
|
|
168
|
+
const call = history[i];
|
|
169
|
+
if (!call) continue;
|
|
170
|
+
const expected = alternatingTailCount % 2 === 0 ? last.argsHash : otherSignature;
|
|
171
|
+
if (call.argsHash !== expected) break;
|
|
172
|
+
alternatingTailCount += 1;
|
|
173
|
+
}
|
|
174
|
+
if (alternatingTailCount < 2) return {
|
|
175
|
+
count: 0,
|
|
176
|
+
noProgressEvidence: false
|
|
177
|
+
};
|
|
178
|
+
if (currentSignature !== otherSignature) return {
|
|
179
|
+
count: 0,
|
|
180
|
+
noProgressEvidence: false
|
|
181
|
+
};
|
|
182
|
+
const tailStart = Math.max(0, history.length - alternatingTailCount);
|
|
183
|
+
let firstHashA;
|
|
184
|
+
let firstHashB;
|
|
185
|
+
let noProgressEvidence = true;
|
|
186
|
+
for (let i = tailStart; i < history.length; i += 1) {
|
|
187
|
+
const call = history[i];
|
|
188
|
+
if (!call) continue;
|
|
189
|
+
if (!call.resultHash) {
|
|
190
|
+
noProgressEvidence = false;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
if (call.argsHash === last.argsHash) {
|
|
194
|
+
if (!firstHashA) firstHashA = call.resultHash;
|
|
195
|
+
else if (firstHashA !== call.resultHash) {
|
|
196
|
+
noProgressEvidence = false;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (call.argsHash === otherSignature) {
|
|
202
|
+
if (!firstHashB) firstHashB = call.resultHash;
|
|
203
|
+
else if (firstHashB !== call.resultHash) {
|
|
204
|
+
noProgressEvidence = false;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
noProgressEvidence = false;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
if (!firstHashA || !firstHashB) noProgressEvidence = false;
|
|
213
|
+
return {
|
|
214
|
+
count: alternatingTailCount + 1,
|
|
215
|
+
pairedToolName: last.toolName,
|
|
216
|
+
pairedSignature: last.argsHash,
|
|
217
|
+
noProgressEvidence
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function canonicalPairKey(signatureA, signatureB) {
|
|
221
|
+
return [signatureA, signatureB].toSorted().join("|");
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Detect if an agent is stuck in a repetitive tool call loop.
|
|
225
|
+
* Checks if the same tool+params combination has been called excessively.
|
|
226
|
+
*/
|
|
227
|
+
function detectToolCallLoop(state, toolName, params, config) {
|
|
228
|
+
const resolvedConfig = resolveLoopDetectionConfig(config);
|
|
229
|
+
if (!resolvedConfig.enabled) return { stuck: false };
|
|
230
|
+
const history = state.toolCallHistory ?? [];
|
|
231
|
+
const currentHash = hashToolCall(toolName, params);
|
|
232
|
+
const noProgress = getNoProgressStreak(history, toolName, currentHash);
|
|
233
|
+
const noProgressStreak = noProgress.count;
|
|
234
|
+
const knownPollTool = isKnownPollToolCall(toolName, params);
|
|
235
|
+
const pingPong = getPingPongStreak(history, currentHash);
|
|
236
|
+
if (noProgressStreak >= resolvedConfig.globalCircuitBreakerThreshold) {
|
|
237
|
+
log.error(`Global circuit breaker triggered: ${toolName} repeated ${noProgressStreak} times with no progress`);
|
|
238
|
+
return {
|
|
239
|
+
stuck: true,
|
|
240
|
+
level: "critical",
|
|
241
|
+
detector: "global_circuit_breaker",
|
|
242
|
+
count: noProgressStreak,
|
|
243
|
+
message: `CRITICAL: ${toolName} has repeated identical no-progress outcomes ${noProgressStreak} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,
|
|
244
|
+
warningKey: `global:${toolName}:${currentHash}:${noProgress.latestResultHash ?? "none"}`
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
if (knownPollTool && resolvedConfig.detectors.knownPollNoProgress && noProgressStreak >= resolvedConfig.criticalThreshold) {
|
|
248
|
+
log.error(`Critical polling loop detected: ${toolName} repeated ${noProgressStreak} times`);
|
|
249
|
+
return {
|
|
250
|
+
stuck: true,
|
|
251
|
+
level: "critical",
|
|
252
|
+
detector: "known_poll_no_progress",
|
|
253
|
+
count: noProgressStreak,
|
|
254
|
+
message: `CRITICAL: Called ${toolName} with identical arguments and no progress ${noProgressStreak} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,
|
|
255
|
+
warningKey: `poll:${toolName}:${currentHash}:${noProgress.latestResultHash ?? "none"}`
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (knownPollTool && resolvedConfig.detectors.knownPollNoProgress && noProgressStreak >= resolvedConfig.warningThreshold) {
|
|
259
|
+
log.warn(`Polling loop warning: ${toolName} repeated ${noProgressStreak} times`);
|
|
260
|
+
return {
|
|
261
|
+
stuck: true,
|
|
262
|
+
level: "warning",
|
|
263
|
+
detector: "known_poll_no_progress",
|
|
264
|
+
count: noProgressStreak,
|
|
265
|
+
message: `WARNING: You have called ${toolName} ${noProgressStreak} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,
|
|
266
|
+
warningKey: `poll:${toolName}:${currentHash}:${noProgress.latestResultHash ?? "none"}`
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const pingPongWarningKey = pingPong.pairedSignature ? `pingpong:${canonicalPairKey(currentHash, pingPong.pairedSignature)}` : `pingpong:${toolName}:${currentHash}`;
|
|
270
|
+
if (resolvedConfig.detectors.pingPong && pingPong.count >= resolvedConfig.criticalThreshold && pingPong.noProgressEvidence) {
|
|
271
|
+
log.error(`Critical ping-pong loop detected: alternating calls count=${pingPong.count} currentTool=${toolName}`);
|
|
272
|
+
return {
|
|
273
|
+
stuck: true,
|
|
274
|
+
level: "critical",
|
|
275
|
+
detector: "ping_pong",
|
|
276
|
+
count: pingPong.count,
|
|
277
|
+
message: `CRITICAL: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,
|
|
278
|
+
pairedToolName: pingPong.pairedToolName,
|
|
279
|
+
warningKey: pingPongWarningKey
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (resolvedConfig.detectors.pingPong && pingPong.count >= resolvedConfig.warningThreshold) {
|
|
283
|
+
log.warn(`Ping-pong loop warning: alternating calls count=${pingPong.count} currentTool=${toolName}`);
|
|
284
|
+
return {
|
|
285
|
+
stuck: true,
|
|
286
|
+
level: "warning",
|
|
287
|
+
detector: "ping_pong",
|
|
288
|
+
count: pingPong.count,
|
|
289
|
+
message: `WARNING: You are alternating between repeated tool-call patterns (${pingPong.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,
|
|
290
|
+
pairedToolName: pingPong.pairedToolName,
|
|
291
|
+
warningKey: pingPongWarningKey
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const recentCount = history.filter((h) => h.toolName === toolName && h.argsHash === currentHash).length;
|
|
295
|
+
if (!knownPollTool && resolvedConfig.detectors.genericRepeat && recentCount >= resolvedConfig.warningThreshold) {
|
|
296
|
+
log.warn(`Loop warning: ${toolName} called ${recentCount} times with identical arguments`);
|
|
297
|
+
return {
|
|
298
|
+
stuck: true,
|
|
299
|
+
level: "warning",
|
|
300
|
+
detector: "generic_repeat",
|
|
301
|
+
count: recentCount,
|
|
302
|
+
message: `WARNING: You have called ${toolName} ${recentCount} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,
|
|
303
|
+
warningKey: `generic:${toolName}:${currentHash}`
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
return { stuck: false };
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Record a tool call in the session's history for loop detection.
|
|
310
|
+
* Maintains sliding window of last N calls.
|
|
311
|
+
*/
|
|
312
|
+
function recordToolCall(state, toolName, params, toolCallId, config) {
|
|
313
|
+
const resolvedConfig = resolveLoopDetectionConfig(config);
|
|
314
|
+
if (!state.toolCallHistory) state.toolCallHistory = [];
|
|
315
|
+
state.toolCallHistory.push({
|
|
316
|
+
toolName,
|
|
317
|
+
argsHash: hashToolCall(toolName, params),
|
|
318
|
+
toolCallId,
|
|
319
|
+
timestamp: Date.now()
|
|
320
|
+
});
|
|
321
|
+
if (state.toolCallHistory.length > resolvedConfig.historySize) state.toolCallHistory.shift();
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Record a completed tool call outcome so loop detection can identify no-progress repeats.
|
|
325
|
+
*/
|
|
326
|
+
function recordToolCallOutcome(state, params) {
|
|
327
|
+
const resolvedConfig = resolveLoopDetectionConfig(params.config);
|
|
328
|
+
const resultHash = hashToolOutcome(params.toolName, params.toolParams, params.result, params.error);
|
|
329
|
+
if (!resultHash) return;
|
|
330
|
+
if (!state.toolCallHistory) state.toolCallHistory = [];
|
|
331
|
+
const argsHash = hashToolCall(params.toolName, params.toolParams);
|
|
332
|
+
let matched = false;
|
|
333
|
+
for (let i = state.toolCallHistory.length - 1; i >= 0; i -= 1) {
|
|
334
|
+
const call = state.toolCallHistory[i];
|
|
335
|
+
if (!call) continue;
|
|
336
|
+
if (params.toolCallId && call.toolCallId !== params.toolCallId) continue;
|
|
337
|
+
if (call.toolName !== params.toolName || call.argsHash !== argsHash) continue;
|
|
338
|
+
if (call.resultHash !== void 0) continue;
|
|
339
|
+
call.resultHash = resultHash;
|
|
340
|
+
matched = true;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
if (!matched) state.toolCallHistory.push({
|
|
344
|
+
toolName: params.toolName,
|
|
345
|
+
argsHash,
|
|
346
|
+
toolCallId: params.toolCallId,
|
|
347
|
+
resultHash,
|
|
348
|
+
timestamp: Date.now()
|
|
349
|
+
});
|
|
350
|
+
if (state.toolCallHistory.length > resolvedConfig.historySize) state.toolCallHistory.splice(0, state.toolCallHistory.length - resolvedConfig.historySize);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
//#endregion
|
|
354
|
+
export { detectToolCallLoop, getDiagnosticSessionState, logToolLoopAction, recordToolCall, recordToolCallOutcome };
|