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.
Files changed (307) hide show
  1. package/dist/{accounts-PhtBJ8mA.js → accounts-BjEXPlGc.js} +1 -1
  2. package/dist/{accounts-Xp5W2xrR.js → accounts-CyBVeR-N.js} +1 -1
  3. package/dist/{accounts-BFC1okn9.js → accounts-D095MOmG.js} +7 -7
  4. package/dist/{acp-cli-Dt95OPXW.js → acp-cli-Dd2joFFS.js} +8 -8
  5. package/dist/{agent-scope-tUxfsPYq.js → agent-scope-C1XMay0T.js} +17 -17
  6. package/dist/{agents.config-DNPisWCH.js → agents.config-CRKsD30n.js} +2 -2
  7. package/dist/{api-key-rotation-Y59kKrr0.js → api-key-rotation-BcKKu9kK.js} +1 -1
  8. package/dist/{audio-preflight-DeBM0nTy.js → audio-preflight-g9rsstMv.js} +34 -34
  9. package/dist/{audio-transcription-runner-B7oPsr3U.js → audio-transcription-runner-Bnl3Ubjo.js} +23 -23
  10. package/dist/{audit-Bq3iosCf.js → audit-B4s_5Gn1.js} +29 -29
  11. package/dist/{auth-HYiP0mxx.js → auth-DHSeaNcB.js} +1 -1
  12. package/dist/{auth-choice-Du_pIfBh.js → auth-choice-C-7c5Td_.js} +13 -13
  13. package/dist/{auth-choice-CX8TDXmp.js → auth-choice-D7LiN5Ju.js} +11 -11
  14. package/dist/{auth-choice.apply-helpers-DRfHu1d8.js → auth-choice.apply-helpers-CxO2Wbq-.js} +1 -1
  15. package/dist/{auth-token-BQRI3c6e.js → auth-token-BxYYHBlc.js} +1 -1
  16. package/dist/{bonjour-discovery-BenDpM0y.js → bonjour-discovery-mtNewKSx.js} +1 -1
  17. package/dist/{browser-cli-Et8PyJjA.js → browser-cli-I1fzIVmS.js} +12 -12
  18. package/dist/build-info.json +2 -2
  19. package/dist/{call-DbkLm3eP.js → call-DkR5OGhh.js} +10 -10
  20. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  21. package/dist/{channel-account-context-C_WQRa6U.js → channel-account-context-e4ysObLI.js} +5 -5
  22. package/dist/{channel-activity-7kixHIgY.js → channel-activity-CCjlTlcN.js} +1 -1
  23. package/dist/{channel-options-D0TjqxeO.js → channel-options-BL5mHe-R.js} +3 -3
  24. package/dist/{channel-selection-BwbXcgj2.js → channel-selection-D_20zq3H.js} +1 -1
  25. package/dist/{channel-web-lfZ3VOOl.js → channel-web-C7Iij0H0.js} +16 -16
  26. package/dist/{channels-cli-Hr4vekE6.js → channels-cli-BMiEn81Y.js} +92 -92
  27. package/dist/{channels-status-issues-DeoqSoo-.js → channels-status-issues-N9kzQrD8.js} +1 -1
  28. package/dist/{chrome-gIqO4t7T.js → chrome-BNfSmFAM.js} +4 -4
  29. package/dist/{clawbot-cli-C-jGxnTq.js → clawbot-cli-B6-68gsT.js} +11 -11
  30. package/dist/cli/daemon-cli.js +1 -1
  31. package/dist/{cli-BH62lCfL.js → cli-ByaubO_B.js} +72 -72
  32. package/dist/{client-CeaUCJtL.js → client-BURktNyH.js} +2 -2
  33. package/dist/{command-secret-targets-BF4WzaME.js → command-secret-targets-WwcPUFAf.js} +4 -4
  34. package/dist/{commands-CD6EMOiw.js → commands-CiY9HjRt.js} +1 -1
  35. package/dist/{commands-registry-DCUj1QOi.js → commands-registry-0bpX7A_Q.js} +3 -3
  36. package/dist/{completion-cli-BIY_jjYY.js → completion-cli-8PdK97J-.js} +12 -12
  37. package/dist/{config-cli-DvNViMXW.js → config-cli-ClomIMw7.js} +7 -7
  38. package/dist/{config-guard-DwgnWjmj.js → config-guard-rLrk7eSS.js} +16 -16
  39. package/dist/{config-validation-CcqZ--gE.js → config-validation-BQEaXMk7.js} +3 -3
  40. package/dist/{configure-B5Zuhebc.js → configure-CoXGul3l.js} +17 -17
  41. package/dist/{control-ui-assets-x69xyZH-.js → control-ui-assets-Bz7TCLpb.js} +1 -1
  42. package/dist/{cron-cli-Bv-X4msQ.js → cron-cli-C3iKBccc.js} +11 -11
  43. package/dist/{daemon-cli-B-8-rGND.js → daemon-cli-BVcrlw5o.js} +15 -15
  44. package/dist/{daemon-install-2y4HHhYl.js → daemon-install-CXDWHEEO.js} +4 -4
  45. package/dist/{daemon-install-helpers-Cdo6Pryw.js → daemon-install-helpers-a4pGEsbA.js} +11 -11
  46. package/dist/{deliver-CVl43oM1.js → deliver-B1sllFkh.js} +7 -7
  47. package/dist/deliver-runtime-CaV7seKv.js +61 -0
  48. package/dist/deps-send-discord.runtime-DbS5pxta.js +36 -0
  49. package/dist/deps-send-imessage.runtime-Ji753_F7.js +35 -0
  50. package/dist/deps-send-signal.runtime-DLJqvPLf.js +34 -0
  51. package/dist/deps-send-slack.runtime-DrFxeZ1I.js +32 -0
  52. package/dist/{deps-send-telegram.runtime-C9lz8bf0.js → deps-send-telegram.runtime-CF-Ylrvr.js} +16 -16
  53. package/dist/deps-send-whatsapp.runtime-BOE0Ke6v.js +118 -0
  54. package/dist/{devices-cli-BT8K0hdG.js → devices-cli-Dn_norz3.js} +8 -8
  55. package/dist/{diagnostic-5bqrhGEp.js → diagnostic-CNl71AzW.js} +1 -1
  56. package/dist/{diagnostics-C0CazfQM.js → diagnostics-DZ99A0EW.js} +5 -5
  57. package/dist/{directory-cli-BZcT9ie1.js → directory-cli-ZzwXkW89.js} +7 -7
  58. package/dist/{dns-cli-CPYaeASu.js → dns-cli-DipYQjtY.js} +5 -5
  59. package/dist/{dock-CVTqzMqE.js → dock-C7N1CmcP.js} +4 -4
  60. package/dist/{docs-cli-C50vGyDh.js → docs-cli-C-Izm9Tb.js} +4 -4
  61. package/dist/{doctor-completion-Emprau8v.js → doctor-completion-CGmYWy0n.js} +2 -2
  62. package/dist/{doctor-config-flow-DSA-JE3n.js → doctor-config-flow-DDWA3Z2D.js} +15 -15
  63. package/dist/{enable-CAYj5OhY.js → enable-RJyJVP_B.js} +1 -1
  64. package/dist/{exec-approvals-allowlist-BO4EEQUI.js → exec-approvals-allowlist-Bu_oaDJC.js} +1 -1
  65. package/dist/{exec-approvals-cli-DSOHdWJR.js → exec-approvals-cli-Csducy9L.js} +16 -16
  66. package/dist/{exec-safe-bin-runtime-policy-CSnpe1AT.js → exec-safe-bin-runtime-policy-DRQwt8kj.js} +2 -2
  67. package/dist/{fetch-guard-VcWeni3c.js → fetch-guard-DNykKlIv.js} +1 -1
  68. package/dist/{fs-safe-CjHYKGbt.js → fs-safe-CKHYu4Vz.js} +24 -24
  69. package/dist/{gateway-cli-B2fScwuY.js → gateway-cli-CUph5Eqo.js} +152 -152
  70. package/dist/{gateway-rpc-DpqZnhyz.js → gateway-rpc-DoKw40aG.js} +1 -1
  71. package/dist/{health-BZcB9SMe.js → health-Cia3g9r1.js} +11 -11
  72. package/dist/{hooks-cli-BylHgZ52.js → hooks-cli-LDbU3XMU.js} +80 -80
  73. package/dist/{hooks-status-DqGd74DG.js → hooks-status-Dd_iWcBZ.js} +1 -1
  74. package/dist/{image-CulZw1up.js → image-D2a7rcK1.js} +5 -5
  75. package/dist/{image-ops-BpsIdA2j.js → image-ops-BIWika4g.js} +10 -10
  76. package/dist/image-runtime-DTxVPe7Z.js +55 -0
  77. package/dist/index.js +82 -82
  78. package/dist/{inspect-D5T8Bbzl.js → inspect-C3PHuODr.js} +4 -4
  79. package/dist/{install-safe-path-BoN-MLvX.js → install-safe-path-iCmVuopp.js} +25 -25
  80. package/dist/{installs-CPHMcmNj.js → installs-CyjlehlR.js} +9 -9
  81. package/dist/{ipv4-Bwl9ruCP.js → ipv4-CWVOQw5T.js} +1 -1
  82. package/dist/{ir-xnftdkOo.js → ir-BPM7rQYq.js} +8 -8
  83. package/dist/{issue-format-8t_ncgFx.js → issue-format-sA05c-6t.js} +1 -1
  84. package/dist/{json-files-DIEpaxUj.js → json-files-D6M304Qd.js} +8 -8
  85. package/dist/{lifecycle-core-DKiBjZdv.js → lifecycle-core-DsfZ6965.js} +5 -5
  86. package/dist/{local-roots-BrxGyJnb.js → local-roots-CMxJ8L4w.js} +3 -3
  87. package/dist/{login-CxDYXbgx.js → login-BjtBaVVG.js} +3 -3
  88. package/dist/{login-qr-zf4B1lpU.js → login-qr-JfRlpd7I.js} +6 -6
  89. package/dist/{logs-cli-CJAe1_dv.js → logs-cli-gv2Ql7GE.js} +9 -9
  90. package/dist/{manager-DBgRFvYb.js → manager-XeZQ6ws7.js} +14 -14
  91. package/dist/{manager-runtime-Dl31cGh-.js → manager-runtime-BvGqzQIY.js} +9 -9
  92. package/dist/{manifest-registry-Cx3mB9zS.js → manifest-registry-BaUPjNKb.js} +1 -1
  93. package/dist/{memory-cli-Bhoc-n_1.js → memory-cli-BUJHSsW6.js} +12 -12
  94. package/dist/{model-DYzjrxpA.js → model-Jy6fO59G.js} +2 -2
  95. package/dist/{model-catalog-kpDOW8eY.js → model-catalog-BfoWgIDd.js} +3 -3
  96. package/dist/{model-picker-BZwK54QT.js → model-picker-CxmHVCE1.js} +4 -4
  97. package/dist/{model-selection-ZV3PuYVR.js → model-selection-QgM_TOjC.js} +16 -16
  98. package/dist/{models-cli-BIxlIOFr.js → models-cli-DlbNL6it.js} +81 -81
  99. package/dist/{models-config-BLdDYoxi.js → models-config-DOD5jluc.js} +6 -6
  100. package/dist/{node-cli-6uYJccbd.js → node-cli-uJ5lFzxj.js} +33 -33
  101. package/dist/{node-command-policy-CKTXVa3D.js → node-command-policy-CwVo8Z1X.js} +1 -1
  102. package/dist/{node-service-DGPVb5ri.js → node-service-xGYkt3vb.js} +1 -1
  103. package/dist/{nodes-cli-CXLRfAYx.js → nodes-cli-eauCMbSr.js} +16 -16
  104. package/dist/{nodes-screen-C-tuRhA1.js → nodes-screen-iR_FzGNs.js} +7 -7
  105. package/dist/{npm-pack-install-DgSn7djE.js → npm-pack-install-s-mP9K0z.js} +18 -18
  106. package/dist/{npm-resolution-gw3vFNTB.js → npm-resolution-Ck7yFIM2.js} +4 -4
  107. package/dist/{onboard-CCaYDSO2.js → onboard-aISMp4Kt.js} +6 -6
  108. package/dist/{onboard-channels-DQnP5d3Y.js → onboard-channels-CELkEQUS.js} +21 -21
  109. package/dist/{onboard-custom-CJohrPzT.js → onboard-custom-BmAzWYbD.js} +4 -4
  110. package/dist/{onboard-helpers-Bcs_1b81.js → onboard-helpers-DRk4Y5uA.js} +10 -10
  111. package/dist/{onboard-hooks-A23nqe_3.js → onboard-hooks-lk1sMnDf.js} +4 -4
  112. package/dist/{onboard-remote-Hf9sTDHl.js → onboard-remote-Bj9cR8kF.js} +4 -4
  113. package/dist/{onboard-skills-Cpc8o6sG.js → onboard-skills-eRpyQ1la.js} +4 -4
  114. package/dist/{onboarding-wx00blu5.js → onboarding-Bl4RDn6W.js} +14 -14
  115. package/dist/{onboarding.finalize-B8wqvggG.js → onboarding.finalize-Bm7_INHb.js} +85 -85
  116. package/dist/{onboarding.gateway-config-CvWq5i_X.js → onboarding.gateway-config-BPyk6gwr.js} +18 -18
  117. package/dist/{onboarding.secret-input-CIN4p8mg.js → onboarding.secret-input-DlDt-I2O.js} +1 -1
  118. package/dist/{openai-model-default-BYfJa19m.js → openai-model-default-DnYP1Em1.js} +2 -2
  119. package/dist/{outbound-B3RZI-ai.js → outbound-BQtnr_z2.js} +3 -3
  120. package/dist/{outbound-attachment-BATDqOuj.js → outbound-attachment-WnXMTJC4.js} +2 -2
  121. package/dist/{pairing-cli-FMIw0yL6.js → pairing-cli-BsU-YnVT.js} +8 -8
  122. package/dist/{pairing-labels-MH31IXn_.js → pairing-labels-BXfoinTP.js} +1 -1
  123. package/dist/{pairing-store-KII9MIZX.js → pairing-store-C1FvWpDK.js} +3 -3
  124. package/dist/{path-alias-guards-B7H6jIIw.js → path-alias-guards-CCRXJArp.js} +3 -3
  125. package/dist/{path-safety-3wUzDqI9.js → path-safety-BWiXz6D4.js} +1 -1
  126. package/dist/{paths-BguvT84s.js → paths-Bg6h1q3v.js} +9 -9
  127. package/dist/{pi-embedded-helpers-D8WkqLZt.js → pi-embedded-helpers-DctimJJI.js} +6 -6
  128. package/dist/{pi-model-discovery-Bfyzj3Lq.js → pi-model-discovery-D63dINOn.js} +1 -1
  129. package/dist/{pi-model-discovery-runtime-nh-zh_Bp.js → pi-model-discovery-runtime-CcXGQcru.js} +5 -5
  130. package/dist/{pi-tools.before-tool-call.runtime-D4V6gUzq.js → pi-tools.before-tool-call.runtime-BMb_b90y.js} +5 -5
  131. package/dist/{pi-tools.policy-DCE9mhtw.js → pi-tools.policy-CXvZtJB7.js} +5 -5
  132. package/dist/{plugin-auto-enable-BJw5Rcbx.js → plugin-auto-enable-DMABTEO-.js} +3 -3
  133. package/dist/{plugin-registry-V0H8DaZf.js → plugin-registry-BSlUIHKX.js} +3 -3
  134. package/dist/plugin-sdk/accounts-B6gye1Jd.js +46 -0
  135. package/dist/plugin-sdk/accounts-C-BT6Po7.js +288 -0
  136. package/dist/plugin-sdk/accounts-DQDXV8eB.js +35 -0
  137. package/dist/plugin-sdk/active-listener-DZCohPuZ.js +50 -0
  138. package/dist/plugin-sdk/api-key-rotation-CrX0fvDj.js +181 -0
  139. package/dist/plugin-sdk/audio-preflight-xnWAFqH-.js +69 -0
  140. package/dist/plugin-sdk/audio-transcription-runner-BDmtq7-q.js +2176 -0
  141. package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +58 -0
  142. package/dist/plugin-sdk/channel-activity-JjLRpUa_.js +94 -0
  143. package/dist/plugin-sdk/channel-web-DNWsxhYh.js +2256 -0
  144. package/dist/plugin-sdk/chrome-B5PWOUbr.js +2415 -0
  145. package/dist/plugin-sdk/commands-registry-BKeyJUxK.js +1125 -0
  146. package/dist/plugin-sdk/config-FhBFLsNm.js +17911 -0
  147. package/dist/plugin-sdk/deliver-DEbTlzFy.js +1694 -0
  148. package/dist/plugin-sdk/deliver-runtime-CO2uP-r9.js +32 -0
  149. package/dist/plugin-sdk/deps-send-discord.runtime-DIPW0tR4.js +23 -0
  150. package/dist/plugin-sdk/deps-send-imessage.runtime-ByGjRa1H.js +22 -0
  151. package/dist/plugin-sdk/deps-send-signal.runtime-Ca1awu4L.js +21 -0
  152. package/dist/plugin-sdk/deps-send-slack.runtime-CRzWCVkC.js +19 -0
  153. package/dist/plugin-sdk/deps-send-telegram.runtime-BWyavKp9.js +24 -0
  154. package/dist/plugin-sdk/deps-send-whatsapp.runtime-cC_XvHV8.js +57 -0
  155. package/dist/plugin-sdk/diagnostic-Dv9S12vm.js +319 -0
  156. package/dist/plugin-sdk/errors-B8oJXuCF.js +54 -0
  157. package/dist/plugin-sdk/fetch-guard-W_A4uSz2.js +156 -0
  158. package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +352 -0
  159. package/dist/plugin-sdk/image-BSFy8d1M.js +2310 -0
  160. package/dist/plugin-sdk/image-ops-DN17S88I.js +584 -0
  161. package/dist/plugin-sdk/image-runtime-5YO31sjU.js +25 -0
  162. package/dist/plugin-sdk/imessage.js +2 -2
  163. package/dist/plugin-sdk/index.js +50 -50
  164. package/dist/plugin-sdk/ir-JaPZ0yKH.js +1296 -0
  165. package/dist/plugin-sdk/local-roots-BTW3ifco.js +186 -0
  166. package/dist/plugin-sdk/logger-DDdrdbDu.js +1163 -0
  167. package/dist/plugin-sdk/login-BXGRny-S.js +57 -0
  168. package/dist/plugin-sdk/login-qr-DTs92ap8.js +320 -0
  169. package/dist/plugin-sdk/manager-DzFj9oHX.js +3917 -0
  170. package/dist/plugin-sdk/manager-runtime-DrpyZvO0.js +15 -0
  171. package/dist/plugin-sdk/mattermost.js +3 -3
  172. package/dist/plugin-sdk/outbound-CQ7uBBML.js +212 -0
  173. package/dist/plugin-sdk/outbound-attachment-dTE6EVdX.js +19 -0
  174. package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +43 -0
  175. package/dist/plugin-sdk/paths-C6W4VHoa.js +166 -0
  176. package/dist/plugin-sdk/pi-embedded-helpers-CfzQPXDC.js +9627 -0
  177. package/dist/plugin-sdk/pi-model-discovery-Bt6B0MAj.js +134 -0
  178. package/dist/plugin-sdk/pi-model-discovery-runtime-BcgXpTmL.js +8 -0
  179. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-DYJQxhuo.js +354 -0
  180. package/dist/plugin-sdk/plugins-6NxPd6TS.js +864 -0
  181. package/dist/plugin-sdk/proxy-fetch-ZPEvp58f.js +38 -0
  182. package/dist/plugin-sdk/pw-ai-BFK39pwE.js +1938 -0
  183. package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +1448 -0
  184. package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +1011 -0
  185. package/dist/plugin-sdk/redact-BoNEjbpF.js +319 -0
  186. package/dist/plugin-sdk/reply-DgcrQBKL.js +98828 -0
  187. package/dist/plugin-sdk/resolve-outbound-target-CbaJ-kc2.js +40 -0
  188. package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +1994 -0
  189. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-jkgyeVsN.js +10 -0
  190. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DdLJJ1YC.js +19 -0
  191. package/dist/plugin-sdk/send-BSoMbeqA.js +3135 -0
  192. package/dist/plugin-sdk/send-Byyfc20_.js +503 -0
  193. package/dist/plugin-sdk/send-CI-xWEs7.js +2587 -0
  194. package/dist/plugin-sdk/send-DzP9EJqK.js +540 -0
  195. package/dist/plugin-sdk/send-MlSZ82sA.js +414 -0
  196. package/dist/plugin-sdk/session-DFy97tfW.js +169 -0
  197. package/dist/plugin-sdk/signal.js +2 -2
  198. package/dist/plugin-sdk/skill-commands-yum46YuA.js +342 -0
  199. package/dist/plugin-sdk/skills-DUphJGKn.js +1428 -0
  200. package/dist/plugin-sdk/slash-commands.runtime-5UW5KLyR.js +13 -0
  201. package/dist/plugin-sdk/slash-dispatch.runtime-4oQ2P_qo.js +52 -0
  202. package/dist/plugin-sdk/slash-skill-commands.runtime-y_mOLyS7.js +16 -0
  203. package/dist/plugin-sdk/ssrf-B3XRWBsP.js +202 -0
  204. package/dist/plugin-sdk/store-DFvIhzWZ.js +81 -0
  205. package/dist/plugin-sdk/subagent-registry-runtime-DtKXhKtl.js +52 -0
  206. package/dist/plugin-sdk/tables-bDM_jlLP.js +55 -0
  207. package/dist/{target-errors-DlzVutaL.js → plugin-sdk/target-errors-BVBW25Y3.js} +4 -4
  208. package/dist/plugin-sdk/thinking-Bu-w5mW5.js +1206 -0
  209. package/dist/plugin-sdk/tokens-CTIYTLWu.js +52 -0
  210. package/dist/plugin-sdk/tool-images-D0G_giwP.js +274 -0
  211. package/dist/plugin-sdk/web-DSXk7XCb.js +56 -0
  212. package/dist/plugin-sdk/whatsapp-actions-BOyA0Uuj.js +80 -0
  213. package/dist/{plugins-Cl_3OCyK.js → plugins-H53_4Gxb.js} +2 -2
  214. package/dist/{plugins-cli-CN2fty5U.js → plugins-cli-CQkxWdnt.js} +82 -82
  215. package/dist/{ports-Bop51hz6.js → ports-CKXuQJST.js} +2 -2
  216. package/dist/{ports-6i8smH3e.js → ports-CXjhFS7T.js} +1 -1
  217. package/dist/{program-context-ehHvCw9L.js → program-context-tphS7xu7.js} +41 -41
  218. package/dist/{prompt-select-styled-CSMviLJY.js → prompt-select-styled-DL2p1pfi.js} +40 -40
  219. package/dist/{provider-auth-helpers-CgNWlsqs.js → provider-auth-helpers-BqWiy-r-.js} +5 -5
  220. package/dist/{proxy-env-CRD7fbqp.js → proxy-env-D1tz4Z6a.js} +1 -1
  221. package/dist/{push-apns-DoYzx3tH.js → push-apns-C-YdARdy.js} +5 -5
  222. package/dist/{pw-ai-yKJj32B4.js → pw-ai-SVeR5d2o.js} +18 -18
  223. package/dist/{qmd-manager-AYDUTXmc.js → qmd-manager-B-XXhWVw.js} +20 -20
  224. package/dist/{qr-cli-cikAHfYn.js → qr-cli-B4fjHvn1.js} +2 -2
  225. package/dist/{query-expansion-CV2Z4_mS.js → query-expansion-Bf60ekMj.js} +12 -12
  226. package/dist/{redact-snapshot-C9T1079O.js → redact-snapshot-DRqM8Vla.js} +1 -1
  227. package/dist/{register.agent-BlxoyQt0.js → register.agent-BdiM0qkl.js} +97 -97
  228. package/dist/register.configure-wANXDbzQ.js +164 -0
  229. package/dist/{register.maintenance-C-Yv2mHK.js → register.maintenance-CMAt3Nl8.js} +93 -93
  230. package/dist/{register.message-CUNXtFOj.js → register.message-CbxQ5lgi.js} +73 -73
  231. package/dist/{register.onboard-BKXm1mL7.js → register.onboard-CbiTdKQX.js} +18 -18
  232. package/dist/{register.setup-DaT9AIAz.js → register.setup-KhsHMx2v.js} +21 -21
  233. package/dist/{register.status-health-sessions-7yZmSvUL.js → register.status-health-sessions-Bw5YDa_s.js} +86 -86
  234. package/dist/{reply-CeUYZhWu.js → reply-BWXzPVSJ.js} +149 -149
  235. package/dist/{rpc-BDpuIniF.js → rpc-DlN_W_L1.js} +1 -1
  236. package/dist/{runtime-Dw7Yw4OJ.js → runtime-Ci7mtLvH.js} +3 -3
  237. package/dist/{runtime-config-collectors-jhc1wDBg.js → runtime-config-collectors-CKmGmTQ5.js} +1 -1
  238. package/dist/{runtime-whatsapp-login.runtime-f293Z_er.js → runtime-whatsapp-login.runtime-Bxqt5jiO.js} +7 -7
  239. package/dist/runtime-whatsapp-outbound.runtime-B-UsXwvb.js +32 -0
  240. package/dist/{sandbox-BgsD1lf7.js → sandbox-Cuk1IWYT.js} +18 -18
  241. package/dist/{sandbox-cli-BnvmhiN9.js → sandbox-cli-BxgFeoAD.js} +25 -25
  242. package/dist/{secrets-cli-D7-K7P82.js → secrets-cli-DODLX29x.js} +11 -11
  243. package/dist/{security-cli-BFJAgNYH.js → security-cli-Ch83VrLP.js} +42 -42
  244. package/dist/{send-BvlkshC1.js → send-BfVgGHK6.js} +6 -6
  245. package/dist/{send-tK0H9nwq.js → send-Bw8LNCit.js} +5 -5
  246. package/dist/{send-CDms2FQA.js → send-C9UJKBSM.js} +4 -4
  247. package/dist/{send-CPFNtAP8.js → send-DX_fR45p.js} +11 -11
  248. package/dist/{send-C3Aeswif.js → send-FTQaNJPj.js} +8 -8
  249. package/dist/{server-OfKJG6Bo.js → server-Q9nnn04D.js} +20 -20
  250. package/dist/{server-context-B-0KzcZE.js → server-context-CX28l04l.js} +12 -12
  251. package/dist/{server-lifecycle-D6VNKVvQ.js → server-lifecycle-yAUMTJhv.js} +2 -2
  252. package/dist/{server-middleware-7cXowO4W.js → server-middleware-DIc4WJOS.js} +1 -1
  253. package/dist/{server-node-events-DWQhNK-0.js → server-node-events-qU3NTncQ.js} +73 -73
  254. package/dist/{service-Dk-UMipf.js → service-D4y0_Q5Z.js} +15 -15
  255. package/dist/{session-Da18ilJ0.js → session-CZJ5Ux6-.js} +1 -1
  256. package/dist/{sessions-CmjcNTJ3.js → sessions-C5H_BZSr.js} +15 -15
  257. package/dist/{shared-BzY0v0tS.js → shared-CxdBWgym.js} +3 -3
  258. package/dist/{shared-BcB-feC8.js → shared-DwNtcoQg.js} +1 -1
  259. package/dist/{skill-commands-BEWkEml_.js → skill-commands-BSRPnzXp.js} +5 -5
  260. package/dist/{skill-scanner-Bb5SMbCz.js → skill-scanner-rdr9cQew.js} +6 -6
  261. package/dist/{skills-Rnr7zPen.js → skills-BnBOxX1c.js} +3 -3
  262. package/dist/{skills-cli-BowIIIzH.js → skills-cli-CUgeYV1y.js} +5 -5
  263. package/dist/{skills-install-BLNCKuex.js → skills-install-BE04CZ6e.js} +6 -6
  264. package/dist/{skills-status-BCU-5otB.js → skills-status-DQw98BkG.js} +1 -1
  265. package/dist/{slash-commands.runtime-BgVgQ-Eh.js → slash-commands.runtime-BPtL2Qev.js} +11 -11
  266. package/dist/slash-dispatch.runtime-Cf9dq1k6.js +113 -0
  267. package/dist/{slash-skill-commands.runtime-4dOiU6U0.js → slash-skill-commands.runtime-9BYoANpd.js} +15 -15
  268. package/dist/{squidclaw-root-BcB7vo9M.js → squidclaw-root-CnE19yKj.js} +8 -8
  269. package/dist/{status-COTRBaam.js → status-rb5Jz-VU.js} +26 -26
  270. package/dist/{status.update-BUql4yz-.js → status.update-BNODJGA9.js} +2 -2
  271. package/dist/{store-aa15VM42.js → store-PDMRmC5Z.js} +5 -5
  272. package/dist/subagent-registry-runtime-CTiA365B.js +113 -0
  273. package/dist/{system-cli-CgCUbH_M.js → system-cli-DJYyTO07.js} +9 -9
  274. package/dist/{system-run-command-Ny1SbbOD.js → system-run-command-BgnCyvrj.js} +1 -1
  275. package/dist/{systemd-zbKl2Q3E.js → systemd-fP8tz4aL.js} +9 -9
  276. package/dist/{systemd-hints-C9_7ouv7.js → systemd-hints-BG_t__ZD.js} +6 -6
  277. package/dist/{systemd-linger-BM6JyzAr.js → systemd-linger-DgK8uuKY.js} +1 -1
  278. package/dist/{tables-jZMI8hLl.js → tables-DUSFF9-W.js} +1 -1
  279. package/dist/{tailnet-gTCqUBfJ.js → tailnet-CLkKVwDq.js} +1 -1
  280. package/dist/target-errors-BxwxgIDk.js +195 -0
  281. package/dist/{tool-images-DTl_LHMa.js → tool-images-FhSCiY-o.js} +1 -1
  282. package/dist/{tui-kDK-MAOc.js → tui-BMOMT-ma.js} +6 -6
  283. package/dist/{tui-cli-Dxy6fKkU.js → tui-cli-kqZ_-2Mz.js} +32 -32
  284. package/dist/{update-ZUTn6Jsu.js → update-blK9j2ag.js} +3 -3
  285. package/dist/{update-cli-D_QEiKyz.js → update-cli-gLKrP8UQ.js} +102 -102
  286. package/dist/{update-runner-DOXPSA_-.js → update-runner-C2UrF4oZ.js} +16 -16
  287. package/dist/web-VmjeceHS.js +117 -0
  288. package/dist/{webhooks-cli-D1iehjkP.js → webhooks-cli-BEXPBILa.js} +6 -6
  289. package/dist/{whatsapp-actions-hN5bwjWU.js → whatsapp-actions-DhiV181U.js} +17 -17
  290. package/dist/{with-timeout-BjaANd4G.js → with-timeout-BCAfkt03.js} +3 -3
  291. package/dist/{workspace-BITWyKG4.js → workspace-B-k5DNiQ.js} +1 -1
  292. package/dist/{workspace-dirs-B7O9BAHp.js → workspace-dirs-B2dNahfe.js} +1 -1
  293. package/dist/{ws-Bx8lpC1N.js → ws-DKt5HoA5.js} +2 -2
  294. package/dist/{wsl-wYxPJ8EO.js → wsl-CgxzAzRe.js} +2 -2
  295. package/package.json +1 -1
  296. package/dist/deliver-runtime-uwleBPlq.js +0 -61
  297. package/dist/deps-send-discord.runtime-CuZGpA7H.js +0 -36
  298. package/dist/deps-send-imessage.runtime-ByVW2alP.js +0 -35
  299. package/dist/deps-send-signal.runtime-Dl4GaCbQ.js +0 -34
  300. package/dist/deps-send-slack.runtime-BEV10FHj.js +0 -32
  301. package/dist/deps-send-whatsapp.runtime-Di0SEPNK.js +0 -118
  302. package/dist/image-runtime-B5Q4J9w2.js +0 -55
  303. package/dist/register.configure-CGptmTVZ.js +0 -164
  304. package/dist/runtime-whatsapp-outbound.runtime-uDhEmWe1.js +0 -32
  305. package/dist/slash-dispatch.runtime-D83FVeU7.js +0 -113
  306. package/dist/subagent-registry-runtime-CrT5RSO9.js +0 -113
  307. 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 };