shadow-claw 1.59.7 → 1.60.0

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 (253) hide show
  1. package/.well-known/mcp/server-card.json +4 -12
  2. package/.well-known/mcp.json +4 -12
  3. package/README.md +6 -2
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/{chunk-DDvuLVfW.js → chunk-3C5izdQW.js} +1 -1
  6. package/dist/cli/chunk-B-75h9gX.js +1 -0
  7. package/dist/cli/{chunk-hVf839t7.js → chunk-B7Kn-otm.js} +1 -1
  8. package/dist/cli/{chunk-YX32FcN7.js → chunk-BBczgswQ.js} +1 -1
  9. package/dist/cli/{chunk-DcNxjqH6.js → chunk-BE-lYWcn.js} +1 -1
  10. package/dist/cli/{chunk-CQaCgswD.js → chunk-BECr0WxI.js} +11 -11
  11. package/dist/cli/chunk-BEz1PD1_.js +1 -0
  12. package/dist/cli/chunk-BLzI1Fp2.js +1 -0
  13. package/dist/cli/{chunk-B3TrWbca.js → chunk-BVSC1MNQ.js} +11 -11
  14. package/dist/cli/{chunk-D_te8ufL.js → chunk-BdWcep6o.js} +1 -1
  15. package/dist/cli/{chunk-SRBRVorc.js → chunk-BfTpnSS4.js} +1 -1
  16. package/dist/cli/{chunk-D2_eAO83.js → chunk-BgvqTf7w.js} +1 -1
  17. package/dist/cli/chunk-BwsJfUT3.js +1 -0
  18. package/dist/cli/{chunk--PFY91kE.js → chunk-C9b4b7c_.js} +1 -1
  19. package/dist/cli/{chunk-SxK79JmB.js → chunk-CAw9XYFe.js} +1 -1
  20. package/dist/cli/chunk-CFCcbFs2.js +396 -0
  21. package/dist/cli/{chunk-Cnjb8Usu.js → chunk-CTarF4FC.js} +1 -1
  22. package/dist/cli/{chunk-3vNYrs_L.js → chunk-Cbq5hpjb.js} +4 -4
  23. package/dist/cli/chunk-CjTjKy_v.js +310 -0
  24. package/dist/cli/chunk-Cjyu4cr_.js +36 -0
  25. package/dist/cli/{chunk-DUGZPka_.js → chunk-ClMKygjZ.js} +1 -1
  26. package/dist/cli/chunk-Cppnq1KF.js +1 -0
  27. package/dist/cli/{chunk-DvemF16v.js → chunk-D9QCNFMO.js} +1 -1
  28. package/dist/cli/{chunk-iB8OoMmW.js → chunk-DB21BMqt.js} +1 -1
  29. package/dist/cli/{chunk-_Vo-o_e3.js → chunk-DHoIWvCc.js} +1 -1
  30. package/dist/cli/chunk-DZEN9T5y.js +1 -0
  31. package/dist/cli/{chunk-5rLO4DWS.js → chunk-Dl14OyYO.js} +9 -9
  32. package/dist/cli/chunk-Dl_vv0dI.js +1 -0
  33. package/dist/cli/chunk-Dpmfhlyl.js +1 -0
  34. package/dist/cli/{chunk-BrR1DOBS.js → chunk-Du7Xtucq.js} +1 -1
  35. package/dist/cli/{chunk-B88Z8T_9.js → chunk-DxcDFUi_.js} +1 -1
  36. package/dist/cli/{chunk-Dt7-hzJU.js → chunk-DyyEWbV7.js} +1 -1
  37. package/dist/cli/chunk-N0x3mXU0.js +1 -0
  38. package/dist/cli/{chunk-CGoE4llV.js → chunk-V-w0Bata.js} +1 -1
  39. package/dist/cli/{chunk-CncW6_WL.js → chunk-ZxDxSSn-.js} +1 -1
  40. package/dist/cli/{chunk-CZdCRqNe.js → chunk-lPvFUkd5.js} +1 -1
  41. package/dist/cli/{chunk-66BvqAV0.js → chunk-n5s-sCdU.js} +1 -1
  42. package/dist/cli/{chunk-CAAeGOdy.js → chunk-nD9VPVMq.js} +1 -1
  43. package/dist/cli/{chunk-DMs7kREC.js → chunk-rFuy8aS_.js} +1 -1
  44. package/dist/cli/{chunk-B0qusANw.js → chunk-wjM6JXWa.js} +1 -1
  45. package/dist/cli/{chunk-DhOU6GYX.js → chunk-zcES9rut.js} +1 -1
  46. package/dist/cli/cli.js +3 -3
  47. package/dist/headless-agent.js +1 -1
  48. package/dist/lib/{channel-mmdGzPkT.js → channel-DB77spML.js} +2 -2
  49. package/dist/lib/{channel-mmdGzPkT.js.map → channel-DB77spML.js.map} +1 -1
  50. package/dist/lib/{compact-context-CY9BBlUQ.js → compact-context-Q9t9aL1e.js} +7 -7
  51. package/dist/lib/{compact-context-CY9BBlUQ.js.map → compact-context-Q9t9aL1e.js.map} +1 -1
  52. package/dist/lib/components/index.js +21 -21
  53. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  58. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  63. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  64. package/dist/lib/components/shadow-claw-channels.js +1 -1
  65. package/dist/lib/components/shadow-claw-chat.js +1 -1
  66. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  67. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  68. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  69. package/dist/lib/components/shadow-claw-files.js +1 -1
  70. package/dist/lib/components/shadow-claw-git.js +1 -1
  71. package/dist/lib/components/shadow-claw-llm.js +1 -1
  72. package/dist/lib/components/shadow-claw-networking.js +1 -1
  73. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  74. package/dist/lib/components/shadow-claw-pages.js +1 -1
  75. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  76. package/dist/lib/components/shadow-claw-settings.js +1 -1
  77. package/dist/lib/components/shadow-claw-storage.js +1 -1
  78. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  79. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  80. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  81. package/dist/lib/components/shadow-claw-tools.js +1 -1
  82. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  83. package/dist/lib/components/shadow-claw.js +1 -1
  84. package/dist/lib/{configure-peer-js-ccNvax2N.js → configure-peer-js-CgFiwoxY.js} +2 -2
  85. package/dist/lib/{configure-peer-js-ccNvax2N.js.map → configure-peer-js-CgFiwoxY.js.map} +1 -1
  86. package/dist/lib/content/build-attachment-content-blocks.d.ts +2 -0
  87. package/dist/lib/{discover-skills-OwlQ2sXA.js → discover-skills-CXyaWHKi.js} +5 -5
  88. package/dist/lib/{discover-skills-OwlQ2sXA.js.map → discover-skills-CXyaWHKi.js.map} +1 -1
  89. package/dist/lib/{git-D2J_j9X9.js → git-CogDRlEz.js} +2 -2
  90. package/dist/lib/{git-D2J_j9X9.js.map → git-CogDRlEz.js.map} +1 -1
  91. package/dist/lib/index.js +21 -21
  92. package/dist/lib/{init-control-plane-B7blDVIE.js → init-control-plane-CEGdzgWX.js} +7 -7
  93. package/dist/lib/{init-control-plane-B7blDVIE.js.map → init-control-plane-CEGdzgWX.js.map} +1 -1
  94. package/dist/lib/{invoke-agent-SxvudiDT.js → invoke-agent-cac3gCsj.js} +6 -6
  95. package/dist/lib/{invoke-agent-SxvudiDT.js.map → invoke-agent-cac3gCsj.js.map} +1 -1
  96. package/dist/lib/{move-group-entry-DDpjxa10.js → move-group-entry-D8dptMg0.js} +2 -2
  97. package/dist/lib/{move-group-entry-DDpjxa10.js.map → move-group-entry-D8dptMg0.js.map} +1 -1
  98. package/dist/lib/{orchestrator-C7fkh7T7.js → orchestrator-BBAwy9Nm.js} +12 -12
  99. package/dist/lib/{orchestrator-C7fkh7T7.js.map → orchestrator-BBAwy9Nm.js.map} +1 -1
  100. package/dist/lib/{orchestrator-CCARkxQC.js → orchestrator-cRBe3lhq.js} +2 -2
  101. package/dist/lib/{orchestrator-CCARkxQC.js.map → orchestrator-cRBe3lhq.js.map} +1 -1
  102. package/dist/lib/{peerjs-Bfw_FWLB.js → peerjs-BLg8aGUj.js} +3 -3
  103. package/dist/lib/{peerjs-Bfw_FWLB.js.map → peerjs-BLg8aGUj.js.map} +1 -1
  104. package/dist/lib/{process-peer-query-param-BxYiZNdf.js → process-peer-query-param-BnsVnxzH.js} +5 -5
  105. package/dist/lib/{process-peer-query-param-BxYiZNdf.js.map → process-peer-query-param-BnsVnxzH.js.map} +1 -1
  106. package/dist/lib/{process-pending-shared-payloads-DPIbwRb3.js → process-pending-shared-payloads-DBZfZOOa.js} +2 -2
  107. package/dist/lib/{process-pending-shared-payloads-DPIbwRb3.js.map → process-pending-shared-payloads-DBZfZOOa.js.map} +1 -1
  108. package/dist/lib/{process-room-query-param-B2_d50nE.js → process-room-query-param-B8EYg_-r.js} +4 -4
  109. package/dist/lib/{process-room-query-param-B2_d50nE.js.map → process-room-query-param-B8EYg_-r.js.map} +1 -1
  110. package/dist/lib/{push-client-rrjTdc-U.js → push-client-CAm6UMvE.js} +3 -3
  111. package/dist/lib/{push-client-rrjTdc-U.js.map → push-client-CAm6UMvE.js.map} +1 -1
  112. package/dist/lib/{rooms-bwGoYb1q.js → rooms-Dzphx3rK.js} +2 -2
  113. package/dist/lib/{rooms-bwGoYb1q.js.map → rooms-Dzphx3rK.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-CypGVlVO.js → shadow-claw-CGl8tXtG.js} +6 -6
  115. package/dist/lib/{shadow-claw-CypGVlVO.js.map → shadow-claw-CGl8tXtG.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-channel-config-DJpDovkF.js → shadow-claw-channel-config-BNIWCdsL.js} +4 -4
  117. package/dist/lib/{shadow-claw-channel-config-DJpDovkF.js.map → shadow-claw-channel-config-BNIWCdsL.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-channels-DJLwRovH.js → shadow-claw-channels-C2QSn4Ew.js} +2 -2
  119. package/dist/lib/{shadow-claw-channels-DJLwRovH.js.map → shadow-claw-channels-C2QSn4Ew.js.map} +1 -1
  120. package/dist/lib/{shadow-claw-chat-B92cPaft.js → shadow-claw-chat-Wx3y9y6c.js} +3 -3
  121. package/dist/lib/{shadow-claw-chat-B92cPaft.js.map → shadow-claw-chat-Wx3y9y6c.js.map} +1 -1
  122. package/dist/lib/{shadow-claw-control-plane-fvn-qyHj.js → shadow-claw-control-plane-D5E4cFGu.js} +6 -6
  123. package/dist/lib/{shadow-claw-control-plane-fvn-qyHj.js.map → shadow-claw-control-plane-D5E4cFGu.js.map} +1 -1
  124. package/dist/lib/{shadow-claw-conversations-CsVyDOny.js → shadow-claw-conversations-BtDv7GRW.js} +2 -2
  125. package/dist/lib/{shadow-claw-conversations-CsVyDOny.js.map → shadow-claw-conversations-BtDv7GRW.js.map} +1 -1
  126. package/dist/lib/{shadow-claw-file-viewer-DFfyP7s5.js → shadow-claw-file-viewer-CG40kwWV.js} +2 -2
  127. package/dist/lib/{shadow-claw-file-viewer-DFfyP7s5.js.map → shadow-claw-file-viewer-CG40kwWV.js.map} +1 -1
  128. package/dist/lib/{shadow-claw-files-cT6HL7ye.js → shadow-claw-files-BOUULrlX.js} +3 -3
  129. package/dist/lib/{shadow-claw-files-cT6HL7ye.js.map → shadow-claw-files-BOUULrlX.js.map} +1 -1
  130. package/dist/lib/{shadow-claw-git-Cv9mQgTx.js → shadow-claw-git-BeHV73_9.js} +3 -3
  131. package/dist/lib/{shadow-claw-git-Cv9mQgTx.js.map → shadow-claw-git-BeHV73_9.js.map} +1 -1
  132. package/dist/lib/{shadow-claw-llm-CKOYzPDp.js → shadow-claw-llm-KONyWKZM.js} +2 -2
  133. package/dist/lib/{shadow-claw-llm-CKOYzPDp.js.map → shadow-claw-llm-KONyWKZM.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-networking-DYfiUQaH.js → shadow-claw-networking-Diy3JJkc.js} +2 -2
  135. package/dist/lib/{shadow-claw-networking-DYfiUQaH.js.map → shadow-claw-networking-Diy3JJkc.js.map} +1 -1
  136. package/dist/lib/{shadow-claw-notifications-JJlzriuX.js → shadow-claw-notifications-C-upPa-4.js} +2 -2
  137. package/dist/lib/{shadow-claw-notifications-JJlzriuX.js.map → shadow-claw-notifications-C-upPa-4.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-pages-BCo3ihZI.js → shadow-claw-pages-CfAjUKgd.js} +2 -2
  139. package/dist/lib/{shadow-claw-pages-BCo3ihZI.js.map → shadow-claw-pages-CfAjUKgd.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-peerjs-CFNjfrY5.js → shadow-claw-peerjs-t4YibS9s.js} +5 -5
  141. package/dist/lib/{shadow-claw-peerjs-CFNjfrY5.js.map → shadow-claw-peerjs-t4YibS9s.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-settings-BMwne0bh.js → shadow-claw-settings-Cg5V0e9g.js} +2 -2
  143. package/dist/lib/{shadow-claw-settings-BMwne0bh.js.map → shadow-claw-settings-Cg5V0e9g.js.map} +1 -1
  144. package/dist/lib/{shadow-claw-storage-DUY8B9m-.js → shadow-claw-storage-C7tCnsSG.js} +2 -2
  145. package/dist/lib/{shadow-claw-storage-DUY8B9m-.js.map → shadow-claw-storage-C7tCnsSG.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-task-server-yWeoA3eL.js → shadow-claw-task-server-BObsRdf8.js} +2 -2
  147. package/dist/lib/{shadow-claw-task-server-yWeoA3eL.js.map → shadow-claw-task-server-BObsRdf8.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-tasks-Bg0uM15I.js → shadow-claw-tasks-B2EEqrcY.js} +3 -3
  149. package/dist/lib/{shadow-claw-tasks-Bg0uM15I.js.map → shadow-claw-tasks-B2EEqrcY.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-terminal-fyJPppY_.js → shadow-claw-terminal-DSHfO2b9.js} +2 -2
  151. package/dist/lib/{shadow-claw-terminal-fyJPppY_.js.map → shadow-claw-terminal-DSHfO2b9.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-tools-D0T8m3go.js → shadow-claw-tools-DwPBADua.js} +3 -3
  153. package/dist/lib/{shadow-claw-tools-D0T8m3go.js.map → shadow-claw-tools-DwPBADua.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-webvm-CQvzJwKI.js → shadow-claw-webvm-CY4qGaMB.js} +2 -2
  155. package/dist/lib/{shadow-claw-webvm-CQvzJwKI.js.map → shadow-claw-webvm-CY4qGaMB.js.map} +1 -1
  156. package/dist/lib/{sync-web-mcp-registration-BFtG_4kx.js → sync-web-mcp-registration-BiOZvW-R.js} +3 -3
  157. package/dist/lib/{sync-web-mcp-registration-BFtG_4kx.js.map → sync-web-mcp-registration-BiOZvW-R.js.map} +1 -1
  158. package/dist/lib/{system-prompt-bhGRLoL2.js → system-prompt-CxJ3Nx4c.js} +4 -3
  159. package/dist/lib/system-prompt-CxJ3Nx4c.js.map +1 -0
  160. package/dist/public/.well-known/mcp/server-card.json +4 -12
  161. package/dist/public/.well-known/mcp.json +4 -12
  162. package/dist/public/AGENTS.md +3 -1
  163. package/dist/public/README.md +6 -2
  164. package/dist/public/agent.worker.js +1 -1
  165. package/dist/public/{channel-Dk7wl-Av.js → channel-DIpDQekL.js} +1 -1
  166. package/dist/public/{chat-template-BwAnTFKf.js → chat-template-CXKs8lFR.js} +1 -1
  167. package/dist/public/compact-context-BQ2ZXoAc.js +5 -0
  168. package/dist/public/{compact-context-fOTqwKF6.js → compact-context-dHitmPsV.js} +2 -2
  169. package/dist/public/{configure-peer-js-BOV0tR6G.js → configure-peer-js-DV1rqvFX.js} +1 -1
  170. package/dist/public/{create-model-cache-fetch-DSAFjOwc.js → create-model-cache-fetch-B0mSCEk6.js} +1 -1
  171. package/dist/public/{discover-skills-D1sNTy2r.js → discover-skills-BWJB8HUA.js} +1 -1
  172. package/dist/public/docs/architecture/overview.md +1 -1
  173. package/dist/public/docs/example/article/index.html +21 -21
  174. package/dist/public/docs/example/article.html +21 -21
  175. package/dist/public/docs/publishing/index.html +21 -21
  176. package/dist/public/docs/publishing.html +21 -21
  177. package/dist/public/docs/skill-creator/index.html +21 -21
  178. package/dist/public/docs/skill-creator.html +21 -21
  179. package/dist/public/docs/subsystems/attachment-capabilities.md +14 -1
  180. package/dist/public/docs/subsystems/cli.md +95 -51
  181. package/dist/public/docs/subsystems/pages.md +5 -0
  182. package/dist/public/e2e/README.md +1 -1
  183. package/dist/public/{e2e-bridge-Cz95DLlb.js → e2e-bridge-lP2qqiv3.js} +1 -1
  184. package/dist/public/{git-BmMlwIMP.js → git-DjmQ16rm.js} +1 -1
  185. package/dist/public/{iframe-bridge-scripts-Cibg0m6A.js → iframe-bridge-scripts-CO0izGjW.js} +1 -1
  186. package/dist/public/index.html +21 -21
  187. package/dist/public/index.js +1 -1
  188. package/dist/public/{init-control-plane-Cb31yLTY.js → init-control-plane-Ctz7FI8M.js} +1 -1
  189. package/dist/public/{invoke-agent-CN7mSV0Z.js → invoke-agent-C_geruwq.js} +1 -1
  190. package/dist/public/llms.txt +1 -1
  191. package/dist/public/main/index.html +21 -21
  192. package/dist/public/main/memory/index.html +21 -21
  193. package/dist/public/main/memory.html +21 -21
  194. package/dist/public/main.html +21 -21
  195. package/dist/public/{move-group-entry-CXneuNVa.js → move-group-entry-QQ9Hkk54.js} +1 -1
  196. package/dist/public/{orchestrator-Dyylc8IU.js → orchestrator-C1kaTltu.js} +2 -2
  197. package/dist/public/{orchestrator-DBO4NZqd.js → orchestrator-Li1UAsv7.js} +1 -1
  198. package/dist/public/{peerjs-l0jiBoh6.js → peerjs-DbBryE-9.js} +1 -1
  199. package/dist/public/{process-peer-query-param-s-aSP1Rq.js → process-peer-query-param-DQIgr3KL.js} +1 -1
  200. package/dist/public/{process-pending-shared-payloads-BN3GigPT.js → process-pending-shared-payloads-Ctb-TFqB.js} +1 -1
  201. package/dist/public/{process-room-query-param-B2Qe0F0M.js → process-room-query-param-F-XnIVoZ.js} +1 -1
  202. package/dist/public/{push-client-B2LC8Qp9.js → push-client-DRx9Eggz.js} +1 -1
  203. package/dist/public/{rooms-ChCEOvkw.js → rooms-BurBI7is.js} +1 -1
  204. package/dist/public/service-worker/init.js +1 -1
  205. package/dist/public/service-worker.js +1 -1
  206. package/dist/public/{shadow-claw-Br8mWDUx.js → shadow-claw-Bg9AQ5x_.js} +2 -2
  207. package/dist/public/{shadow-claw-accounts-Dm6G7KMP.js → shadow-claw-accounts-B3mjYI0M.js} +1 -1
  208. package/dist/public/{shadow-claw-card-CggS8uSa.js → shadow-claw-card-tcXRS1GF.js} +1 -1
  209. package/dist/public/{shadow-claw-channels-088vhuWO.js → shadow-claw-channels-BiSfLvWv.js} +1 -1
  210. package/dist/public/{shadow-claw-chat-BRwRlq-n.js → shadow-claw-chat-N5jMsXZZ.js} +1 -1
  211. package/dist/public/{shadow-claw-control-plane-rhKACK85.js → shadow-claw-control-plane-DFVe_Xdq.js} +2 -2
  212. package/dist/public/{shadow-claw-conversations-CF_yUfKl.js → shadow-claw-conversations-wAR06_ya.js} +1 -1
  213. package/dist/public/{shadow-claw-empty-state-CkpOSXCS.js → shadow-claw-empty-state-CnPm3NVM.js} +1 -1
  214. package/dist/public/{shadow-claw-file-viewer-DWCejuY3.js → shadow-claw-file-viewer-sZN_FCDW.js} +2 -2
  215. package/dist/public/{shadow-claw-files-L6_ioyzh.js → shadow-claw-files-CnvkCbd4.js} +2 -2
  216. package/dist/public/{shadow-claw-git-DsdkwLqQ.js → shadow-claw-git-BBHfClGk.js} +2 -2
  217. package/dist/public/{shadow-claw-integrations-CSbRTOm3.js → shadow-claw-integrations-DvdBqzRJ.js} +1 -1
  218. package/dist/public/{shadow-claw-llm-BitaeAVc.js → shadow-claw-llm-YfohG519.js} +1 -1
  219. package/dist/public/{shadow-claw-mcp-remote-gSbV5riy.js → shadow-claw-mcp-remote-BAVbf5pi.js} +1 -1
  220. package/dist/public/{shadow-claw-networking-Dn_y6Cl9.js → shadow-claw-networking-CZ4LWPW7.js} +1 -1
  221. package/dist/public/{shadow-claw-notifications-Cj4Lqx8U.js → shadow-claw-notifications-BHwyREkG.js} +1 -1
  222. package/dist/public/{shadow-claw-page-header-DR4OZFt2.js → shadow-claw-page-header-De6Qf6eY.js} +1 -1
  223. package/dist/public/{shadow-claw-page-header-action-button-BnCV_2Kb.js → shadow-claw-page-header-action-button-FSOhTc9z.js} +1 -1
  224. package/dist/public/{shadow-claw-pages-mpDOtNYj.js → shadow-claw-pages-D_oPyDca.js} +1 -1
  225. package/dist/public/{shadow-claw-pdf-viewer-DZ_84qJH.js → shadow-claw-pdf-viewer-CrU4wqRq.js} +1 -1
  226. package/dist/public/{shadow-claw-settings-CfFTYTEy.js → shadow-claw-settings-DkUhvxVr.js} +2 -2
  227. package/dist/public/{shadow-claw-storage-DLmiT4bG.js → shadow-claw-storage-D0o56Tjw.js} +1 -1
  228. package/dist/public/{shadow-claw-task-server-BoMBCsiS.js → shadow-claw-task-server-4rkroO9K.js} +1 -1
  229. package/dist/public/{shadow-claw-tasks-ChEp1j7x.js → shadow-claw-tasks-BdP7lmvu.js} +1 -1
  230. package/dist/public/{shadow-claw-terminal-BaoVbOda.js → shadow-claw-terminal-DVHX7Fsu.js} +1 -1
  231. package/dist/public/{shadow-claw-toast-e8oz7z6Z.js → shadow-claw-toast-B9Y9tSkW.js} +1 -1
  232. package/dist/public/{shadow-claw-tools-BYjUBiJz.js → shadow-claw-tools-BwwY53Lr.js} +1 -1
  233. package/dist/public/{shadow-claw-webvm-xGb13TME.js → shadow-claw-webvm-CXGdkCNM.js} +1 -1
  234. package/dist/public/{sync-web-mcp-registration-CQluj-Kz.js → sync-web-mcp-registration-DVK_IhXZ.js} +1 -1
  235. package/dist/public/{system-prompt-CTJn0tK-.js → system-prompt-BmswoQwF.js} +2 -2
  236. package/dist/public/{workbox-92eae37e.js → workbox-e4022e15.js} +1 -1
  237. package/dist/public/{zip-reader-DN7FB-Q0.js → zip-reader-JHoTbATw.js} +1 -1
  238. package/dist/server.js +5 -5
  239. package/package.json +1 -1
  240. package/dist/cli/chunk-2gZFafgY.js +0 -1
  241. package/dist/cli/chunk-BCjL0JXf.js +0 -1
  242. package/dist/cli/chunk-BNcu1oiT.js +0 -1
  243. package/dist/cli/chunk-BUNoeMKY.js +0 -36
  244. package/dist/cli/chunk-C5ypckWC.js +0 -225
  245. package/dist/cli/chunk-CFxww5Yz.js +0 -1
  246. package/dist/cli/chunk-CGIgtL6R.js +0 -1
  247. package/dist/cli/chunk-CafdvLx-.js +0 -1
  248. package/dist/cli/chunk-Dhap1VwA.js +0 -1
  249. package/dist/cli/chunk-Ds5-K-9o.js +0 -1
  250. package/dist/cli/chunk-DwvavohW.js +0 -1
  251. package/dist/cli/chunk-_a0CkUNS.js +0 -139
  252. package/dist/lib/system-prompt-bhGRLoL2.js.map +0 -1
  253. package/dist/public/compact-context-CX4H8V57.js +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"invoke-agent-SxvudiDT.js","names":[],"sources":["../../src/subsystems/providers/litert-lm-provider.ts","../../src/subsystems/providers/transformers-js-provider.ts","../../src/worker/utils/create-token-usage-message.ts","../../src/worker/utils/log.ts","../../src/worker/utils/parse-sse-stream.ts","../../src/worker/utils/rate-limit.ts","../../src/worker/stream-accumulator/stream-accumulator.ts","../../src/worker/utils/tool-state.ts","../../src/worker/utils/handle-invoke.ts","../../src/core/orchestrator/utils/dispatch-subagent-invoke.ts","../../src/core/orchestrator/utils/invoke-agent.ts"],"sourcesContent":["/**\n * LiteRT-LM Browser Provider\n *\n * Wraps the Google LiteRT-LM Web API (@litert-lm/core) to provide\n * in-browser LLM inference for Gemma 4 models via WebGPU.\n *\n * https://developers.google.com/edge/litert-lm/js\n *\n * Currently supports:\n * - litert-community/gemma-4-E2B-it-litert-lm (gemma-4-E2B-it-web.litertlm)\n * - litert-community/gemma-4-E4B-it-litert-lm (gemma-4-E4B-it-web.litertlm)\n *\n * Model IDs in config use the litert-community HuggingFace repo ID. We resolve\n * the actual .litertlm file URL from the repo's main branch.\n */\n\nimport { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\nimport { ShadowClawDatabase } from \"../../db/db.js\";\nimport { createLogMessage } from \"../../worker/utils/create-log-message.js\";\nimport { createToolActivityMessage } from \"../../worker/utils/create-tool-activity-message.js\";\nimport { executeTool } from \"../../worker/utils/execute-tool.js\";\nimport { setPostHandler } from \"../../worker/utils/post.js\";\nimport { ToolDefinition } from \"../tools/tools.js\";\n\nimport type { SubagentInvokeContext } from \"../../worker/tools/spawn-subagent/spawn-subagent.js\";\n\n/**\n * Map from provider model ID (HuggingFace repo) to the .litertlm web model URL.\n */\nconst LITERT_LM_MODEL_URLS: Record<string, string> = {\n \"litert-community/gemma-4-E2B-it-litert-lm\":\n \"https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it-web.litertlm\",\n \"litert-community/gemma-4-E4B-it-litert-lm\":\n \"https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm\",\n};\n\nexport const LITERT_LM_SUPPORTED_MODELS = Object.keys(LITERT_LM_MODEL_URLS);\n\nexport const DEFAULT_LITERT_LM_MODEL =\n \"litert-community/gemma-4-E2B-it-litert-lm\";\n\n/**\n * Returns true if the LiteRT-LM JS API is available (WebGPU required).\n */\nexport function isLiteRtLmSupported(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n \"gpu\" in navigator &&\n typeof WebAssembly !== \"undefined\" &&\n \"Suspending\" in WebAssembly\n );\n}\n\n/**\n * Lazy-loaded LiteRT-LM Engine singleton per model.\n * We keep one engine alive to avoid expensive re-initialization.\n */\nlet liteRtEngine: any | null = null;\nlet liteRtEngineModelId: string | null = null;\n\nlet liteRtEnginePromise: Promise<any> | null = null;\nlet liteRtEnginePromiseModelId: string | null = null;\n\nimport {\n DEFAULT_CHUNK_SIZE,\n type ModelProgressCallback as LiteRtProgressCallback,\n} from \"./utils/types.js\";\nimport { loadModelStream } from \"./utils/load-model-stream.js\";\n\n/**\n * Persistent Cache Storage bucket for downloaded `.litertlm` model weights.\n */\nexport const LITERT_LM_CACHE_NAME = \"shadow-claw-litertlm-models\";\nexport const LITERT_LM_CHUNK_SIZE = DEFAULT_CHUNK_SIZE;\n\nexport async function loadLiteRtModelStream(\n url: string,\n onProgress: LiteRtProgressCallback,\n abortSignal?: AbortSignal,\n): Promise<ReadableStream<Uint8Array>> {\n return loadModelStream(url, onProgress, abortSignal, {\n cacheName: LITERT_LM_CACHE_NAME,\n chunkSize: LITERT_LM_CHUNK_SIZE,\n });\n}\n\nasync function getLiteRtEngine(\n modelId: string,\n onProgress?: LiteRtProgressCallback,\n abortSignal?: AbortSignal,\n): Promise<any> {\n if (liteRtEngineModelId === modelId && liteRtEngine) {\n return liteRtEngine;\n }\n\n if (liteRtEnginePromise && liteRtEnginePromiseModelId === modelId) {\n return liteRtEnginePromise;\n }\n\n liteRtEnginePromiseModelId = modelId;\n liteRtEnginePromise = (async () => {\n if (liteRtEngine) {\n try {\n await liteRtEngine.delete?.();\n } catch {}\n\n liteRtEngine = null;\n liteRtEngineModelId = null;\n }\n\n const modelUrl = LITERT_LM_MODEL_URLS[modelId];\n if (!modelUrl) {\n throw new Error(\n `LiteRT-LM: Model '${modelId} is not supported. Supported models: ${LITERT_LM_SUPPORTED_MODELS.join(\", \")}`,\n );\n }\n\n const litertlm = await import(\"@litert-lm/core\").catch(() => {\n throw new Error(\n \"LiteRT-LM: The @litert-lm/core package is not installed. Run: npm install @litert-lm/core\",\n );\n });\n\n const Engine: any = litertlm.Engine ?? (litertlm as any).default?.Engine;\n if (typeof Engine?.create !== \"function\") {\n throw new Error(\n \"LiteRT-LM: Could not locate Engine.create in @litert-lm/core. Ensure you have the latest version installed.\",\n );\n }\n\n const modelStream = await loadLiteRtModelStream(\n modelUrl,\n onProgress ?? (() => {}),\n abortSignal,\n );\n\n const engine = await Engine.create({\n model: modelStream,\n mainExecutorSettings: {\n maxNumTokens: 8192,\n },\n });\n\n liteRtEngine = engine;\n liteRtEngineModelId = modelId;\n\n return engine;\n })();\n\n try {\n return await liteRtEnginePromise;\n } finally {\n liteRtEnginePromise = null;\n liteRtEnginePromiseModelId = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool-call output parsing (model-agnostic)\n// ---------------------------------------------------------------------------\n\n/**\n * Internal parsed tool-call / response envelope.\n */\ninterface LiteRtParsed {\n type: \"response\" | \"tool_use\";\n format?: \"json\" | \"model_specific\";\n response?: string;\n tool_calls?: Array<{\n id?: string;\n name: string;\n input?: Record<string, any>;\n }>;\n}\n\n/**\n * Try to parse Gemma 4's native tool-call syntax:\n * <|tool_call>call:TOOLNAME{...args...}<tool_call|>\n *\n * The model sometimes emits <|\"|> instead of literal quote chars, and may\n * omit the closing sentinel if generation was cut off.\n *\n * Returns a normalised { name, input } object on success, or null.\n *\n * NOTE: This is a *fallback* for models that ignore the JSON-envelope\n * instructions. The primary path is always the JSON envelope.\n */\nexport function parseModelSpecificToolCall(\n text: string,\n): { name: string; input: Record<string, any> } | null {\n if (!text) {\n return null;\n }\n\n // Match <|tool_call>call:TOOLNAME{...}<tool_call|> (closing sentinel optional)\n const match = text.match(\n /<\\|tool_call>call:([A-Za-z0-9_]+)(\\{[\\s\\S]*?)(?:<tool_call\\|>|$)/,\n );\n if (!match) {\n return null;\n }\n\n const name = match[1];\n let body = match[2];\n\n // Replace the Gemma 4 quote sentinel <|\"|> → \" so the body becomes\n // valid JSON-like text that we can parse.\n body = body.replace(/<\\|\"\\|>/g, '\"');\n\n /**\n * Gemma 4 emits JavaScript-style objects with unquoted property names,\n * e.g. {queries:[\"blueberries\"]}. This function wraps bare identifier keys\n * with double quotes so the result is valid JSON.\n */\n function normaliseToJson(src: string): string {\n // Quote any unquoted object key: an identifier followed by a colon that\n // is NOT already preceded by a double quote.\n\n return src.replace(\n /([{,]\\s*)([A-Za-z_$][A-Za-z0-9_$]*)(\\s*:)/g,\n '$1\"$2\"$3',\n );\n }\n\n // Attempt JSON.parse of the argument block, with progressive relaxation.\n let input: Record<string, any> = {};\n\n const candidates = [body, normaliseToJson(body)];\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n input = parsed;\n\n break;\n }\n } catch {\n // try next candidate\n }\n }\n\n // If still unparsed, try extracting the first complete {...} block.\n if (Object.keys(input).length === 0) {\n const start = body.indexOf(\"{\");\n const end = body.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const slice = body.slice(start, end + 1);\n for (const candidate of [slice, normaliseToJson(slice)]) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n input = parsed;\n\n break;\n }\n } catch {\n // Best-effort: leave input as {}\n }\n }\n }\n }\n\n return { name, input };\n}\n\n/**\n * Parse the model's accumulated response into a structured envelope.\n *\n * Priority:\n * 1. JSON envelope { \"type\": \"tool_use\" | \"response\", ... } (model-agnostic, primary)\n * 2. Gemma 4 native <|tool_call>call:NAME{...}<tool_call|> (fallback)\n *\n * Returns null when the output is plain text with no recognised structure.\n */\nexport function parseLiteRtStructured(raw: string): LiteRtParsed | null {\n const text = sanitizeModelOutput(String(raw || \"\"), \"litert_lm\").trim();\n if (!text) {\n return null;\n }\n\n // ── 1. Try JSON (primary, model-agnostic) ──────────────────────────────\n const tryJson = (src: string): LiteRtParsed | null => {\n try {\n const obj = JSON.parse(src);\n if (\n obj &&\n typeof obj === \"object\" &&\n (obj.type === \"tool_use\" || obj.type === \"response\")\n ) {\n // Fix common model typos\n if (obj.tools_calls && !obj.tool_calls) {\n obj.tool_calls = obj.tools_calls;\n }\n\n return { ...obj, format: \"json\" } as LiteRtParsed;\n }\n } catch {\n // fall through\n }\n\n return null;\n };\n\n let result = tryJson(text);\n if (result) {\n return result;\n }\n\n // Try extracting the first {...} block in case the model wrapped it in prose.\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n result = tryJson(text.slice(start, end + 1));\n if (result) {\n return result;\n }\n }\n\n // ── 2. Regex fallback for malformed JSON ─────────────────────────────\n // Handle cases where the model forgets closing braces or brackets\n // e.g. {\"type\": \"tool_use\", \"tools_calls\": [{ \"name\": \"web_search\", \"input\": { \"query\": \"...\" } ]}\n if (text.includes('\"tool_use\"')) {\n const nameMatch = /\"name\"\\s*:\\s*\"([^\"]+)\"/.exec(text);\n if (nameMatch) {\n let input = {};\n const inputMatch = /\"input\"\\s*:\\s*(\\{.*?\\})\\s*(?:]|\\}|\"|$)/s.exec(text);\n if (inputMatch) {\n try {\n input = JSON.parse(inputMatch[1]);\n } catch {\n // Leave input empty if it's too mangled\n }\n }\n\n return {\n type: \"tool_use\",\n format: \"json\",\n tool_calls: [\n {\n id: `litert_${Date.now()}`,\n name: nameMatch[1],\n input,\n },\n ],\n };\n }\n }\n\n // ── 2. Gemma 4 native tool-call format (fallback) ──────────────────────\n const native = parseModelSpecificToolCall(text);\n if (native) {\n return {\n type: \"tool_use\",\n format: \"model_specific\",\n tool_calls: [\n {\n id: `litert_${Date.now()}`,\n name: native.name,\n input: native.input,\n },\n ],\n };\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation building helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build the preface (system messages) and per-turn text strings that will be\n * sent to the LiteRT-LM stateful conversation API.\n *\n * When tools are active we prepend JSON-envelope instructions so that any\n * LiteRT model (not just Gemma 4) knows how to signal tool calls.\n */\nfunction buildLiteRtMessages(\n systemPrompt: string,\n messages: any[],\n tools: ToolDefinition[],\n): { preface: any[]; turns: string[] } {\n const preface: any[] = [];\n\n // Compose the effective system content: original prompt + tool instructions.\n let effectiveSystem = systemPrompt || \"\";\n\n if (tools.length > 0) {\n const toolHints = tools\n .map((t) => {\n const params = Object.keys(t.input_schema.properties || {}).join(\", \");\n const brief = t.description.split(\". \")[0];\n\n return `${t.name}(${params}): ${brief}`;\n })\n .join(\"\\n\");\n\n const jsonInstructions = [\n \"\",\n \"TOOL CALLING INSTRUCTIONS:\",\n \"Return ONLY valid JSON (no markdown fences).\",\n 'To call a tool: {\"type\":\"tool_use\",\"tool_calls\":[{\"name\":\"<tool>\",\"input\":{...}}]}',\n 'To reply: {\"type\":\"response\",\"response\":\"<your answer>\"}',\n \"IMPORTANT: When you need to use a tool, output ONLY the JSON above — do NOT describe the call as text.\",\n \"\",\n \"Available tools:\",\n toolHints,\n ].join(\"\\n\");\n\n effectiveSystem = effectiveSystem\n ? effectiveSystem + jsonInstructions\n : jsonInstructions;\n }\n\n if (effectiveSystem) {\n preface.push({ role: \"system\", content: effectiveSystem });\n }\n\n // Build prior turns. All message types (text, tool_use, tool_result) are\n // serialised to a flat string so the stateful conversation engine can replay\n // them without native tool-call support.\n const turns: string[] = [];\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const content = Array.isArray(msg.content)\n ? msg.content\n .map((b: any) => {\n if (b?.type === \"text\") {\n return b.text;\n }\n\n if (b?.type === \"tool_result\") {\n return `[TOOL_RESULT ${b.tool_use_id}] ${String(b.content || \"\")}`;\n }\n\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n : String(msg.content || \"\");\n if (content) {\n turns.push(content);\n }\n } else if (msg.role === \"assistant\") {\n // Skip — LiteRT conversation is stateful; assistant turns are generated\n // by the model itself.\n }\n }\n\n return { preface, turns };\n}\n\n/**\n * Main entry point. Invokes the LiteRT-LM browser engine and streams the\n * response back via the emit callback, following the same protocol as\n * invokeWithTransformersJs / invokeWithPromptApi.\n *\n * When `tools` is non-empty the provider enters an agentic loop:\n * 1. Append JSON-envelope tool instructions to the system prompt.\n * 2. Parse the model's full response for a tool_use or response envelope.\n * 3. If tool_use: execute the tools, append results, loop.\n * 4. If response (or plain text): emit the final text and return.\n */\nexport async function invokeWithLiteRtLm(\n db: ShadowClawDatabase,\n groupId: string,\n systemPrompt: string,\n messages: any[],\n _maxTokens: number,\n emit: (message: any) => Promise<void> | void,\n abortSignal: AbortSignal | undefined,\n modelId: string,\n tools?: ToolDefinition[],\n invokeContext?: SubagentInvokeContext,\n) {\n if (!isLiteRtLmSupported()) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: \"⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.\",\n },\n });\n\n return;\n }\n\n await emit(\n createLogMessage(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: LiteRT-LM (Browser · WebGPU) · Model: ${modelId}`,\n ),\n );\n\n // Emit model-download-progress so the UI shows a loading state\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"running\",\n progress: 0,\n message: `Loading LiteRT-LM model: ${modelId}…`,\n },\n });\n\n const formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(0);\n\n let lastEmittedPct = -1;\n\n const onProgress: LiteRtProgressCallback = (received, total, fromCache) => {\n const progress = total ? received / total : null;\n const pct = progress != null ? Math.floor(progress * 100) : -1;\n\n if (pct === lastEmittedPct && !fromCache) {\n return;\n }\n\n lastEmittedPct = pct;\n\n const message = fromCache\n ? `Loaded ${modelId} from cache (${formatMb(received)} MB )`\n : total\n ? `Downloading ${modelId}: ${formatMb(received)} / ${formatMb(total)} MB`\n : `Downloading ${modelId}: ${formatMb(received)} MB`;\n\n void emit({\n type: \"model-download-progress\",\n payload: { groupId, status: \"running\", progress, message },\n });\n };\n\n let engine: any;\n\n try {\n engine = await getLiteRtEngine(modelId, onProgress, abortSignal);\n } catch (err: any) {\n if (abortSignal?.aborted || err?.name === \"AbortError\") {\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"error\",\n progress: null,\n message: \"LiteRT-LM model download cancelled.\",\n },\n });\n\n return;\n }\n\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"error\",\n progress: null,\n message: `LiteRT-LM model failed to load: ${err?.message ?? String(err)}`,\n },\n });\n\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM failed to initialize: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"done\",\n progress: 1,\n message: \"LiteRT-LM model ready.\",\n },\n });\n\n const activeTools = tools ?? [];\n\n const { preface, turns } = buildLiteRtMessages(\n systemPrompt,\n messages,\n activeTools,\n );\n\n let conversation: any;\n try {\n conversation = await engine.createConversation({\n preface: { messages: preface },\n });\n } catch (err: any) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM failed to create conversation: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n // Replay prior turns (if any) — LiteRT-LM conversation is stateful.\n // All turns except the final user turn are sent non-streaming.\n const priorTurns = turns.slice(0, -1);\n const lastTurn = turns[turns.length - 1] ?? \"Hello.\";\n\n for (const turn of priorTurns) {\n if (abortSignal?.aborted) {\n return;\n }\n\n try {\n await conversation.sendMessage(turn);\n } catch {\n // If replaying history fails, continue to latest turn anyway\n }\n }\n\n if (abortSignal?.aborted) {\n return;\n }\n\n // ── Agentic tool-calling loop ─────────────────────────────────────────────\n // We maintain a mutable list of messages that grows as tool results arrive,\n // and re-send the current user query on each iteration (with tool results\n // appended) until the model emits a plain response or we hit the limit.\n const MAX_ITERATIONS = 10;\n let currentTurn = lastTurn;\n\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n if (abortSignal?.aborted) {\n return;\n }\n\n await emit({ type: \"streaming-start\", payload: { groupId } });\n\n let accumulated = \"\";\n try {\n const stream = conversation.sendMessageStreaming(currentTurn);\n for await (const chunk of stream) {\n if (abortSignal?.aborted) {\n break;\n }\n\n const text = chunk?.content?.[0]?.text ?? \"\";\n if (text) {\n const cleaned = sanitizeModelOutput(text, \"litert_lm\");\n if (cleaned) {\n accumulated += cleaned;\n // Stream chunks to the UI so the user sees partial output\n await emit({\n type: \"streaming-chunk\",\n payload: { groupId, text: cleaned },\n });\n }\n }\n }\n } catch (err: any) {\n if (abortSignal?.aborted) {\n return;\n }\n\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM generation error: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n // ── Parse the accumulated output ───────────────────────────────────────\n const parsed =\n activeTools.length > 0 ? parseLiteRtStructured(accumulated) : null;\n\n if (parsed?.type === \"tool_use\") {\n // Tool call detected — hide the raw JSON from the user.\n await emit({ type: \"streaming-end\", payload: { groupId } });\n\n const calls = Array.isArray(parsed.tool_calls) ? parsed.tool_calls : [];\n if (calls.length === 0) {\n // Malformed tool_use with no calls — treat as final response.\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text: \"(no response)\" },\n });\n await emit({\n type: \"response\",\n payload: { groupId, text: \"(no response)\" },\n });\n\n return;\n }\n\n // Execute each tool and collect results.\n const resultLines: string[] = [];\n const isNative = parsed.format === \"model_specific\";\n\n for (const call of calls) {\n await emit(createToolActivityMessage(groupId, call.name, \"running\"));\n // LiteRT-LM runs on the main thread (emit === handleWorkerMessage).\n // Route builtin-AI cross-thread requests (e.g. summarize_text's\n // \"request-native-ai-task\") back through emit so the main-thread\n // handler rseolves them; otherwise post() fails through to\n // self.postMessage and the tool promise hangs forever. Matches the\n // transformers-js / prompt-api providers.\n setPostHandler((msg) => {\n void emit(msg);\n });\n\n let output: any;\n try {\n output = await executeTool(db, call.name, call.input || {}, groupId, {\n allowedTools: activeTools,\n invokeContext,\n });\n } catch (err: any) {\n output = `Error: ${err?.message ?? String(err)}`;\n } finally {\n setPostHandler(null);\n }\n\n await emit(createToolActivityMessage(groupId, call.name, \"done\"));\n\n const resultText =\n typeof output === \"string\" ? output : JSON.stringify(output);\n\n if (isNative) {\n resultLines.push(`<|tool_response>${resultText}<|tool_response|>`);\n } else {\n resultLines.push(\n `[TOOL_RESULT ${call.id ?? call.name}] ${resultText}`,\n );\n }\n }\n\n // Feed results back to the model as the next turn.\n if (isNative) {\n currentTurn = resultLines.join(\"\\n\");\n } else {\n const lastUserContent = turns[turns.length - 1] ?? \"\";\n currentTurn = [\n ...resultLines,\n \"\",\n \"Based on the above tool results, please respond to the original request.\",\n lastUserContent ? `Original request: \"${lastUserContent}\"` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n continue; // next iteration\n }\n\n // ── Plain text or JSON response envelope ─────────────────────────────\n let finalText: string;\n if (parsed?.type === \"response\" && parsed.response) {\n finalText = sanitizeModelOutput(parsed.response, \"litert_lm\");\n } else {\n // No recognised structure — treat accumulated text as the answer.\n finalText = sanitizeModelOutput(accumulated, \"litert_lm\");\n }\n\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text: finalText },\n });\n\n await emit({\n type: \"response\",\n payload: { groupId, text: finalText },\n });\n\n return;\n }\n\n // Exhausted iterations without a plain-text response.\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: \"⚠️ LiteRT-LM reached the maximum number of tool-calling iterations without producing a final response.\",\n },\n });\n}\n","import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\nimport { ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { createModuleWorker } from \"../../utils/runtime-assets.js\";\nimport { createLogMessage } from \"../../worker/utils/create-log-message.js\";\nimport { createToolActivityMessage } from \"../../worker/utils/create-tool-activity-message.js\";\nimport { executeTool } from \"../../worker/utils/execute-tool.js\";\nimport { setPostHandler } from \"../../worker/utils/post.js\";\nimport { ToolDefinition } from \"../tools/tools.js\";\n\nimport type { SubagentInvokeContext } from \"../../worker/tools/spawn-subagent/spawn-subagent.js\";\n\nclass TransformersJsManager {\n private chunkCallbacks = new Map<string, (payload: any) => void>();\n private loadRejects = new Map<string, (reason: any) => void>();\n private loadResolves = new Map<string, () => void>();\n private pendingRejects = new Map<string, (reason: any) => void>();\n private pendingResolves = new Map<string, (value: any) => void>();\n private progressCallbacks = new Map<string, (payload: any) => void>();\n private thinkingCallbacks = new Map<string, (text: string) => void>();\n private worker: Worker | null = null;\n\n async generate(\n messages: any[],\n maxTokens: number,\n groupId: string,\n onChunk: (text: string) => void,\n onThinking?: (text: string) => void,\n tools?: any[],\n ): Promise<string> {\n const worker = this.getWorker();\n\n return new Promise((resolve, reject) => {\n this.pendingResolves.set(groupId, resolve);\n this.pendingRejects.set(groupId, reject);\n this.chunkCallbacks.set(groupId, (payload) => onChunk(payload.text));\n if (onThinking) {\n this.thinkingCallbacks.set(groupId, onThinking);\n }\n\n worker.postMessage({\n type: \"generate\",\n payload: { messages, maxTokens, groupId, tools },\n });\n });\n }\n\n async load(\n modelId: string,\n device: string,\n dtypeStrategy: string,\n groupId: string,\n onProgress: (payload: any) => void,\n ): Promise<void> {\n const worker = this.getWorker();\n\n return new Promise((resolve, reject) => {\n this.loadResolves.set(groupId, resolve);\n this.loadRejects.set(groupId, reject);\n this.progressCallbacks.set(groupId, onProgress);\n worker.postMessage({\n type: \"load\",\n payload: { modelId, device, dtypeStrategy, groupId },\n });\n });\n }\n\n private cleanup(groupId: string) {\n this.pendingResolves.delete(groupId);\n this.pendingRejects.delete(groupId);\n this.progressCallbacks.delete(groupId);\n this.chunkCallbacks.delete(groupId);\n this.thinkingCallbacks.delete(groupId);\n }\n\n private getWorker() {\n if (!this.worker) {\n this.worker = createModuleWorker(\n new URL(\"./transformers-js.worker.js\", import.meta.url).href,\n );\n this.worker.onmessage = (event) => {\n const { type, payload } = event.data;\n const groupId = payload?.groupId;\n\n switch (type) {\n case \"progress\":\n this.progressCallbacks.get(groupId)?.(payload);\n if (payload.status === \"done\") {\n this.loadResolves.get(groupId)?.();\n this.loadResolves.delete(groupId);\n this.loadRejects.delete(groupId);\n }\n\n break;\n case \"chunk\":\n this.chunkCallbacks.get(groupId)?.(payload);\n\n break;\n case \"thinking-chunk\":\n this.thinkingCallbacks.get(groupId)?.(payload.text);\n\n break;\n case \"done\":\n this.pendingResolves.get(groupId)?.(payload.text);\n this.cleanup(groupId);\n\n break;\n case \"error\":\n this.pendingRejects.get(groupId)?.(payload.error);\n this.loadRejects.get(groupId)?.(payload.error);\n this.cleanup(groupId);\n this.loadResolves.delete(groupId);\n this.loadRejects.delete(groupId);\n\n break;\n }\n };\n }\n\n return this.worker;\n }\n}\n\nconst manager = new TransformersJsManager();\n\nfunction formatMessageContent(msg: any): string {\n if (typeof msg?.content === \"string\") {\n return msg.content;\n }\n\n if (Array.isArray(msg?.content)) {\n return msg.content\n .map((block: any) => {\n if (block?.type === \"text\") {\n return block.text || \"\";\n }\n if (block?.type === \"tool_use\") {\n return `[TOOL_CALL ${block.name}] ${JSON.stringify(block.input || {})}`;\n }\n if (block?.type === \"tool_result\") {\n return `[TOOL_RESULT ${block.tool_use_id}] ${String(block.content || \"\")}`;\n }\n if (block?.type === \"attachment\") {\n return `[ATTACHMENT ${block.mediaType}] ${block.fileName} (${block.mimeType})`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n return \"\";\n}\n\nfunction parseStructured(raw: string) {\n const text = sanitizeModelOutput(String(raw || \"\"), \"transformers_js\").trim();\n if (!text) {\n return null;\n }\n\n // Check for Qwen/Llama XML-like tool calls: <tool_call>{\"name\": \"...\", \"arguments\": ...}</tool_call>\n const toolCallMatch = text.match(/<tool_call>([\\s\\S]*?)<\\/tool_call>/);\n if (toolCallMatch) {\n try {\n const parsedTool = JSON.parse(toolCallMatch[1]);\n if (parsedTool.name) {\n return {\n type: \"tool_use\",\n tool_calls: [\n {\n name: parsedTool.name,\n input: parsedTool.arguments || parsedTool.parameters || {},\n },\n ],\n };\n }\n } catch {\n // fallback to other parsing if invalid JSON\n }\n }\n\n try {\n return JSON.parse(text);\n } catch {\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n try {\n return JSON.parse(text.slice(start, end + 1));\n } catch {\n return null;\n }\n }\n\n return null;\n }\n}\n\nexport async function invokeWithTransformersJs(\n db: ShadowClawDatabase,\n groupId: string,\n systemPrompt: string,\n messages: any[],\n maxTokens: number,\n emit: (message: any) => Promise<void> | void,\n _abortSignal: AbortSignal | undefined,\n tools: ToolDefinition[] | undefined,\n modelId: string,\n invokeContext?: SubagentInvokeContext,\n) {\n const activeTools = tools || [];\n const backend =\n (await getConfig(db, CONFIG_KEYS.TRANSFORMERS_JS_BACKEND)) || \"auto\";\n const dtypeStrategy =\n (await getConfig(db, CONFIG_KEYS.TRANSFORMERS_JS_DTYPE_STRATEGY)) || \"auto\";\n\n await emit(\n createLogMessage(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: Transformers.js (Local Worker) · Model: ${modelId} · Backend: ${backend} · Dtype: ${dtypeStrategy}`,\n ),\n );\n\n await manager.load(modelId, backend, dtypeStrategy, groupId, (payload) => {\n void emit({ type: \"model-download-progress\", payload });\n });\n\n let currentMessages = [...messages];\n\n for (let i = 0; i < 10; i++) {\n const systemMessage = {\n role: \"system\",\n content: systemPrompt,\n };\n\n const structuredMessages = [\n systemMessage,\n ...currentMessages.map((m) => ({\n role: m.role === \"assistant\" ? \"assistant\" : \"user\",\n content: formatMessageContent(m),\n })),\n ];\n\n await emit({ type: \"streaming-start\", payload: { groupId } });\n\n let thinkingBuffer = \"\";\n let accumulated = \"\";\n const response = await manager.generate(\n structuredMessages,\n maxTokens,\n groupId,\n (chunk) => {\n accumulated += chunk;\n void emit({\n type: \"streaming-chunk\",\n payload: { groupId, text: chunk },\n });\n },\n (thinkingChunk) => {\n thinkingBuffer += thinkingChunk;\n void emit(\n createLogMessage(groupId, \"text\", \"Thinking\", thinkingBuffer),\n );\n },\n activeTools,\n );\n\n await emit({ type: \"typing\", payload: { groupId } });\n\n const parsed = parseStructured(response);\n\n if (parsed?.type === \"tool_use\") {\n await emit({ type: \"streaming-end\", payload: { groupId } });\n } else {\n const text = parsed?.response\n ? sanitizeModelOutput(parsed.response, \"transformers_js\")\n : sanitizeModelOutput(response, \"transformers_js\");\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text },\n });\n }\n\n if (!parsed || parsed.type === \"response\") {\n const text = parsed?.response\n ? sanitizeModelOutput(parsed.response, \"transformers_js\")\n : sanitizeModelOutput(response, \"transformers_js\");\n await emit({ type: \"response\", payload: { groupId, text } });\n\n return;\n }\n\n const calls = Array.isArray(parsed.tool_calls) ? parsed.tool_calls : [];\n if (calls.length === 0) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: sanitizeModelOutput(\n parsed.response || response,\n \"transformers_js\",\n ),\n },\n });\n\n return;\n }\n\n const toolResults: any[] = [];\n for (const call of calls) {\n await emit(createToolActivityMessage(groupId, call.name, \"running\"));\n setPostHandler((msg) => {\n emit(msg);\n });\n let output: any;\n try {\n output = await executeTool(db, call.name, call.input || {}, groupId, {\n allowedTools: activeTools,\n invokeContext,\n });\n } finally {\n setPostHandler(null);\n }\n\n await emit(createToolActivityMessage(groupId, call.name, \"done\"));\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: call.id || `call_${Date.now()}`,\n content: typeof output === \"string\" ? output : JSON.stringify(output),\n });\n }\n\n currentMessages.push({\n role: \"assistant\",\n content: [\n ...(parsed.response ? [{ type: \"text\", text: parsed.response }] : []),\n ...calls.map((c) => ({\n type: \"tool_use\",\n id: c.id || `call_${Date.now()}_${Math.random()}`,\n name: c.name,\n input: c.input || {},\n })),\n ] as any,\n });\n\n currentMessages.push({ role: \"user\", content: toolResults as any });\n }\n}\n","/**\n * Create a token-usage message object\n */\nexport function createTokenUsageMessage(\n groupId: string,\n usage: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n },\n contextLimit: number,\n): any {\n const inputTokens = usage.input_tokens || 0;\n const outputTokens = usage.output_tokens || 0;\n const cacheReadTokens = usage.cache_read_input_tokens || 0;\n const cacheCreationTokens = usage.cache_creation_input_tokens || 0;\n\n return {\n type: \"token-usage\",\n payload: {\n groupId,\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheCreationTokens,\n totalTokens:\n inputTokens + outputTokens + cacheReadTokens + cacheCreationTokens,\n contextLimit,\n },\n };\n}\n","import { createLogMessage } from \"./create-log-message.js\";\nimport { post } from \"./post.js\";\n\n/**\n * Log a message\n */\nexport function log(\n groupId: string,\n level:\n | \"info\"\n | \"api-call\"\n | \"tool\"\n | \"error\"\n | \"warning\"\n | \"tool-call\"\n | \"tool-result\"\n | \"text\",\n label: string,\n message?: string,\n): void {\n post(createLogMessage(groupId, level as any, label, message));\n}\n","/**\n * Parse a Server-Sent Events (SSE) stream from a ReadableStream.\n *\n * Yields parsed JSON data objects from `data:` lines, skipping `[DONE]`\n * sentinel and comment lines.\n */\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<any> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // SSE events are separated by double newlines\n const parts = buffer.split(\"\\n\\n\");\n\n // Keep the last incomplete part in the buffer\n buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n\n for (const line of lines) {\n // Skip empty lines and comments\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n\n // Skip the [DONE] sentinel\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n yield JSON.parse(data);\n } catch {\n // Skip malformed JSON lines\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import { post } from \"./post.js\";\n\nconst ONE_MINUTE_MS = 60_000;\n\nexport interface RateLimitConfig {\n callsPerMinute: number;\n autoAdapt: boolean;\n}\n\ninterface ProviderRateLimitState {\n recentCalls: number[];\n nextAllowedAt: number;\n remoteLimit: number | null;\n remoteRemaining: number | null;\n remoteResetAt: number | null;\n}\n\nconst stateByProvider = new Map<string, ProviderRateLimitState>();\n\nfunction getState(providerId: string): ProviderRateLimitState {\n const existing = stateByProvider.get(providerId);\n if (existing) {\n return existing;\n }\n\n const created: ProviderRateLimitState = {\n recentCalls: [],\n nextAllowedAt: 0,\n remoteLimit: null,\n remoteRemaining: null,\n remoteResetAt: null,\n };\n\n stateByProvider.set(providerId, created);\n\n return created;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction parseHeaderNumber(raw: string | null): number | null {\n if (!raw) {\n return null;\n }\n\n const value = Number(raw.trim());\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return value;\n}\n\nfunction parseRetryAfterMs(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const trimmed = retryAfter.trim();\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) {\n if (numeric <= 0) {\n return null;\n }\n\n return Math.round(numeric * 1000);\n }\n\n const dateMs = Date.parse(trimmed);\n if (!Number.isFinite(dateMs)) {\n return null;\n }\n\n const delta = dateMs - nowMs();\n\n return delta > 0 ? delta : null;\n}\n\nfunction parseResetAtMs(resetHeader: string | null): number | null {\n const numeric = parseHeaderNumber(resetHeader);\n if (numeric === null || numeric <= 0) {\n return null;\n }\n\n // 13-digit epoch milliseconds\n if (numeric >= 1_000_000_000_000) {\n return Math.round(numeric);\n }\n\n // 10-digit epoch seconds\n if (numeric >= 1_000_000_000) {\n return Math.round(numeric * 1000);\n }\n\n // Otherwise treat as delta seconds from now.\n\n return nowMs() + Math.round(numeric * 1000);\n}\n\nasync function waitWithAbort(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n signal?.removeEventListener(\"abort\", onAbort);\n };\n\n if (signal?.aborted) {\n onAbort();\n\n return;\n }\n\n signal?.addEventListener(\"abort\", onAbort);\n });\n}\n\nfunction computeManualWaitMs(\n state: ProviderRateLimitState,\n callsPerMinute: number,\n): number {\n if (!Number.isFinite(callsPerMinute) || callsPerMinute <= 0) {\n return 0;\n }\n\n const now = nowMs();\n state.recentCalls = state.recentCalls.filter(\n (ts) => now - ts < ONE_MINUTE_MS,\n );\n\n if (state.recentCalls.length < callsPerMinute) {\n return 0;\n }\n\n const oldest = state.recentCalls[0] || now;\n\n return Math.max(0, ONE_MINUTE_MS - (now - oldest));\n}\n\nfunction computeAutoWaitMs(state: ProviderRateLimitState): number {\n const now = nowMs();\n let waitMs = 0;\n\n if (state.nextAllowedAt > now) {\n waitMs = Math.max(waitMs, state.nextAllowedAt - now);\n }\n\n if (\n state.remoteRemaining !== null &&\n state.remoteRemaining <= 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n waitMs = Math.max(waitMs, state.remoteResetAt - now);\n }\n\n return waitMs;\n}\n\nexport async function waitForRateLimitSlot(\n providerId: string,\n groupId: string,\n config: RateLimitConfig,\n signal?: AbortSignal,\n): Promise<void> {\n const state = getState(providerId);\n\n while (true) {\n const manualWait = computeManualWaitMs(state, config.callsPerMinute);\n const autoWait = config.autoAdapt ? computeAutoWaitMs(state) : 0;\n const waitMs = Math.max(manualWait, autoWait);\n\n if (waitMs <= 0) {\n const now = nowMs();\n if (config.callsPerMinute > 0) {\n state.recentCalls.push(now);\n }\n\n if (\n config.autoAdapt &&\n state.remoteRemaining !== null &&\n state.remoteRemaining > 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n const msLeft = state.remoteResetAt - now;\n const slotsLeft = Math.max(1, state.remoteRemaining);\n const interval = Math.ceil(msLeft / slotsLeft);\n state.nextAllowedAt = Math.max(state.nextAllowedAt, now + interval);\n }\n\n return;\n }\n\n if (waitMs >= 1000) {\n post({\n type: \"thinking-log\",\n payload: {\n groupId,\n level: \"info\",\n label: \"Rate limiter\",\n message: `Waiting ${Math.ceil(waitMs / 1000)}s before next provider call to avoid 429s.`,\n timestamp: Date.now(),\n },\n });\n }\n\n await waitWithAbort(waitMs, signal);\n }\n}\n\ntype HeaderReader = {\n get(name: string): string | null;\n};\n\nexport function updateRateLimitFromHeaders(\n providerId: string,\n headers: HeaderReader | null | undefined,\n config: RateLimitConfig,\n): void {\n if (!config.autoAdapt) {\n return;\n }\n\n if (!headers || typeof headers.get !== \"function\") {\n return;\n }\n\n const state = getState(providerId);\n const now = nowMs();\n\n const limit = parseHeaderNumber(headers.get(\"x-ratelimit-limit\"));\n const remaining = parseHeaderNumber(headers.get(\"x-ratelimit-remaining\"));\n const resetAt = parseResetAtMs(headers.get(\"x-ratelimit-reset\"));\n\n if (limit !== null) {\n state.remoteLimit = Math.max(0, Math.floor(limit));\n }\n\n if (remaining !== null) {\n state.remoteRemaining = Math.max(0, Math.floor(remaining));\n }\n\n if (resetAt !== null) {\n state.remoteResetAt = resetAt;\n }\n\n const retryAfterMs = parseRetryAfterMs(headers.get(\"retry-after\"));\n if (retryAfterMs !== null) {\n state.nextAllowedAt = Math.max(state.nextAllowedAt, now + retryAfterMs);\n }\n\n if (\n state.remoteRemaining !== null &&\n state.remoteRemaining <= 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n state.nextAllowedAt = Math.max(state.nextAllowedAt, state.remoteResetAt);\n }\n}\n","import { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\n\nimport type {\n ContentBlockAccumulator,\n StreamCallbacks,\n StreamFormat,\n} from \"./types.js\";\n\n/**\n * Accumulates streamed SSE chunks into a unified response object.\n *\n * Supports both OpenAI-format (choices[].delta) and Anthropic-format\n * (content_block_start / content_block_delta / message_delta) SSE streams.\n *\n * Emits callbacks for incremental text and tool-call progress.\n */\nexport class StreamAccumulator {\n callbacks: StreamCallbacks;\n contentBlocks: ContentBlockAccumulator[] = [];\n format: StreamFormat;\n stopReason: string = \"end_turn\";\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n } = {\n input_tokens: 0,\n output_tokens: 0,\n };\n\n #anthropicBlocks = new Map<number, ContentBlockAccumulator>();\n\n #openaiReasoningText: string = \"\";\n #openaiText: string = \"\";\n #openaiToolCalls = new Map<\n number,\n { id: string; name: string; args: string }\n >();\n\n constructor(format: StreamFormat, callbacks: StreamCallbacks = {}) {\n this.format = format;\n this.callbacks = callbacks;\n }\n\n /**\n * Build the final normalized response (same shape as parseResponse).\n */\n finalize(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n if (this.format === \"openai\" || this.format === \"mesh-llm\") {\n return this.#finalizeOpenAI();\n }\n\n return this.#finalizeAnthropic();\n }\n\n /**\n * Feed a single parsed SSE chunk into the accumulator.\n */\n push(chunk: any): void {\n if (this.format === \"openai\" || this.format === \"mesh-llm\") {\n this.#pushOpenAI(chunk);\n } else {\n this.#pushAnthropic(chunk);\n }\n }\n\n #finalizeAnthropic(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n const content: any[] = [];\n\n for (const [, block] of [...this.#anthropicBlocks.entries()].sort(\n (a, b) => a[0] - b[0],\n )) {\n if (block.type === \"text\") {\n const cleaned = this.#sanitize(block.text || \"\");\n if (cleaned) {\n content.push({ type: \"text\", text: cleaned });\n }\n } else if (block.type === \"tool_use\") {\n let input;\n try {\n input = block.partialJson ? JSON.parse(block.partialJson) : {};\n } catch {\n input = {};\n }\n\n content.push({\n type: \"tool_use\",\n id: block.id || `call_${Date.now()}_${Math.random()}`,\n name: block.name,\n input,\n });\n } else if (block.type === \"thinking\") {\n if (typeof block.text === \"string\" && block.text.length > 0) {\n content.push({\n type: \"thinking\",\n thinking: block.text,\n ...(typeof block.id === \"string\" ? { signature: block.id } : {}),\n });\n }\n } else if (block.type === \"redacted_thinking\") {\n if (typeof block.text === \"string\" && block.text.length > 0) {\n content.push({\n type: \"redacted_thinking\",\n data: block.text,\n });\n }\n }\n }\n\n return {\n content,\n stop_reason: this.stopReason,\n usage: { ...this.usage },\n };\n }\n\n #finalizeOpenAI(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n const content: any[] = [];\n\n if (this.#openaiText) {\n const cleaned = this.#sanitize(this.#openaiText);\n if (cleaned) {\n content.push({ type: \"text\", text: cleaned });\n }\n }\n\n if (this.#openaiReasoningText) {\n content.unshift({\n type: \"thinking\",\n thinking: this.#openaiReasoningText,\n });\n }\n\n if (this.#openaiToolCalls.size > 0) {\n this.stopReason = \"tool_use\";\n\n for (const [, tc] of [...this.#openaiToolCalls.entries()].sort(\n (a, b) => a[0] - b[0],\n )) {\n let input;\n try {\n input = tc.args ? JSON.parse(tc.args) : {};\n } catch {\n input = {};\n }\n\n content.push({\n type: \"tool_use\",\n id: tc.id || `call_${Date.now()}_${Math.random()}`,\n name: tc.name,\n input,\n });\n }\n }\n\n return {\n content,\n stop_reason: this.stopReason,\n usage: { ...this.usage },\n };\n }\n\n #pushAnthropic(chunk: any): void {\n switch (chunk.type) {\n case \"message_start\": {\n if (chunk.message?.usage) {\n this.usage.input_tokens = chunk.message.usage.input_tokens || 0;\n this.usage.cache_read_input_tokens =\n chunk.message.usage.cache_read_input_tokens || 0;\n this.usage.cache_creation_input_tokens =\n chunk.message.usage.cache_creation_input_tokens || 0;\n }\n\n break;\n }\n\n case \"content_block_start\": {\n const idx = chunk.index ?? this.#anthropicBlocks.size;\n const block = chunk.content_block || {};\n\n this.#anthropicBlocks.set(idx, {\n type: block.type || \"text\",\n id: block.type === \"thinking\" ? block.signature : block.id,\n name: block.name,\n text: block.text || block.thinking || block.data || \"\",\n partialJson: block.type === \"tool_use\" ? \"\" : undefined,\n });\n\n if (block.type === \"tool_use\" && block.name) {\n this.callbacks.onToolStart?.(block.name);\n }\n\n break;\n }\n\n case \"content_block_delta\": {\n const idx = chunk.index ?? 0;\n let block = this.#anthropicBlocks.get(idx);\n if (!block) {\n const inferredType =\n chunk.delta?.type === \"input_json_delta\" ? \"tool_use\" : \"text\";\n\n block = {\n type: inferredType,\n text: inferredType === \"text\" ? \"\" : undefined,\n partialJson: inferredType === \"tool_use\" ? \"\" : undefined,\n };\n\n this.#anthropicBlocks.set(idx, block);\n }\n\n const delta = chunk.delta;\n if (!delta) {\n break;\n }\n\n if (delta.type === \"text_delta\" && typeof delta.text === \"string\") {\n const cleaned = this.#sanitize(delta.text);\n if (!cleaned) {\n break;\n }\n\n block.text = (block.text || \"\") + cleaned;\n this.callbacks.onText?.(cleaned);\n }\n\n if (\n delta.type === \"thinking_delta\" &&\n typeof delta.thinking === \"string\"\n ) {\n block.type = \"thinking\";\n block.text = (block.text || \"\") + delta.thinking;\n this.callbacks.onThinking?.(delta.thinking);\n }\n\n if (\n delta.type === \"signature_delta\" &&\n typeof delta.signature === \"string\"\n ) {\n block.type = \"thinking\";\n block.id = delta.signature;\n }\n\n if (\n delta.type === \"redacted_thinking_delta\" &&\n typeof delta.data === \"string\"\n ) {\n block.type = \"redacted_thinking\";\n block.text = (block.text || \"\") + delta.data;\n }\n\n if (\n delta.type === \"input_json_delta\" &&\n typeof delta.partial_json === \"string\"\n ) {\n block.partialJson = (block.partialJson || \"\") + delta.partial_json;\n }\n\n break;\n }\n\n case \"content_block_stop\":\n // No action needed; block is already accumulated\n\n break;\n\n case \"message_delta\": {\n if (chunk.delta?.stop_reason) {\n this.stopReason = chunk.delta.stop_reason;\n }\n\n if (chunk.usage) {\n this.usage.output_tokens = chunk.usage.output_tokens || 0;\n this.callbacks.onUsage?.(this.usage);\n }\n\n break;\n }\n\n case \"message_stop\":\n break;\n\n default:\n // Ignore ping, error events, etc.\n\n break;\n }\n }\n\n #pushOpenAI(chunk: any): void {\n // Handle usage in the final chunk (OpenAI includes it when stream_options.include_usage is set,\n // or in the last chunk for some providers)\n if (chunk.usage) {\n this.usage.input_tokens = chunk.usage.prompt_tokens || 0;\n this.usage.output_tokens = chunk.usage.completion_tokens || 0;\n this.usage.cache_read_input_tokens =\n chunk.usage.prompt_tokens_details?.cached_tokens || 0;\n this.callbacks.onUsage?.(this.usage);\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n const delta = choice.delta;\n if (!delta) {\n return;\n }\n\n // Accumulate text content\n if (typeof delta.content === \"string\") {\n const cleaned = this.#sanitize(delta.content);\n if (cleaned) {\n this.#openaiText += cleaned;\n this.callbacks.onText?.(cleaned);\n }\n }\n\n // Accumulate reasoning content from OpenAI-compatible providers that expose\n // thought tokens separately from user-visible assistant text.\n if (typeof delta.reasoning === \"string\") {\n this.#openaiReasoningText += delta.reasoning;\n this.callbacks.onThinking?.(delta.reasoning);\n } else if (delta.reasoning && typeof delta.reasoning === \"object\") {\n const reasoningObj: any = delta.reasoning;\n if (typeof reasoningObj.content === \"string\") {\n this.#openaiReasoningText += reasoningObj.content;\n this.callbacks.onThinking?.(reasoningObj.content);\n } else if (typeof reasoningObj.text === \"string\") {\n this.#openaiReasoningText += reasoningObj.text;\n this.callbacks.onThinking?.(reasoningObj.text);\n }\n }\n\n // Accumulate tool calls\n if (Array.isArray(delta.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n\n if (!this.#openaiToolCalls.has(idx)) {\n this.#openaiToolCalls.set(idx, {\n id: tc.id || \"\",\n name: tc.function?.name || \"\",\n args: \"\",\n });\n\n if (tc.function?.name) {\n this.callbacks.onToolStart?.(tc.function.name);\n }\n }\n\n const existing = this.#openaiToolCalls.get(idx);\n if (!existing) {\n continue;\n }\n\n if (tc.id) {\n existing.id = tc.id;\n }\n\n if (tc.function?.name) {\n existing.name = tc.function.name;\n }\n\n if (tc.function?.arguments) {\n existing.args += tc.function.arguments;\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n if (choice.finish_reason === \"tool_calls\") {\n this.stopReason = \"tool_use\";\n } else if (choice.finish_reason === \"stop\") {\n this.stopReason = \"end_turn\";\n } else {\n this.stopReason = choice.finish_reason;\n }\n }\n }\n\n #sanitize(text: string): string {\n return sanitizeModelOutput(text, this.callbacks.source ?? this.format);\n }\n}\n","import { ToolDefinition } from \"../../subsystems/tools/types.js\";\n\ninterface ToolState {\n enabledTools: ToolDefinition[];\n systemPromptOverride: string;\n}\n\n/**\n * Worker-side tool state cache per groupId.\n * This allows the worker to reflect tool management changes in the middle\n * of an agent invocation loop.\n */\nconst toolStateMap = new Map<string, ToolState>();\n\nexport function setToolState(\n groupId: string,\n enabledTools: ToolDefinition[],\n systemPromptOverride: string,\n) {\n toolStateMap.set(groupId, { enabledTools, systemPromptOverride });\n}\n\nexport function getToolState(groupId: string): ToolState | undefined {\n return toolStateMap.get(groupId);\n}\n\nexport function clearToolState(groupId: string) {\n toolStateMap.delete(groupId);\n}\n","import {\n DEFAULT_MAX_ITERATIONS,\n getProvider,\n ProviderConfig,\n} from \"../../config/config.js\";\nimport { isHeadlessMode, filterHeadlessTools } from \"../../config/headless.js\";\n\nimport { buildDynamicContext } from \"../../context/build-dynamic-context.js\";\nimport { estimateTokens } from \"../../context/estimate-tokens.js\";\n\nimport {\n buildHeaders,\n formatRequest,\n getContextLimit,\n normalizeMeshLlmResult,\n parseResponse,\n} from \"../../subsystems/providers/providers.js\";\n\nimport { setStorageRoot } from \"../../storage/storage.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { createTokenUsageMessage } from \"./create-token-usage-message.js\";\nimport { createToolActivityMessage } from \"./create-tool-activity-message.js\";\nimport { executeTool } from \"./execute-tool.js\";\nimport { log } from \"./log.js\";\nimport { parseSSEStream } from \"./parse-sse-stream.js\";\n\nimport {\n post,\n registerSubagentCollector,\n unregisterSubagentCollector,\n} from \"./post.js\";\n\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport {\n RateLimitConfig,\n updateRateLimitFromHeaders,\n waitForRateLimitSlot,\n} from \"./rate-limit.js\";\n\nimport { ContentBlock, ToolResultContentBlock } from \"../../content/types.js\";\nimport { dispatchSubagentInvoke } from \"../../core/orchestrator/utils/dispatch-subagent-invoke.js\";\nimport { InvokePayload } from \"../../subsystems/worker/types.js\";\nimport { StreamAccumulator } from \"../stream-accumulator/stream-accumulator.js\";\nimport { StreamFormat } from \"../stream-accumulator/types.js\";\n\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { clearToolState, getToolState } from \"./tool-state.js\";\nimport { isRetryableHttpError, withRetry } from \"../../utils/retry.js\";\n\nimport type { SubagentInvokeContext, ToolResult } from \"./execute-tool.js\";\n\n/**\n * Throttle interval (ms) for streaming text chunks sent to the UI.\n * Keeps the main thread responsive during fast token delivery.\n */\nconst STREAM_THROTTLE_MS = 50;\n\ntype ParsedToolCodeBlock = {\n toolBlocks: Array<{\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, any>;\n }>;\n residualText: string;\n};\n\nfunction parseToolCodeBlock(\n text: string,\n allowedToolNames: Set<string>,\n): ParsedToolCodeBlock {\n const trimmed = text.trim();\n const wrappedMatch = trimmed.match(\n /^\\[tool_code\\]([\\s\\S]*?)\\[\\/tool_code\\]$/i,\n );\n if (!wrappedMatch?.[1]) {\n return { toolBlocks: [], residualText: text };\n }\n\n const body = wrappedMatch[1].trim();\n\n const printMatch = body.match(\n /^print\\s*\\(\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(\\s*(.*?)\\s*\\)\\s*\\)$/s,\n );\n\n const directMatch = body.match(\n /^([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(\\s*(.*?)\\s*\\)$/s,\n );\n\n const match = printMatch || directMatch;\n if (!match?.[1]) {\n return { toolBlocks: [], residualText: text };\n }\n\n const toolName = match[1];\n if (!allowedToolNames.has(toolName)) {\n return { toolBlocks: [], residualText: text };\n }\n\n const rawArgs = (match[2] || \"\").trim();\n let input: Record<string, any> = {};\n if (rawArgs) {\n if (!rawArgs.startsWith(\"{\") || !rawArgs.endsWith(\"}\")) {\n return { toolBlocks: [], residualText: text };\n }\n\n try {\n const parsed = JSON.parse(rawArgs);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { toolBlocks: [], residualText: text };\n }\n\n input = parsed as Record<string, any>;\n } catch {\n return { toolBlocks: [], residualText: text };\n }\n }\n\n return {\n toolBlocks: [\n {\n type: \"tool_use\",\n id: `tool_code_${Date.now()}_${Math.random()}`,\n name: toolName,\n input,\n },\n ],\n residualText: \"\",\n };\n}\n\nfunction normalizeToolCodeResponses(result: any, enabledTools: any[]): any {\n if (\n !result ||\n result.stop_reason === \"tool_use\" ||\n !Array.isArray(result.content)\n ) {\n return result;\n }\n\n const allowedToolNames = new Set(\n (enabledTools || [])\n .map((tool: any) => (typeof tool?.name === \"string\" ? tool.name : \"\"))\n .filter(Boolean),\n );\n\n if (allowedToolNames.size === 0) {\n return result;\n }\n\n const normalizedContent: any[] = [];\n let convertedAny = false;\n\n for (const block of result.content) {\n if (block?.type !== \"text\" || typeof block.text !== \"string\") {\n normalizedContent.push(block);\n\n continue;\n }\n\n const parsed = parseToolCodeBlock(block.text, allowedToolNames);\n if (parsed.toolBlocks.length > 0) {\n convertedAny = true;\n if (parsed.residualText.trim()) {\n normalizedContent.push({ type: \"text\", text: parsed.residualText });\n }\n\n normalizedContent.push(...parsed.toolBlocks);\n\n continue;\n }\n\n normalizedContent.push(block);\n }\n\n if (!convertedAny) {\n return result;\n }\n\n return {\n ...result,\n content: normalizedContent,\n stop_reason: \"tool_use\",\n };\n}\n\nfunction buildToolResultsFallbackText(toolResults: ContentBlock[]): string {\n const lines = toolResults\n .filter((entry) => entry?.type === \"tool_result\")\n .map((entry) => {\n if (typeof (entry as any).content === \"string\") {\n return (entry as any).content.trim();\n }\n\n if (Array.isArray((entry as any).content)) {\n return ((entry as any).content as ToolResultContentBlock[])\n .filter((block) => block.type === \"text\")\n .map((block) => (block as { type: \"text\"; text: string }).text)\n .join(\"\\n\")\n .trim();\n }\n\n return JSON.stringify((entry as any).content).trim();\n })\n .filter(Boolean);\n\n if (lines.length === 0) {\n return \"\";\n }\n\n return lines.join(\"\\n\\n\").slice(0, 10_000);\n}\n\nfunction formatToolFallbackResponseText(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return \"\";\n }\n\n return `Tool result:\\n${trimmed}`;\n}\n\nexport type NodeTransformersCompletionExecutor = (options: {\n modelId: string;\n messages: any[];\n tools?: any[];\n maxTokens?: number;\n verbose?: boolean;\n onToken?: (text: string) => void;\n onProgress?: (info: any) => void;\n abortSignal?: AbortSignal;\n}) => Promise<any>;\n\nlet _nodeTransformersCompletionExecutor: NodeTransformersCompletionExecutor | null =\n null;\n\nexport function setNodeTransformersCompletionExecutor(\n executor: NodeTransformersCompletionExecutor | null,\n): void {\n _nodeTransformersCompletionExecutor = executor;\n}\n\nexport type NodeLlamafileCompletionExecutor = (options: {\n model: string;\n messages: any[];\n tools?: any[];\n maxTokens?: number;\n abortSignal?: AbortSignal;\n verbose?: boolean;\n onToken?: (text: string) => void;\n service?: any;\n}) => Promise<any>;\n\nlet _nodeLlamafileCompletionExecutor: NodeLlamafileCompletionExecutor | null =\n null;\n\nexport function setNodeLlamafileCompletionExecutor(\n executor: NodeLlamafileCompletionExecutor | null,\n): void {\n _nodeLlamafileCompletionExecutor = executor;\n}\n\n/**\n * Handle agent invocation with tool-use loop\n */\nexport async function handleInvoke(\n db: any,\n payload: InvokePayload & { isScheduledTask?: boolean },\n abortSignal?: AbortSignal,\n): Promise<void> {\n const {\n apiKey,\n assistantName,\n contextCompression = false,\n contextLimit: payloadContextLimit,\n enabledTools,\n groupId: originalGroupId,\n isScheduledTask = false,\n maxIterations: payloadMaxIterations,\n maxTokens,\n memory,\n messages,\n model,\n provider: providerId,\n providerHeaders = {},\n providerRuntimeOverrides,\n reasoning,\n rateLimitAutoAdapt = true,\n rateLimitCallsPerMinute = 0,\n storageHandle,\n streaming = false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedModel,\n subagentPinnedProvider,\n systemPrompt,\n workspaceGroupId,\n } = payload;\n\n const isSubagentTask = !!payload.subagentTask;\n const groupId = isSubagentTask\n ? originalGroupId.startsWith(\"subagent:\")\n ? originalGroupId\n : `subagent:${ulid()}`\n : originalGroupId;\n const effectiveWorkspaceGroupId = workspaceGroupId || originalGroupId;\n\n if (isSubagentTask) {\n registerSubagentCollector(groupId, []);\n }\n\n const rateLimitConfig: RateLimitConfig = {\n autoAdapt: rateLimitAutoAdapt !== false,\n callsPerMinute: Number.isFinite(rateLimitCallsPerMinute)\n ? Math.max(0, Math.floor(rateLimitCallsPerMinute))\n : 0,\n };\n\n if (storageHandle) {\n setStorageRoot(storageHandle);\n }\n\n const provider = getProvider(providerId);\n if (!provider) {\n post({\n payload: { groupId, error: `Unknown provider: ${providerId}` },\n type: \"error\",\n });\n\n return;\n }\n\n const typedProvider = (\n payload.baseUrl ? { ...provider, baseUrl: payload.baseUrl } : provider\n ) as ProviderConfig;\n\n // Determine whether we can actually use streaming for this provider.\n const useStreaming =\n streaming &&\n typedProvider.supportsStreaming === true &&\n typedProvider.format !== \"prompt_api\";\n\n post({ type: \"typing\", payload: { groupId } });\n\n log(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: ${typedProvider.name} · Model: ${model} · Max tokens: ${maxTokens} · Streaming: ${useStreaming ? \"on\" : \"off\"}${streaming && !useStreaming ? \" (provider does not support streaming)\" : \"\"}`,\n );\n\n try {\n let currentMessages = [...messages];\n let iterations = 0;\n\n const maxIterations =\n typeof payloadMaxIterations === \"number\" && payloadMaxIterations > 0\n ? payloadMaxIterations\n : DEFAULT_MAX_ITERATIONS;\n\n let currentTools = Array.isArray(enabledTools)\n ? enabledTools\n : TOOL_DEFINITIONS;\n\n if (isHeadlessMode()) {\n currentTools = filterHeadlessTools(currentTools as any);\n }\n\n let currentSystemPrompt = systemPrompt;\n let latestToolResultsFallbackText = \"\";\n\n // Build the invoke context for spawn_subagent to inherit\n const invokeContext: SubagentInvokeContext = {\n apiKey,\n assistantName: assistantName ?? \"\",\n db,\n enabledTools: currentTools as any,\n invokeSubagent: (subPayload) =>\n dispatchSubagentInvoke(db, subPayload, abortSignal),\n maxTokens,\n memory: memory ?? \"\",\n model,\n provider: providerId,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n providerHeaders,\n providerRuntimeOverrides,\n storageHandle,\n streaming: false, // subagents always use non-streaming for clean capture\n systemPrompt: currentSystemPrompt ?? \"\",\n };\n\n // Track exact tool calls to prevent loops\n const toolCallHistory: string[] = [];\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Check for mid-invocation tool updates from main thread\n const updatedState = getToolState(groupId);\n if (updatedState) {\n currentTools = updatedState.enabledTools;\n currentSystemPrompt = buildSystemPrompt(\n assistantName,\n memory,\n currentTools,\n updatedState.systemPromptOverride,\n undefined,\n undefined,\n { groupId },\n );\n }\n\n const contextLimit = payloadContextLimit ?? getContextLimit(model);\n const systemPromptTokens = estimateTokens(currentSystemPrompt);\n\n // Re-evaluate context dynamically for each API call to handle large tool outputs\n const { messages: payloadMessages, estimatedTokens } =\n buildDynamicContext(currentMessages as any, {\n contextLimit,\n maxOutputTokens: maxTokens,\n skimTop: contextCompression,\n systemPromptTokens,\n });\n\n // Strict proxy boundaries (e.g. Azure OpenAI) calculate: prompt_tokens + max_tokens <= context_window.\n const SAFETY_BUFFER = 500;\n const totalPromptEstimate =\n (estimatedTokens as number) + systemPromptTokens;\n\n // Mathematically guarantee we don't overflow the strict provider budget\n const safeMaxTokens = Math.max(\n 100, // floor\n Math.min(maxTokens, contextLimit - totalPromptEstimate - SAFETY_BUFFER),\n );\n\n const body = formatRequest(\n typedProvider,\n payloadMessages,\n currentTools as any,\n {\n contextCompression,\n maxTokens: safeMaxTokens,\n model,\n reasoning,\n system: currentSystemPrompt,\n },\n );\n\n log(\n groupId,\n \"api-call\",\n `API call #${iterations}`,\n `${payloadMessages.length} messages in context`,\n );\n\n const headers = {\n ...buildHeaders(typedProvider, apiKey),\n ...providerHeaders,\n };\n\n const url = typedProvider.baseUrl;\n\n let result: any;\n\n if (\n isHeadlessMode() &&\n providerId === \"transformers_js_local\" &&\n _nodeTransformersCompletionExecutor\n ) {\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n }\n\n const rawResult = await _nodeTransformersCompletionExecutor({\n modelId: model,\n messages: body?.messages || payloadMessages,\n tools: currentTools as any[],\n maxTokens: safeMaxTokens,\n abortSignal,\n verbose: Boolean(payload.verbose),\n onToken: (text: string) => {\n if (useStreaming && text) {\n post({\n payload: { groupId, text },\n type: \"streaming-chunk\",\n });\n }\n },\n onProgress: (info: any) => {\n if (\n info?.status === \"progress\" ||\n info?.status === \"progress_total\"\n ) {\n let pct: number | null = null;\n if (typeof info.progress === \"number\") {\n const rawPct =\n info.progress <= 1 && info.progress > 0 && !info.total\n ? info.progress * 100\n : typeof info.loaded === \"number\" &&\n typeof info.total === \"number\" &&\n info.total > 0\n ? (info.loaded / info.total) * 100\n : info.progress;\n pct = Math.max(0, Math.min(100, Math.round(rawPct)));\n }\n post({\n payload: {\n groupId,\n label: \"Model Progress\",\n message: `${info.file || model}: ${pct !== null ? `${pct}%` : \"loading...\"}`,\n },\n type: \"status\",\n });\n }\n },\n });\n result = parseResponse(typedProvider, rawResult);\n } else if (\n isHeadlessMode() &&\n (providerId === \"llamafile\" || providerId === \"agentfile\") &&\n _nodeLlamafileCompletionExecutor\n ) {\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n }\n\n const rawResult = await _nodeLlamafileCompletionExecutor({\n model,\n messages: body?.messages || payloadMessages,\n tools: (body?.tools ?? currentTools) as any[],\n maxTokens: safeMaxTokens,\n abortSignal,\n verbose: Boolean(payload.verbose),\n onToken: (text: string) => {\n if (useStreaming && text) {\n post({\n payload: { groupId, text },\n type: \"streaming-chunk\",\n });\n }\n },\n });\n result = parseResponse(typedProvider, rawResult);\n } else if (useStreaming) {\n result = await callWithStreaming(\n providerId,\n typedProvider,\n url,\n headers,\n body,\n groupId,\n model,\n rateLimitConfig,\n abortSignal,\n );\n } else {\n result = await callApi(\n providerId,\n typedProvider,\n url,\n headers,\n body,\n groupId,\n rateLimitConfig,\n abortSignal,\n );\n }\n\n result = normalizeToolCodeResponses(result, currentTools as any[]);\n\n // Emit token usage\n if (result.usage) {\n post(\n createTokenUsageMessage(\n groupId,\n result.usage,\n getContextLimit(model),\n ),\n );\n }\n\n // Log text blocks\n for (const block of result.content) {\n if (block.type === \"text\" && block.text) {\n const preview =\n block.text.length > 200\n ? block.text.slice(0, 200) + \"…\"\n : block.text;\n\n log(groupId, \"text\", \"Response text\", preview);\n }\n }\n\n if (result.stop_reason === \"tool_use\") {\n const allowedToolNames = new Set(\n (currentTools as any[])\n .map((tool: any) =>\n typeof tool?.name === \"string\" ? tool.name : \"\",\n )\n .filter(Boolean),\n );\n\n // If the response includes text alongside tool calls, persist it\n const intermediateText = result.content\n .filter((b: any) => b.type === \"text\")\n .map((b: any) => b.text)\n .join(\"\")\n .replace(/<internal>[\\s\\S]*?<\\/internal>/g, \"\")\n .trim();\n\n if (intermediateText) {\n post({\n payload: { groupId, text: intermediateText },\n type: \"intermediate-response\",\n });\n }\n\n // If we were streaming text before tool calls, clear the streaming bubble\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-end\",\n });\n }\n\n // Execute tool calls\n const toolResults: ContentBlock[] = [];\n for (const block of result.content) {\n if (block.type === \"tool_use\") {\n const isAllowed = allowedToolNames.has(block.name);\n\n // Prevent infinite loops by detecting repeated identical tool calls\n const toolCallSignature = `${block.name}:${JSON.stringify(block.input)}`;\n const timesCalled = toolCallHistory.filter(\n (s) => s === toolCallSignature,\n ).length;\n\n toolCallHistory.push(toolCallSignature);\n\n if (!isAllowed) {\n const blockedMessage =\n `SYSTEM ERROR: Tool '${block.name}' is disabled or unavailable for this request. ` +\n \"Do not call it again. Try a different approach or ask the user for help.\";\n\n log(groupId, \"warning\", \"Tool blocked\", blockedMessage);\n\n toolResults.push({\n content: blockedMessage,\n tool_use_id: block.id,\n type: \"tool_result\",\n });\n\n continue;\n }\n\n const inputPreview = JSON.stringify(block.input);\n const inputShort =\n inputPreview.length > 300\n ? inputPreview.slice(0, 300) + \"…\"\n : inputPreview;\n\n log(groupId, \"tool-call\", `Tool: ${block.name}`, inputShort);\n\n post(createToolActivityMessage(groupId, block.name, \"running\"));\n\n let output: ToolResult;\n if (timesCalled >= 3) {\n output = `SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${timesCalled + 1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`;\n\n console.warn(\n `[Worker] Blocked repetitive tool call:`,\n toolCallSignature,\n );\n } else {\n output = await executeTool(\n db,\n block.name,\n block.input,\n effectiveWorkspaceGroupId,\n {\n allowedTools: currentTools,\n isScheduledTask,\n invokeContext,\n },\n );\n }\n\n const outputStr =\n typeof output === \"string\" ? output : JSON.stringify(output);\n\n const outputShort =\n outputStr.length > 500\n ? outputStr.slice(0, 500) + \"…\"\n : outputStr;\n\n log(groupId, \"tool-result\", `Result: ${block.name}`, outputShort);\n\n post(createToolActivityMessage(groupId, block.name, \"done\"));\n\n if (Array.isArray(output)) {\n toolResults.push({\n content: output as ToolResultContentBlock[],\n tool_use_id: block.id,\n name: block.name,\n type: \"tool_result\",\n });\n } else {\n toolResults.push({\n content:\n typeof output === \"string\"\n ? output.slice(0, 100_000)\n : JSON.stringify(output).slice(0, 100_000),\n tool_use_id: block.id,\n name: block.name,\n type: \"tool_result\",\n });\n }\n }\n }\n\n // Continue conversation with tool results\n latestToolResultsFallbackText =\n buildToolResultsFallbackText(toolResults);\n\n currentMessages.push({ role: \"assistant\", content: result.content });\n currentMessages.push({ role: \"user\", content: toolResults as any });\n\n post({ type: \"typing\", payload: { groupId } });\n } else {\n // Final response\n const text = result.content\n .filter((b: any) => b.type === \"text\")\n .map((b: any) => b.text)\n .join(\"\");\n\n const cleaned = text\n .replace(/<internal>[\\s\\S]*?<\\/internal>/g, \"\")\n .trim();\n\n const isPlaceholderOnly = cleaned.toLowerCase() === \"(no response)\";\n const preferredModelText = isPlaceholderOnly ? \"\" : cleaned;\n const finalText = preferredModelText\n ? preferredModelText\n : latestToolResultsFallbackText\n ? formatToolFallbackResponseText(latestToolResultsFallbackText)\n : \"(no response)\";\n\n // If streaming was used, the text was already streamed chunk-by-chunk.\n if (useStreaming) {\n post({\n payload: { groupId, text: finalText },\n type: \"streaming-done\",\n });\n }\n\n post({\n payload: { groupId, text: finalText },\n type: \"response\",\n });\n\n return;\n }\n }\n\n // Max iterations reached\n post({\n payload: {\n text: `⚠️ Reached maximum tool-use iterations (${maxIterations}). Stopping to avoid excessive API usage.`,\n groupId,\n },\n type: \"response\",\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n\n // If we were streaming when the error occurred, preserve partial content\n if (useStreaming) {\n post({\n payload: { groupId, error: message },\n type: \"streaming-error\",\n });\n }\n\n post({ type: \"error\", payload: { groupId, error: message } });\n } finally {\n clearToolState(groupId);\n if (isSubagentTask) {\n unregisterSubagentCollector(groupId);\n }\n }\n}\n\n/**\n * Make a non-streaming LLM API call with retry.\n */\nasync function callApi(\n providerId: string,\n typedProvider: ProviderConfig,\n url: string,\n headers: Record<string, string>,\n body: any,\n groupId: string,\n rateLimitConfig: RateLimitConfig,\n abortSignal?: AbortSignal,\n): Promise<any> {\n return withRetry(\n async () => {\n await waitForRateLimitSlot(\n providerId,\n groupId,\n rateLimitConfig,\n abortSignal,\n );\n\n const res = await fetch(url, {\n body: JSON.stringify(body),\n headers,\n method: \"POST\",\n signal: abortSignal,\n });\n\n updateRateLimitFromHeaders(providerId, res.headers, rateLimitConfig);\n\n if (!res.ok) {\n const errBody = await res.text();\n const error = new Error(\n `${typedProvider.name} API error ${res.status}: ${errBody}`,\n );\n (error as any).status = res.status;\n\n throw error;\n }\n\n const rawResult = await res.json();\n\n return parseResponse(typedProvider, rawResult);\n },\n {\n baseDelayMs: 2000,\n jitterFactor: 0.5,\n maxDelayMs: 30_000,\n maxRetries: 3,\n onRetry: (_attempt, _maxRetries, _delayMs, _error) => {\n const errMsg =\n _error instanceof Error ? _error.message : String(_error);\n\n log(\n groupId,\n \"warning\",\n `Retrying API call (${_attempt}/${_maxRetries})`,\n errMsg,\n );\n\n post({\n type: \"show-toast\",\n payload: {\n message: `LLM API: Retrying (${_attempt}/${_maxRetries})… ${errMsg.slice(0, 120)}`,\n type: \"warning\",\n duration: 5000,\n },\n });\n },\n shouldRetry: (error) => isRetryableHttpError(error),\n signal: abortSignal,\n },\n );\n}\n\n/**\n * Make a streaming LLM API call.\n */\nasync function callWithStreaming(\n providerId: string,\n typedProvider: ProviderConfig,\n url: string,\n headers: Record<string, string>,\n body: any,\n groupId: string,\n model: string,\n rateLimitConfig: RateLimitConfig,\n abortSignal?: AbortSignal,\n): Promise<any> {\n // Add stream flag to the request body\n const streamBody = {\n ...body,\n stream: true,\n // For OpenAI-compatible APIs, request usage in the stream\n ...((typedProvider.format === \"openai\" ||\n typedProvider.format === \"mesh-llm\") && {\n stream_options: { include_usage: true },\n }),\n };\n\n await waitForRateLimitSlot(providerId, groupId, rateLimitConfig, abortSignal);\n\n const res = await fetch(url, {\n body: JSON.stringify(streamBody),\n headers,\n method: \"POST\",\n signal: abortSignal,\n });\n\n updateRateLimitFromHeaders(providerId, res.headers, rateLimitConfig);\n\n if (!res.ok) {\n const errBody = await res.text();\n const error = new Error(\n `${typedProvider.name} API error ${res.status}: ${errBody}`,\n );\n\n (error as any).status = res.status;\n\n throw error;\n }\n\n if (!res.body) {\n throw new Error(\"Streaming response has no body\");\n }\n\n // Signal the UI that a streaming response is starting\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n\n let lastChunkTime = 0;\n let pendingText = \"\";\n let lastReasoningChunkTime = 0;\n let pendingReasoning = \"\";\n\n const flushReasoning = (force = false) => {\n const now = Date.now();\n if (!pendingReasoning) {\n return;\n }\n\n if (!force && now - lastReasoningChunkTime < STREAM_THROTTLE_MS) {\n return;\n }\n\n const message =\n pendingReasoning.length > 400\n ? `${pendingReasoning.slice(0, 400)}…`\n : pendingReasoning;\n\n log(groupId, \"info\", \"Reasoning\", message);\n pendingReasoning = \"\";\n lastReasoningChunkTime = now;\n };\n\n const accumulator = new StreamAccumulator(\n typedProvider.format as StreamFormat,\n {\n source: typedProvider.id,\n onText: (text) => {\n const now = Date.now();\n\n // Always buffer incoming text\n pendingText += text;\n\n // Flush to the UI only when the throttle interval has elapsed\n if (now - lastChunkTime >= STREAM_THROTTLE_MS) {\n post({\n payload: { groupId, text: pendingText },\n type: \"streaming-chunk\",\n });\n\n pendingText = \"\";\n lastChunkTime = now;\n }\n },\n onToolStart: (name) => {\n post(createToolActivityMessage(groupId, name, \"running\"));\n },\n onUsage: (usage) => {\n post(createTokenUsageMessage(groupId, usage, getContextLimit(model)));\n },\n onThinking: (text) => {\n pendingReasoning += text;\n flushReasoning(false);\n },\n },\n );\n\n for await (const chunk of parseSSEStream(res.body, abortSignal)) {\n accumulator.push(chunk);\n }\n\n // Flush any remaining buffered text that didn't make it through the throttle\n if (pendingText) {\n post({\n payload: { groupId, text: pendingText },\n type: \"streaming-chunk\",\n });\n }\n\n flushReasoning(true);\n\n let finalResult = accumulator.finalize();\n\n // Mesh LLM streams standard OpenAI SSE chunks but its assembled text may\n // contain proprietary markers for thoughts and tool calls.\n // We normalize the final assembled object before the agent loop consumes it.\n if (typedProvider.format === \"mesh-llm\") {\n finalResult = normalizeMeshLlmResult(finalResult);\n }\n\n return finalResult;\n}\n","import { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport {\n invokeWithLiteRtLm,\n isLiteRtLmSupported,\n} from \"../../../subsystems/providers/litert-lm-provider.js\";\n\nimport {\n invokeWithPromptApi,\n isPromptApiSupported,\n} from \"../../../subsystems/providers/prompt-api-provider.js\";\n\nimport { invokeWithTransformersJs } from \"../../../subsystems/providers/transformers-js-provider.js\";\n\nimport { InvokePayload } from \"../../../subsystems/worker/types.js\";\nimport { handleInvoke } from \"../../../worker/utils/handle-invoke.js\";\nimport { post as workerPost } from \"../../../worker/utils/post.js\";\n\ntype SubagentPayload = InvokePayload & { isScheduledTask?: boolean };\n\nconst BROWSER_PROVIDER_IDS = new Set([\n \"litert_lm_browser\",\n \"prompt_api\",\n \"transformers_js_browser\",\n]);\n\nexport function isBrowserProviderId(providerId: string | undefined): boolean {\n return !!providerId && BROWSER_PROVIDER_IDS.has(providerId);\n}\n\nexport async function dispatchSubagentInvoke(\n db: ShadowClawDatabase,\n payload: SubagentPayload,\n abortSignal?: AbortSignal | undefined,\n): Promise<void> {\n const providerId = payload.provider;\n\n const emit = async (msg: any) => {\n workerPost(msg);\n };\n\n if (providerId === \"transformers_js_browser\") {\n await invokeWithTransformersJs(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.enabledTools,\n payload.model,\n );\n\n return;\n }\n\n if (providerId === \"prompt_api\") {\n if (!isPromptApiSupported()) {\n throw new Error(\n \"Prompt API provider is not supported in this environment.\",\n );\n }\n\n await invokeWithPromptApi(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.enabledTools,\n );\n\n return;\n }\n\n if (providerId === \"litert_lm_browser\") {\n if (!isLiteRtLmSupported()) {\n throw new Error(\n \"Litert LM Browser provider is not supported in this environment.\",\n );\n }\n\n await invokeWithLiteRtLm(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.model,\n payload.enabledTools,\n );\n\n return;\n }\n\n await handleInvoke(db, payload, abortSignal);\n}\n","import {\n CONFIG_KEYS,\n DEFAULT_PROMPT_API_FALLBACK_MODEL,\n getModelMaxTokens,\n getProvider,\n} from \"../../../config/config.js\";\n\nimport { buildDynamicContext } from \"../../../context/build-dynamic-context.js\";\nimport { estimateTokens } from \"../../../context/estimate-tokens.js\";\n\nimport { buildConversationMessages } from \"../../../db/build-conversation-messages.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { listGroups } from \"../../../db/groups.js\";\nimport { saveMessage } from \"../../../db/save-message.js\";\n\nimport { readGroupFile } from \"../../../storage/read-group-file.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../../stores/tools.js\";\n\nimport {\n invokeWithLiteRtLm,\n isLiteRtLmSupported,\n} from \"../../../subsystems/providers/litert-lm-provider.js\";\n\nimport {\n invokeWithPromptApi,\n isPromptApiSupported,\n} from \"../../../subsystems/providers/prompt-api-provider.js\";\nimport { ensureBuiltinAiPolyfills } from \"../../../subsystems/providers/builtin-ai-tasks.js\";\n\nimport { getContextLimit } from \"../../../subsystems/providers/providers.js\";\nimport { invokeWithTransformersJs } from \"../../../subsystems/providers/transformers-js-provider.js\";\nimport { ulid } from \"../../../utils/ulid.js\";\nimport { buildSystemPrompt } from \"../../../worker/utils/system-prompt.js\";\nimport { discoverSkills } from \"../../../subsystems/skills/discover-skills.js\";\nimport { activate_skill } from \"../../../subsystems/skills/tool.js\";\nimport { loadDeclarativeTools } from \"../../../subsystems/tools/declarative.js\";\n\nimport { compactContext } from \"./compact-context.js\";\nimport { deliverResponse } from \"./deliver-response.js\";\nimport { dispatchSubagentInvoke } from \"./dispatch-subagent-invoke.js\";\nimport { handleWorkerMessage } from \"./handle-worker-message.js\";\nimport { getChannelTypeForGroup } from \"./operations/channel.js\";\n\nimport {\n getApiKeyForRequest,\n getProviderRuntimeHeaders,\n getReasoningConfig,\n startTransformersProgressPolling,\n} from \"./operations/provider.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { ToolDefinition } from \"../../../subsystems/tools/types.js\";\nimport type { SubagentInvokeContext } from \"../../../worker/tools/spawn-subagent/spawn-subagent.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport async function invokeAgent(\n o: Orchestrator,\n db: ShadowClawDatabase,\n groupId: string,\n triggerContent: string,\n freshContext = false,\n subagent = false,\n): Promise<void> {\n const executionGroupId = subagent ? `subagent:${ulid()}` : groupId;\n\n o.inFlightTriggerByGroup.set(executionGroupId, triggerContent);\n o.setState(\"thinking\", executionGroupId);\n o.router?.setTyping(executionGroupId, true);\n o.events.emit(\"typing\", { groupId: executionGroupId, typing: true });\n\n // Save scheduled task as client message\n if (triggerContent.startsWith(\"[SCHEDULED TASK]\")) {\n o.pendingScheduledTasks.add(groupId);\n\n const stored = {\n id: ulid(),\n groupId,\n sender: \"Scheduler\",\n content: triggerContent,\n timestamp: Date.now(),\n channel: getChannelTypeForGroup(o, groupId),\n isFromMe: false,\n isTrigger: true,\n };\n\n await saveMessage(db, stored);\n\n o.events.emit(\"message\", stored);\n }\n\n // Load group memory\n let memory = \"\";\n try {\n memory = await readGroupFile(db, groupId, \"MEMORY.md\");\n } catch {}\n\n // Load group metadata to check for conversation-specific pinned tools\n const groups = await listGroups(db);\n const group = groups.find((g) => g.groupId === groupId);\n\n const effectiveProviderId = group?.pinnedProvider ?? o.provider;\n\n // When a provider is pinned but no specific model is pinned, default to that provider's own defaultModel\n const effectiveModel =\n group?.pinnedModel ??\n (group?.pinnedProvider\n ? (getProvider(group.pinnedProvider)?.defaultModel ?? o.model)\n : o.model);\n\n const configuredMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : o.maxTokens;\n\n let modelForTokenLimits = effectiveModel;\n if (\n effectiveProviderId === \"prompt_api\" &&\n (effectiveModel === \"browser-built-in\" || !effectiveModel) &&\n !isPromptApiSupported()\n ) {\n const configuredFallback = await getConfig(\n db,\n CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL,\n );\n modelForTokenLimits =\n configuredFallback || DEFAULT_PROMPT_API_FALLBACK_MODEL;\n }\n\n const effectiveMaxTokens = Math.max(\n 1,\n Math.min(configuredMaxTokens, getModelMaxTokens(modelForTokenLimits)),\n );\n\n const effectiveProviderConfig =\n getProvider(effectiveProviderId) ?? o.providerConfig;\n\n // Track the effective provider for this group so the error handler\n // can show the right help UI and avoid showing the wrong provider's error.\n o.inFlightEffectiveProviderByGroup.set(executionGroupId, {\n providerId: effectiveProviderId,\n providerConfig: effectiveProviderConfig,\n model: effectiveModel,\n });\n\n // Use pinned tools if set; otherwise fallback to global enabled tools.\n const configuredTools = Array.isArray(group?.toolTags)\n ? toolsStore.allTools.filter((t) => group.toolTags!.includes(t.name))\n : toolsStore.enabledTools;\n const declarativeToolResult = await loadDeclarativeTools(\n db,\n executionGroupId,\n );\n const rawDeclarativeTools = declarativeToolResult.tools.filter(\n (tool) =>\n !toolsStore.allTools.some((builtIn) => builtIn.name === tool.name),\n );\n const declarativeTools = Array.isArray(group?.toolTags)\n ? rawDeclarativeTools.filter((tool) => group.toolTags!.includes(tool.name))\n : rawDeclarativeTools.filter((tool) =>\n toolsStore.isDeclarativeToolEnabled(tool.name),\n );\n const toolsWithDeclarative = [...configuredTools, ...declarativeTools];\n const skillDiscovery = await discoverSkills(db, executionGroupId);\n const activeTools =\n skillDiscovery.skills.length > 0 &&\n !toolsWithDeclarative.some((tool) => tool.name === activate_skill.name)\n ? [...toolsWithDeclarative, activate_skill]\n : toolsWithDeclarative;\n\n const subagentModelSelectionMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n const subagentMaxTokens = group?.subagentMaxTokens;\n const subagentPinnedProvider = group?.subagentPinnedProvider;\n const subagentPinnedModel = group?.subagentPinnedModel;\n const subagentFastProvider = group?.subagentFastProvider;\n const subagentFastModel = group?.subagentFastModel;\n const subagentSmartProvider = group?.subagentSmartProvider;\n const subagentSmartModel = group?.subagentSmartModel;\n const subagentPowerfulProvider = group?.subagentPowerfulProvider;\n const subagentPowerfulModel = group?.subagentPowerfulModel;\n const providerRuntimeOverrides = group?.providerRuntimeOverrides;\n\n const peerState = orchestratorStore.getPeerState(groupId) || undefined;\n const systemPrompt = buildSystemPrompt(\n o.assistantName,\n memory,\n activeTools,\n toolsStore.systemPromptOverride,\n peerState,\n skillDiscovery.skills,\n { groupId },\n );\n\n // Build conversation context with dynamic token-aware windowing\n const contextLimit = getContextLimit(modelForTokenLimits);\n const systemPromptTokens =\n estimateTokens(systemPrompt) +\n activeTools.reduce((acc, t) => acc + estimateTokens(JSON.stringify(t)), 0);\n let allMessages = await buildConversationMessages(groupId, 200);\n if (freshContext) {\n if (allMessages.length > 0) {\n allMessages = [allMessages[allMessages.length - 1]];\n } else {\n allMessages = [{ role: \"user\", content: triggerContent }];\n }\n }\n const dynamicContext = buildDynamicContext(allMessages, {\n contextLimit,\n systemPromptTokens,\n maxOutputTokens: effectiveMaxTokens,\n skimTop: o.contextCompressionEnabled,\n });\n\n const messages = dynamicContext.messages;\n\n let displayTokens = dynamicContext.estimatedTokens + systemPromptTokens;\n\n if (orchestratorStore.tokenUsage) {\n const u = orchestratorStore.tokenUsage;\n const actualPrompt =\n (u.inputTokens || 0) + (u.cacheReadTokens || 0) + (u.outputTokens || 0);\n\n displayTokens = Math.max(displayTokens, actualPrompt);\n }\n\n // Emit context usage for UI display\n o.events.emit(\"context-usage\", {\n estimatedTokens: displayTokens,\n contextLimit,\n usagePercent: Math.min(\n 100,\n Math.max(\n dynamicContext.usagePercent,\n (displayTokens / contextLimit) * 100,\n ),\n ),\n truncatedCount: dynamicContext.truncatedCount,\n });\n\n // Auto-compact when context usage exceeds 80% and there are enough messages\n if (\n dynamicContext.usagePercent > 80 &&\n dynamicContext.truncatedCount > 0 &&\n allMessages.length > 10\n ) {\n o.events.emit(\"show-toast\", {\n message: `Context ${dynamicContext.usagePercent.toFixed(0)}% full — auto-compacting older messages…`,\n type: \"info\",\n duration: 4000,\n });\n // Queue compaction after this invocation completes\n queueMicrotask(() => compactContext(o, db, groupId));\n }\n\n if (effectiveProviderId === \"transformers_js_browser\") {\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const transformersInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithTransformersJs(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n activeTools,\n effectiveModel,\n transformersInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n if (effectiveProviderId === \"prompt_api\") {\n if (!isPromptApiSupported()) {\n await ensureBuiltinAiPolyfills();\n }\n if (!isPromptApiSupported()) {\n await deliverResponse(\n o,\n db,\n executionGroupId,\n \"⚠️ Error: Prompt API is not available in this browser. Switch provider or enable experimental browser flags.\",\n );\n\n return;\n }\n\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const promptApiInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithPromptApi(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n activeTools,\n promptApiInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n if (effectiveProviderId === \"litert_lm_browser\") {\n if (!isLiteRtLmSupported()) {\n await deliverResponse(\n o,\n db,\n executionGroupId,\n \"⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.\",\n );\n\n return;\n }\n\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const liteRtInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithLiteRtLm(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n effectiveModel,\n activeTools,\n liteRtInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n // Determine whether to stream. The provider must explicitly opt in via\n // supportsStreaming (proxies like bedrock_proxy use synchronous\n // InvokeModelCommand and cannot return SSE streams).\n const shouldStream =\n o.streamingEnabled &&\n effectiveProviderConfig.supportsStreaming === true &&\n (effectiveProviderConfig.format === \"openai\" ||\n effectiveProviderConfig.format === \"anthropic\");\n\n if (effectiveProviderId === \"transformers_js_local\") {\n startTransformersProgressPolling(o, o.events, executionGroupId);\n }\n\n await o.ensureWorkerReady?.();\n\n const providerRequestId = o.createProviderRequestId(executionGroupId);\n\n // Send to agent worker\n o.agentWorker?.postMessage({\n type: \"invoke\",\n payload: {\n apiKey:\n effectiveProviderId === o.provider\n ? await getApiKeyForRequest(o)\n : await o.getApiKeyForSpecificProvider(db, effectiveProviderId),\n assistantName: o.assistantName,\n contextCompression: o.contextCompressionEnabled,\n contextLimit: getContextLimit(modelForTokenLimits),\n enabledTools: activeTools,\n groupId: executionGroupId,\n isScheduledTask: o.schedulerTriggeredGroups.has(groupId),\n maxIterations: o.maxIterations,\n maxTokens: effectiveMaxTokens,\n memory,\n messages,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n providerRequestId,\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n reasoning: getReasoningConfig(o),\n rateLimitAutoAdapt: o.rateLimitAutoAdapt,\n rateLimitCallsPerMinute: o.rateLimitCallsPerMinute,\n storageHandle: await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE),\n streaming: shouldStream,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n subagentTask: subagent,\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"invoke-agent-cac3gCsj.js","names":[],"sources":["../../src/subsystems/providers/litert-lm-provider.ts","../../src/subsystems/providers/transformers-js-provider.ts","../../src/worker/utils/create-token-usage-message.ts","../../src/worker/utils/log.ts","../../src/worker/utils/parse-sse-stream.ts","../../src/worker/utils/rate-limit.ts","../../src/worker/stream-accumulator/stream-accumulator.ts","../../src/worker/utils/tool-state.ts","../../src/worker/utils/handle-invoke.ts","../../src/core/orchestrator/utils/dispatch-subagent-invoke.ts","../../src/core/orchestrator/utils/invoke-agent.ts"],"sourcesContent":["/**\n * LiteRT-LM Browser Provider\n *\n * Wraps the Google LiteRT-LM Web API (@litert-lm/core) to provide\n * in-browser LLM inference for Gemma 4 models via WebGPU.\n *\n * https://developers.google.com/edge/litert-lm/js\n *\n * Currently supports:\n * - litert-community/gemma-4-E2B-it-litert-lm (gemma-4-E2B-it-web.litertlm)\n * - litert-community/gemma-4-E4B-it-litert-lm (gemma-4-E4B-it-web.litertlm)\n *\n * Model IDs in config use the litert-community HuggingFace repo ID. We resolve\n * the actual .litertlm file URL from the repo's main branch.\n */\n\nimport { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\nimport { ShadowClawDatabase } from \"../../db/db.js\";\nimport { createLogMessage } from \"../../worker/utils/create-log-message.js\";\nimport { createToolActivityMessage } from \"../../worker/utils/create-tool-activity-message.js\";\nimport { executeTool } from \"../../worker/utils/execute-tool.js\";\nimport { setPostHandler } from \"../../worker/utils/post.js\";\nimport { ToolDefinition } from \"../tools/tools.js\";\n\nimport type { SubagentInvokeContext } from \"../../worker/tools/spawn-subagent/spawn-subagent.js\";\n\n/**\n * Map from provider model ID (HuggingFace repo) to the .litertlm web model URL.\n */\nconst LITERT_LM_MODEL_URLS: Record<string, string> = {\n \"litert-community/gemma-4-E2B-it-litert-lm\":\n \"https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it-web.litertlm\",\n \"litert-community/gemma-4-E4B-it-litert-lm\":\n \"https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm\",\n};\n\nexport const LITERT_LM_SUPPORTED_MODELS = Object.keys(LITERT_LM_MODEL_URLS);\n\nexport const DEFAULT_LITERT_LM_MODEL =\n \"litert-community/gemma-4-E2B-it-litert-lm\";\n\n/**\n * Returns true if the LiteRT-LM JS API is available (WebGPU required).\n */\nexport function isLiteRtLmSupported(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n \"gpu\" in navigator &&\n typeof WebAssembly !== \"undefined\" &&\n \"Suspending\" in WebAssembly\n );\n}\n\n/**\n * Lazy-loaded LiteRT-LM Engine singleton per model.\n * We keep one engine alive to avoid expensive re-initialization.\n */\nlet liteRtEngine: any | null = null;\nlet liteRtEngineModelId: string | null = null;\n\nlet liteRtEnginePromise: Promise<any> | null = null;\nlet liteRtEnginePromiseModelId: string | null = null;\n\nimport {\n DEFAULT_CHUNK_SIZE,\n type ModelProgressCallback as LiteRtProgressCallback,\n} from \"./utils/types.js\";\nimport { loadModelStream } from \"./utils/load-model-stream.js\";\n\n/**\n * Persistent Cache Storage bucket for downloaded `.litertlm` model weights.\n */\nexport const LITERT_LM_CACHE_NAME = \"shadow-claw-litertlm-models\";\nexport const LITERT_LM_CHUNK_SIZE = DEFAULT_CHUNK_SIZE;\n\nexport async function loadLiteRtModelStream(\n url: string,\n onProgress: LiteRtProgressCallback,\n abortSignal?: AbortSignal,\n): Promise<ReadableStream<Uint8Array>> {\n return loadModelStream(url, onProgress, abortSignal, {\n cacheName: LITERT_LM_CACHE_NAME,\n chunkSize: LITERT_LM_CHUNK_SIZE,\n });\n}\n\nasync function getLiteRtEngine(\n modelId: string,\n onProgress?: LiteRtProgressCallback,\n abortSignal?: AbortSignal,\n): Promise<any> {\n if (liteRtEngineModelId === modelId && liteRtEngine) {\n return liteRtEngine;\n }\n\n if (liteRtEnginePromise && liteRtEnginePromiseModelId === modelId) {\n return liteRtEnginePromise;\n }\n\n liteRtEnginePromiseModelId = modelId;\n liteRtEnginePromise = (async () => {\n if (liteRtEngine) {\n try {\n await liteRtEngine.delete?.();\n } catch {}\n\n liteRtEngine = null;\n liteRtEngineModelId = null;\n }\n\n const modelUrl = LITERT_LM_MODEL_URLS[modelId];\n if (!modelUrl) {\n throw new Error(\n `LiteRT-LM: Model '${modelId} is not supported. Supported models: ${LITERT_LM_SUPPORTED_MODELS.join(\", \")}`,\n );\n }\n\n const litertlm = await import(\"@litert-lm/core\").catch(() => {\n throw new Error(\n \"LiteRT-LM: The @litert-lm/core package is not installed. Run: npm install @litert-lm/core\",\n );\n });\n\n const Engine: any = litertlm.Engine ?? (litertlm as any).default?.Engine;\n if (typeof Engine?.create !== \"function\") {\n throw new Error(\n \"LiteRT-LM: Could not locate Engine.create in @litert-lm/core. Ensure you have the latest version installed.\",\n );\n }\n\n const modelStream = await loadLiteRtModelStream(\n modelUrl,\n onProgress ?? (() => {}),\n abortSignal,\n );\n\n const engine = await Engine.create({\n model: modelStream,\n mainExecutorSettings: {\n maxNumTokens: 8192,\n },\n });\n\n liteRtEngine = engine;\n liteRtEngineModelId = modelId;\n\n return engine;\n })();\n\n try {\n return await liteRtEnginePromise;\n } finally {\n liteRtEnginePromise = null;\n liteRtEnginePromiseModelId = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool-call output parsing (model-agnostic)\n// ---------------------------------------------------------------------------\n\n/**\n * Internal parsed tool-call / response envelope.\n */\ninterface LiteRtParsed {\n type: \"response\" | \"tool_use\";\n format?: \"json\" | \"model_specific\";\n response?: string;\n tool_calls?: Array<{\n id?: string;\n name: string;\n input?: Record<string, any>;\n }>;\n}\n\n/**\n * Try to parse Gemma 4's native tool-call syntax:\n * <|tool_call>call:TOOLNAME{...args...}<tool_call|>\n *\n * The model sometimes emits <|\"|> instead of literal quote chars, and may\n * omit the closing sentinel if generation was cut off.\n *\n * Returns a normalised { name, input } object on success, or null.\n *\n * NOTE: This is a *fallback* for models that ignore the JSON-envelope\n * instructions. The primary path is always the JSON envelope.\n */\nexport function parseModelSpecificToolCall(\n text: string,\n): { name: string; input: Record<string, any> } | null {\n if (!text) {\n return null;\n }\n\n // Match <|tool_call>call:TOOLNAME{...}<tool_call|> (closing sentinel optional)\n const match = text.match(\n /<\\|tool_call>call:([A-Za-z0-9_]+)(\\{[\\s\\S]*?)(?:<tool_call\\|>|$)/,\n );\n if (!match) {\n return null;\n }\n\n const name = match[1];\n let body = match[2];\n\n // Replace the Gemma 4 quote sentinel <|\"|> → \" so the body becomes\n // valid JSON-like text that we can parse.\n body = body.replace(/<\\|\"\\|>/g, '\"');\n\n /**\n * Gemma 4 emits JavaScript-style objects with unquoted property names,\n * e.g. {queries:[\"blueberries\"]}. This function wraps bare identifier keys\n * with double quotes so the result is valid JSON.\n */\n function normaliseToJson(src: string): string {\n // Quote any unquoted object key: an identifier followed by a colon that\n // is NOT already preceded by a double quote.\n\n return src.replace(\n /([{,]\\s*)([A-Za-z_$][A-Za-z0-9_$]*)(\\s*:)/g,\n '$1\"$2\"$3',\n );\n }\n\n // Attempt JSON.parse of the argument block, with progressive relaxation.\n let input: Record<string, any> = {};\n\n const candidates = [body, normaliseToJson(body)];\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n input = parsed;\n\n break;\n }\n } catch {\n // try next candidate\n }\n }\n\n // If still unparsed, try extracting the first complete {...} block.\n if (Object.keys(input).length === 0) {\n const start = body.indexOf(\"{\");\n const end = body.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const slice = body.slice(start, end + 1);\n for (const candidate of [slice, normaliseToJson(slice)]) {\n try {\n const parsed = JSON.parse(candidate);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n input = parsed;\n\n break;\n }\n } catch {\n // Best-effort: leave input as {}\n }\n }\n }\n }\n\n return { name, input };\n}\n\n/**\n * Parse the model's accumulated response into a structured envelope.\n *\n * Priority:\n * 1. JSON envelope { \"type\": \"tool_use\" | \"response\", ... } (model-agnostic, primary)\n * 2. Gemma 4 native <|tool_call>call:NAME{...}<tool_call|> (fallback)\n *\n * Returns null when the output is plain text with no recognised structure.\n */\nexport function parseLiteRtStructured(raw: string): LiteRtParsed | null {\n const text = sanitizeModelOutput(String(raw || \"\"), \"litert_lm\").trim();\n if (!text) {\n return null;\n }\n\n // ── 1. Try JSON (primary, model-agnostic) ──────────────────────────────\n const tryJson = (src: string): LiteRtParsed | null => {\n try {\n const obj = JSON.parse(src);\n if (\n obj &&\n typeof obj === \"object\" &&\n (obj.type === \"tool_use\" || obj.type === \"response\")\n ) {\n // Fix common model typos\n if (obj.tools_calls && !obj.tool_calls) {\n obj.tool_calls = obj.tools_calls;\n }\n\n return { ...obj, format: \"json\" } as LiteRtParsed;\n }\n } catch {\n // fall through\n }\n\n return null;\n };\n\n let result = tryJson(text);\n if (result) {\n return result;\n }\n\n // Try extracting the first {...} block in case the model wrapped it in prose.\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n result = tryJson(text.slice(start, end + 1));\n if (result) {\n return result;\n }\n }\n\n // ── 2. Regex fallback for malformed JSON ─────────────────────────────\n // Handle cases where the model forgets closing braces or brackets\n // e.g. {\"type\": \"tool_use\", \"tools_calls\": [{ \"name\": \"web_search\", \"input\": { \"query\": \"...\" } ]}\n if (text.includes('\"tool_use\"')) {\n const nameMatch = /\"name\"\\s*:\\s*\"([^\"]+)\"/.exec(text);\n if (nameMatch) {\n let input = {};\n const inputMatch = /\"input\"\\s*:\\s*(\\{.*?\\})\\s*(?:]|\\}|\"|$)/s.exec(text);\n if (inputMatch) {\n try {\n input = JSON.parse(inputMatch[1]);\n } catch {\n // Leave input empty if it's too mangled\n }\n }\n\n return {\n type: \"tool_use\",\n format: \"json\",\n tool_calls: [\n {\n id: `litert_${Date.now()}`,\n name: nameMatch[1],\n input,\n },\n ],\n };\n }\n }\n\n // ── 2. Gemma 4 native tool-call format (fallback) ──────────────────────\n const native = parseModelSpecificToolCall(text);\n if (native) {\n return {\n type: \"tool_use\",\n format: \"model_specific\",\n tool_calls: [\n {\n id: `litert_${Date.now()}`,\n name: native.name,\n input: native.input,\n },\n ],\n };\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation building helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build the preface (system messages) and per-turn text strings that will be\n * sent to the LiteRT-LM stateful conversation API.\n *\n * When tools are active we prepend JSON-envelope instructions so that any\n * LiteRT model (not just Gemma 4) knows how to signal tool calls.\n */\nfunction buildLiteRtMessages(\n systemPrompt: string,\n messages: any[],\n tools: ToolDefinition[],\n): { preface: any[]; turns: string[] } {\n const preface: any[] = [];\n\n // Compose the effective system content: original prompt + tool instructions.\n let effectiveSystem = systemPrompt || \"\";\n\n if (tools.length > 0) {\n const toolHints = tools\n .map((t) => {\n const params = Object.keys(t.input_schema.properties || {}).join(\", \");\n const brief = t.description.split(\". \")[0];\n\n return `${t.name}(${params}): ${brief}`;\n })\n .join(\"\\n\");\n\n const jsonInstructions = [\n \"\",\n \"TOOL CALLING INSTRUCTIONS:\",\n \"Return ONLY valid JSON (no markdown fences).\",\n 'To call a tool: {\"type\":\"tool_use\",\"tool_calls\":[{\"name\":\"<tool>\",\"input\":{...}}]}',\n 'To reply: {\"type\":\"response\",\"response\":\"<your answer>\"}',\n \"IMPORTANT: When you need to use a tool, output ONLY the JSON above — do NOT describe the call as text.\",\n \"\",\n \"Available tools:\",\n toolHints,\n ].join(\"\\n\");\n\n effectiveSystem = effectiveSystem\n ? effectiveSystem + jsonInstructions\n : jsonInstructions;\n }\n\n if (effectiveSystem) {\n preface.push({ role: \"system\", content: effectiveSystem });\n }\n\n // Build prior turns. All message types (text, tool_use, tool_result) are\n // serialised to a flat string so the stateful conversation engine can replay\n // them without native tool-call support.\n const turns: string[] = [];\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const content = Array.isArray(msg.content)\n ? msg.content\n .map((b: any) => {\n if (b?.type === \"text\") {\n return b.text;\n }\n\n if (b?.type === \"tool_result\") {\n return `[TOOL_RESULT ${b.tool_use_id}] ${String(b.content || \"\")}`;\n }\n\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n : String(msg.content || \"\");\n if (content) {\n turns.push(content);\n }\n } else if (msg.role === \"assistant\") {\n // Skip — LiteRT conversation is stateful; assistant turns are generated\n // by the model itself.\n }\n }\n\n return { preface, turns };\n}\n\n/**\n * Main entry point. Invokes the LiteRT-LM browser engine and streams the\n * response back via the emit callback, following the same protocol as\n * invokeWithTransformersJs / invokeWithPromptApi.\n *\n * When `tools` is non-empty the provider enters an agentic loop:\n * 1. Append JSON-envelope tool instructions to the system prompt.\n * 2. Parse the model's full response for a tool_use or response envelope.\n * 3. If tool_use: execute the tools, append results, loop.\n * 4. If response (or plain text): emit the final text and return.\n */\nexport async function invokeWithLiteRtLm(\n db: ShadowClawDatabase,\n groupId: string,\n systemPrompt: string,\n messages: any[],\n _maxTokens: number,\n emit: (message: any) => Promise<void> | void,\n abortSignal: AbortSignal | undefined,\n modelId: string,\n tools?: ToolDefinition[],\n invokeContext?: SubagentInvokeContext,\n) {\n if (!isLiteRtLmSupported()) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: \"⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.\",\n },\n });\n\n return;\n }\n\n await emit(\n createLogMessage(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: LiteRT-LM (Browser · WebGPU) · Model: ${modelId}`,\n ),\n );\n\n // Emit model-download-progress so the UI shows a loading state\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"running\",\n progress: 0,\n message: `Loading LiteRT-LM model: ${modelId}…`,\n },\n });\n\n const formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(0);\n\n let lastEmittedPct = -1;\n\n const onProgress: LiteRtProgressCallback = (received, total, fromCache) => {\n const progress = total ? received / total : null;\n const pct = progress != null ? Math.floor(progress * 100) : -1;\n\n if (pct === lastEmittedPct && !fromCache) {\n return;\n }\n\n lastEmittedPct = pct;\n\n const message = fromCache\n ? `Loaded ${modelId} from cache (${formatMb(received)} MB )`\n : total\n ? `Downloading ${modelId}: ${formatMb(received)} / ${formatMb(total)} MB`\n : `Downloading ${modelId}: ${formatMb(received)} MB`;\n\n void emit({\n type: \"model-download-progress\",\n payload: { groupId, status: \"running\", progress, message },\n });\n };\n\n let engine: any;\n\n try {\n engine = await getLiteRtEngine(modelId, onProgress, abortSignal);\n } catch (err: any) {\n if (abortSignal?.aborted || err?.name === \"AbortError\") {\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"error\",\n progress: null,\n message: \"LiteRT-LM model download cancelled.\",\n },\n });\n\n return;\n }\n\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"error\",\n progress: null,\n message: `LiteRT-LM model failed to load: ${err?.message ?? String(err)}`,\n },\n });\n\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM failed to initialize: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n await emit({\n type: \"model-download-progress\",\n payload: {\n groupId,\n status: \"done\",\n progress: 1,\n message: \"LiteRT-LM model ready.\",\n },\n });\n\n const activeTools = tools ?? [];\n\n const { preface, turns } = buildLiteRtMessages(\n systemPrompt,\n messages,\n activeTools,\n );\n\n let conversation: any;\n try {\n conversation = await engine.createConversation({\n preface: { messages: preface },\n });\n } catch (err: any) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM failed to create conversation: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n // Replay prior turns (if any) — LiteRT-LM conversation is stateful.\n // All turns except the final user turn are sent non-streaming.\n const priorTurns = turns.slice(0, -1);\n const lastTurn = turns[turns.length - 1] ?? \"Hello.\";\n\n for (const turn of priorTurns) {\n if (abortSignal?.aborted) {\n return;\n }\n\n try {\n await conversation.sendMessage(turn);\n } catch {\n // If replaying history fails, continue to latest turn anyway\n }\n }\n\n if (abortSignal?.aborted) {\n return;\n }\n\n // ── Agentic tool-calling loop ─────────────────────────────────────────────\n // We maintain a mutable list of messages that grows as tool results arrive,\n // and re-send the current user query on each iteration (with tool results\n // appended) until the model emits a plain response or we hit the limit.\n const MAX_ITERATIONS = 10;\n let currentTurn = lastTurn;\n\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n if (abortSignal?.aborted) {\n return;\n }\n\n await emit({ type: \"streaming-start\", payload: { groupId } });\n\n let accumulated = \"\";\n try {\n const stream = conversation.sendMessageStreaming(currentTurn);\n for await (const chunk of stream) {\n if (abortSignal?.aborted) {\n break;\n }\n\n const text = chunk?.content?.[0]?.text ?? \"\";\n if (text) {\n const cleaned = sanitizeModelOutput(text, \"litert_lm\");\n if (cleaned) {\n accumulated += cleaned;\n // Stream chunks to the UI so the user sees partial output\n await emit({\n type: \"streaming-chunk\",\n payload: { groupId, text: cleaned },\n });\n }\n }\n }\n } catch (err: any) {\n if (abortSignal?.aborted) {\n return;\n }\n\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: `⚠️ LiteRT-LM generation error: ${err?.message ?? String(err)}`,\n },\n });\n\n return;\n }\n\n // ── Parse the accumulated output ───────────────────────────────────────\n const parsed =\n activeTools.length > 0 ? parseLiteRtStructured(accumulated) : null;\n\n if (parsed?.type === \"tool_use\") {\n // Tool call detected — hide the raw JSON from the user.\n await emit({ type: \"streaming-end\", payload: { groupId } });\n\n const calls = Array.isArray(parsed.tool_calls) ? parsed.tool_calls : [];\n if (calls.length === 0) {\n // Malformed tool_use with no calls — treat as final response.\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text: \"(no response)\" },\n });\n await emit({\n type: \"response\",\n payload: { groupId, text: \"(no response)\" },\n });\n\n return;\n }\n\n // Execute each tool and collect results.\n const resultLines: string[] = [];\n const isNative = parsed.format === \"model_specific\";\n\n for (const call of calls) {\n await emit(createToolActivityMessage(groupId, call.name, \"running\"));\n // LiteRT-LM runs on the main thread (emit === handleWorkerMessage).\n // Route builtin-AI cross-thread requests (e.g. summarize_text's\n // \"request-native-ai-task\") back through emit so the main-thread\n // handler rseolves them; otherwise post() fails through to\n // self.postMessage and the tool promise hangs forever. Matches the\n // transformers-js / prompt-api providers.\n setPostHandler((msg) => {\n void emit(msg);\n });\n\n let output: any;\n try {\n output = await executeTool(db, call.name, call.input || {}, groupId, {\n allowedTools: activeTools,\n invokeContext,\n });\n } catch (err: any) {\n output = `Error: ${err?.message ?? String(err)}`;\n } finally {\n setPostHandler(null);\n }\n\n await emit(createToolActivityMessage(groupId, call.name, \"done\"));\n\n const resultText =\n typeof output === \"string\" ? output : JSON.stringify(output);\n\n if (isNative) {\n resultLines.push(`<|tool_response>${resultText}<|tool_response|>`);\n } else {\n resultLines.push(\n `[TOOL_RESULT ${call.id ?? call.name}] ${resultText}`,\n );\n }\n }\n\n // Feed results back to the model as the next turn.\n if (isNative) {\n currentTurn = resultLines.join(\"\\n\");\n } else {\n const lastUserContent = turns[turns.length - 1] ?? \"\";\n currentTurn = [\n ...resultLines,\n \"\",\n \"Based on the above tool results, please respond to the original request.\",\n lastUserContent ? `Original request: \"${lastUserContent}\"` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n continue; // next iteration\n }\n\n // ── Plain text or JSON response envelope ─────────────────────────────\n let finalText: string;\n if (parsed?.type === \"response\" && parsed.response) {\n finalText = sanitizeModelOutput(parsed.response, \"litert_lm\");\n } else {\n // No recognised structure — treat accumulated text as the answer.\n finalText = sanitizeModelOutput(accumulated, \"litert_lm\");\n }\n\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text: finalText },\n });\n\n await emit({\n type: \"response\",\n payload: { groupId, text: finalText },\n });\n\n return;\n }\n\n // Exhausted iterations without a plain-text response.\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: \"⚠️ LiteRT-LM reached the maximum number of tool-calling iterations without producing a final response.\",\n },\n });\n}\n","import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\nimport { ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { createModuleWorker } from \"../../utils/runtime-assets.js\";\nimport { createLogMessage } from \"../../worker/utils/create-log-message.js\";\nimport { createToolActivityMessage } from \"../../worker/utils/create-tool-activity-message.js\";\nimport { executeTool } from \"../../worker/utils/execute-tool.js\";\nimport { setPostHandler } from \"../../worker/utils/post.js\";\nimport { ToolDefinition } from \"../tools/tools.js\";\n\nimport type { SubagentInvokeContext } from \"../../worker/tools/spawn-subagent/spawn-subagent.js\";\n\nclass TransformersJsManager {\n private chunkCallbacks = new Map<string, (payload: any) => void>();\n private loadRejects = new Map<string, (reason: any) => void>();\n private loadResolves = new Map<string, () => void>();\n private pendingRejects = new Map<string, (reason: any) => void>();\n private pendingResolves = new Map<string, (value: any) => void>();\n private progressCallbacks = new Map<string, (payload: any) => void>();\n private thinkingCallbacks = new Map<string, (text: string) => void>();\n private worker: Worker | null = null;\n\n async generate(\n messages: any[],\n maxTokens: number,\n groupId: string,\n onChunk: (text: string) => void,\n onThinking?: (text: string) => void,\n tools?: any[],\n ): Promise<string> {\n const worker = this.getWorker();\n\n return new Promise((resolve, reject) => {\n this.pendingResolves.set(groupId, resolve);\n this.pendingRejects.set(groupId, reject);\n this.chunkCallbacks.set(groupId, (payload) => onChunk(payload.text));\n if (onThinking) {\n this.thinkingCallbacks.set(groupId, onThinking);\n }\n\n worker.postMessage({\n type: \"generate\",\n payload: { messages, maxTokens, groupId, tools },\n });\n });\n }\n\n async load(\n modelId: string,\n device: string,\n dtypeStrategy: string,\n groupId: string,\n onProgress: (payload: any) => void,\n ): Promise<void> {\n const worker = this.getWorker();\n\n return new Promise((resolve, reject) => {\n this.loadResolves.set(groupId, resolve);\n this.loadRejects.set(groupId, reject);\n this.progressCallbacks.set(groupId, onProgress);\n worker.postMessage({\n type: \"load\",\n payload: { modelId, device, dtypeStrategy, groupId },\n });\n });\n }\n\n private cleanup(groupId: string) {\n this.pendingResolves.delete(groupId);\n this.pendingRejects.delete(groupId);\n this.progressCallbacks.delete(groupId);\n this.chunkCallbacks.delete(groupId);\n this.thinkingCallbacks.delete(groupId);\n }\n\n private getWorker() {\n if (!this.worker) {\n this.worker = createModuleWorker(\n new URL(\"./transformers-js.worker.js\", import.meta.url).href,\n );\n this.worker.onmessage = (event) => {\n const { type, payload } = event.data;\n const groupId = payload?.groupId;\n\n switch (type) {\n case \"progress\":\n this.progressCallbacks.get(groupId)?.(payload);\n if (payload.status === \"done\") {\n this.loadResolves.get(groupId)?.();\n this.loadResolves.delete(groupId);\n this.loadRejects.delete(groupId);\n }\n\n break;\n case \"chunk\":\n this.chunkCallbacks.get(groupId)?.(payload);\n\n break;\n case \"thinking-chunk\":\n this.thinkingCallbacks.get(groupId)?.(payload.text);\n\n break;\n case \"done\":\n this.pendingResolves.get(groupId)?.(payload.text);\n this.cleanup(groupId);\n\n break;\n case \"error\":\n this.pendingRejects.get(groupId)?.(payload.error);\n this.loadRejects.get(groupId)?.(payload.error);\n this.cleanup(groupId);\n this.loadResolves.delete(groupId);\n this.loadRejects.delete(groupId);\n\n break;\n }\n };\n }\n\n return this.worker;\n }\n}\n\nconst manager = new TransformersJsManager();\n\nfunction formatMessageContent(msg: any): string {\n if (typeof msg?.content === \"string\") {\n return msg.content;\n }\n\n if (Array.isArray(msg?.content)) {\n return msg.content\n .map((block: any) => {\n if (block?.type === \"text\") {\n return block.text || \"\";\n }\n if (block?.type === \"tool_use\") {\n return `[TOOL_CALL ${block.name}] ${JSON.stringify(block.input || {})}`;\n }\n if (block?.type === \"tool_result\") {\n return `[TOOL_RESULT ${block.tool_use_id}] ${String(block.content || \"\")}`;\n }\n if (block?.type === \"attachment\") {\n return `[ATTACHMENT ${block.mediaType}] ${block.fileName} (${block.mimeType})`;\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n return \"\";\n}\n\nfunction parseStructured(raw: string) {\n const text = sanitizeModelOutput(String(raw || \"\"), \"transformers_js\").trim();\n if (!text) {\n return null;\n }\n\n // Check for Qwen/Llama XML-like tool calls: <tool_call>{\"name\": \"...\", \"arguments\": ...}</tool_call>\n const toolCallMatch = text.match(/<tool_call>([\\s\\S]*?)<\\/tool_call>/);\n if (toolCallMatch) {\n try {\n const parsedTool = JSON.parse(toolCallMatch[1]);\n if (parsedTool.name) {\n return {\n type: \"tool_use\",\n tool_calls: [\n {\n name: parsedTool.name,\n input: parsedTool.arguments || parsedTool.parameters || {},\n },\n ],\n };\n }\n } catch {\n // fallback to other parsing if invalid JSON\n }\n }\n\n try {\n return JSON.parse(text);\n } catch {\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n try {\n return JSON.parse(text.slice(start, end + 1));\n } catch {\n return null;\n }\n }\n\n return null;\n }\n}\n\nexport async function invokeWithTransformersJs(\n db: ShadowClawDatabase,\n groupId: string,\n systemPrompt: string,\n messages: any[],\n maxTokens: number,\n emit: (message: any) => Promise<void> | void,\n _abortSignal: AbortSignal | undefined,\n tools: ToolDefinition[] | undefined,\n modelId: string,\n invokeContext?: SubagentInvokeContext,\n) {\n const activeTools = tools || [];\n const backend =\n (await getConfig(db, CONFIG_KEYS.TRANSFORMERS_JS_BACKEND)) || \"auto\";\n const dtypeStrategy =\n (await getConfig(db, CONFIG_KEYS.TRANSFORMERS_JS_DTYPE_STRATEGY)) || \"auto\";\n\n await emit(\n createLogMessage(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: Transformers.js (Local Worker) · Model: ${modelId} · Backend: ${backend} · Dtype: ${dtypeStrategy}`,\n ),\n );\n\n await manager.load(modelId, backend, dtypeStrategy, groupId, (payload) => {\n void emit({ type: \"model-download-progress\", payload });\n });\n\n let currentMessages = [...messages];\n\n for (let i = 0; i < 10; i++) {\n const systemMessage = {\n role: \"system\",\n content: systemPrompt,\n };\n\n const structuredMessages = [\n systemMessage,\n ...currentMessages.map((m) => ({\n role: m.role === \"assistant\" ? \"assistant\" : \"user\",\n content: formatMessageContent(m),\n })),\n ];\n\n await emit({ type: \"streaming-start\", payload: { groupId } });\n\n let thinkingBuffer = \"\";\n let accumulated = \"\";\n const response = await manager.generate(\n structuredMessages,\n maxTokens,\n groupId,\n (chunk) => {\n accumulated += chunk;\n void emit({\n type: \"streaming-chunk\",\n payload: { groupId, text: chunk },\n });\n },\n (thinkingChunk) => {\n thinkingBuffer += thinkingChunk;\n void emit(\n createLogMessage(groupId, \"text\", \"Thinking\", thinkingBuffer),\n );\n },\n activeTools,\n );\n\n await emit({ type: \"typing\", payload: { groupId } });\n\n const parsed = parseStructured(response);\n\n if (parsed?.type === \"tool_use\") {\n await emit({ type: \"streaming-end\", payload: { groupId } });\n } else {\n const text = parsed?.response\n ? sanitizeModelOutput(parsed.response, \"transformers_js\")\n : sanitizeModelOutput(response, \"transformers_js\");\n await emit({\n type: \"streaming-done\",\n payload: { groupId, text },\n });\n }\n\n if (!parsed || parsed.type === \"response\") {\n const text = parsed?.response\n ? sanitizeModelOutput(parsed.response, \"transformers_js\")\n : sanitizeModelOutput(response, \"transformers_js\");\n await emit({ type: \"response\", payload: { groupId, text } });\n\n return;\n }\n\n const calls = Array.isArray(parsed.tool_calls) ? parsed.tool_calls : [];\n if (calls.length === 0) {\n await emit({\n type: \"response\",\n payload: {\n groupId,\n text: sanitizeModelOutput(\n parsed.response || response,\n \"transformers_js\",\n ),\n },\n });\n\n return;\n }\n\n const toolResults: any[] = [];\n for (const call of calls) {\n await emit(createToolActivityMessage(groupId, call.name, \"running\"));\n setPostHandler((msg) => {\n emit(msg);\n });\n let output: any;\n try {\n output = await executeTool(db, call.name, call.input || {}, groupId, {\n allowedTools: activeTools,\n invokeContext,\n });\n } finally {\n setPostHandler(null);\n }\n\n await emit(createToolActivityMessage(groupId, call.name, \"done\"));\n\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: call.id || `call_${Date.now()}`,\n content: typeof output === \"string\" ? output : JSON.stringify(output),\n });\n }\n\n currentMessages.push({\n role: \"assistant\",\n content: [\n ...(parsed.response ? [{ type: \"text\", text: parsed.response }] : []),\n ...calls.map((c) => ({\n type: \"tool_use\",\n id: c.id || `call_${Date.now()}_${Math.random()}`,\n name: c.name,\n input: c.input || {},\n })),\n ] as any,\n });\n\n currentMessages.push({ role: \"user\", content: toolResults as any });\n }\n}\n","/**\n * Create a token-usage message object\n */\nexport function createTokenUsageMessage(\n groupId: string,\n usage: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n },\n contextLimit: number,\n): any {\n const inputTokens = usage.input_tokens || 0;\n const outputTokens = usage.output_tokens || 0;\n const cacheReadTokens = usage.cache_read_input_tokens || 0;\n const cacheCreationTokens = usage.cache_creation_input_tokens || 0;\n\n return {\n type: \"token-usage\",\n payload: {\n groupId,\n inputTokens,\n outputTokens,\n cacheReadTokens,\n cacheCreationTokens,\n totalTokens:\n inputTokens + outputTokens + cacheReadTokens + cacheCreationTokens,\n contextLimit,\n },\n };\n}\n","import { createLogMessage } from \"./create-log-message.js\";\nimport { post } from \"./post.js\";\n\n/**\n * Log a message\n */\nexport function log(\n groupId: string,\n level:\n | \"info\"\n | \"api-call\"\n | \"tool\"\n | \"error\"\n | \"warning\"\n | \"tool-call\"\n | \"tool-result\"\n | \"text\",\n label: string,\n message?: string,\n): void {\n post(createLogMessage(groupId, level as any, label, message));\n}\n","/**\n * Parse a Server-Sent Events (SSE) stream from a ReadableStream.\n *\n * Yields parsed JSON data objects from `data:` lines, skipping `[DONE]`\n * sentinel and comment lines.\n */\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<any> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // SSE events are separated by double newlines\n const parts = buffer.split(\"\\n\\n\");\n\n // Keep the last incomplete part in the buffer\n buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n\n for (const line of lines) {\n // Skip empty lines and comments\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n\n // Skip the [DONE] sentinel\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n yield JSON.parse(data);\n } catch {\n // Skip malformed JSON lines\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import { post } from \"./post.js\";\n\nconst ONE_MINUTE_MS = 60_000;\n\nexport interface RateLimitConfig {\n callsPerMinute: number;\n autoAdapt: boolean;\n}\n\ninterface ProviderRateLimitState {\n recentCalls: number[];\n nextAllowedAt: number;\n remoteLimit: number | null;\n remoteRemaining: number | null;\n remoteResetAt: number | null;\n}\n\nconst stateByProvider = new Map<string, ProviderRateLimitState>();\n\nfunction getState(providerId: string): ProviderRateLimitState {\n const existing = stateByProvider.get(providerId);\n if (existing) {\n return existing;\n }\n\n const created: ProviderRateLimitState = {\n recentCalls: [],\n nextAllowedAt: 0,\n remoteLimit: null,\n remoteRemaining: null,\n remoteResetAt: null,\n };\n\n stateByProvider.set(providerId, created);\n\n return created;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction parseHeaderNumber(raw: string | null): number | null {\n if (!raw) {\n return null;\n }\n\n const value = Number(raw.trim());\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return value;\n}\n\nfunction parseRetryAfterMs(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const trimmed = retryAfter.trim();\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) {\n if (numeric <= 0) {\n return null;\n }\n\n return Math.round(numeric * 1000);\n }\n\n const dateMs = Date.parse(trimmed);\n if (!Number.isFinite(dateMs)) {\n return null;\n }\n\n const delta = dateMs - nowMs();\n\n return delta > 0 ? delta : null;\n}\n\nfunction parseResetAtMs(resetHeader: string | null): number | null {\n const numeric = parseHeaderNumber(resetHeader);\n if (numeric === null || numeric <= 0) {\n return null;\n }\n\n // 13-digit epoch milliseconds\n if (numeric >= 1_000_000_000_000) {\n return Math.round(numeric);\n }\n\n // 10-digit epoch seconds\n if (numeric >= 1_000_000_000) {\n return Math.round(numeric * 1000);\n }\n\n // Otherwise treat as delta seconds from now.\n\n return nowMs() + Math.round(numeric * 1000);\n}\n\nasync function waitWithAbort(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n signal?.removeEventListener(\"abort\", onAbort);\n };\n\n if (signal?.aborted) {\n onAbort();\n\n return;\n }\n\n signal?.addEventListener(\"abort\", onAbort);\n });\n}\n\nfunction computeManualWaitMs(\n state: ProviderRateLimitState,\n callsPerMinute: number,\n): number {\n if (!Number.isFinite(callsPerMinute) || callsPerMinute <= 0) {\n return 0;\n }\n\n const now = nowMs();\n state.recentCalls = state.recentCalls.filter(\n (ts) => now - ts < ONE_MINUTE_MS,\n );\n\n if (state.recentCalls.length < callsPerMinute) {\n return 0;\n }\n\n const oldest = state.recentCalls[0] || now;\n\n return Math.max(0, ONE_MINUTE_MS - (now - oldest));\n}\n\nfunction computeAutoWaitMs(state: ProviderRateLimitState): number {\n const now = nowMs();\n let waitMs = 0;\n\n if (state.nextAllowedAt > now) {\n waitMs = Math.max(waitMs, state.nextAllowedAt - now);\n }\n\n if (\n state.remoteRemaining !== null &&\n state.remoteRemaining <= 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n waitMs = Math.max(waitMs, state.remoteResetAt - now);\n }\n\n return waitMs;\n}\n\nexport async function waitForRateLimitSlot(\n providerId: string,\n groupId: string,\n config: RateLimitConfig,\n signal?: AbortSignal,\n): Promise<void> {\n const state = getState(providerId);\n\n while (true) {\n const manualWait = computeManualWaitMs(state, config.callsPerMinute);\n const autoWait = config.autoAdapt ? computeAutoWaitMs(state) : 0;\n const waitMs = Math.max(manualWait, autoWait);\n\n if (waitMs <= 0) {\n const now = nowMs();\n if (config.callsPerMinute > 0) {\n state.recentCalls.push(now);\n }\n\n if (\n config.autoAdapt &&\n state.remoteRemaining !== null &&\n state.remoteRemaining > 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n const msLeft = state.remoteResetAt - now;\n const slotsLeft = Math.max(1, state.remoteRemaining);\n const interval = Math.ceil(msLeft / slotsLeft);\n state.nextAllowedAt = Math.max(state.nextAllowedAt, now + interval);\n }\n\n return;\n }\n\n if (waitMs >= 1000) {\n post({\n type: \"thinking-log\",\n payload: {\n groupId,\n level: \"info\",\n label: \"Rate limiter\",\n message: `Waiting ${Math.ceil(waitMs / 1000)}s before next provider call to avoid 429s.`,\n timestamp: Date.now(),\n },\n });\n }\n\n await waitWithAbort(waitMs, signal);\n }\n}\n\ntype HeaderReader = {\n get(name: string): string | null;\n};\n\nexport function updateRateLimitFromHeaders(\n providerId: string,\n headers: HeaderReader | null | undefined,\n config: RateLimitConfig,\n): void {\n if (!config.autoAdapt) {\n return;\n }\n\n if (!headers || typeof headers.get !== \"function\") {\n return;\n }\n\n const state = getState(providerId);\n const now = nowMs();\n\n const limit = parseHeaderNumber(headers.get(\"x-ratelimit-limit\"));\n const remaining = parseHeaderNumber(headers.get(\"x-ratelimit-remaining\"));\n const resetAt = parseResetAtMs(headers.get(\"x-ratelimit-reset\"));\n\n if (limit !== null) {\n state.remoteLimit = Math.max(0, Math.floor(limit));\n }\n\n if (remaining !== null) {\n state.remoteRemaining = Math.max(0, Math.floor(remaining));\n }\n\n if (resetAt !== null) {\n state.remoteResetAt = resetAt;\n }\n\n const retryAfterMs = parseRetryAfterMs(headers.get(\"retry-after\"));\n if (retryAfterMs !== null) {\n state.nextAllowedAt = Math.max(state.nextAllowedAt, now + retryAfterMs);\n }\n\n if (\n state.remoteRemaining !== null &&\n state.remoteRemaining <= 0 &&\n state.remoteResetAt !== null &&\n state.remoteResetAt > now\n ) {\n state.nextAllowedAt = Math.max(state.nextAllowedAt, state.remoteResetAt);\n }\n}\n","import { sanitizeModelOutput } from \"../../content/chat-template-sanitizer.js\";\n\nimport type {\n ContentBlockAccumulator,\n StreamCallbacks,\n StreamFormat,\n} from \"./types.js\";\n\n/**\n * Accumulates streamed SSE chunks into a unified response object.\n *\n * Supports both OpenAI-format (choices[].delta) and Anthropic-format\n * (content_block_start / content_block_delta / message_delta) SSE streams.\n *\n * Emits callbacks for incremental text and tool-call progress.\n */\nexport class StreamAccumulator {\n callbacks: StreamCallbacks;\n contentBlocks: ContentBlockAccumulator[] = [];\n format: StreamFormat;\n stopReason: string = \"end_turn\";\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n } = {\n input_tokens: 0,\n output_tokens: 0,\n };\n\n #anthropicBlocks = new Map<number, ContentBlockAccumulator>();\n\n #openaiReasoningText: string = \"\";\n #openaiText: string = \"\";\n #openaiToolCalls = new Map<\n number,\n { id: string; name: string; args: string }\n >();\n\n constructor(format: StreamFormat, callbacks: StreamCallbacks = {}) {\n this.format = format;\n this.callbacks = callbacks;\n }\n\n /**\n * Build the final normalized response (same shape as parseResponse).\n */\n finalize(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n if (this.format === \"openai\" || this.format === \"mesh-llm\") {\n return this.#finalizeOpenAI();\n }\n\n return this.#finalizeAnthropic();\n }\n\n /**\n * Feed a single parsed SSE chunk into the accumulator.\n */\n push(chunk: any): void {\n if (this.format === \"openai\" || this.format === \"mesh-llm\") {\n this.#pushOpenAI(chunk);\n } else {\n this.#pushAnthropic(chunk);\n }\n }\n\n #finalizeAnthropic(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n const content: any[] = [];\n\n for (const [, block] of [...this.#anthropicBlocks.entries()].sort(\n (a, b) => a[0] - b[0],\n )) {\n if (block.type === \"text\") {\n const cleaned = this.#sanitize(block.text || \"\");\n if (cleaned) {\n content.push({ type: \"text\", text: cleaned });\n }\n } else if (block.type === \"tool_use\") {\n let input;\n try {\n input = block.partialJson ? JSON.parse(block.partialJson) : {};\n } catch {\n input = {};\n }\n\n content.push({\n type: \"tool_use\",\n id: block.id || `call_${Date.now()}_${Math.random()}`,\n name: block.name,\n input,\n });\n } else if (block.type === \"thinking\") {\n if (typeof block.text === \"string\" && block.text.length > 0) {\n content.push({\n type: \"thinking\",\n thinking: block.text,\n ...(typeof block.id === \"string\" ? { signature: block.id } : {}),\n });\n }\n } else if (block.type === \"redacted_thinking\") {\n if (typeof block.text === \"string\" && block.text.length > 0) {\n content.push({\n type: \"redacted_thinking\",\n data: block.text,\n });\n }\n }\n }\n\n return {\n content,\n stop_reason: this.stopReason,\n usage: { ...this.usage },\n };\n }\n\n #finalizeOpenAI(): {\n content: any[];\n stop_reason: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n } {\n const content: any[] = [];\n\n if (this.#openaiText) {\n const cleaned = this.#sanitize(this.#openaiText);\n if (cleaned) {\n content.push({ type: \"text\", text: cleaned });\n }\n }\n\n if (this.#openaiReasoningText) {\n content.unshift({\n type: \"thinking\",\n thinking: this.#openaiReasoningText,\n });\n }\n\n if (this.#openaiToolCalls.size > 0) {\n this.stopReason = \"tool_use\";\n\n for (const [, tc] of [...this.#openaiToolCalls.entries()].sort(\n (a, b) => a[0] - b[0],\n )) {\n let input;\n try {\n input = tc.args ? JSON.parse(tc.args) : {};\n } catch {\n input = {};\n }\n\n content.push({\n type: \"tool_use\",\n id: tc.id || `call_${Date.now()}_${Math.random()}`,\n name: tc.name,\n input,\n });\n }\n }\n\n return {\n content,\n stop_reason: this.stopReason,\n usage: { ...this.usage },\n };\n }\n\n #pushAnthropic(chunk: any): void {\n switch (chunk.type) {\n case \"message_start\": {\n if (chunk.message?.usage) {\n this.usage.input_tokens = chunk.message.usage.input_tokens || 0;\n this.usage.cache_read_input_tokens =\n chunk.message.usage.cache_read_input_tokens || 0;\n this.usage.cache_creation_input_tokens =\n chunk.message.usage.cache_creation_input_tokens || 0;\n }\n\n break;\n }\n\n case \"content_block_start\": {\n const idx = chunk.index ?? this.#anthropicBlocks.size;\n const block = chunk.content_block || {};\n\n this.#anthropicBlocks.set(idx, {\n type: block.type || \"text\",\n id: block.type === \"thinking\" ? block.signature : block.id,\n name: block.name,\n text: block.text || block.thinking || block.data || \"\",\n partialJson: block.type === \"tool_use\" ? \"\" : undefined,\n });\n\n if (block.type === \"tool_use\" && block.name) {\n this.callbacks.onToolStart?.(block.name);\n }\n\n break;\n }\n\n case \"content_block_delta\": {\n const idx = chunk.index ?? 0;\n let block = this.#anthropicBlocks.get(idx);\n if (!block) {\n const inferredType =\n chunk.delta?.type === \"input_json_delta\" ? \"tool_use\" : \"text\";\n\n block = {\n type: inferredType,\n text: inferredType === \"text\" ? \"\" : undefined,\n partialJson: inferredType === \"tool_use\" ? \"\" : undefined,\n };\n\n this.#anthropicBlocks.set(idx, block);\n }\n\n const delta = chunk.delta;\n if (!delta) {\n break;\n }\n\n if (delta.type === \"text_delta\" && typeof delta.text === \"string\") {\n const cleaned = this.#sanitize(delta.text);\n if (!cleaned) {\n break;\n }\n\n block.text = (block.text || \"\") + cleaned;\n this.callbacks.onText?.(cleaned);\n }\n\n if (\n delta.type === \"thinking_delta\" &&\n typeof delta.thinking === \"string\"\n ) {\n block.type = \"thinking\";\n block.text = (block.text || \"\") + delta.thinking;\n this.callbacks.onThinking?.(delta.thinking);\n }\n\n if (\n delta.type === \"signature_delta\" &&\n typeof delta.signature === \"string\"\n ) {\n block.type = \"thinking\";\n block.id = delta.signature;\n }\n\n if (\n delta.type === \"redacted_thinking_delta\" &&\n typeof delta.data === \"string\"\n ) {\n block.type = \"redacted_thinking\";\n block.text = (block.text || \"\") + delta.data;\n }\n\n if (\n delta.type === \"input_json_delta\" &&\n typeof delta.partial_json === \"string\"\n ) {\n block.partialJson = (block.partialJson || \"\") + delta.partial_json;\n }\n\n break;\n }\n\n case \"content_block_stop\":\n // No action needed; block is already accumulated\n\n break;\n\n case \"message_delta\": {\n if (chunk.delta?.stop_reason) {\n this.stopReason = chunk.delta.stop_reason;\n }\n\n if (chunk.usage) {\n this.usage.output_tokens = chunk.usage.output_tokens || 0;\n this.callbacks.onUsage?.(this.usage);\n }\n\n break;\n }\n\n case \"message_stop\":\n break;\n\n default:\n // Ignore ping, error events, etc.\n\n break;\n }\n }\n\n #pushOpenAI(chunk: any): void {\n // Handle usage in the final chunk (OpenAI includes it when stream_options.include_usage is set,\n // or in the last chunk for some providers)\n if (chunk.usage) {\n this.usage.input_tokens = chunk.usage.prompt_tokens || 0;\n this.usage.output_tokens = chunk.usage.completion_tokens || 0;\n this.usage.cache_read_input_tokens =\n chunk.usage.prompt_tokens_details?.cached_tokens || 0;\n this.callbacks.onUsage?.(this.usage);\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n return;\n }\n\n const delta = choice.delta;\n if (!delta) {\n return;\n }\n\n // Accumulate text content\n if (typeof delta.content === \"string\") {\n const cleaned = this.#sanitize(delta.content);\n if (cleaned) {\n this.#openaiText += cleaned;\n this.callbacks.onText?.(cleaned);\n }\n }\n\n // Accumulate reasoning content from OpenAI-compatible providers that expose\n // thought tokens separately from user-visible assistant text.\n if (typeof delta.reasoning === \"string\") {\n this.#openaiReasoningText += delta.reasoning;\n this.callbacks.onThinking?.(delta.reasoning);\n } else if (delta.reasoning && typeof delta.reasoning === \"object\") {\n const reasoningObj: any = delta.reasoning;\n if (typeof reasoningObj.content === \"string\") {\n this.#openaiReasoningText += reasoningObj.content;\n this.callbacks.onThinking?.(reasoningObj.content);\n } else if (typeof reasoningObj.text === \"string\") {\n this.#openaiReasoningText += reasoningObj.text;\n this.callbacks.onThinking?.(reasoningObj.text);\n }\n }\n\n // Accumulate tool calls\n if (Array.isArray(delta.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n\n if (!this.#openaiToolCalls.has(idx)) {\n this.#openaiToolCalls.set(idx, {\n id: tc.id || \"\",\n name: tc.function?.name || \"\",\n args: \"\",\n });\n\n if (tc.function?.name) {\n this.callbacks.onToolStart?.(tc.function.name);\n }\n }\n\n const existing = this.#openaiToolCalls.get(idx);\n if (!existing) {\n continue;\n }\n\n if (tc.id) {\n existing.id = tc.id;\n }\n\n if (tc.function?.name) {\n existing.name = tc.function.name;\n }\n\n if (tc.function?.arguments) {\n existing.args += tc.function.arguments;\n }\n }\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n if (choice.finish_reason === \"tool_calls\") {\n this.stopReason = \"tool_use\";\n } else if (choice.finish_reason === \"stop\") {\n this.stopReason = \"end_turn\";\n } else {\n this.stopReason = choice.finish_reason;\n }\n }\n }\n\n #sanitize(text: string): string {\n return sanitizeModelOutput(text, this.callbacks.source ?? this.format);\n }\n}\n","import { ToolDefinition } from \"../../subsystems/tools/types.js\";\n\ninterface ToolState {\n enabledTools: ToolDefinition[];\n systemPromptOverride: string;\n}\n\n/**\n * Worker-side tool state cache per groupId.\n * This allows the worker to reflect tool management changes in the middle\n * of an agent invocation loop.\n */\nconst toolStateMap = new Map<string, ToolState>();\n\nexport function setToolState(\n groupId: string,\n enabledTools: ToolDefinition[],\n systemPromptOverride: string,\n) {\n toolStateMap.set(groupId, { enabledTools, systemPromptOverride });\n}\n\nexport function getToolState(groupId: string): ToolState | undefined {\n return toolStateMap.get(groupId);\n}\n\nexport function clearToolState(groupId: string) {\n toolStateMap.delete(groupId);\n}\n","import {\n DEFAULT_MAX_ITERATIONS,\n getProvider,\n ProviderConfig,\n} from \"../../config/config.js\";\nimport { isHeadlessMode, filterHeadlessTools } from \"../../config/headless.js\";\n\nimport { buildDynamicContext } from \"../../context/build-dynamic-context.js\";\nimport { estimateTokens } from \"../../context/estimate-tokens.js\";\n\nimport {\n buildHeaders,\n formatRequest,\n getContextLimit,\n normalizeMeshLlmResult,\n parseResponse,\n} from \"../../subsystems/providers/providers.js\";\n\nimport { setStorageRoot } from \"../../storage/storage.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { createTokenUsageMessage } from \"./create-token-usage-message.js\";\nimport { createToolActivityMessage } from \"./create-tool-activity-message.js\";\nimport { executeTool } from \"./execute-tool.js\";\nimport { log } from \"./log.js\";\nimport { parseSSEStream } from \"./parse-sse-stream.js\";\n\nimport {\n post,\n registerSubagentCollector,\n unregisterSubagentCollector,\n} from \"./post.js\";\n\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport {\n RateLimitConfig,\n updateRateLimitFromHeaders,\n waitForRateLimitSlot,\n} from \"./rate-limit.js\";\n\nimport { ContentBlock, ToolResultContentBlock } from \"../../content/types.js\";\nimport { dispatchSubagentInvoke } from \"../../core/orchestrator/utils/dispatch-subagent-invoke.js\";\nimport { InvokePayload } from \"../../subsystems/worker/types.js\";\nimport { StreamAccumulator } from \"../stream-accumulator/stream-accumulator.js\";\nimport { StreamFormat } from \"../stream-accumulator/types.js\";\n\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { clearToolState, getToolState } from \"./tool-state.js\";\nimport { isRetryableHttpError, withRetry } from \"../../utils/retry.js\";\n\nimport type { SubagentInvokeContext, ToolResult } from \"./execute-tool.js\";\n\n/**\n * Throttle interval (ms) for streaming text chunks sent to the UI.\n * Keeps the main thread responsive during fast token delivery.\n */\nconst STREAM_THROTTLE_MS = 50;\n\ntype ParsedToolCodeBlock = {\n toolBlocks: Array<{\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, any>;\n }>;\n residualText: string;\n};\n\nfunction parseToolCodeBlock(\n text: string,\n allowedToolNames: Set<string>,\n): ParsedToolCodeBlock {\n const trimmed = text.trim();\n const wrappedMatch = trimmed.match(\n /^\\[tool_code\\]([\\s\\S]*?)\\[\\/tool_code\\]$/i,\n );\n if (!wrappedMatch?.[1]) {\n return { toolBlocks: [], residualText: text };\n }\n\n const body = wrappedMatch[1].trim();\n\n const printMatch = body.match(\n /^print\\s*\\(\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(\\s*(.*?)\\s*\\)\\s*\\)$/s,\n );\n\n const directMatch = body.match(\n /^([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(\\s*(.*?)\\s*\\)$/s,\n );\n\n const match = printMatch || directMatch;\n if (!match?.[1]) {\n return { toolBlocks: [], residualText: text };\n }\n\n const toolName = match[1];\n if (!allowedToolNames.has(toolName)) {\n return { toolBlocks: [], residualText: text };\n }\n\n const rawArgs = (match[2] || \"\").trim();\n let input: Record<string, any> = {};\n if (rawArgs) {\n if (!rawArgs.startsWith(\"{\") || !rawArgs.endsWith(\"}\")) {\n return { toolBlocks: [], residualText: text };\n }\n\n try {\n const parsed = JSON.parse(rawArgs);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { toolBlocks: [], residualText: text };\n }\n\n input = parsed as Record<string, any>;\n } catch {\n return { toolBlocks: [], residualText: text };\n }\n }\n\n return {\n toolBlocks: [\n {\n type: \"tool_use\",\n id: `tool_code_${Date.now()}_${Math.random()}`,\n name: toolName,\n input,\n },\n ],\n residualText: \"\",\n };\n}\n\nfunction normalizeToolCodeResponses(result: any, enabledTools: any[]): any {\n if (\n !result ||\n result.stop_reason === \"tool_use\" ||\n !Array.isArray(result.content)\n ) {\n return result;\n }\n\n const allowedToolNames = new Set(\n (enabledTools || [])\n .map((tool: any) => (typeof tool?.name === \"string\" ? tool.name : \"\"))\n .filter(Boolean),\n );\n\n if (allowedToolNames.size === 0) {\n return result;\n }\n\n const normalizedContent: any[] = [];\n let convertedAny = false;\n\n for (const block of result.content) {\n if (block?.type !== \"text\" || typeof block.text !== \"string\") {\n normalizedContent.push(block);\n\n continue;\n }\n\n const parsed = parseToolCodeBlock(block.text, allowedToolNames);\n if (parsed.toolBlocks.length > 0) {\n convertedAny = true;\n if (parsed.residualText.trim()) {\n normalizedContent.push({ type: \"text\", text: parsed.residualText });\n }\n\n normalizedContent.push(...parsed.toolBlocks);\n\n continue;\n }\n\n normalizedContent.push(block);\n }\n\n if (!convertedAny) {\n return result;\n }\n\n return {\n ...result,\n content: normalizedContent,\n stop_reason: \"tool_use\",\n };\n}\n\nfunction buildToolResultsFallbackText(toolResults: ContentBlock[]): string {\n const lines = toolResults\n .filter((entry) => entry?.type === \"tool_result\")\n .map((entry) => {\n if (typeof (entry as any).content === \"string\") {\n return (entry as any).content.trim();\n }\n\n if (Array.isArray((entry as any).content)) {\n return ((entry as any).content as ToolResultContentBlock[])\n .filter((block) => block.type === \"text\")\n .map((block) => (block as { type: \"text\"; text: string }).text)\n .join(\"\\n\")\n .trim();\n }\n\n return JSON.stringify((entry as any).content).trim();\n })\n .filter(Boolean);\n\n if (lines.length === 0) {\n return \"\";\n }\n\n return lines.join(\"\\n\\n\").slice(0, 10_000);\n}\n\nfunction formatToolFallbackResponseText(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return \"\";\n }\n\n return `Tool result:\\n${trimmed}`;\n}\n\nexport type NodeTransformersCompletionExecutor = (options: {\n modelId: string;\n messages: any[];\n tools?: any[];\n maxTokens?: number;\n verbose?: boolean;\n onToken?: (text: string) => void;\n onProgress?: (info: any) => void;\n abortSignal?: AbortSignal;\n}) => Promise<any>;\n\nlet _nodeTransformersCompletionExecutor: NodeTransformersCompletionExecutor | null =\n null;\n\nexport function setNodeTransformersCompletionExecutor(\n executor: NodeTransformersCompletionExecutor | null,\n): void {\n _nodeTransformersCompletionExecutor = executor;\n}\n\nexport type NodeLlamafileCompletionExecutor = (options: {\n model: string;\n messages: any[];\n tools?: any[];\n maxTokens?: number;\n abortSignal?: AbortSignal;\n verbose?: boolean;\n onToken?: (text: string) => void;\n service?: any;\n}) => Promise<any>;\n\nlet _nodeLlamafileCompletionExecutor: NodeLlamafileCompletionExecutor | null =\n null;\n\nexport function setNodeLlamafileCompletionExecutor(\n executor: NodeLlamafileCompletionExecutor | null,\n): void {\n _nodeLlamafileCompletionExecutor = executor;\n}\n\n/**\n * Handle agent invocation with tool-use loop\n */\nexport async function handleInvoke(\n db: any,\n payload: InvokePayload & { isScheduledTask?: boolean },\n abortSignal?: AbortSignal,\n): Promise<void> {\n const {\n apiKey,\n assistantName,\n contextCompression = false,\n contextLimit: payloadContextLimit,\n enabledTools,\n groupId: originalGroupId,\n isScheduledTask = false,\n maxIterations: payloadMaxIterations,\n maxTokens,\n memory,\n messages,\n model,\n provider: providerId,\n providerHeaders = {},\n providerRuntimeOverrides,\n reasoning,\n rateLimitAutoAdapt = true,\n rateLimitCallsPerMinute = 0,\n storageHandle,\n streaming = false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedModel,\n subagentPinnedProvider,\n systemPrompt,\n workspaceGroupId,\n } = payload;\n\n const isSubagentTask = !!payload.subagentTask;\n const groupId = isSubagentTask\n ? originalGroupId.startsWith(\"subagent:\")\n ? originalGroupId\n : `subagent:${ulid()}`\n : originalGroupId;\n const effectiveWorkspaceGroupId = workspaceGroupId || originalGroupId;\n\n if (isSubagentTask) {\n registerSubagentCollector(groupId, []);\n }\n\n const rateLimitConfig: RateLimitConfig = {\n autoAdapt: rateLimitAutoAdapt !== false,\n callsPerMinute: Number.isFinite(rateLimitCallsPerMinute)\n ? Math.max(0, Math.floor(rateLimitCallsPerMinute))\n : 0,\n };\n\n if (storageHandle) {\n setStorageRoot(storageHandle);\n }\n\n const provider = getProvider(providerId);\n if (!provider) {\n post({\n payload: { groupId, error: `Unknown provider: ${providerId}` },\n type: \"error\",\n });\n\n return;\n }\n\n const typedProvider = (\n payload.baseUrl ? { ...provider, baseUrl: payload.baseUrl } : provider\n ) as ProviderConfig;\n\n // Determine whether we can actually use streaming for this provider.\n const useStreaming =\n streaming &&\n typedProvider.supportsStreaming === true &&\n typedProvider.format !== \"prompt_api\";\n\n post({ type: \"typing\", payload: { groupId } });\n\n log(\n groupId,\n \"info\",\n \"Starting\",\n `Provider: ${typedProvider.name} · Model: ${model} · Max tokens: ${maxTokens} · Streaming: ${useStreaming ? \"on\" : \"off\"}${streaming && !useStreaming ? \" (provider does not support streaming)\" : \"\"}`,\n );\n\n try {\n let currentMessages = [...messages];\n let iterations = 0;\n\n const maxIterations =\n typeof payloadMaxIterations === \"number\" && payloadMaxIterations > 0\n ? payloadMaxIterations\n : DEFAULT_MAX_ITERATIONS;\n\n let currentTools = Array.isArray(enabledTools)\n ? enabledTools\n : TOOL_DEFINITIONS;\n\n if (isHeadlessMode()) {\n currentTools = filterHeadlessTools(currentTools as any);\n }\n\n let currentSystemPrompt = systemPrompt;\n let latestToolResultsFallbackText = \"\";\n\n // Build the invoke context for spawn_subagent to inherit\n const invokeContext: SubagentInvokeContext = {\n apiKey,\n assistantName: assistantName ?? \"\",\n db,\n enabledTools: currentTools as any,\n invokeSubagent: (subPayload) =>\n dispatchSubagentInvoke(db, subPayload, abortSignal),\n maxTokens,\n memory: memory ?? \"\",\n model,\n provider: providerId,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n providerHeaders,\n providerRuntimeOverrides,\n storageHandle,\n streaming: false, // subagents always use non-streaming for clean capture\n systemPrompt: currentSystemPrompt ?? \"\",\n };\n\n // Track exact tool calls to prevent loops\n const toolCallHistory: string[] = [];\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Check for mid-invocation tool updates from main thread\n const updatedState = getToolState(groupId);\n if (updatedState) {\n currentTools = updatedState.enabledTools;\n currentSystemPrompt = buildSystemPrompt(\n assistantName,\n memory,\n currentTools,\n updatedState.systemPromptOverride,\n undefined,\n undefined,\n { groupId },\n );\n }\n\n const contextLimit = payloadContextLimit ?? getContextLimit(model);\n const systemPromptTokens = estimateTokens(currentSystemPrompt);\n\n // Re-evaluate context dynamically for each API call to handle large tool outputs\n const { messages: payloadMessages, estimatedTokens } =\n buildDynamicContext(currentMessages as any, {\n contextLimit,\n maxOutputTokens: maxTokens,\n skimTop: contextCompression,\n systemPromptTokens,\n });\n\n // Strict proxy boundaries (e.g. Azure OpenAI) calculate: prompt_tokens + max_tokens <= context_window.\n const SAFETY_BUFFER = 500;\n const totalPromptEstimate =\n (estimatedTokens as number) + systemPromptTokens;\n\n // Mathematically guarantee we don't overflow the strict provider budget\n const safeMaxTokens = Math.max(\n 100, // floor\n Math.min(maxTokens, contextLimit - totalPromptEstimate - SAFETY_BUFFER),\n );\n\n const body = formatRequest(\n typedProvider,\n payloadMessages,\n currentTools as any,\n {\n contextCompression,\n maxTokens: safeMaxTokens,\n model,\n reasoning,\n system: currentSystemPrompt,\n },\n );\n\n log(\n groupId,\n \"api-call\",\n `API call #${iterations}`,\n `${payloadMessages.length} messages in context`,\n );\n\n const headers = {\n ...buildHeaders(typedProvider, apiKey),\n ...providerHeaders,\n };\n\n const url = typedProvider.baseUrl;\n\n let result: any;\n\n if (\n isHeadlessMode() &&\n providerId === \"transformers_js_local\" &&\n _nodeTransformersCompletionExecutor\n ) {\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n }\n\n const rawResult = await _nodeTransformersCompletionExecutor({\n modelId: model,\n messages: body?.messages || payloadMessages,\n tools: currentTools as any[],\n maxTokens: safeMaxTokens,\n abortSignal,\n verbose: Boolean(payload.verbose),\n onToken: (text: string) => {\n if (useStreaming && text) {\n post({\n payload: { groupId, text },\n type: \"streaming-chunk\",\n });\n }\n },\n onProgress: (info: any) => {\n if (\n info?.status === \"progress\" ||\n info?.status === \"progress_total\"\n ) {\n let pct: number | null = null;\n if (typeof info.progress === \"number\") {\n const rawPct =\n info.progress <= 1 && info.progress > 0 && !info.total\n ? info.progress * 100\n : typeof info.loaded === \"number\" &&\n typeof info.total === \"number\" &&\n info.total > 0\n ? (info.loaded / info.total) * 100\n : info.progress;\n pct = Math.max(0, Math.min(100, Math.round(rawPct)));\n }\n post({\n payload: {\n groupId,\n label: \"Model Progress\",\n message: `${info.file || model}: ${pct !== null ? `${pct}%` : \"loading...\"}`,\n },\n type: \"status\",\n });\n }\n },\n });\n result = parseResponse(typedProvider, rawResult);\n } else if (\n isHeadlessMode() &&\n (providerId === \"llamafile\" || providerId === \"agentfile\") &&\n _nodeLlamafileCompletionExecutor\n ) {\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n }\n\n const rawResult = await _nodeLlamafileCompletionExecutor({\n model,\n messages: body?.messages || payloadMessages,\n tools: (body?.tools ?? currentTools) as any[],\n maxTokens: safeMaxTokens,\n abortSignal,\n verbose: Boolean(payload.verbose),\n onToken: (text: string) => {\n if (useStreaming && text) {\n post({\n payload: { groupId, text },\n type: \"streaming-chunk\",\n });\n }\n },\n });\n result = parseResponse(typedProvider, rawResult);\n } else if (useStreaming) {\n result = await callWithStreaming(\n providerId,\n typedProvider,\n url,\n headers,\n body,\n groupId,\n model,\n rateLimitConfig,\n abortSignal,\n );\n } else {\n result = await callApi(\n providerId,\n typedProvider,\n url,\n headers,\n body,\n groupId,\n rateLimitConfig,\n abortSignal,\n );\n }\n\n result = normalizeToolCodeResponses(result, currentTools as any[]);\n\n // Emit token usage\n if (result.usage) {\n post(\n createTokenUsageMessage(\n groupId,\n result.usage,\n getContextLimit(model),\n ),\n );\n }\n\n // Log text blocks\n for (const block of result.content) {\n if (block.type === \"text\" && block.text) {\n const preview =\n block.text.length > 200\n ? block.text.slice(0, 200) + \"…\"\n : block.text;\n\n log(groupId, \"text\", \"Response text\", preview);\n }\n }\n\n if (result.stop_reason === \"tool_use\") {\n const allowedToolNames = new Set(\n (currentTools as any[])\n .map((tool: any) =>\n typeof tool?.name === \"string\" ? tool.name : \"\",\n )\n .filter(Boolean),\n );\n\n // If the response includes text alongside tool calls, persist it\n const intermediateText = result.content\n .filter((b: any) => b.type === \"text\")\n .map((b: any) => b.text)\n .join(\"\")\n .replace(/<internal>[\\s\\S]*?<\\/internal>/g, \"\")\n .trim();\n\n if (intermediateText) {\n post({\n payload: { groupId, text: intermediateText },\n type: \"intermediate-response\",\n });\n }\n\n // If we were streaming text before tool calls, clear the streaming bubble\n if (useStreaming) {\n post({\n payload: { groupId },\n type: \"streaming-end\",\n });\n }\n\n // Execute tool calls\n const toolResults: ContentBlock[] = [];\n for (const block of result.content) {\n if (block.type === \"tool_use\") {\n const isAllowed = allowedToolNames.has(block.name);\n\n // Prevent infinite loops by detecting repeated identical tool calls\n const toolCallSignature = `${block.name}:${JSON.stringify(block.input)}`;\n const timesCalled = toolCallHistory.filter(\n (s) => s === toolCallSignature,\n ).length;\n\n toolCallHistory.push(toolCallSignature);\n\n if (!isAllowed) {\n const blockedMessage =\n `SYSTEM ERROR: Tool '${block.name}' is disabled or unavailable for this request. ` +\n \"Do not call it again. Try a different approach or ask the user for help.\";\n\n log(groupId, \"warning\", \"Tool blocked\", blockedMessage);\n\n toolResults.push({\n content: blockedMessage,\n tool_use_id: block.id,\n type: \"tool_result\",\n });\n\n continue;\n }\n\n const inputPreview = JSON.stringify(block.input);\n const inputShort =\n inputPreview.length > 300\n ? inputPreview.slice(0, 300) + \"…\"\n : inputPreview;\n\n log(groupId, \"tool-call\", `Tool: ${block.name}`, inputShort);\n\n post(createToolActivityMessage(groupId, block.name, \"running\"));\n\n let output: ToolResult;\n if (timesCalled >= 3) {\n output = `SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${timesCalled + 1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`;\n\n console.warn(\n `[Worker] Blocked repetitive tool call:`,\n toolCallSignature,\n );\n } else {\n output = await executeTool(\n db,\n block.name,\n block.input,\n effectiveWorkspaceGroupId,\n {\n allowedTools: currentTools,\n isScheduledTask,\n invokeContext,\n },\n );\n }\n\n const outputStr =\n typeof output === \"string\" ? output : JSON.stringify(output);\n\n const outputShort =\n outputStr.length > 500\n ? outputStr.slice(0, 500) + \"…\"\n : outputStr;\n\n log(groupId, \"tool-result\", `Result: ${block.name}`, outputShort);\n\n post(createToolActivityMessage(groupId, block.name, \"done\"));\n\n if (Array.isArray(output)) {\n toolResults.push({\n content: output as ToolResultContentBlock[],\n tool_use_id: block.id,\n name: block.name,\n type: \"tool_result\",\n });\n } else {\n toolResults.push({\n content:\n typeof output === \"string\"\n ? output.slice(0, 100_000)\n : JSON.stringify(output).slice(0, 100_000),\n tool_use_id: block.id,\n name: block.name,\n type: \"tool_result\",\n });\n }\n }\n }\n\n // Continue conversation with tool results\n latestToolResultsFallbackText =\n buildToolResultsFallbackText(toolResults);\n\n currentMessages.push({ role: \"assistant\", content: result.content });\n currentMessages.push({ role: \"user\", content: toolResults as any });\n\n post({ type: \"typing\", payload: { groupId } });\n } else {\n // Final response\n const text = result.content\n .filter((b: any) => b.type === \"text\")\n .map((b: any) => b.text)\n .join(\"\");\n\n const cleaned = text\n .replace(/<internal>[\\s\\S]*?<\\/internal>/g, \"\")\n .trim();\n\n const isPlaceholderOnly = cleaned.toLowerCase() === \"(no response)\";\n const preferredModelText = isPlaceholderOnly ? \"\" : cleaned;\n const finalText = preferredModelText\n ? preferredModelText\n : latestToolResultsFallbackText\n ? formatToolFallbackResponseText(latestToolResultsFallbackText)\n : \"(no response)\";\n\n // If streaming was used, the text was already streamed chunk-by-chunk.\n if (useStreaming) {\n post({\n payload: { groupId, text: finalText },\n type: \"streaming-done\",\n });\n }\n\n post({\n payload: { groupId, text: finalText },\n type: \"response\",\n });\n\n return;\n }\n }\n\n // Max iterations reached\n post({\n payload: {\n text: `⚠️ Reached maximum tool-use iterations (${maxIterations}). Stopping to avoid excessive API usage.`,\n groupId,\n },\n type: \"response\",\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n\n // If we were streaming when the error occurred, preserve partial content\n if (useStreaming) {\n post({\n payload: { groupId, error: message },\n type: \"streaming-error\",\n });\n }\n\n post({ type: \"error\", payload: { groupId, error: message } });\n } finally {\n clearToolState(groupId);\n if (isSubagentTask) {\n unregisterSubagentCollector(groupId);\n }\n }\n}\n\n/**\n * Make a non-streaming LLM API call with retry.\n */\nasync function callApi(\n providerId: string,\n typedProvider: ProviderConfig,\n url: string,\n headers: Record<string, string>,\n body: any,\n groupId: string,\n rateLimitConfig: RateLimitConfig,\n abortSignal?: AbortSignal,\n): Promise<any> {\n return withRetry(\n async () => {\n await waitForRateLimitSlot(\n providerId,\n groupId,\n rateLimitConfig,\n abortSignal,\n );\n\n const res = await fetch(url, {\n body: JSON.stringify(body),\n headers,\n method: \"POST\",\n signal: abortSignal,\n });\n\n updateRateLimitFromHeaders(providerId, res.headers, rateLimitConfig);\n\n if (!res.ok) {\n const errBody = await res.text();\n const error = new Error(\n `${typedProvider.name} API error ${res.status}: ${errBody}`,\n );\n (error as any).status = res.status;\n\n throw error;\n }\n\n const rawResult = await res.json();\n\n return parseResponse(typedProvider, rawResult);\n },\n {\n baseDelayMs: 2000,\n jitterFactor: 0.5,\n maxDelayMs: 30_000,\n maxRetries: 3,\n onRetry: (_attempt, _maxRetries, _delayMs, _error) => {\n const errMsg =\n _error instanceof Error ? _error.message : String(_error);\n\n log(\n groupId,\n \"warning\",\n `Retrying API call (${_attempt}/${_maxRetries})`,\n errMsg,\n );\n\n post({\n type: \"show-toast\",\n payload: {\n message: `LLM API: Retrying (${_attempt}/${_maxRetries})… ${errMsg.slice(0, 120)}`,\n type: \"warning\",\n duration: 5000,\n },\n });\n },\n shouldRetry: (error) => isRetryableHttpError(error),\n signal: abortSignal,\n },\n );\n}\n\n/**\n * Make a streaming LLM API call.\n */\nasync function callWithStreaming(\n providerId: string,\n typedProvider: ProviderConfig,\n url: string,\n headers: Record<string, string>,\n body: any,\n groupId: string,\n model: string,\n rateLimitConfig: RateLimitConfig,\n abortSignal?: AbortSignal,\n): Promise<any> {\n // Add stream flag to the request body\n const streamBody = {\n ...body,\n stream: true,\n // For OpenAI-compatible APIs, request usage in the stream\n ...((typedProvider.format === \"openai\" ||\n typedProvider.format === \"mesh-llm\") && {\n stream_options: { include_usage: true },\n }),\n };\n\n await waitForRateLimitSlot(providerId, groupId, rateLimitConfig, abortSignal);\n\n const res = await fetch(url, {\n body: JSON.stringify(streamBody),\n headers,\n method: \"POST\",\n signal: abortSignal,\n });\n\n updateRateLimitFromHeaders(providerId, res.headers, rateLimitConfig);\n\n if (!res.ok) {\n const errBody = await res.text();\n const error = new Error(\n `${typedProvider.name} API error ${res.status}: ${errBody}`,\n );\n\n (error as any).status = res.status;\n\n throw error;\n }\n\n if (!res.body) {\n throw new Error(\"Streaming response has no body\");\n }\n\n // Signal the UI that a streaming response is starting\n post({\n payload: { groupId },\n type: \"streaming-start\",\n });\n\n let lastChunkTime = 0;\n let pendingText = \"\";\n let lastReasoningChunkTime = 0;\n let pendingReasoning = \"\";\n\n const flushReasoning = (force = false) => {\n const now = Date.now();\n if (!pendingReasoning) {\n return;\n }\n\n if (!force && now - lastReasoningChunkTime < STREAM_THROTTLE_MS) {\n return;\n }\n\n const message =\n pendingReasoning.length > 400\n ? `${pendingReasoning.slice(0, 400)}…`\n : pendingReasoning;\n\n log(groupId, \"info\", \"Reasoning\", message);\n pendingReasoning = \"\";\n lastReasoningChunkTime = now;\n };\n\n const accumulator = new StreamAccumulator(\n typedProvider.format as StreamFormat,\n {\n source: typedProvider.id,\n onText: (text) => {\n const now = Date.now();\n\n // Always buffer incoming text\n pendingText += text;\n\n // Flush to the UI only when the throttle interval has elapsed\n if (now - lastChunkTime >= STREAM_THROTTLE_MS) {\n post({\n payload: { groupId, text: pendingText },\n type: \"streaming-chunk\",\n });\n\n pendingText = \"\";\n lastChunkTime = now;\n }\n },\n onToolStart: (name) => {\n post(createToolActivityMessage(groupId, name, \"running\"));\n },\n onUsage: (usage) => {\n post(createTokenUsageMessage(groupId, usage, getContextLimit(model)));\n },\n onThinking: (text) => {\n pendingReasoning += text;\n flushReasoning(false);\n },\n },\n );\n\n for await (const chunk of parseSSEStream(res.body, abortSignal)) {\n accumulator.push(chunk);\n }\n\n // Flush any remaining buffered text that didn't make it through the throttle\n if (pendingText) {\n post({\n payload: { groupId, text: pendingText },\n type: \"streaming-chunk\",\n });\n }\n\n flushReasoning(true);\n\n let finalResult = accumulator.finalize();\n\n // Mesh LLM streams standard OpenAI SSE chunks but its assembled text may\n // contain proprietary markers for thoughts and tool calls.\n // We normalize the final assembled object before the agent loop consumes it.\n if (typedProvider.format === \"mesh-llm\") {\n finalResult = normalizeMeshLlmResult(finalResult);\n }\n\n return finalResult;\n}\n","import { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport {\n invokeWithLiteRtLm,\n isLiteRtLmSupported,\n} from \"../../../subsystems/providers/litert-lm-provider.js\";\n\nimport {\n invokeWithPromptApi,\n isPromptApiSupported,\n} from \"../../../subsystems/providers/prompt-api-provider.js\";\n\nimport { invokeWithTransformersJs } from \"../../../subsystems/providers/transformers-js-provider.js\";\n\nimport { InvokePayload } from \"../../../subsystems/worker/types.js\";\nimport { handleInvoke } from \"../../../worker/utils/handle-invoke.js\";\nimport { post as workerPost } from \"../../../worker/utils/post.js\";\n\ntype SubagentPayload = InvokePayload & { isScheduledTask?: boolean };\n\nconst BROWSER_PROVIDER_IDS = new Set([\n \"litert_lm_browser\",\n \"prompt_api\",\n \"transformers_js_browser\",\n]);\n\nexport function isBrowserProviderId(providerId: string | undefined): boolean {\n return !!providerId && BROWSER_PROVIDER_IDS.has(providerId);\n}\n\nexport async function dispatchSubagentInvoke(\n db: ShadowClawDatabase,\n payload: SubagentPayload,\n abortSignal?: AbortSignal | undefined,\n): Promise<void> {\n const providerId = payload.provider;\n\n const emit = async (msg: any) => {\n workerPost(msg);\n };\n\n if (providerId === \"transformers_js_browser\") {\n await invokeWithTransformersJs(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.enabledTools,\n payload.model,\n );\n\n return;\n }\n\n if (providerId === \"prompt_api\") {\n if (!isPromptApiSupported()) {\n throw new Error(\n \"Prompt API provider is not supported in this environment.\",\n );\n }\n\n await invokeWithPromptApi(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.enabledTools,\n );\n\n return;\n }\n\n if (providerId === \"litert_lm_browser\") {\n if (!isLiteRtLmSupported()) {\n throw new Error(\n \"Litert LM Browser provider is not supported in this environment.\",\n );\n }\n\n await invokeWithLiteRtLm(\n db,\n payload.groupId,\n payload.systemPrompt,\n payload.messages,\n payload.maxTokens,\n emit,\n abortSignal,\n payload.model,\n payload.enabledTools,\n );\n\n return;\n }\n\n await handleInvoke(db, payload, abortSignal);\n}\n","import {\n CONFIG_KEYS,\n DEFAULT_PROMPT_API_FALLBACK_MODEL,\n getModelMaxTokens,\n getProvider,\n} from \"../../../config/config.js\";\n\nimport { buildDynamicContext } from \"../../../context/build-dynamic-context.js\";\nimport { estimateTokens } from \"../../../context/estimate-tokens.js\";\n\nimport { buildConversationMessages } from \"../../../db/build-conversation-messages.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { listGroups } from \"../../../db/groups.js\";\nimport { saveMessage } from \"../../../db/save-message.js\";\n\nimport { readGroupFile } from \"../../../storage/read-group-file.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../../stores/tools.js\";\n\nimport {\n invokeWithLiteRtLm,\n isLiteRtLmSupported,\n} from \"../../../subsystems/providers/litert-lm-provider.js\";\n\nimport {\n invokeWithPromptApi,\n isPromptApiSupported,\n} from \"../../../subsystems/providers/prompt-api-provider.js\";\nimport { ensureBuiltinAiPolyfills } from \"../../../subsystems/providers/builtin-ai-tasks.js\";\n\nimport { getContextLimit } from \"../../../subsystems/providers/providers.js\";\nimport { invokeWithTransformersJs } from \"../../../subsystems/providers/transformers-js-provider.js\";\nimport { ulid } from \"../../../utils/ulid.js\";\nimport { buildSystemPrompt } from \"../../../worker/utils/system-prompt.js\";\nimport { discoverSkills } from \"../../../subsystems/skills/discover-skills.js\";\nimport { activate_skill } from \"../../../subsystems/skills/tool.js\";\nimport { loadDeclarativeTools } from \"../../../subsystems/tools/declarative.js\";\n\nimport { compactContext } from \"./compact-context.js\";\nimport { deliverResponse } from \"./deliver-response.js\";\nimport { dispatchSubagentInvoke } from \"./dispatch-subagent-invoke.js\";\nimport { handleWorkerMessage } from \"./handle-worker-message.js\";\nimport { getChannelTypeForGroup } from \"./operations/channel.js\";\n\nimport {\n getApiKeyForRequest,\n getProviderRuntimeHeaders,\n getReasoningConfig,\n startTransformersProgressPolling,\n} from \"./operations/provider.js\";\n\nimport type { ShadowClawDatabase } from \"../../../db/db.js\";\nimport type { ToolDefinition } from \"../../../subsystems/tools/types.js\";\nimport type { SubagentInvokeContext } from \"../../../worker/tools/spawn-subagent/spawn-subagent.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport async function invokeAgent(\n o: Orchestrator,\n db: ShadowClawDatabase,\n groupId: string,\n triggerContent: string,\n freshContext = false,\n subagent = false,\n): Promise<void> {\n const executionGroupId = subagent ? `subagent:${ulid()}` : groupId;\n\n o.inFlightTriggerByGroup.set(executionGroupId, triggerContent);\n o.setState(\"thinking\", executionGroupId);\n o.router?.setTyping(executionGroupId, true);\n o.events.emit(\"typing\", { groupId: executionGroupId, typing: true });\n\n // Save scheduled task as client message\n if (triggerContent.startsWith(\"[SCHEDULED TASK]\")) {\n o.pendingScheduledTasks.add(groupId);\n\n const stored = {\n id: ulid(),\n groupId,\n sender: \"Scheduler\",\n content: triggerContent,\n timestamp: Date.now(),\n channel: getChannelTypeForGroup(o, groupId),\n isFromMe: false,\n isTrigger: true,\n };\n\n await saveMessage(db, stored);\n\n o.events.emit(\"message\", stored);\n }\n\n // Load group memory\n let memory = \"\";\n try {\n memory = await readGroupFile(db, groupId, \"MEMORY.md\");\n } catch {}\n\n // Load group metadata to check for conversation-specific pinned tools\n const groups = await listGroups(db);\n const group = groups.find((g) => g.groupId === groupId);\n\n const effectiveProviderId = group?.pinnedProvider ?? o.provider;\n\n // When a provider is pinned but no specific model is pinned, default to that provider's own defaultModel\n const effectiveModel =\n group?.pinnedModel ??\n (group?.pinnedProvider\n ? (getProvider(group.pinnedProvider)?.defaultModel ?? o.model)\n : o.model);\n\n const configuredMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : o.maxTokens;\n\n let modelForTokenLimits = effectiveModel;\n if (\n effectiveProviderId === \"prompt_api\" &&\n (effectiveModel === \"browser-built-in\" || !effectiveModel) &&\n !isPromptApiSupported()\n ) {\n const configuredFallback = await getConfig(\n db,\n CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL,\n );\n modelForTokenLimits =\n configuredFallback || DEFAULT_PROMPT_API_FALLBACK_MODEL;\n }\n\n const effectiveMaxTokens = Math.max(\n 1,\n Math.min(configuredMaxTokens, getModelMaxTokens(modelForTokenLimits)),\n );\n\n const effectiveProviderConfig =\n getProvider(effectiveProviderId) ?? o.providerConfig;\n\n // Track the effective provider for this group so the error handler\n // can show the right help UI and avoid showing the wrong provider's error.\n o.inFlightEffectiveProviderByGroup.set(executionGroupId, {\n providerId: effectiveProviderId,\n providerConfig: effectiveProviderConfig,\n model: effectiveModel,\n });\n\n // Use pinned tools if set; otherwise fallback to global enabled tools.\n const configuredTools = Array.isArray(group?.toolTags)\n ? toolsStore.allTools.filter((t) => group.toolTags!.includes(t.name))\n : toolsStore.enabledTools;\n const declarativeToolResult = await loadDeclarativeTools(\n db,\n executionGroupId,\n );\n const rawDeclarativeTools = declarativeToolResult.tools.filter(\n (tool) =>\n !toolsStore.allTools.some((builtIn) => builtIn.name === tool.name),\n );\n const declarativeTools = Array.isArray(group?.toolTags)\n ? rawDeclarativeTools.filter((tool) => group.toolTags!.includes(tool.name))\n : rawDeclarativeTools.filter((tool) =>\n toolsStore.isDeclarativeToolEnabled(tool.name),\n );\n const toolsWithDeclarative = [...configuredTools, ...declarativeTools];\n const skillDiscovery = await discoverSkills(db, executionGroupId);\n const activeTools =\n skillDiscovery.skills.length > 0 &&\n !toolsWithDeclarative.some((tool) => tool.name === activate_skill.name)\n ? [...toolsWithDeclarative, activate_skill]\n : toolsWithDeclarative;\n\n const subagentModelSelectionMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n const subagentMaxTokens = group?.subagentMaxTokens;\n const subagentPinnedProvider = group?.subagentPinnedProvider;\n const subagentPinnedModel = group?.subagentPinnedModel;\n const subagentFastProvider = group?.subagentFastProvider;\n const subagentFastModel = group?.subagentFastModel;\n const subagentSmartProvider = group?.subagentSmartProvider;\n const subagentSmartModel = group?.subagentSmartModel;\n const subagentPowerfulProvider = group?.subagentPowerfulProvider;\n const subagentPowerfulModel = group?.subagentPowerfulModel;\n const providerRuntimeOverrides = group?.providerRuntimeOverrides;\n\n const peerState = orchestratorStore.getPeerState(groupId) || undefined;\n const systemPrompt = buildSystemPrompt(\n o.assistantName,\n memory,\n activeTools,\n toolsStore.systemPromptOverride,\n peerState,\n skillDiscovery.skills,\n { groupId },\n );\n\n // Build conversation context with dynamic token-aware windowing\n const contextLimit = getContextLimit(modelForTokenLimits);\n const systemPromptTokens =\n estimateTokens(systemPrompt) +\n activeTools.reduce((acc, t) => acc + estimateTokens(JSON.stringify(t)), 0);\n let allMessages = await buildConversationMessages(groupId, 200);\n if (freshContext) {\n if (allMessages.length > 0) {\n allMessages = [allMessages[allMessages.length - 1]];\n } else {\n allMessages = [{ role: \"user\", content: triggerContent }];\n }\n }\n const dynamicContext = buildDynamicContext(allMessages, {\n contextLimit,\n systemPromptTokens,\n maxOutputTokens: effectiveMaxTokens,\n skimTop: o.contextCompressionEnabled,\n });\n\n const messages = dynamicContext.messages;\n\n let displayTokens = dynamicContext.estimatedTokens + systemPromptTokens;\n\n if (orchestratorStore.tokenUsage) {\n const u = orchestratorStore.tokenUsage;\n const actualPrompt =\n (u.inputTokens || 0) + (u.cacheReadTokens || 0) + (u.outputTokens || 0);\n\n displayTokens = Math.max(displayTokens, actualPrompt);\n }\n\n // Emit context usage for UI display\n o.events.emit(\"context-usage\", {\n estimatedTokens: displayTokens,\n contextLimit,\n usagePercent: Math.min(\n 100,\n Math.max(\n dynamicContext.usagePercent,\n (displayTokens / contextLimit) * 100,\n ),\n ),\n truncatedCount: dynamicContext.truncatedCount,\n });\n\n // Auto-compact when context usage exceeds 80% and there are enough messages\n if (\n dynamicContext.usagePercent > 80 &&\n dynamicContext.truncatedCount > 0 &&\n allMessages.length > 10\n ) {\n o.events.emit(\"show-toast\", {\n message: `Context ${dynamicContext.usagePercent.toFixed(0)}% full — auto-compacting older messages…`,\n type: \"info\",\n duration: 4000,\n });\n // Queue compaction after this invocation completes\n queueMicrotask(() => compactContext(o, db, groupId));\n }\n\n if (effectiveProviderId === \"transformers_js_browser\") {\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const transformersInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithTransformersJs(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n activeTools,\n effectiveModel,\n transformersInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n if (effectiveProviderId === \"prompt_api\") {\n if (!isPromptApiSupported()) {\n await ensureBuiltinAiPolyfills();\n }\n if (!isPromptApiSupported()) {\n await deliverResponse(\n o,\n db,\n executionGroupId,\n \"⚠️ Error: Prompt API is not available in this browser. Switch provider or enable experimental browser flags.\",\n );\n\n return;\n }\n\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const promptApiInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithPromptApi(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n activeTools,\n promptApiInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n if (effectiveProviderId === \"litert_lm_browser\") {\n if (!isLiteRtLmSupported()) {\n await deliverResponse(\n o,\n db,\n executionGroupId,\n \"⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.\",\n );\n\n return;\n }\n\n const controller = new AbortController();\n o.promptControllers.set(executionGroupId, controller);\n\n const liteRtInvokeContext: SubagentInvokeContext = {\n apiKey: \"\",\n assistantName: o.assistantName,\n db,\n enabledTools: activeTools as unknown as ToolDefinition[],\n invokeSubagent: async (subPayload) => {\n await dispatchSubagentInvoke(db, subPayload, controller.signal);\n },\n maxTokens: effectiveMaxTokens,\n memory,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n \"\",\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n streaming: false,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n };\n\n try {\n await invokeWithLiteRtLm(\n db,\n executionGroupId,\n systemPrompt,\n messages,\n effectiveMaxTokens,\n async (msg) => {\n await handleWorkerMessage(o, db, msg);\n },\n controller.signal,\n effectiveModel,\n activeTools,\n liteRtInvokeContext,\n );\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n await deliverResponse(o, db, executionGroupId, `⚠️ Error: ${message}`);\n } finally {\n o.promptControllers.delete(executionGroupId);\n }\n\n return;\n }\n\n // Determine whether to stream. The provider must explicitly opt in via\n // supportsStreaming (proxies like bedrock_proxy use synchronous\n // InvokeModelCommand and cannot return SSE streams).\n const shouldStream =\n o.streamingEnabled &&\n effectiveProviderConfig.supportsStreaming === true &&\n (effectiveProviderConfig.format === \"openai\" ||\n effectiveProviderConfig.format === \"anthropic\");\n\n if (effectiveProviderId === \"transformers_js_local\") {\n startTransformersProgressPolling(o, o.events, executionGroupId);\n }\n\n await o.ensureWorkerReady?.();\n\n const providerRequestId = o.createProviderRequestId(executionGroupId);\n\n // Send to agent worker\n o.agentWorker?.postMessage({\n type: \"invoke\",\n payload: {\n apiKey:\n effectiveProviderId === o.provider\n ? await getApiKeyForRequest(o)\n : await o.getApiKeyForSpecificProvider(db, effectiveProviderId),\n assistantName: o.assistantName,\n contextCompression: o.contextCompressionEnabled,\n contextLimit: getContextLimit(modelForTokenLimits),\n enabledTools: activeTools,\n groupId: executionGroupId,\n isScheduledTask: o.schedulerTriggeredGroups.has(groupId),\n maxIterations: o.maxIterations,\n maxTokens: effectiveMaxTokens,\n memory,\n messages,\n model: effectiveModel,\n provider: effectiveProviderId,\n providerHeaders: getProviderRuntimeHeaders(\n o,\n effectiveProviderId,\n providerRequestId,\n providerRuntimeOverrides,\n ),\n providerRuntimeOverrides,\n reasoning: getReasoningConfig(o),\n rateLimitAutoAdapt: o.rateLimitAutoAdapt,\n rateLimitCallsPerMinute: o.rateLimitCallsPerMinute,\n storageHandle: await getConfig(db, CONFIG_KEYS.STORAGE_HANDLE),\n streaming: shouldStream,\n subagentModelSelectionMode,\n subagentMaxTokens,\n subagentPinnedProvider,\n subagentPinnedModel,\n subagentFastProvider,\n subagentFastModel,\n subagentSmartProvider,\n subagentSmartModel,\n subagentPowerfulProvider,\n subagentPowerfulModel,\n systemPrompt,\n subagentTask: subagent,\n },\n });\n}\n"],"mappings":"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"}