abtars 0.3.4-alpha.7 → 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 (348) hide show
  1. package/bundle/{_registry.generated-WGR4WOPT.js → _registry.generated-AVR7DK2A.js} +17 -14
  2. package/bundle/{_registry.generated-WGR4WOPT.js.map → _registry.generated-AVR7DK2A.js.map} +1 -1
  3. package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
  4. package/bundle/abtars-browser.js +4 -4
  5. package/bundle/abtars-cli.js +23 -13
  6. package/bundle/abtars-cli.js.map +2 -2
  7. package/bundle/abtars-restart.js +3 -3
  8. package/bundle/abtars-task.js +3 -3
  9. package/bundle/abtars-task.js.map +2 -2
  10. package/bundle/abtars.js +610 -455
  11. package/bundle/abtars.js.map +4 -4
  12. package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
  13. package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
  14. package/bundle/{agent-api-adapter-YAHKQMMZ.js → agent-api-adapter-7HEPYSIN.js} +3 -3
  15. package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
  16. package/bundle/{agent-registry-GI6CLT3Z.js → agent-registry-46A2R5KP.js} +7 -7
  17. package/bundle/{bootstrap-X2QYIZIJ.js → bootstrap-MIHJJSWU.js} +2 -2
  18. package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
  19. package/bundle/{browser-DMARZJIN.js → browser-F6BCWJWW.js} +6 -6
  20. package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
  21. package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
  22. package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
  23. package/bundle/{chunk-KTYGKPYM.js → chunk-2NLUT5S2.js} +6 -6
  24. package/bundle/chunk-3BG3AIDP.js +191 -0
  25. package/bundle/chunk-3BG3AIDP.js.map +7 -0
  26. package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
  27. package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
  28. package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
  29. package/bundle/{chunk-LGP6TYFI.js → chunk-4AILRHUI.js} +97 -8
  30. package/bundle/chunk-4AILRHUI.js.map +7 -0
  31. package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
  32. package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
  33. package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
  34. package/bundle/{chunk-4UL3KINB.js → chunk-5PNJFDSW.js} +8 -8
  35. package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
  36. package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
  37. package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
  38. package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
  39. package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
  40. package/bundle/chunk-BNXV7SZI.js +195 -0
  41. package/bundle/chunk-BNXV7SZI.js.map +7 -0
  42. package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
  43. package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
  44. package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
  45. package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
  46. package/bundle/{chunk-GXL7HJPT.js → chunk-EAX5ZZUL.js} +63 -39
  47. package/bundle/chunk-EAX5ZZUL.js.map +7 -0
  48. package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
  49. package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
  50. package/bundle/chunk-FGYDIX54.js.map +7 -0
  51. package/bundle/{chunk-XWRADSXO.js → chunk-GF6NVNA7.js} +15 -5
  52. package/bundle/chunk-GF6NVNA7.js.map +7 -0
  53. package/bundle/{chunk-SIFPBTI4.js → chunk-HGSHCQ5F.js} +113 -73
  54. package/bundle/chunk-HGSHCQ5F.js.map +7 -0
  55. package/bundle/{chunk-YRU2K3O6.js → chunk-IMIGG5EO.js} +39 -39
  56. package/bundle/chunk-IMIGG5EO.js.map +7 -0
  57. package/bundle/{chunk-W4EA4GCA.js → chunk-ITOFPJAV.js} +43 -31
  58. package/bundle/chunk-ITOFPJAV.js.map +7 -0
  59. package/bundle/{chunk-UPRZDU6T.js → chunk-IY6UKLPS.js} +3 -3
  60. package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
  61. package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
  62. package/bundle/chunk-J7DRPVMU.js.map +7 -0
  63. package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
  64. package/bundle/chunk-JG4BKXBN.js.map +7 -0
  65. package/bundle/{chunk-5B5B6EHL.js → chunk-JLWYPGWI.js} +5 -5
  66. package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
  67. package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
  68. package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
  69. package/bundle/{chunk-ONBF5DDU.js → chunk-L72RIPEC.js} +248 -182
  70. package/bundle/chunk-L72RIPEC.js.map +7 -0
  71. package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
  72. package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
  73. package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
  74. package/bundle/chunk-OY4Q6AMY.js.map +7 -0
  75. package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
  76. package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
  77. package/bundle/{chunk-BROFMHC2.js → chunk-PB5GF4FG.js} +334 -237
  78. package/bundle/chunk-PB5GF4FG.js.map +7 -0
  79. package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
  80. package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
  81. package/bundle/{chunk-HKRSMUXJ.js → chunk-SC2Y5NR2.js} +71 -132
  82. package/bundle/chunk-SC2Y5NR2.js.map +7 -0
  83. package/bundle/chunk-SFL4EPCZ.js +555 -0
  84. package/bundle/chunk-SFL4EPCZ.js.map +7 -0
  85. package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
  86. package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
  87. package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
  88. package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
  89. package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
  90. package/bundle/chunk-WC5O5KOE.js +211 -0
  91. package/bundle/chunk-WC5O5KOE.js.map +7 -0
  92. package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
  93. package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
  94. package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
  95. package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
  96. package/bundle/chunk-YJZE4OK3.js +169 -0
  97. package/bundle/chunk-YJZE4OK3.js.map +7 -0
  98. package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
  99. package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
  100. package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
  101. package/bundle/{commands-XYEGVUZF.js → commands-2ZW6CMLC.js} +17 -16
  102. package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
  103. package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
  104. package/bundle/context-CL2RSLII.js.map +7 -0
  105. package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
  106. package/bundle/{delegation-tools-QKNYQGTQ.js → delegation-tools-WS7Z56KZ.js} +12 -12
  107. package/bundle/{deploy-EPDWNHJU.js → deploy-AMTVKIMU.js} +2 -2
  108. package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
  109. package/bundle/{direct-api-transport-E3LNDBJT.js → direct-api-transport-QNNY2WWP.js} +56 -33
  110. package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
  111. package/bundle/{discord-adapter-IT3KP3VB.js → discord-adapter-ABAD56Y2.js} +21 -20
  112. package/bundle/{discord-adapter-IT3KP3VB.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
  113. package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
  114. package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
  115. package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
  116. package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
  117. package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
  118. package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
  119. package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
  120. package/bundle/{heartbeat-tier3-ABWL3P7M.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
  121. package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
  122. package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
  123. package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
  124. package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
  125. package/bundle/install-RFKKFSGS.js.map +7 -0
  126. package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
  127. package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
  128. package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
  129. package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
  130. package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
  131. package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
  132. package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
  133. package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
  134. package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
  135. package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
  136. package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
  137. package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
  138. package/bundle/{message-pipeline-P5GAQU4Z.js → message-pipeline-GRDRWONR.js} +17 -16
  139. package/bundle/meta.json +3699 -3138
  140. package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
  141. package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
  142. package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
  143. package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
  144. package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
  145. package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
  146. package/bundle/{orc-tools-4CHEFWSN.js → orc-tools-UZVPONKY.js} +5 -3
  147. package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
  148. package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
  149. package/bundle/peer-client-UITTMWJ2.js.map +7 -0
  150. package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
  151. package/bundle/{peer-transport-I6JPLFZ2.js → peer-transport-SI7I72DB.js} +12 -10
  152. package/bundle/{phase-transport-PGKU2KD4.js → phase-transport-ESWWACZI.js} +17 -17
  153. package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
  154. package/bundle/{reconciler-EBKH3JNU.js → reconciler-IEUJXJN2.js} +12 -12
  155. package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
  156. package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
  157. package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
  158. package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
  159. package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
  160. package/bundle/{skill-session-BMSRQSHV.js → skill-session-5HSMXY54.js} +3 -3
  161. package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
  162. package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
  163. package/bundle/{sleep-36XS6MHJ.js → sleep-I4JFASCY.js} +11 -8
  164. package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
  165. package/bundle/{spin-TI3TSVVT.js → spin-VHNGNWTD.js} +11 -11
  166. package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
  167. package/bundle/{spin-types-BLPYAETA.js → spin-types-C5KOQOPD.js} +7 -3
  168. package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
  169. package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
  170. package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
  171. package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
  172. package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
  173. package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
  174. package/bundle/{system-status-JZU5FO7B.js → system-status-4LYGOFNO.js} +38 -24
  175. package/bundle/system-status-4LYGOFNO.js.map +7 -0
  176. package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
  177. package/bundle/{telegram-adapter-H6PMFPMB.js → telegram-adapter-O6KIZDY6.js} +69 -46
  178. package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
  179. package/bundle/{tool-registry-IZX2IOBM.js → tool-registry-JJMWCQKZ.js} +26 -24
  180. package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
  181. package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
  182. package/bundle/tribe-GDTFYJTK.js +111 -0
  183. package/bundle/tribe-GDTFYJTK.js.map +7 -0
  184. package/bundle/{update-MESYO4LO.js → update-HGQAOC5L.js} +3 -3
  185. package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
  186. package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
  187. package/bundle/wire-platform-KKPWNNNQ.js +88 -0
  188. package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
  189. package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
  190. package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
  191. package/package.json +1 -1
  192. package/scripts/abtars-watchdog.service +2 -1
  193. package/scripts/abtars-watchdog.sh +1 -5
  194. package/scripts/emergency-deploy.sh +2 -2
  195. package/scripts/emergency-update.sh +88 -41
  196. package/bundle/chunk-3AAENI2K.js +0 -210
  197. package/bundle/chunk-3AAENI2K.js.map +0 -7
  198. package/bundle/chunk-4MULJ5SS.js.map +0 -7
  199. package/bundle/chunk-4S554KLW.js +0 -105
  200. package/bundle/chunk-4S554KLW.js.map +0 -7
  201. package/bundle/chunk-5GCLBUBS.js +0 -257
  202. package/bundle/chunk-5GCLBUBS.js.map +0 -7
  203. package/bundle/chunk-BROFMHC2.js.map +0 -7
  204. package/bundle/chunk-EGL6UMAO.js.map +0 -7
  205. package/bundle/chunk-EQSG2CRM.js.map +0 -7
  206. package/bundle/chunk-GXL7HJPT.js.map +0 -7
  207. package/bundle/chunk-HKRSMUXJ.js.map +0 -7
  208. package/bundle/chunk-HT2BPTZY.js +0 -241
  209. package/bundle/chunk-HT2BPTZY.js.map +0 -7
  210. package/bundle/chunk-HZDLFLRP.js.map +0 -7
  211. package/bundle/chunk-IKUZPMVA.js +0 -82
  212. package/bundle/chunk-IKUZPMVA.js.map +0 -7
  213. package/bundle/chunk-LGP6TYFI.js.map +0 -7
  214. package/bundle/chunk-ONBF5DDU.js.map +0 -7
  215. package/bundle/chunk-RWRRGE4U.js +0 -72
  216. package/bundle/chunk-RWRRGE4U.js.map +0 -7
  217. package/bundle/chunk-SIFPBTI4.js.map +0 -7
  218. package/bundle/chunk-VUIX5AGB.js +0 -65
  219. package/bundle/chunk-VUIX5AGB.js.map +0 -7
  220. package/bundle/chunk-W4EA4GCA.js.map +0 -7
  221. package/bundle/chunk-XWRADSXO.js.map +0 -7
  222. package/bundle/chunk-Y76VUJSF.js +0 -75
  223. package/bundle/chunk-Y76VUJSF.js.map +0 -7
  224. package/bundle/chunk-YRU2K3O6.js.map +0 -7
  225. package/bundle/context-2RJHC2LE.js.map +0 -7
  226. package/bundle/direct-api-transport-E3LNDBJT.js.map +0 -7
  227. package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
  228. package/bundle/heartbeat-tier3-ABWL3P7M.js.map +0 -7
  229. package/bundle/install-OS3CU7NF.js.map +0 -7
  230. package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
  231. package/bundle/peer-client-RGEU5HOK.js.map +0 -7
  232. package/bundle/peer-jwt-NCCPXJRX.js +0 -18
  233. package/bundle/public/css/dashboard.css +0 -542
  234. package/bundle/public/index.html +0 -180
  235. package/bundle/public/js/app.js +0 -437
  236. package/bundle/public/memory-universe.js +0 -384
  237. package/bundle/stream-single-RFJNUTL6.js +0 -34
  238. package/bundle/stream-single-RFJNUTL6.js.map +0 -7
  239. package/bundle/subagent-runtime-5QUVES3W.js +0 -14
  240. package/bundle/system-status-JZU5FO7B.js.map +0 -7
  241. package/bundle/telegram-adapter-H6PMFPMB.js.map +0 -7
  242. package/bundle/usage-tracker-NXD364VX.js.map +0 -7
  243. package/bundle/user-registry-35BW4XKM.js.map +0 -7
  244. package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
  245. package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
  246. /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
  247. /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
  248. /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
  249. /package/bundle/{agent-api-adapter-YAHKQMMZ.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
  250. /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
  251. /package/bundle/{agent-registry-GI6CLT3Z.js.map → agent-registry-46A2R5KP.js.map} +0 -0
  252. /package/bundle/{bootstrap-X2QYIZIJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
  253. /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
  254. /package/bundle/{browser-DMARZJIN.js.map → browser-F6BCWJWW.js.map} +0 -0
  255. /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
  256. /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
  257. /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
  258. /package/bundle/{chunk-KTYGKPYM.js.map → chunk-2NLUT5S2.js.map} +0 -0
  259. /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
  260. /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
  261. /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
  262. /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
  263. /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
  264. /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
  265. /package/bundle/{chunk-4UL3KINB.js.map → chunk-5PNJFDSW.js.map} +0 -0
  266. /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
  267. /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
  268. /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
  269. /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
  270. /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
  271. /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
  272. /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
  273. /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
  274. /package/bundle/{chunk-UPRZDU6T.js.map → chunk-IY6UKLPS.js.map} +0 -0
  275. /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
  276. /package/bundle/{chunk-5B5B6EHL.js.map → chunk-JLWYPGWI.js.map} +0 -0
  277. /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
  278. /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
  279. /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
  280. /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
  281. /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
  282. /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
  283. /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
  284. /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
  285. /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
  286. /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
  287. /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
  288. /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
  289. /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
  290. /package/bundle/{commands-XYEGVUZF.js.map → commands-2ZW6CMLC.js.map} +0 -0
  291. /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
  292. /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
  293. /package/bundle/{delegation-tools-QKNYQGTQ.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
  294. /package/bundle/{deploy-EPDWNHJU.js.map → deploy-AMTVKIMU.js.map} +0 -0
  295. /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
  296. /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
  297. /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
  298. /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
  299. /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
  300. /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
  301. /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
  302. /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
  303. /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
  304. /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
  305. /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
  306. /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
  307. /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
  308. /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
  309. /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
  310. /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
  311. /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
  312. /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
  313. /package/bundle/{message-pipeline-P5GAQU4Z.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
  314. /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
  315. /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
  316. /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
  317. /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
  318. /package/bundle/{orc-tools-4CHEFWSN.js.map → orc-tools-UZVPONKY.js.map} +0 -0
  319. /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
  320. /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
  321. /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
  322. /package/bundle/{peer-transport-I6JPLFZ2.js.map → phase-transport-ESWWACZI.js.map} +0 -0
  323. /package/bundle/{phase-transport-PGKU2KD4.js.map → reconcile-GFDQYNBD.js.map} +0 -0
  324. /package/bundle/{reconciler-EBKH3JNU.js.map → reconciler-IEUJXJN2.js.map} +0 -0
  325. /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
  326. /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
  327. /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
  328. /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
  329. /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
  330. /package/bundle/{skill-session-BMSRQSHV.js.map → skill-session-5HSMXY54.js.map} +0 -0
  331. /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
  332. /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
  333. /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
  334. /package/bundle/{sleep-36XS6MHJ.js.map → soul-bundle-522C3IRH.js.map} +0 -0
  335. /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
  336. /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
  337. /package/bundle/{spin-TI3TSVVT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
  338. /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
  339. /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
  340. /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
  341. /package/bundle/{spin-types-BLPYAETA.js.map → stt-PSOPPBV4.js.map} +0 -0
  342. /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
  343. /package/bundle/{subagent-runtime-5QUVES3W.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
  344. /package/bundle/{task-store-W5BFIAIH.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
  345. /package/bundle/{tool-registry-IZX2IOBM.js.map → transport-config-6MB2K2XC.js.map} +0 -0
  346. /package/bundle/{tool-sandbox-4UC6GAKA.js.map → update-HGQAOC5L.js.map} +0 -0
  347. /package/bundle/{transport-config-KBF5W2DP.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
  348. /package/bundle/{update-MESYO4LO.js.map → user-registry-4PACZJIJ.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/spin-profiles.ts", "../src/components/spin-types.ts"],
4
+ "sourcesContent": ["/**\n * spin-profiles.ts \u2014 Per-session-type behavior registry (#1271).\n *\n * Replaces the per-type `if (type === ...)` branches that used to live in\n * `execute()` and `executeOrc()`. Adding a new SessionType = adding a row to\n * SESSION_PROFILES; `spin()` itself contains no type-specific code.\n */\n\nimport type { AgentName } from \"./subagent-runtime.js\";\nimport type { ManagedSession, SessionType } from \"./spin-types.js\";\nimport { sessionType } from \"./spin-types.js\";\n\n/** A prompt decorator wraps/prepends context onto the outgoing prompt. */\nexport type PromptDecorator = (\n prompt: string,\n ctx: { session: ManagedSession; cardId?: number; parentCardId?: number },\n) => Promise<string> | string;\n\nexport interface SessionProfile {\n /** Agent to route the prompt to. */\n agent: AgentName;\n /** \"oneshot\" uses runtime.complete(); \"persistent\" uses session.transport.sendPrompt. */\n transportMode: \"oneshot\" | \"persistent\";\n /** How spin() resolves the ManagedSession \u2014 replaces per-type branches. */\n resolution: \"active\" | \"singleton\" | \"transient\";\n /** What happens to the session record after the call returns. */\n terminateAfter: \"call\" | \"response\" | \"external\";\n /** Ordered prompt transforms (decorator at index N prepends; last in list = outermost). */\n decorators: readonly PromptDecorator[];\n /** Side-effect hook fired before the prompt is sent. */\n beforePrompt?: (session: ManagedSession, cardId?: number) => Promise<void> | void;\n /** Side-effect hook fired after the prompt resolves (success OR failure). */\n afterPrompt?: (session: ManagedSession, cardId?: number) => Promise<void> | void;\n}\n\n// \u2500\u2500 Reusable decorators \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 soulBundle: PromptDecorator = async (prompt, { session }) => {\n const { buildSoulBundle } = await import(\"./soul-bundle.js\");\n const bundle = buildSoulBundle(sessionType(session));\n return bundle ? `${bundle}\\n\\n---\\n\\n${prompt}` : prompt;\n};\n\nconst channelMessages: PromptDecorator = async (prompt, { cardId, parentCardId }) => {\n if (cardId === undefined) return prompt;\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const workerName = `Worker-${String(cardId).padStart(2, \"0\")}`;\n const msgs = channelUnread(parentCardId ?? cardId, workerName);\n if (msgs.length === 0) return prompt;\n const lines = msgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n return `[CHANNEL \u2014 ${msgs.length} message(s) for ${workerName}]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${prompt}`;\n};\n\nconst orcContext: PromptDecorator = async (prompt, { cardId }) => {\n const { localDateTime } = await import(\"../utils/local-time.js\");\n return `[CONTEXT \u2014 do not respond to this section]\\n[PROJECT] card #${cardId}\\n[CURRENT TIME] ${localDateTime()}\\n[/CONTEXT]\\n\\n${prompt}`;\n};\n\nconst orcNotifications: PromptDecorator = async (prompt, { cardId }) => {\n if (cardId === undefined) return prompt;\n const { drainOrcNotifications } = await import(\"./spin-notifications.js\");\n const n = drainOrcNotifications(cardId);\n return n.length ? `${n.join(\"\\n\")}\\n\\n${prompt}` : prompt;\n};\n\nconst orcChannel: PromptDecorator = async (prompt, { cardId }) => {\n if (cardId === undefined) return prompt;\n const { channelUnread } = await import(\"./tasks/kanban-channel.js\");\n const msgs = channelUnread(cardId, \"Orc\");\n if (msgs.length === 0) return prompt;\n const lines = msgs.map(m => `[${m.from_agent}\u2192${m.to_agent}]${m.directive ? \" \u26A1\" : \"\"} ${m.message}`);\n return `[CHANNEL \u2014 ${msgs.length} message(s)]\\n${lines.join(\"\\n\")}\\n[/CHANNEL]\\n\\n${prompt}`;\n};\n\n// \u2500\u2500 The registry \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 const SESSION_PROFILES: Record<SessionType, SessionProfile> = {\n A: { agent: \"professor\", transportMode: \"persistent\", resolution: \"active\", terminateAfter: \"external\", decorators: [] },\n B: { agent: \"browsie\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle] },\n C: { agent: \"coding\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle] },\n T: { agent: \"professor\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle, channelMessages] },\n P: { agent: \"professor\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle] },\n S: { agent: \"coding\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"call\", decorators: [] },\n W: { agent: \"browsie\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle, channelMessages] },\n H: { agent: \"coding\", transportMode: \"oneshot\", resolution: \"transient\", terminateAfter: \"response\", decorators: [soulBundle] },\n D: { agent: \"dreamy\", transportMode: \"persistent\", resolution: \"transient\", terminateAfter: \"external\", decorators: [] },\n O: {\n agent: \"browsie\", // \u2190 preserves current Orc agent (NOT professor)\n transportMode: \"persistent\",\n resolution: \"singleton\", // \u2190 one Orc; reuse the visible O session\n terminateAfter: \"external\",\n decorators: [orcContext, soulBundle, orcNotifications, orcChannel],\n beforePrompt: async (_session, cardId) => {\n const { updateBridgeLockField } = await import(\"./transport/bridge-lock-transport.js\");\n const { setActiveOrcCard } = await import(\"./transport/orc-tools.js\");\n if (cardId !== undefined) { updateBridgeLockField(\"orc_active\", cardId); setActiveOrcCard(cardId); }\n },\n afterPrompt: async () => {\n const { updateBridgeLockField } = await import(\"./transport/bridge-lock-transport.js\");\n const { setActiveOrcCard } = await import(\"./transport/orc-tools.js\");\n updateBridgeLockField(\"orc_active\", null); setActiveOrcCard(null);\n },\n },\n};\n\nexport function profileFor(type: SessionType): SessionProfile {\n return SESSION_PROFILES[type];\n}\n", "/**\n * spin-types.ts \u2014 Types and helpers for the Spin session system (#943, #953).\n * Importable by any module that needs ManagedSession or SessionType without pulling in the full Spin class.\n */\n\nimport type { AgentName } from \"./subagent-runtime.js\";\nimport type { IKiroTransport } from \"./transport/kiro-transport.js\";\nimport type { SandboxPolicy } from \"./tool-sandbox.js\";\nimport { logError } from \"./logger.js\";\n\nexport type SessionType = \"A\" | \"B\" | \"C\" | \"T\" | \"P\" | \"S\" | \"O\" | \"W\" | \"D\" | \"H\";\n\nexport interface ManagedSession {\n id: string; // \"1749563282_A_01\"\n userId: string;\n platform: string;\n chatId: number;\n threadId?: number | string;\n\n // Transport\n transport?: IKiroTransport;\n delivery: \"streaming\" | \"simple\";\n model?: string;\n provider?: string;\n pid?: number;\n peer?: string; // remote host name (hollow session)\n remoteSessionId?: string; // session ID on the peer\n\n // Lifecycle\n active: boolean; // true = current session for this userId+platform\n status: \"creating\" | \"ready\" | \"paused\" | \"ended\";\n idleTimeoutMs: number;\n lastActiveAt: number;\n motherId?: string;\n name?: string;\n\n // Context\n workingDir?: string;\n contextPercent?: number;\n\n // Metrics\n messageCount: number;\n tokenCount: number;\n toolCallCount: number;\n\n // Session event log (last 5 events)\n log: string[];\n\n // Display\n shortIndex: number;\n\n // Pipeline state (#1040 \u2014 merged from SessionRegistry)\n busy: boolean;\n queue: Array<{ msg: import(\"../types/platform.js\").InboundMessage; adapter: import(\"../types/platform.js\").PlatformAdapter }>;\n fullMode: boolean;\n pendingStart: boolean;\n seen: boolean;\n compacting: boolean;\n ctxWarned: boolean;\n compactFailures: number;\n primingTerms: string[];\n pendingWait?: string;\n\n // Completion buffer (#1040 \u2014 merged from completion-buffer.ts)\n completions: Array<{ sessionId: string; goal: string; status: string; result: string; elapsedMs: number; inputTokens: number; outputTokens: number }>;\n\n // Session-scoped metadata (#1271). Set ONCE at session allocation from\n // `SpinSessionSpec.metadata`; never merged on `sessionId` reuse. Use\n // `onStepComplete`'s event for per-step data.\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpinRequest {\n type: SessionType;\n agent?: import(\"./subagent-runtime.js\").AgentName; // override typeAgent() default\n goal: string;\n title?: string;\n source: \"task\" | \"user\" | \"agent\" | \"peer\";\n cardId?: number;\n parentCardId?: number;\n deliveryMode?: \"silent\" | \"deliver\" | \"announce\";\n priority?: string;\n tools?: SandboxPolicy;\n timeoutMs?: number;\n callbackPeer?: string; // #675: peer to notify on completion\n sourcePeer?: string; // #949: which peer delegated this task\n chatId?: string; // #1008: delivery target chat (fallback: masterChatId)\n maxToolRounds?: number; // #1283: per-task circuit breaker override\n}\n\n// \u2500\u2500 #1271: unified session API \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 interface SpinSessionSpec {\n type: SessionType;\n\n // Identity\n userId?: string; // default: master user\n platform?: string; // default: \"background\"\n chatId?: number; // default: 0\n\n // Work\n goal?: string; // user-facing \u2192 creates kanban card\n prompt?: string; // background one-shot \u2192 no card\n\n // Reuse / continuation (multi-step sleep, pipeline main turn)\n sessionId?: string; // reuse an existing session (send next prompt to it)\n\n // Lifecycle overrides (default comes from the profile)\n active?: boolean;\n persistent?: boolean;\n terminateAfter?: \"call\" | \"response\" | \"external\";\n\n // Kanban tracking\n cardId?: number;\n parentCardId?: number;\n title?: string;\n priority?: \"CRITICAL\" | \"HIGH\" | \"MEDIUM\" | \"LOW\";\n source?: \"task\" | \"user\" | \"agent\" | \"peer\";\n\n // Execution\n agent?: import(\"./subagent-runtime.js\").AgentName; // override the profile's agent\n timeoutMs?: number;\n maxToolRounds?: number; // #1283: per-task circuit breaker override\n\n // Delivery (continuation / pipeline)\n deliveryMode?: \"deliver\" | \"silent\" | \"announce\";\n imageContent?: unknown; // \u2192 sendPrompt arg 3 (image passthrough)\n callbackPeer?: string;\n sourcePeer?: string;\n // NOTE: no `stream` field. Streaming is a transport property\n // (transport.onIntermediateResponse / onToolCallStart / onSegmentBreak) that the\n // PIPELINE sets before calling spin() and resets in its finally \u2014 Spin never touches it.\n // sendPrompt is (sessionKey, message, image?, userId?) \u2014 4 args, no stream.\n\n // Extension / future-proofing\n metadata?: Record<string, unknown>; // session-scoped initial data, set ONCE at allocation\n // (not merged on sessionId-reuse \u2014 see design \u00A72)\n\n // Result\n await?: boolean;\n\n // Progress hook (partial-result reporting \u2014 sleep, workers)\n onStepComplete?: (event: StepEvent) => void | Promise<void>;\n}\n\nexport interface StepEvent {\n sessionId: string;\n cardId?: number;\n stepIndex: number; // 1-based call count within this session\n result?: string; // undefined on failure\n error?: Error;\n durationMs: number;\n inputTokens?: number; // per-call absolute (usage.input), not a delta\n outputTokens?: number; // per-call absolute (usage.output)\n}\n\nexport interface SpinResult {\n sessionId: string;\n cardId?: number;\n result?: string; // present when await: true\n}\n\nexport interface DispatchBackgroundOptions {\n prompt: string;\n type?: SessionType; // default \"S\" (ephemeral one-shot)\n agent?: import(\"./subagent-runtime.js\").AgentName; // override the profile agent\n timeoutMs?: number;\n}\n\n// \u2500\u2500 Helpers \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 sessionType(session: ManagedSession): SessionType {\n const type = session.id.split(\"_\")[1];\n if (!type) logError(\"spin-types\", `Malformed session ID \"${session.id}\" \u2014 no type segment, defaulting to A`);\n return (type ?? \"A\") as SessionType;\n}\n\n/** Session type from a raw session-id string (companion to sessionType(session)). */\nexport function sessionTypeOf(sessionId: string): SessionType {\n return (sessionId.split(\"_\")[1] ?? \"A\") as SessionType;\n}\n\n/**\n * #1022: compaction fires only for A (main) and C (coding) session types.\n * Every other type (B, D, O, S, T, P, W, H) is never compacted. Hard requirement.\n */\nconst COMPACTABLE_TYPES: ReadonlySet<SessionType> = new Set<SessionType>([\"A\", \"C\"]);\nexport function isCompactable(sessionId: string): boolean {\n return COMPACTABLE_TYPES.has(sessionTypeOf(sessionId));\n}\n\nexport function sessionCreatedAt(session: ManagedSession): number {\n return parseInt(session.id.split(\"_\")[0] ?? \"0\", 10) * 1000;\n}\n\nconst TYPE_LABELS: Record<SessionType, string> = {\n A: \"Main\", B: \"Browse\", C: \"Code\", T: \"Task\", P: \"Peer\",\n S: \"System\", O: \"Orc\", W: \"Worker\", D: \"Dreamy\", H: \"Healer\",\n};\n\nconst TYPE_AGENT_MAP: Partial<Record<SessionType, AgentName>> = {\n A: \"professor\", C: \"coding\", B: \"browsie\", D: \"dreamy\",\n O: \"professor\", T: \"professor\", W: \"browsie\", H: \"coding\",\n};\n\nexport function typeLabel(t: SessionType): string { return TYPE_LABELS[t]; }\n\n/** #1271: single source of truth = SessionProfile. Kept as fallback for callers\n * that import spin-types without pulling in spin-profiles. */\nexport function typeAgent(t: SessionType): AgentName {\n try {\n // Lazy require to avoid circular import (spin-profiles \u2192 spin-types).\n // The static map is also kept for back-compat in the standalone abmind path.\n const { SESSION_PROFILES } = require(\"./spin-profiles.js\") as typeof import(\"./spin-profiles.js\");\n return SESSION_PROFILES[t].agent;\n } catch {\n return TYPE_AGENT_MAP[t] ?? \"professor\";\n }\n}\n\nexport function parseSessionType(input: string): SessionType | null {\n switch (input.toLowerCase()) {\n case \"browse\": return \"B\";\n case \"code\": return \"C\";\n case \"task\": return \"T\";\n default: return null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SESSION_PROFILES"]
7
+ }
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_user_registry,
5
5
  loadUsers
6
- } from "./chunk-ZV4IWKDJ.js";
6
+ } from "./chunk-E7XD5UGB.js";
7
7
  import {
8
8
  __esm
9
9
  } from "./chunk-7K2YZTLD.js";
@@ -24,4 +24,4 @@ export {
24
24
  getMasterUserId,
25
25
  init_master_user
26
26
  };
27
- //# sourceMappingURL=chunk-AFREM7FX.js.map
27
+ //# sourceMappingURL=chunk-CK7YTA2F.js.map
@@ -5,7 +5,7 @@ import {
5
5
  logDebug,
6
6
  logInfo,
7
7
  logWarn
8
- } from "./chunk-GWILHZPT.js";
8
+ } from "./chunk-XRTXYN66.js";
9
9
  import {
10
10
  abmindHome,
11
11
  init_paths
@@ -148,4 +148,4 @@ export {
148
148
  getHookSummary,
149
149
  fire
150
150
  };
151
- //# sourceMappingURL=chunk-NRUSRJXR.js.map
151
+ //# sourceMappingURL=chunk-DZJ5QZFD.js.map
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_logger,
5
5
  logTrace
6
- } from "./chunk-GWILHZPT.js";
6
+ } from "./chunk-XRTXYN66.js";
7
7
 
8
8
  // src/components/env.ts
9
9
  init_logger();
@@ -26,4 +26,4 @@ export {
26
26
  readEnv,
27
27
  readEnvWithDefault
28
28
  };
29
- //# sourceMappingURL=chunk-YRSMGJFP.js.map
29
+ //# sourceMappingURL=chunk-E67KESEG.js.map
@@ -3,12 +3,12 @@
3
3
  import {
4
4
  getEnv,
5
5
  init_env_schema
6
- } from "./chunk-65VCEC32.js";
6
+ } from "./chunk-6PA5JBUU.js";
7
7
  import {
8
8
  init_logger,
9
9
  logInfo,
10
10
  logWarn
11
- } from "./chunk-GWILHZPT.js";
11
+ } from "./chunk-XRTXYN66.js";
12
12
  import {
13
13
  abtarsHome,
14
14
  init_paths
@@ -100,4 +100,4 @@ export {
100
100
  buildUsersBlock,
101
101
  init_user_registry
102
102
  };
103
- //# sourceMappingURL=chunk-ZV4IWKDJ.js.map
103
+ //# sourceMappingURL=chunk-E7XD5UGB.js.map
@@ -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-E3LNDBJT.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-GXL7HJPT.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-TI3TSVVT.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-XWRADSXO.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": "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",
6
+ "names": []
7
+ }