abtars 0.3.4-alpha.8 → 0.3.4

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 (335) hide show
  1. package/bundle/{_registry.generated-YP5GLSG7.js → _registry.generated-AVR7DK2A.js} +15 -15
  2. package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
  3. package/bundle/abtars-browser.js +4 -4
  4. package/bundle/abtars-cli.js +23 -13
  5. package/bundle/abtars-cli.js.map +2 -2
  6. package/bundle/abtars-restart.js +3 -3
  7. package/bundle/abtars-task.js +3 -3
  8. package/bundle/abtars.js +385 -466
  9. package/bundle/abtars.js.map +4 -4
  10. package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
  11. package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
  12. package/bundle/{agent-api-adapter-WRGEQ6DV.js → agent-api-adapter-7HEPYSIN.js} +3 -3
  13. package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
  14. package/bundle/{agent-registry-GHNG2PH3.js → agent-registry-46A2R5KP.js} +7 -7
  15. package/bundle/{bootstrap-PZIDBPEJ.js → bootstrap-MIHJJSWU.js} +2 -2
  16. package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
  17. package/bundle/{browser-D3LZV7ZK.js → browser-F6BCWJWW.js} +6 -6
  18. package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
  19. package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
  20. package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
  21. package/bundle/{chunk-W2R2HFOQ.js → chunk-2NLUT5S2.js} +6 -6
  22. package/bundle/chunk-3BG3AIDP.js +191 -0
  23. package/bundle/chunk-3BG3AIDP.js.map +7 -0
  24. package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
  25. package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
  26. package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
  27. package/bundle/{chunk-374NCXFZ.js → chunk-4AILRHUI.js} +10 -8
  28. package/bundle/chunk-4AILRHUI.js.map +7 -0
  29. package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
  30. package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
  31. package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
  32. package/bundle/{chunk-7JN2MMU7.js → chunk-5PNJFDSW.js} +8 -8
  33. package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
  34. package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
  35. package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
  36. package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
  37. package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
  38. package/bundle/{chunk-C7K6VZNY.js → chunk-BNXV7SZI.js} +21 -12
  39. package/bundle/chunk-BNXV7SZI.js.map +7 -0
  40. package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
  41. package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
  42. package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
  43. package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
  44. package/bundle/{chunk-CXXU3HAU.js → chunk-EAX5ZZUL.js} +63 -39
  45. package/bundle/chunk-EAX5ZZUL.js.map +7 -0
  46. package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
  47. package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
  48. package/bundle/chunk-FGYDIX54.js.map +7 -0
  49. package/bundle/{chunk-YPAQEQSC.js → chunk-GF6NVNA7.js} +15 -5
  50. package/bundle/chunk-GF6NVNA7.js.map +7 -0
  51. package/bundle/{chunk-UNM3OXHB.js → chunk-HGSHCQ5F.js} +110 -72
  52. package/bundle/{chunk-UNM3OXHB.js.map → chunk-HGSHCQ5F.js.map} +2 -2
  53. package/bundle/{chunk-VXCETPZU.js → chunk-IMIGG5EO.js} +39 -39
  54. package/bundle/chunk-IMIGG5EO.js.map +7 -0
  55. package/bundle/{chunk-P2K2K6XL.js → chunk-ITOFPJAV.js} +44 -32
  56. package/bundle/chunk-ITOFPJAV.js.map +7 -0
  57. package/bundle/{chunk-75ATTOW4.js → chunk-IY6UKLPS.js} +3 -3
  58. package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
  59. package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
  60. package/bundle/chunk-J7DRPVMU.js.map +7 -0
  61. package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
  62. package/bundle/chunk-JG4BKXBN.js.map +7 -0
  63. package/bundle/{chunk-N4EB6LA7.js → chunk-JLWYPGWI.js} +5 -5
  64. package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
  65. package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
  66. package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
  67. package/bundle/{chunk-M3JEX6L4.js → chunk-L72RIPEC.js} +9 -9
  68. package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
  69. package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
  70. package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
  71. package/bundle/chunk-OY4Q6AMY.js.map +7 -0
  72. package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
  73. package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
  74. package/bundle/{chunk-SMPHE3ZM.js → chunk-PB5GF4FG.js} +215 -163
  75. package/bundle/chunk-PB5GF4FG.js.map +7 -0
  76. package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
  77. package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
  78. package/bundle/{chunk-IHYKTDIP.js → chunk-SC2Y5NR2.js} +36 -119
  79. package/bundle/chunk-SC2Y5NR2.js.map +7 -0
  80. package/bundle/chunk-SFL4EPCZ.js +555 -0
  81. package/bundle/chunk-SFL4EPCZ.js.map +7 -0
  82. package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
  83. package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
  84. package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
  85. package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
  86. package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
  87. package/bundle/chunk-WC5O5KOE.js +211 -0
  88. package/bundle/chunk-WC5O5KOE.js.map +7 -0
  89. package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
  90. package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
  91. package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
  92. package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
  93. package/bundle/chunk-YJZE4OK3.js +169 -0
  94. package/bundle/chunk-YJZE4OK3.js.map +7 -0
  95. package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
  96. package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
  97. package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
  98. package/bundle/{commands-OIISYHTD.js → commands-2ZW6CMLC.js} +17 -16
  99. package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
  100. package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
  101. package/bundle/context-CL2RSLII.js.map +7 -0
  102. package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
  103. package/bundle/{delegation-tools-YATZFKYO.js → delegation-tools-WS7Z56KZ.js} +12 -12
  104. package/bundle/{deploy-T6R45OZJ.js → deploy-AMTVKIMU.js} +2 -2
  105. package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
  106. package/bundle/{direct-api-transport-S2RDH2I7.js → direct-api-transport-QNNY2WWP.js} +51 -32
  107. package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
  108. package/bundle/{discord-adapter-UTXUWX3A.js → discord-adapter-ABAD56Y2.js} +21 -20
  109. package/bundle/{discord-adapter-UTXUWX3A.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
  110. package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
  111. package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
  112. package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
  113. package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
  114. package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
  115. package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
  116. package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
  117. package/bundle/{heartbeat-tier3-6KH45CL6.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
  118. package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
  119. package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
  120. package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
  121. package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
  122. package/bundle/install-RFKKFSGS.js.map +7 -0
  123. package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
  124. package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
  125. package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
  126. package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
  127. package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
  128. package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
  129. package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
  130. package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
  131. package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
  132. package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
  133. package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
  134. package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
  135. package/bundle/{message-pipeline-AUIUNM5R.js → message-pipeline-GRDRWONR.js} +17 -16
  136. package/bundle/meta.json +2773 -2241
  137. package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
  138. package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
  139. package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
  140. package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
  141. package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
  142. package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
  143. package/bundle/{orc-tools-TOD4WHTM.js → orc-tools-UZVPONKY.js} +5 -3
  144. package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
  145. package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
  146. package/bundle/peer-client-UITTMWJ2.js.map +7 -0
  147. package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
  148. package/bundle/{peer-transport-5VKK2I7P.js → peer-transport-SI7I72DB.js} +12 -10
  149. package/bundle/{phase-transport-FS6NL4A5.js → phase-transport-ESWWACZI.js} +17 -17
  150. package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
  151. package/bundle/{reconciler-NZ4O4BCP.js → reconciler-IEUJXJN2.js} +12 -12
  152. package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
  153. package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
  154. package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
  155. package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
  156. package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
  157. package/bundle/{skill-session-VJXTKOKL.js → skill-session-5HSMXY54.js} +3 -3
  158. package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
  159. package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
  160. package/bundle/{sleep-BEWAUFCL.js → sleep-I4JFASCY.js} +11 -11
  161. package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
  162. package/bundle/{spin-E3ZDEDKT.js → spin-VHNGNWTD.js} +11 -11
  163. package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
  164. package/bundle/{spin-types-OIE67MJK.js → spin-types-C5KOQOPD.js} +7 -3
  165. package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
  166. package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
  167. package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
  168. package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
  169. package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
  170. package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
  171. package/bundle/{system-status-FAVNIUFJ.js → system-status-4LYGOFNO.js} +38 -24
  172. package/bundle/system-status-4LYGOFNO.js.map +7 -0
  173. package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
  174. package/bundle/{telegram-adapter-4TX7QWKC.js → telegram-adapter-O6KIZDY6.js} +62 -45
  175. package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
  176. package/bundle/{tool-registry-7FK3OQGL.js → tool-registry-JJMWCQKZ.js} +26 -24
  177. package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
  178. package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
  179. package/bundle/tribe-GDTFYJTK.js +111 -0
  180. package/bundle/tribe-GDTFYJTK.js.map +7 -0
  181. package/bundle/{update-CKFP6LBE.js → update-HGQAOC5L.js} +3 -3
  182. package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
  183. package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
  184. package/bundle/wire-platform-KKPWNNNQ.js +88 -0
  185. package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
  186. package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
  187. package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
  188. package/package.json +1 -1
  189. package/scripts/abtars-watchdog.sh +1 -5
  190. package/scripts/emergency-deploy.sh +2 -2
  191. package/scripts/emergency-update.sh +36 -37
  192. package/bundle/chunk-374NCXFZ.js.map +0 -7
  193. package/bundle/chunk-4MULJ5SS.js.map +0 -7
  194. package/bundle/chunk-4S554KLW.js +0 -105
  195. package/bundle/chunk-4S554KLW.js.map +0 -7
  196. package/bundle/chunk-C7K6VZNY.js.map +0 -7
  197. package/bundle/chunk-CXXU3HAU.js.map +0 -7
  198. package/bundle/chunk-EGL6UMAO.js.map +0 -7
  199. package/bundle/chunk-EQSG2CRM.js.map +0 -7
  200. package/bundle/chunk-HT2BPTZY.js +0 -241
  201. package/bundle/chunk-HT2BPTZY.js.map +0 -7
  202. package/bundle/chunk-HZDLFLRP.js.map +0 -7
  203. package/bundle/chunk-IHYKTDIP.js.map +0 -7
  204. package/bundle/chunk-IKUZPMVA.js +0 -82
  205. package/bundle/chunk-IKUZPMVA.js.map +0 -7
  206. package/bundle/chunk-P2K2K6XL.js.map +0 -7
  207. package/bundle/chunk-PU5HSKWH.js +0 -257
  208. package/bundle/chunk-PU5HSKWH.js.map +0 -7
  209. package/bundle/chunk-RWRRGE4U.js +0 -72
  210. package/bundle/chunk-RWRRGE4U.js.map +0 -7
  211. package/bundle/chunk-SMPHE3ZM.js.map +0 -7
  212. package/bundle/chunk-VUIX5AGB.js +0 -65
  213. package/bundle/chunk-VUIX5AGB.js.map +0 -7
  214. package/bundle/chunk-VXCETPZU.js.map +0 -7
  215. package/bundle/chunk-YPAQEQSC.js.map +0 -7
  216. package/bundle/context-2RJHC2LE.js.map +0 -7
  217. package/bundle/direct-api-transport-S2RDH2I7.js.map +0 -7
  218. package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
  219. package/bundle/heartbeat-tier3-6KH45CL6.js.map +0 -7
  220. package/bundle/install-OS3CU7NF.js.map +0 -7
  221. package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
  222. package/bundle/peer-client-RGEU5HOK.js.map +0 -7
  223. package/bundle/peer-jwt-NCCPXJRX.js +0 -18
  224. package/bundle/stream-single-RFJNUTL6.js +0 -34
  225. package/bundle/stream-single-RFJNUTL6.js.map +0 -7
  226. package/bundle/system-status-FAVNIUFJ.js.map +0 -7
  227. package/bundle/telegram-adapter-4TX7QWKC.js.map +0 -7
  228. package/bundle/user-registry-35BW4XKM.js.map +0 -7
  229. package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
  230. package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
  231. /package/bundle/{_registry.generated-YP5GLSG7.js.map → _registry.generated-AVR7DK2A.js.map} +0 -0
  232. /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
  233. /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
  234. /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
  235. /package/bundle/{agent-api-adapter-WRGEQ6DV.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
  236. /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
  237. /package/bundle/{agent-registry-GHNG2PH3.js.map → agent-registry-46A2R5KP.js.map} +0 -0
  238. /package/bundle/{bootstrap-PZIDBPEJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
  239. /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
  240. /package/bundle/{browser-D3LZV7ZK.js.map → browser-F6BCWJWW.js.map} +0 -0
  241. /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
  242. /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
  243. /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
  244. /package/bundle/{chunk-W2R2HFOQ.js.map → chunk-2NLUT5S2.js.map} +0 -0
  245. /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
  246. /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
  247. /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
  248. /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
  249. /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
  250. /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
  251. /package/bundle/{chunk-7JN2MMU7.js.map → chunk-5PNJFDSW.js.map} +0 -0
  252. /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
  253. /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
  254. /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
  255. /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
  256. /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
  257. /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
  258. /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
  259. /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
  260. /package/bundle/{chunk-75ATTOW4.js.map → chunk-IY6UKLPS.js.map} +0 -0
  261. /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
  262. /package/bundle/{chunk-N4EB6LA7.js.map → chunk-JLWYPGWI.js.map} +0 -0
  263. /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
  264. /package/bundle/{chunk-M3JEX6L4.js.map → chunk-L72RIPEC.js.map} +0 -0
  265. /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
  266. /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
  267. /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
  268. /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
  269. /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
  270. /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
  271. /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
  272. /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
  273. /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
  274. /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
  275. /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
  276. /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
  277. /package/bundle/{commands-OIISYHTD.js.map → commands-2ZW6CMLC.js.map} +0 -0
  278. /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
  279. /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
  280. /package/bundle/{delegation-tools-YATZFKYO.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
  281. /package/bundle/{deploy-T6R45OZJ.js.map → deploy-AMTVKIMU.js.map} +0 -0
  282. /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
  283. /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
  284. /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
  285. /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
  286. /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
  287. /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
  288. /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
  289. /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
  290. /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
  291. /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
  292. /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
  293. /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
  294. /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
  295. /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
  296. /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
  297. /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
  298. /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
  299. /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
  300. /package/bundle/{message-pipeline-AUIUNM5R.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
  301. /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
  302. /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
  303. /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
  304. /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
  305. /package/bundle/{orc-tools-TOD4WHTM.js.map → orc-tools-UZVPONKY.js.map} +0 -0
  306. /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
  307. /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
  308. /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
  309. /package/bundle/{peer-transport-5VKK2I7P.js.map → phase-transport-ESWWACZI.js.map} +0 -0
  310. /package/bundle/{phase-transport-FS6NL4A5.js.map → reconcile-GFDQYNBD.js.map} +0 -0
  311. /package/bundle/{reconciler-NZ4O4BCP.js.map → reconciler-IEUJXJN2.js.map} +0 -0
  312. /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
  313. /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
  314. /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
  315. /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
  316. /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
  317. /package/bundle/{skill-session-VJXTKOKL.js.map → skill-session-5HSMXY54.js.map} +0 -0
  318. /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
  319. /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
  320. /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
  321. /package/bundle/{sleep-BEWAUFCL.js.map → soul-bundle-522C3IRH.js.map} +0 -0
  322. /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
  323. /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
  324. /package/bundle/{spin-E3ZDEDKT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
  325. /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
  326. /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
  327. /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
  328. /package/bundle/{spin-types-OIE67MJK.js.map → stt-PSOPPBV4.js.map} +0 -0
  329. /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
  330. /package/bundle/{task-store-W5BFIAIH.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
  331. /package/bundle/{tool-registry-7FK3OQGL.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
  332. /package/bundle/{tool-sandbox-4UC6GAKA.js.map → transport-config-6MB2K2XC.js.map} +0 -0
  333. /package/bundle/{transport-config-KBF5W2DP.js.map → update-HGQAOC5L.js.map} +0 -0
  334. /package/bundle/{update-CKFP6LBE.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
  335. /package/bundle/{usage-tracker-NXD364VX.js.map → user-registry-4PACZJIJ.js.map} +0 -0
@@ -2,16 +2,16 @@
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
3
  import {
4
4
  AcpTransport
5
- } from "./chunk-5QUTMUIK.js";
5
+ } from "./chunk-JXYWDAHD.js";
6
6
  import {
7
7
  getEnv,
8
8
  init_env_schema
9
- } from "./chunk-65VCEC32.js";
9
+ } from "./chunk-6PA5JBUU.js";
10
10
  import {
11
11
  init_logger,
12
12
  logInfo,
13
13
  logWarn
14
- } from "./chunk-GWILHZPT.js";
14
+ } from "./chunk-XRTXYN66.js";
15
15
 
16
16
  // src/components/agent-registry.ts
17
17
  init_env_schema();
@@ -60,7 +60,7 @@ var SUBAGENT_ACP_ROLE = {
60
60
  task: "task"
61
61
  };
62
62
  async function createSubagentTransport(role, registry, currentModel) {
63
- const { resolveAgent, getEnvFallback, loadTransport } = await import("./transport-config-KBF5W2DP.js");
63
+ const { resolveAgent, getEnvFallback, loadTransport } = await import("./transport-config-6MB2K2XC.js");
64
64
  const tc = loadTransport();
65
65
  const agentName = SUBAGENT_TO_AGENT[role];
66
66
  const resolved = tc ? resolveAgent(agentName, tc) : null;
@@ -70,32 +70,65 @@ async function createSubagentTransport(role, registry, currentModel) {
70
70
  return { model: fb.model, provider: fb.provider, providerName: fb.providerName, contextWindow: fb.contextWindow, maxOutput: fb.maxOutput, fallbacks: [] };
71
71
  })();
72
72
  if (agent.provider.transport === "api") {
73
- const { DirectApiTransport } = await import("./direct-api-transport-S2RDH2I7.js");
73
+ let resolveModelEndpoint2 = function(model) {
74
+ if (!tc) return null;
75
+ for (const [, agentEntry] of Object.entries(tc.agents)) {
76
+ const primaryProvider = tc.providers[agentEntry.provider];
77
+ if (primaryProvider?.transport === "api" && agentEntry.model === model && primaryProvider.endpoint) {
78
+ return {
79
+ endpoint: primaryProvider.endpoint,
80
+ apiKey: primaryProvider.apiKeyEnv ? getEnv().getApiKey(primaryProvider.apiKeyEnv) : void 0
81
+ };
82
+ }
83
+ for (const fb of agentEntry.fallbacks ?? []) {
84
+ if (fb.model !== model) continue;
85
+ const fbProvider = tc.providers[fb.provider];
86
+ if (fbProvider?.transport === "api" && fbProvider.endpoint) {
87
+ return {
88
+ endpoint: fbProvider.endpoint,
89
+ apiKey: fbProvider.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : void 0
90
+ };
91
+ }
92
+ }
93
+ }
94
+ return null;
95
+ };
96
+ var resolveModelEndpoint = resolveModelEndpoint2;
97
+ const { DirectApiTransport } = await import("./direct-api-transport-QNNY2WWP.js");
74
98
  const { FallbackPolicy } = await import("./fallback-policy-SR6ED5I3.js");
75
99
  const apiKey = getEnv().getApiKey(agent.provider.apiKeyEnv ?? "API_KEY");
76
100
  const startModel = currentModel ?? agent.model;
77
- const candidates = [
78
- { endpoint: agent.provider.endpoint ?? "http://localhost:11434/v1", apiKey, model: startModel, maxContext: agent.contextWindow }
79
- ];
80
- if (agent.model !== startModel && !candidates.some((c) => c.model === agent.model)) {
81
- candidates.push({ endpoint: agent.provider.endpoint ?? "http://localhost:11434/v1", apiKey, model: agent.model, maxContext: agent.contextWindow });
101
+ const startModelResolved = startModel !== agent.model ? resolveModelEndpoint2(startModel) : null;
102
+ const startEndpoint = startModelResolved?.endpoint ?? agent.provider.endpoint ?? "http://localhost:11434/v1";
103
+ const startApiKey = startModelResolved?.apiKey ?? apiKey;
104
+ const candidateKey = (model, endpoint) => `${model}@${endpoint}`;
105
+ const seenCandidates = /* @__PURE__ */ new Set();
106
+ const candidates = [];
107
+ const addCandidate = (model, endpoint, candidateApiKey, maxContext) => {
108
+ const key = candidateKey(model, endpoint);
109
+ if (seenCandidates.has(key)) return;
110
+ seenCandidates.add(key);
111
+ candidates.push({ model, endpoint, apiKey: candidateApiKey, maxContext });
112
+ };
113
+ addCandidate(startModel, startEndpoint, startApiKey, agent.contextWindow);
114
+ if (agent.model !== startModel) {
115
+ addCandidate(agent.model, agent.provider.endpoint ?? "http://localhost:11434/v1", apiKey, agent.contextWindow);
82
116
  }
83
117
  const profAgent = tc ? resolveAgent("professor", tc) : null;
84
118
  const agentTransport = agent.provider.transport ?? "api";
85
- if (profAgent && profAgent.model !== startModel && !candidates.some((c) => c.model === profAgent.model)) {
119
+ if (profAgent && profAgent.model !== startModel) {
86
120
  const profTransport = profAgent.provider.transport ?? "api";
87
121
  if (profTransport === agentTransport && profAgent.provider.endpoint) {
88
- candidates.push({
89
- endpoint: profAgent.provider.endpoint,
90
- apiKey: profAgent.provider.apiKeyEnv ? getEnv().getApiKey(profAgent.provider.apiKeyEnv) : apiKey,
91
- model: profAgent.model,
92
- maxContext: profAgent.contextWindow
93
- });
122
+ addCandidate(
123
+ profAgent.model,
124
+ profAgent.provider.endpoint,
125
+ profAgent.provider.apiKeyEnv ? getEnv().getApiKey(profAgent.provider.apiKeyEnv) : apiKey,
126
+ profAgent.contextWindow
127
+ );
94
128
  }
95
129
  }
96
130
  if (profAgent) {
97
131
  for (const fb of profAgent.fallbacks ?? []) {
98
- if (candidates.some((c) => c.model === fb.model)) continue;
99
132
  const fbProvider = tc?.providers[fb.provider];
100
133
  const fbEndpoint = fbProvider?.endpoint ?? profAgent.provider.endpoint;
101
134
  if (!fbEndpoint) {
@@ -103,19 +136,17 @@ async function createSubagentTransport(role, registry, currentModel) {
103
136
  continue;
104
137
  }
105
138
  const fbApiKey = fbProvider?.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : apiKey;
106
- candidates.push({ endpoint: fbEndpoint, apiKey: fbApiKey, model: fb.model, maxContext: profAgent.contextWindow });
139
+ addCandidate(fb.model, fbEndpoint, fbApiKey, profAgent.contextWindow);
107
140
  }
108
141
  for (const chainModel of profAgent.provider.fallbackChain ?? []) {
109
- if (candidates.some((c) => c.model === chainModel)) continue;
110
142
  if (!profAgent.provider.endpoint) {
111
143
  logWarn("subagent", `Skipping chain model ${chainModel} \u2014 no endpoint configured`);
112
144
  continue;
113
145
  }
114
- candidates.push({ endpoint: profAgent.provider.endpoint, apiKey, model: chainModel, maxContext: profAgent.contextWindow });
146
+ addCandidate(chainModel, profAgent.provider.endpoint, apiKey, profAgent.contextWindow);
115
147
  }
116
148
  }
117
149
  for (const fb of agent.fallbacks) {
118
- if (candidates.some((c) => c.model === fb.model)) continue;
119
150
  const fbProvider = tc?.providers[fb.provider];
120
151
  const fbEndpoint = fbProvider?.endpoint ?? agent.provider.endpoint;
121
152
  if (!fbEndpoint) {
@@ -123,28 +154,21 @@ async function createSubagentTransport(role, registry, currentModel) {
123
154
  continue;
124
155
  }
125
156
  const fbApiKey = fbProvider?.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : apiKey;
126
- candidates.push({ endpoint: fbEndpoint, apiKey: fbApiKey, model: fb.model, maxContext: agent.contextWindow });
157
+ addCandidate(fb.model, fbEndpoint, fbApiKey, agent.contextWindow);
127
158
  }
128
159
  const chain2 = agent.provider.fallbackChain ?? [];
129
160
  for (const chainModel of chain2) {
130
- if (!candidates.some((c) => c.model === chainModel)) {
131
- if (!agent.provider.endpoint) {
132
- logWarn("subagent", `Skipping chain model ${chainModel} \u2014 no endpoint configured`);
133
- continue;
134
- }
135
- candidates.push({
136
- endpoint: agent.provider.endpoint,
137
- apiKey,
138
- model: chainModel,
139
- maxContext: agent.contextWindow
140
- });
161
+ if (!agent.provider.endpoint) {
162
+ logWarn("subagent", `Skipping chain model ${chainModel} \u2014 no endpoint configured`);
163
+ continue;
141
164
  }
165
+ addCandidate(chainModel, agent.provider.endpoint, apiKey, agent.contextWindow);
142
166
  }
143
- const { ModelHealthRegistry } = await import("./model-health-registry-MLEIZSTV.js");
167
+ const { ModelHealthRegistry } = await import("./model-health-registry-QADMFQFQ.js");
144
168
  const policy = new FallbackPolicy(candidates, registry ?? new ModelHealthRegistry());
145
169
  const transport = new DirectApiTransport({
146
- endpoint: agent.provider.endpoint ?? "http://localhost:11434/v1",
147
- apiKey,
170
+ endpoint: startEndpoint,
171
+ apiKey: startApiKey,
148
172
  model: startModel,
149
173
  maxContext: agent.contextWindow,
150
174
  maxOutput: agent.maxOutput,
@@ -155,7 +179,7 @@ async function createSubagentTransport(role, registry, currentModel) {
155
179
  logInfo("subagent", `${role} transport: DirectAPI ${agent.providerName} (model=${startModel}, ${candidates.length} candidates, shared registry: ${!!registry})`);
156
180
  return { transport, model: agent.model };
157
181
  }
158
- const { loadAndValidateConfig } = await import("./config-M3P5IOAI.js");
182
+ const { loadAndValidateConfig } = await import("./config-YMY5YHKN.js");
159
183
  const config = await loadAndValidateConfig();
160
184
  const chain = agent.provider.fallbackChain ?? [];
161
185
  const modelsToTry = [agent.model, ...chain.filter((m) => m !== agent.model)];
@@ -187,4 +211,4 @@ export {
187
211
  createAgentTransport,
188
212
  createSubagentTransport
189
213
  };
190
- //# sourceMappingURL=chunk-CXXU3HAU.js.map
214
+ //# sourceMappingURL=chunk-EAX5ZZUL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/agent-registry.ts"],
4
+ "sourcesContent": ["import { getEnv } from \"./env-schema.js\";\n/**\n * agent-registry.ts \u2014 Centralized agent role configuration.\n * Single factory for all agent transports. Transport-agnostic.\n */\n\nimport { AcpTransport } from \"./transport/acp-transport.js\";\nimport { logInfo, logWarn } from \"./logger.js\";\nimport type { IKiroTransport } from \"./transport/kiro-transport.js\";\n\nexport type AgentRole = \"professor\" | \"dreamy\" | \"browsie\" | \"coding\" | \"task\";\n\nexport interface AgentRoleConfig {\n agent: string | null;\n model: string | null;\n autoReinit: boolean;\n tag: string;\n trust: number;\n}\n\nconst AGENT_ROLES: Record<AgentRole, AgentRoleConfig> = {\n professor: { agent: \"professor\", model: null, autoReinit: true, tag: \"acp-main\", trust: 3 },\n dreamy: { agent: \"dreamy\", model: null, autoReinit: false, tag: \"acp-sleep\", trust: 2 },\n coding: { agent: \"coding-agent\", model: null, autoReinit: true, tag: \"acp-coding\", trust: 2 },\n browsie: { agent: \"browsie\", model: null, autoReinit: false, tag: \"acp-browsie\", trust: 1 },\n task: { agent: \"professor\", model: null, autoReinit: false, tag: \"acp-task\", trust: 2 },\n};\n\nfunction resolveModel(role: AgentRole): string | undefined {\n switch (role) {\n case \"dreamy\": return getEnv().sleepModel;\n case \"browsie\": return getEnv().browsingAgent;\n case \"coding\": return getEnv().codingModel;\n default: return undefined;\n }\n}\n\nexport interface TransportConfig {\n cliPath: string;\n workingDir: string;\n agentCli?: string;\n model?: string;\n}\n\nexport function createAgentTransport(\n role: AgentRole,\n tc: TransportConfig,\n overrides?: Partial<AgentRoleConfig>,\n): AcpTransport {\n const cfg = { ...AGENT_ROLES[role], ...overrides };\n const cliArgs = tc.agentCli === \"gemini\" ? [\"--acp\", \"-y\"] : undefined;\n const model = tc.model ?? resolveModel(role);\n\n return new AcpTransport(tc.cliPath, tc.workingDir, {\n agent: cfg.agent ?? undefined,\n model,\n autoReinit: cfg.autoReinit,\n tag: cfg.tag,\n cliArgs,\n });\n}\n\nexport type SubagentRole = \"sleep\" | \"browse\" | \"coding\" | \"task\";\n\nconst SUBAGENT_TO_AGENT: Record<SubagentRole, string> = {\n sleep: \"dreamy\",\n browse: \"browsie\",\n coding: \"coding\",\n task: \"professor\",\n};\n\nconst SUBAGENT_ACP_ROLE: Record<SubagentRole, AgentRole> = {\n sleep: \"dreamy\",\n browse: \"browsie\",\n coding: \"coding\",\n task: \"task\",\n};\n\n/** Unified transport factory for all subagents. Reads from transport.json + models.json. */\n/** @internal Used only by SubagentRuntime. Do not call directly. */\nexport async function createSubagentTransport(role: SubagentRole, registry?: import(\"./transport/model-health-registry.js\").ModelHealthRegistry, currentModel?: string): Promise<{ transport: IKiroTransport; model: string }> {\n const { resolveAgent, getEnvFallback, loadTransport } = await import(\"./transport-config.js\");\n const tc = loadTransport();\n const agentName = SUBAGENT_TO_AGENT[role];\n const resolved = tc ? resolveAgent(agentName, tc) : null;\n\n // Fallback: use professor's config. If that also fails, use .env defaults.\n const profResolved = resolved ?? (tc ? resolveAgent(\"professor\", tc) : null);\n const agent = profResolved ?? (() => {\n const fb = getEnvFallback();\n return { model: fb.model, provider: fb.provider, providerName: fb.providerName, contextWindow: fb.contextWindow, maxOutput: fb.maxOutput, fallbacks: [] };\n })();\n\n if (agent.provider.transport === \"api\") {\n const { DirectApiTransport } = await import(\"./transport/direct-api-transport.js\");\n const { FallbackPolicy } = await import(\"./transport/fallback-policy.js\");\n const apiKey = getEnv().getApiKey(agent.provider.apiKeyEnv ?? \"API_KEY\");\n\n // Use main transport's active model if available, else static config\n const startModel = currentModel ?? agent.model;\n\n /**\n * Resolve the correct endpoint + apiKey for a given model by scanning the full\n * transport.json candidate space: all agents' primary + fallback entries.\n * This is needed when startModel was inherited from Main and may belong to a\n * different provider than agent.provider (e.g. Main fell back to Ollama while\n * the task agent's primary provider is OpenRouter).\n */\n function resolveModelEndpoint(model: string): { endpoint: string; apiKey: string | undefined } | null {\n if (!tc) return null;\n for (const [, agentEntry] of Object.entries(tc.agents)) {\n // Check primary\n const primaryProvider = tc.providers[agentEntry.provider];\n if (primaryProvider?.transport === \"api\" && agentEntry.model === model && primaryProvider.endpoint) {\n return {\n endpoint: primaryProvider.endpoint,\n apiKey: primaryProvider.apiKeyEnv ? getEnv().getApiKey(primaryProvider.apiKeyEnv) : undefined,\n };\n }\n // Check fallbacks\n for (const fb of agentEntry.fallbacks ?? []) {\n if (fb.model !== model) continue;\n const fbProvider = tc.providers[fb.provider];\n if (fbProvider?.transport === \"api\" && fbProvider.endpoint) {\n return {\n endpoint: fbProvider.endpoint,\n apiKey: fbProvider.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : undefined,\n };\n }\n }\n }\n return null;\n }\n\n // Resolve the correct endpoint for startModel. When startModel was inherited\n // from Main and belongs to a different provider, this finds the right endpoint\n // instead of blindly using agent.provider.endpoint (#1307).\n const startModelResolved = startModel !== agent.model ? resolveModelEndpoint(startModel) : null;\n const startEndpoint = startModelResolved?.endpoint ?? agent.provider.endpoint ?? \"http://localhost:11434/v1\";\n const startApiKey = startModelResolved?.apiKey ?? apiKey;\n\n // Build per-agent candidate list\n // Dedup key is model+endpoint pair \u2014 same model on different providers is a distinct candidate.\n const candidateKey = (model: string, endpoint: string): string => `${model}@${endpoint}`;\n const seenCandidates = new Set<string>();\n const candidates: Array<{ model: string; endpoint: string; apiKey?: string; maxContext: number }> = [];\n\n const addCandidate = (model: string, endpoint: string, candidateApiKey: string | undefined, maxContext: number): void => {\n const key = candidateKey(model, endpoint);\n if (seenCandidates.has(key)) return;\n seenCandidates.add(key);\n candidates.push({ model, endpoint, apiKey: candidateApiKey, maxContext });\n };\n\n addCandidate(startModel, startEndpoint, startApiKey, agent.contextWindow);\n\n // Add static config model if different from startModel\n if (agent.model !== startModel) {\n addCandidate(agent.model, agent.provider.endpoint ?? \"http://localhost:11434/v1\", apiKey, agent.contextWindow);\n }\n\n // Add professor's model as fallback if different and transport-compatible\n const profAgent = tc ? resolveAgent(\"professor\", tc) : null;\n const agentTransport = agent.provider.transport ?? \"api\";\n if (profAgent && profAgent.model !== startModel) {\n const profTransport = profAgent.provider.transport ?? \"api\";\n if (profTransport === agentTransport && profAgent.provider.endpoint) {\n addCandidate(\n profAgent.model,\n profAgent.provider.endpoint,\n profAgent.provider.apiKeyEnv ? getEnv().getApiKey(profAgent.provider.apiKeyEnv) : apiKey,\n profAgent.contextWindow,\n );\n }\n }\n\n // Inherit professor's full fallback chain (fb1\u2192fb2\u2192fb3)\n if (profAgent) {\n for (const fb of profAgent.fallbacks ?? []) {\n const fbProvider = tc?.providers[fb.provider];\n const fbEndpoint = fbProvider?.endpoint ?? profAgent.provider.endpoint;\n if (!fbEndpoint) { logWarn(\"subagent\", `Skipping fallback ${fb.model} \u2014 no endpoint configured`); continue; }\n const fbApiKey = fbProvider?.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : apiKey;\n addCandidate(fb.model, fbEndpoint, fbApiKey, profAgent.contextWindow);\n }\n for (const chainModel of profAgent.provider.fallbackChain ?? []) {\n if (!profAgent.provider.endpoint) { logWarn(\"subagent\", `Skipping chain model ${chainModel} \u2014 no endpoint configured`); continue; }\n addCandidate(chainModel, profAgent.provider.endpoint, apiKey, profAgent.contextWindow);\n }\n }\n\n // Append agent-level cross-provider fallbacks\n for (const fb of agent.fallbacks) {\n const fbProvider = tc?.providers[fb.provider];\n const fbEndpoint = fbProvider?.endpoint ?? agent.provider.endpoint;\n if (!fbEndpoint) { logWarn(\"subagent\", `Skipping fallback ${fb.model} \u2014 no endpoint configured`); continue; }\n const fbApiKey = fbProvider?.apiKeyEnv ? getEnv().getApiKey(fbProvider.apiKeyEnv) : apiKey;\n addCandidate(fb.model, fbEndpoint, fbApiKey, agent.contextWindow);\n }\n\n // Append fallbackChain entries as last-resort candidates\n const chain = agent.provider.fallbackChain ?? [];\n for (const chainModel of chain) {\n if (!agent.provider.endpoint) { logWarn(\"subagent\", `Skipping chain model ${chainModel} \u2014 no endpoint configured`); continue; }\n addCandidate(chainModel, agent.provider.endpoint, apiKey, agent.contextWindow);\n }\n\n // Use shared registry if provided, otherwise create isolated one\n const { ModelHealthRegistry } = await import(\"./transport/model-health-registry.js\");\n const policy = new FallbackPolicy(candidates, registry ?? new ModelHealthRegistry());\n\n const transport = new DirectApiTransport({\n endpoint: startEndpoint,\n apiKey: startApiKey, model: startModel,\n maxContext: agent.contextWindow, maxOutput: agent.maxOutput,\n maxTurns: tc?.maxTurns ?? 50,\n maxToolRounds: tc?.maxToolRounds ?? 25,\n }, policy);\n await transport.initialize();\n logInfo(\"subagent\", `${role} transport: DirectAPI ${agent.providerName} (model=${startModel}, ${candidates.length} candidates, shared registry: ${!!registry})`);\n return { transport, model: agent.model };\n }\n\n // ACP path \u2014 try configured model, then fallbackChain on failure\n const { loadAndValidateConfig } = await import(\"./config.js\");\n const config = await loadAndValidateConfig();\n const chain = agent.provider.fallbackChain ?? [];\n const modelsToTry = [agent.model, ...chain.filter(m => m !== agent.model)];\n\n for (let i = 0; i < modelsToTry.length; i++) {\n const model = modelsToTry[i]!;\n const transport = createAgentTransport(SUBAGENT_ACP_ROLE[role], {\n cliPath: agent.provider.cli ?? config.transport.agentCliPath,\n workingDir: config.transport.workingDir,\n agentCli: agent.provider.cli ?? \"kiro-cli\",\n model,\n });\n try {\n await transport.initialize();\n if (i > 0) logWarn(\"subagent\", `${role}: configured model failed, fell back to ${model}`);\n logInfo(\"subagent\", `${role} transport: ACP ${agent.providerName} (model=${model}${i > 0 ? \", fallback\" : \"\"})`);\n return { transport, model };\n } catch (err) {\n if (i < modelsToTry.length - 1) {\n logWarn(\"subagent\", `${role}: model ${model} init failed (${err instanceof Error ? err.message : String(err)}), trying ${modelsToTry[i + 1]}`);\n continue;\n }\n throw err;\n }\n }\n throw new Error(`${role}: all models exhausted (tried ${modelsToTry.join(\", \")})`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["resolveModelEndpoint", "chain"]
7
+ }
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_log_and_swallow,
5
5
  logAndSwallow
6
- } from "./chunk-YSKCQH6E.js";
6
+ } from "./chunk-2IYJ4I66.js";
7
7
  import {
8
8
  abtarsHome,
9
9
  init_paths
@@ -75,4 +75,4 @@ export {
75
75
  recordRun,
76
76
  closeDb
77
77
  };
78
- //# sourceMappingURL=chunk-PEDX56EL.js.map
78
+ //# sourceMappingURL=chunk-EFGBM555.js.map
@@ -3,15 +3,15 @@
3
3
  import {
4
4
  init_lazy_require,
5
5
  resolveNativeDep
6
- } from "./chunk-GVM5YU5I.js";
6
+ } from "./chunk-Z4FZPB42.js";
7
7
  import {
8
8
  init_nerve,
9
9
  nerve
10
- } from "./chunk-OXTSWQCX.js";
10
+ } from "./chunk-5Y3FJ2Y7.js";
11
11
  import {
12
12
  init_logger,
13
13
  logWarn
14
- } from "./chunk-GWILHZPT.js";
14
+ } from "./chunk-XRTXYN66.js";
15
15
  import {
16
16
  abtarsHome,
17
17
  init_paths
@@ -24,12 +24,12 @@ import {
24
24
  // src/components/tasks/kanban-board.ts
25
25
  var kanban_board_exports = {};
26
26
  __export(kanban_board_exports, {
27
+ _kanbanExecForTest: () => _kanbanExecForTest,
27
28
  cascadeFail: () => cascadeFail,
28
29
  isUnblocked: () => isUnblocked,
29
30
  kanbanAddTokens: () => kanbanAddTokens,
30
31
  kanbanCleanup: () => kanbanCleanup,
31
32
  kanbanComplete: () => kanbanComplete,
32
- kanbanDeliveryFailed: () => kanbanDeliveryFailed,
33
33
  kanbanEnqueue: () => kanbanEnqueue,
34
34
  kanbanFail: () => kanbanFail,
35
35
  kanbanGetCard: () => kanbanGetCard,
@@ -40,6 +40,7 @@ __export(kanban_board_exports, {
40
40
  kanbanProgress: () => kanbanProgress,
41
41
  kanbanRetryOrFail: () => kanbanRetryOrFail,
42
42
  kanbanRunning: () => kanbanRunning,
43
+ kanbanSearch: () => kanbanSearch,
43
44
  kanbanSetDelivering: () => kanbanSetDelivering,
44
45
  kanbanUpdate: () => kanbanUpdate
45
46
  });
@@ -191,16 +192,16 @@ function kanbanMarkDelivered(id) {
191
192
  ).run(id);
192
193
  nerve.fire("card:delivered", id);
193
194
  }
194
- function kanbanDeliveryFailed(id) {
195
+ function kanbanSearch(term) {
195
196
  const d = dbOrNull();
196
- if (!d) return;
197
- const card = d.prepare(`SELECT delivery_attempts FROM kanban_board WHERE id = ?`).get(id);
198
- const attempts = (card?.delivery_attempts ?? 0) + 1;
199
- if (attempts >= 3) {
200
- d.prepare(`UPDATE kanban_board SET status = 'failed', error = 'delivery failed after 3 attempts', delivery_attempts = ?, updated_at = datetime('now') WHERE id = ?`).run(attempts, id);
201
- } else {
202
- d.prepare(`UPDATE kanban_board SET status = 'done', delivery_attempts = ?, updated_at = datetime('now') WHERE id = ?`).run(attempts, id);
203
- }
197
+ if (!d) return [];
198
+ const safe = term.replace(/[%_]/g, "");
199
+ const like = `%${safe}%`;
200
+ return d.prepare(
201
+ `SELECT * FROM kanban_board
202
+ WHERE title LIKE ? OR status LIKE ? OR source LIKE ? OR priority LIKE ? OR labels LIKE ? OR type LIKE ?
203
+ ORDER BY created_at DESC LIMIT 50`
204
+ ).all(like, like, like, like, like, like);
204
205
  }
205
206
  function kanbanList(filter, filterKey) {
206
207
  const d = dbOrNull();
@@ -249,6 +250,11 @@ function kanbanGetCard(id) {
249
250
  if (!d) return void 0;
250
251
  return d.prepare(`SELECT * FROM kanban_board WHERE id = ?`).get(id);
251
252
  }
253
+ function _kanbanExecForTest(sql, params = []) {
254
+ const d = dbOrNull();
255
+ if (!d) throw new Error("kanban DB not initialised");
256
+ d.prepare(sql).run(...params);
257
+ }
252
258
  function kanbanGetChildren(parentId) {
253
259
  const d = dbOrNull();
254
260
  if (!d) return [];
@@ -324,11 +330,12 @@ export {
324
330
  kanbanPending,
325
331
  kanbanSetDelivering,
326
332
  kanbanMarkDelivered,
327
- kanbanDeliveryFailed,
333
+ kanbanSearch,
328
334
  kanbanList,
329
335
  kanbanUpdate,
330
336
  kanbanCleanup,
331
337
  kanbanGetCard,
338
+ _kanbanExecForTest,
332
339
  kanbanGetChildren,
333
340
  kanbanAddTokens,
334
341
  kanbanProgress,
@@ -337,4 +344,4 @@ export {
337
344
  kanban_board_exports,
338
345
  init_kanban_board
339
346
  };
340
- //# sourceMappingURL=chunk-EQSG2CRM.js.map
347
+ //# sourceMappingURL=chunk-FGYDIX54.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/tasks/kanban-board.ts"],
4
+ "sourcesContent": ["/**\n * kanban-board.ts \u2014 Local Kanban board backed by SQLite.\n *\n * Workers write completion; main agent polls and delivers.\n * DB lives at ~/.abtars/kanban/kanban.db\n */\n\nimport { join } from \"node:path\";\nimport { mkdirSync } from \"node:fs\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { resolveNativeDep } from \"../../utils/lazy-require.js\";\nimport { logWarn } from \"../logger.js\";\n\n// better-sqlite3 is external (native module, resolved from ~/.local/lib/node_modules/)\ntype SqliteDb = { prepare(sql: string): any; exec(sql: string): void; pragma(s: string): void };\n\nexport interface KanbanCard {\n id: number;\n title: string;\n source: string;\n source_id: string | null;\n assignee: string;\n priority: string;\n status: string;\n type: string | null;\n notes: string | null;\n result_summary: string | null;\n result_path: string | null;\n error: string | null;\n delivery_attempts: number;\n approval: string | null;\n due_at: string | null;\n labels: string | null;\n parent_id: number | null;\n blocked_by: string | null;\n created_at: string;\n updated_at: string;\n completed_at: string | null;\n delivered_at: string | null;\n max_tokens: number | null;\n tokens_used: number | null;\n delivery_mode: string;\n chat_id: string | null;\n source_peer: string | null;\n}\n\nlet _db: SqliteDb | null = null;\nlet _dbAttempted = false;\n\nfunction db(): SqliteDb | null {\n if (_dbAttempted) return _db;\n _dbAttempted = true;\n const dir = join(abtarsHome(), \"kanban\");\n mkdirSync(dir, { recursive: true });\n try {\n const Database = resolveNativeDep(\"better-sqlite3\");\n _db = new Database(join(dir, \"kanban.db\")) as SqliteDb;\n _db.pragma(\"journal_mode = WAL\");\n _db.exec(`CREATE TABLE IF NOT EXISTS kanban_board (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n source TEXT NOT NULL,\n source_id TEXT,\n assignee TEXT DEFAULT 'local',\n priority TEXT NOT NULL DEFAULT 'MEDIUM' CHECK(priority IN ('CRITICAL','HIGH','MEDIUM','LOW')),\n status TEXT NOT NULL DEFAULT 'queued' CHECK(status IN ('queued','running','done','failed','delivering','delivered')),\n type TEXT,\n notes TEXT,\n result_summary TEXT,\n result_path TEXT,\n error TEXT,\n delivery_attempts INTEGER DEFAULT 0,\n approval TEXT CHECK(approval IS NULL OR approval IN ('pending','approved','rejected')),\n due_at TEXT,\n labels TEXT,\n parent_id INTEGER REFERENCES kanban_board(id),\n blocked_by TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n completed_at TEXT,\n delivered_at TEXT\n )`);\n // Migrations \u2014 safe to re-run (silently skip if column exists)\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN max_tokens INTEGER`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN tokens_used INTEGER DEFAULT 0`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN progress TEXT`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN delivery_mode TEXT DEFAULT 'deliver'`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN retry_count INTEGER DEFAULT 0`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN next_retry_at TEXT`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN chat_id TEXT`); } catch {}\n try { _db.exec(`ALTER TABLE kanban_board ADD COLUMN source_peer TEXT`); } catch {}\n } catch {\n logWarn(\"kanban\", \"better-sqlite3 not available \u2014 kanban features disabled (run: abtars deps install)\");\n _db = null;\n }\n return _db;\n}\n\nimport { nerve } from \"../nerve.js\";\n\n/** Return db or null (with warning logged once). */\nfunction dbOrNull(): SqliteDb | null {\n return db();\n}\n\nexport function kanbanEnqueue(title: string, source: string, sourceId?: string, opts?: { priority?: string; type?: string; labels?: string; due_at?: string; parent_id?: number; notes?: string; deliveryMode?: \"silent\" | \"deliver\" | \"announce\"; blocked_by?: string; chatId?: string; sourcePeer?: string }): number {\n const d = dbOrNull();\n if (!d) return 0;\n const deliveryMode = opts?.deliveryMode ?? \"deliver\";\n const stmt = d.prepare(\n `INSERT INTO kanban_board (title, source, source_id, priority, type, labels, due_at, parent_id, notes, delivery_mode, blocked_by, chat_id, source_peer)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n );\n const result = stmt.run(title, source, sourceId ?? null, opts?.priority ?? \"MEDIUM\", opts?.type ?? null, opts?.labels ?? null, opts?.due_at ?? null, opts?.parent_id ?? null, opts?.notes ?? null, deliveryMode, opts?.blocked_by ?? null, opts?.chatId ?? null, opts?.sourcePeer ?? null);\n const id = Number(result.lastInsertRowid);\n nerve.fire(\"card:queued\", id);\n return id;\n}\n\nexport function kanbanRunning(id: number): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(`UPDATE kanban_board SET status = 'running', updated_at = datetime('now') WHERE id = ?`).run(id);\n nerve.fire(\"card:running\", id);\n}\n\nexport function kanbanComplete(id: number, resultPath: string | null, summary: string): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(\n `UPDATE kanban_board SET status = 'done', result_path = ?, result_summary = ?, completed_at = datetime('now'), updated_at = datetime('now') WHERE id = ?`\n ).run(resultPath, summary.slice(0, 4000), id);\n nerve.fire(\"card:done\", id);\n}\n\nexport function kanbanFail(id: number, error: string): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(\n `UPDATE kanban_board SET status = 'failed', error = ?, completed_at = datetime('now'), updated_at = datetime('now') WHERE id = ?`\n ).run(error.slice(0, 1000), id);\n nerve.fire(\"card:failed\", id);\n}\n\nconst MAX_RETRIES = 3;\n\n/** Fail with retry logic \u2014 exponential backoff (10s\u219220s\u219240s, cap 5min). After MAX_RETRIES \u2192 permanent fail. */\nexport function kanbanRetryOrFail(id: number, error: string): \"retrying\" | \"failed\" {\n const d = dbOrNull();\n if (!d) return \"failed\";\n const card = d.prepare(\"SELECT retry_count FROM kanban_board WHERE id = ?\").get(id) as { retry_count: number } | undefined;\n const retryCount = (card?.retry_count ?? 0) + 1;\n if (retryCount > MAX_RETRIES) {\n kanbanFail(id, `${error} (after ${MAX_RETRIES} retries)`);\n return \"failed\";\n }\n const backoffMs = Math.min(10_000 * Math.pow(2, retryCount - 1), 300_000);\n const nextRetryAt = new Date(Date.now() + backoffMs).toISOString();\n d.prepare(\n `UPDATE kanban_board SET status = 'queued', retry_count = ?, next_retry_at = ?, error = ?, updated_at = datetime('now') WHERE id = ?`\n ).run(retryCount, nextRetryAt, error.slice(0, 1000), id);\n nerve.fire(\"card:queued\", id);\n return \"retrying\";\n}\n\nexport function kanbanPending(): KanbanCard[] {\n const d = dbOrNull();\n if (!d) return [];\n return d.prepare(\n `SELECT * FROM kanban_board WHERE status = 'done' AND delivery_attempts < 3 ORDER BY priority = 'CRITICAL' DESC, priority = 'HIGH' DESC, created_at ASC`\n ).all() as KanbanCard[];\n}\n\nexport function kanbanSetDelivering(id: number): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(`UPDATE kanban_board SET status = 'delivering', updated_at = datetime('now') WHERE id = ?`).run(id);\n}\n\nexport function kanbanMarkDelivered(id: number): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(\n `UPDATE kanban_board SET status = 'delivered', delivered_at = datetime('now'), updated_at = datetime('now') WHERE id = ?`\n ).run(id);\n nerve.fire(\"card:delivered\", id);\n}\n\n\n/** #1298: Cross-field LIKE search across title/status/source/priority/labels/type. */\nexport function kanbanSearch(term: string): KanbanCard[] {\n const d = dbOrNull();\n if (!d) return [];\n const safe = term.replace(/[%_]/g, \"\"); // strip LIKE wildcards to avoid user-controlled patterns\n const like = `%${safe}%`;\n return d.prepare(\n `SELECT * FROM kanban_board\n WHERE title LIKE ? OR status LIKE ? OR source LIKE ? OR priority LIKE ? OR labels LIKE ? OR type LIKE ?\n ORDER BY created_at DESC LIMIT 50`\n ).all(like, like, like, like, like, like) as KanbanCard[];\n}\n\n\nexport function kanbanList(filter?: string, filterKey?: string): KanbanCard[] {\n const d = dbOrNull();\n if (!d) return [];\n if (filter === \"*\") {\n return d.prepare(`SELECT * FROM kanban_board ORDER BY created_at DESC LIMIT 50`).all() as KanbanCard[];\n }\n if (filter && filterKey) {\n if (filterKey === \"labels\") {\n return d.prepare(`SELECT * FROM kanban_board WHERE labels LIKE ? ORDER BY created_at DESC LIMIT 50`).all(`%${filter}%`) as KanbanCard[];\n }\n const allowed = new Set([\"status\", \"source\", \"priority\", \"type\"]);\n if (allowed.has(filterKey)) {\n return d.prepare(`SELECT * FROM kanban_board WHERE ${filterKey} = ? ORDER BY created_at DESC LIMIT 50`).all(filter) as KanbanCard[];\n }\n }\n if (filter) {\n return d.prepare(`SELECT * FROM kanban_board WHERE status = ? ORDER BY created_at DESC LIMIT 50`).all(filter) as KanbanCard[];\n }\n return d.prepare(`SELECT * FROM kanban_board WHERE status NOT IN ('delivered') ORDER BY status = 'running' DESC, priority = 'CRITICAL' DESC, created_at DESC LIMIT 50`).all() as KanbanCard[];\n}\n\nexport function kanbanUpdate(id: number, fields: Partial<Pick<KanbanCard, \"title\" | \"status\" | \"priority\" | \"type\" | \"labels\" | \"due_at\" | \"notes\" | \"parent_id\" | \"approval\">>): void {\n const d = dbOrNull();\n if (!d) return;\n const sets: string[] = [\"updated_at = datetime('now')\"];\n const vals: unknown[] = [];\n for (const [k, v] of Object.entries(fields)) {\n if (v !== undefined) { sets.push(`${k} = ?`); vals.push(v); }\n }\n vals.push(id);\n d.prepare(`UPDATE kanban_board SET ${sets.join(\", \")} WHERE id = ?`).run(...vals);\n}\n\nexport function kanbanCleanup(olderThanDays = 7): number {\n const d = dbOrNull();\n if (!d) return 0;\n const result = d.prepare(\n `DELETE FROM kanban_board WHERE status = 'delivered' AND delivered_at < datetime('now', '-' || ? || ' days')`\n ).run(olderThanDays);\n return result.changes;\n}\n\nexport function kanbanGetCard(id: number): KanbanCard | undefined {\n const d = dbOrNull();\n if (!d) return undefined;\n return d.prepare(`SELECT * FROM kanban_board WHERE id = ?`).get(id) as KanbanCard | undefined;\n}\n\n/** Test-only: run a raw SQL statement against the kanban DB (avoids direct better-sqlite3 require in tests). */\nexport function _kanbanExecForTest(sql: string, params: unknown[] = []): void {\n const d = dbOrNull();\n if (!d) throw new Error(\"kanban DB not initialised\");\n d.prepare(sql).run(...params);\n}\n\nexport function kanbanGetChildren(parentId: number): KanbanCard[] {\n const d = dbOrNull();\n if (!d) return [];\n return d.prepare(`SELECT * FROM kanban_board WHERE parent_id = ? ORDER BY id`).all(parentId) as KanbanCard[];\n}\n\nexport function kanbanAddTokens(id: number, tokens: number): void {\n const d = dbOrNull();\n if (!d) return;\n d.prepare(`UPDATE kanban_board SET tokens_used = COALESCE(tokens_used, 0) + ?, updated_at = datetime('now') WHERE id = ?`).run(tokens, id);\n const card = kanbanGetCard(id);\n if (card?.parent_id) {\n d.prepare(`UPDATE kanban_board SET tokens_used = COALESCE(tokens_used, 0) + ?, updated_at = datetime('now') WHERE id = ?`).run(tokens, card.parent_id);\n }\n}\n\n// #907: Worker progress \u2014 30s debounce per card\nconst _progressTimers = new Map<number, ReturnType<typeof setTimeout>>();\nconst _progressPending = new Map<number, Record<string, unknown>>();\n\nexport function kanbanProgress(id: number, data: { toolUseCount?: number; tokenCount?: number; lastTool?: string; summary?: string }): void {\n _progressPending.set(id, data);\n if (_progressTimers.has(id)) return;\n _progressTimers.set(id, setTimeout(() => {\n _progressTimers.delete(id);\n const pending = _progressPending.get(id);\n if (pending) {\n const d = dbOrNull();\n if (d) d.prepare(`UPDATE kanban_board SET progress = ?, updated_at = datetime('now') WHERE id = ?`).run(JSON.stringify(pending), id);\n _progressPending.delete(id);\n }\n }, 30_000));\n}\n\n// \u2500\u2500 DAG orchestration (#677) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Check if all dependencies of a card are satisfied. */\nexport function isUnblocked(card: KanbanCard): boolean {\n if (!card.blocked_by) return true;\n if (card.blocked_by === \"children\") {\n const kids = kanbanGetChildren(card.id);\n return kids.length > 0 && kids.every(k => k.status === \"done\" || k.status === \"delivered\");\n }\n const depIds = card.blocked_by.split(\",\").map(Number).filter(n => !isNaN(n));\n if (depIds.length === 0) return true;\n return depIds.every(id => {\n const dep = kanbanGetCard(id);\n return dep?.status === \"done\" || dep?.status === \"delivered\";\n });\n}\n\n/** Cascade-fail all cards depending (transitively) on a failed card. */\nexport function cascadeFail(failedId: number, projectCards: KanbanCard[]): void {\n for (const card of projectCards) {\n if (card.status !== \"queued\") continue;\n if (!card.blocked_by) continue;\n const deps = card.blocked_by.split(\",\").map(Number).filter(n => !isNaN(n));\n if (deps.includes(failedId)) {\n kanbanFail(card.id, `upstream #${failedId} failed`);\n cascadeFail(card.id, projectCards);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_logger,
5
5
  logInfo
6
- } from "./chunk-GWILHZPT.js";
6
+ } from "./chunk-XRTXYN66.js";
7
7
  import {
8
8
  __esm
9
9
  } from "./chunk-7K2YZTLD.js";
@@ -15,6 +15,15 @@ function setActiveOrcCard(id) {
15
15
  function getActiveOrcCard() {
16
16
  return _activeOrcCardId;
17
17
  }
18
+ async function isActiveCardPeerSourced() {
19
+ if (_activeOrcCardId == null) return false;
20
+ try {
21
+ const { kanbanGetCard } = await import("./kanban-board-DLEJUCNN.js");
22
+ return kanbanGetCard(_activeOrcCardId)?.source === "peer";
23
+ } catch {
24
+ return false;
25
+ }
26
+ }
18
27
  function getOrcTools() {
19
28
  return [spawnWorkerTool, checkWorkersTool, cancelWorkerTool];
20
29
  }
@@ -40,7 +49,7 @@ var init_orc_tools = __esm({
40
49
  if (!_activeOrcCardId) return "[err] No active Orc project. spawn_worker only works during orchestration.";
41
50
  const goal = args.goal;
42
51
  if (!goal) return "[err] goal is required";
43
- const { spin } = await import("./spin-E3ZDEDKT.js");
52
+ const { spin } = await import("./spin-VHNGNWTD.js");
44
53
  const cardId = spin.spawnChild(_activeOrcCardId, {
45
54
  goal,
46
55
  title: args.title || goal.slice(0, 40),
@@ -57,7 +66,7 @@ var init_orc_tools = __esm({
57
66
  parameters: { type: "object", properties: {}, required: [] },
58
67
  async execute() {
59
68
  if (!_activeOrcCardId) return "[err] No active Orc project.";
60
- const { kanbanGetChildren } = await import("./kanban-board-M326B2XJ.js");
69
+ const { kanbanGetChildren } = await import("./kanban-board-DLEJUCNN.js");
61
70
  const children = kanbanGetChildren(_activeOrcCardId);
62
71
  if (children.length === 0) return "No workers spawned yet.";
63
72
  const lines = children.map((c) => {
@@ -91,7 +100,7 @@ ${lines.join("\n")}`;
91
100
  if (!_activeOrcCardId) return "[err] No active Orc project.";
92
101
  const cardId = parseInt(args.card_id ?? "", 10);
93
102
  if (isNaN(cardId)) return "[err] Invalid card_id.";
94
- const { kanbanGetCard, kanbanFail } = await import("./kanban-board-M326B2XJ.js");
103
+ const { kanbanGetCard, kanbanFail } = await import("./kanban-board-DLEJUCNN.js");
95
104
  const card = kanbanGetCard(cardId);
96
105
  if (!card) return `[err] Card #${cardId} not found.`;
97
106
  if (card.parent_id !== _activeOrcCardId) return `[err] Card #${cardId} is not a child of this project.`;
@@ -107,7 +116,8 @@ ${lines.join("\n")}`;
107
116
  export {
108
117
  setActiveOrcCard,
109
118
  getActiveOrcCard,
119
+ isActiveCardPeerSourced,
110
120
  getOrcTools,
111
121
  init_orc_tools
112
122
  };
113
- //# sourceMappingURL=chunk-YPAQEQSC.js.map
123
+ //# sourceMappingURL=chunk-GF6NVNA7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/transport/orc-tools.ts"],
4
+ "sourcesContent": ["/**\n * orc-tools.ts \u2014 Orc-specific tools for spawning/managing workers (#1005).\n *\n * Module-scoped activeOrcCardId \u2014 set by executeOrc before prompt, cleared in finally.\n * Tools always registered; return error if no active Orc project.\n */\n\nimport type { ToolDefinition } from \"./tool-registry.js\";\nimport { logInfo } from \"../logger.js\";\n\nconst TAG = \"orc-tools\";\n\nlet _activeOrcCardId: number | null = null;\n\nexport function setActiveOrcCard(id: number | null): void {\n _activeOrcCardId = id;\n}\n\nexport function getActiveOrcCard(): number | null {\n return _activeOrcCardId;\n}\n\n/**\n * #1301 \u2014 true when the Orc is currently processing a peer-originated card.\n *\n * Relay tools (peer_session/peer_wakeup/peer_delegate) call this to refuse: a\n * peer must never be able to make us call a THIRD peer under our identity\n * (relay/identity-confusion). Keys off the active card's `source` \u2014 not the\n * session \u2014 so it stays correct for the shared singleton Orc (owner-initiated\n * delegation on an owner card is still allowed).\n */\nexport async function isActiveCardPeerSourced(): Promise<boolean> {\n if (_activeOrcCardId == null) return false;\n try {\n const { kanbanGetCard } = await import(\"../tasks/kanban-board.js\");\n return kanbanGetCard(_activeOrcCardId)?.source === \"peer\";\n } catch {\n return false;\n }\n}\n\n// \u2500\u2500 spawn_worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst spawnWorkerTool: ToolDefinition = {\n name: \"spawn_worker\",\n description: \"Spawn a worker to execute a task in parallel. Workers run independently and report results.\",\n parameters: {\n type: \"object\",\n properties: {\n goal: { type: \"string\", description: \"What the worker should accomplish (detailed instruction)\" },\n title: { type: \"string\", description: \"Short label for the worker card (optional)\" },\n priority: { type: \"string\", description: \"CRITICAL | HIGH | MEDIUM | LOW\", enum: [\"CRITICAL\", \"HIGH\", \"MEDIUM\", \"LOW\"] },\n },\n required: [\"goal\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project. spawn_worker only works during orchestration.\";\n const goal = args.goal;\n if (!goal) return \"[err] goal is required\";\n const { spin } = await import(\"../spin.js\");\n const cardId = spin.spawnChild(_activeOrcCardId, {\n goal,\n title: args.title || goal.slice(0, 40),\n source: \"agent\",\n priority: args.priority as any,\n });\n logInfo(TAG, `spawn_worker card:${cardId} parent:${_activeOrcCardId} \u2014 ${(args.title || goal).slice(0, 60)}`);\n return `+ Worker card #${cardId} created: \"${args.title || goal.slice(0, 40)}\"`;\n },\n};\n\n// \u2500\u2500 check_workers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst checkWorkersTool: ToolDefinition = {\n name: \"check_workers\",\n description: \"Check status of all workers on the current project. Returns their status and results.\",\n parameters: { type: \"object\", properties: {}, required: [] },\n async execute(): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project.\";\n const { kanbanGetChildren } = await import(\"../tasks/kanban-board.js\");\n const children = kanbanGetChildren(_activeOrcCardId);\n if (children.length === 0) return \"No workers spawned yet.\";\n const lines = children.map(c => {\n const icon = c.status === \"done\" ? \"*\" : c.status === \"running\" ? \"~\" : c.status === \"failed\" ? \"x\" : \"+\";\n const result = c.result_summary ? ` \u2014 ${c.result_summary.slice(0, 100)}` : \"\";\n const tokens = c.tokens_used ? ` (${c.tokens_used} tok)` : \"\";\n const source = c.type === \"remote\" ? (() => { try { return ` [${JSON.parse(c.notes ?? \"{}\").peer}]`; } catch { return \"\"; } })() : \"\";\n return `${icon} #${c.id} ${c.title || \"(untitled)\"} (${c.status})${tokens}${source}${result}`;\n });\n return `Workers (${children.length}):\\n${lines.join(\"\\n\")}`;\n },\n};\n\n// \u2500\u2500 cancel_worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst cancelWorkerTool: ToolDefinition = {\n name: \"cancel_worker\",\n description: \"Cancel a running or queued worker. Use when a task is no longer needed (e.g., another worker found the answer first).\",\n parameters: {\n type: \"object\",\n properties: {\n card_id: { type: \"string\", description: \"The card ID of the worker to cancel\" },\n },\n required: [\"card_id\"],\n },\n async execute(args: Record<string, string>): Promise<string> {\n if (!_activeOrcCardId) return \"[err] No active Orc project.\";\n const cardId = parseInt(args.card_id ?? \"\", 10);\n if (isNaN(cardId)) return \"[err] Invalid card_id.\";\n const { kanbanGetCard, kanbanFail } = await import(\"../tasks/kanban-board.js\");\n const card = kanbanGetCard(cardId);\n if (!card) return `[err] Card #${cardId} not found.`;\n if (card.parent_id !== _activeOrcCardId) return `[err] Card #${cardId} is not a child of this project.`;\n if (card.status === \"done\" || card.status === \"delivered\") return `Card #${cardId} already completed.`;\n kanbanFail(cardId, \"cancelled by Orc\");\n logInfo(TAG, `cancel_worker card:${cardId} (parent:${_activeOrcCardId})`);\n return `x Worker #${cardId} cancelled.`;\n },\n};\n\n// \u2500\u2500 Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getOrcTools(): ToolDefinition[] {\n return [spawnWorkerTool, checkWorkersTool, cancelWorkerTool];\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAcO,SAAS,iBAAiB,IAAyB;AACxD,qBAAmB;AACrB;AAEO,SAAS,mBAAkC;AAChD,SAAO;AACT;AAWA,eAAsB,0BAA4C;AAChE,MAAI,oBAAoB,KAAM,QAAO;AACrC,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,4BAA0B;AACjE,WAAO,cAAc,gBAAgB,GAAG,WAAW;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAmFO,SAAS,cAAgC;AAC9C,SAAO,CAAC,iBAAiB,kBAAkB,gBAAgB;AAC7D;AA5HA,IAUM,KAEF,kBA+BE,iBA8BA,kBAsBA;AA/FN;AAAA;AAQA;AAEA,IAAM,MAAM;AAEZ,IAAI,mBAAkC;AA+BtC,IAAM,kBAAkC;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,UAAU,aAAa,2DAA2D;AAAA,UAChG,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,UACnF,UAAU,EAAE,MAAM,UAAU,aAAa,kCAAkC,MAAM,CAAC,YAAY,QAAQ,UAAU,KAAK,EAAE;AAAA,QACzH;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,MACA,MAAM,QAAQ,MAA+C;AAC3D,YAAI,CAAC,iBAAkB,QAAO;AAC9B,cAAM,OAAO,KAAK;AAClB,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,EAAE,KAAK,IAAI,MAAM,OAAO,oBAAY;AAC1C,cAAM,SAAS,KAAK,WAAW,kBAAkB;AAAA,UAC/C;AAAA,UACA,OAAO,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE;AAAA,UACrC,QAAQ;AAAA,UACR,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,gBAAQ,KAAK,qBAAqB,MAAM,WAAW,gBAAgB,YAAO,KAAK,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE;AAC5G,eAAO,kBAAkB,MAAM,cAAc,KAAK,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,MAC9E;AAAA,IACF;AAIA,IAAM,mBAAmC;AAAA,MACvC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,MAC3D,MAAM,UAA2B;AAC/B,YAAI,CAAC,iBAAkB,QAAO;AAC9B,cAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,4BAA0B;AACrE,cAAM,WAAW,kBAAkB,gBAAgB;AACnD,YAAI,SAAS,WAAW,EAAG,QAAO;AAClC,cAAM,QAAQ,SAAS,IAAI,OAAK;AAC9B,gBAAM,OAAO,EAAE,WAAW,SAAS,MAAM,EAAE,WAAW,YAAY,MAAM,EAAE,WAAW,WAAW,MAAM;AACtG,gBAAM,SAAS,EAAE,iBAAiB,WAAM,EAAE,eAAe,MAAM,GAAG,GAAG,CAAC,KAAK;AAC3E,gBAAM,SAAS,EAAE,cAAc,KAAK,EAAE,WAAW,UAAU;AAC3D,gBAAM,SAAS,EAAE,SAAS,YAAY,MAAM;AAAE,gBAAI;AAAE,qBAAO,KAAK,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,IAAI;AAAA,YAAK,QAAQ;AAAE,qBAAO;AAAA,YAAI;AAAA,UAAE,GAAG,IAAI;AACnI,iBAAO,GAAG,IAAI,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,YAAY,KAAK,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM;AAAA,QAC7F,CAAC;AACD,eAAO,YAAY,SAAS,MAAM;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AAIA,IAAM,mBAAmC;AAAA,MACvC,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,aAAa,sCAAsC;AAAA,QAChF;AAAA,QACA,UAAU,CAAC,SAAS;AAAA,MACtB;AAAA,MACA,MAAM,QAAQ,MAA+C;AAC3D,YAAI,CAAC,iBAAkB,QAAO;AAC9B,cAAM,SAAS,SAAS,KAAK,WAAW,IAAI,EAAE;AAC9C,YAAI,MAAM,MAAM,EAAG,QAAO;AAC1B,cAAM,EAAE,eAAe,WAAW,IAAI,MAAM,OAAO,4BAA0B;AAC7E,cAAM,OAAO,cAAc,MAAM;AACjC,YAAI,CAAC,KAAM,QAAO,eAAe,MAAM;AACvC,YAAI,KAAK,cAAc,iBAAkB,QAAO,eAAe,MAAM;AACrE,YAAI,KAAK,WAAW,UAAU,KAAK,WAAW,YAAa,QAAO,SAAS,MAAM;AACjF,mBAAW,QAAQ,kBAAkB;AACrC,gBAAQ,KAAK,sBAAsB,MAAM,YAAY,gBAAgB,GAAG;AACxE,eAAO,aAAa,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA;AAAA;",
6
+ "names": []
7
+ }