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.
- package/bundle/{_registry.generated-WGR4WOPT.js → _registry.generated-AVR7DK2A.js} +17 -14
- package/bundle/{_registry.generated-WGR4WOPT.js.map → _registry.generated-AVR7DK2A.js.map} +1 -1
- package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
- package/bundle/abtars-browser.js +4 -4
- package/bundle/abtars-cli.js +23 -13
- package/bundle/abtars-cli.js.map +2 -2
- package/bundle/abtars-restart.js +3 -3
- package/bundle/abtars-task.js +3 -3
- package/bundle/abtars-task.js.map +2 -2
- package/bundle/abtars.js +610 -455
- package/bundle/abtars.js.map +4 -4
- package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
- package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
- package/bundle/{agent-api-adapter-YAHKQMMZ.js → agent-api-adapter-7HEPYSIN.js} +3 -3
- package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
- package/bundle/{agent-registry-GI6CLT3Z.js → agent-registry-46A2R5KP.js} +7 -7
- package/bundle/{bootstrap-X2QYIZIJ.js → bootstrap-MIHJJSWU.js} +2 -2
- package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
- package/bundle/{browser-DMARZJIN.js → browser-F6BCWJWW.js} +6 -6
- package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
- package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
- package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
- package/bundle/{chunk-KTYGKPYM.js → chunk-2NLUT5S2.js} +6 -6
- package/bundle/chunk-3BG3AIDP.js +191 -0
- package/bundle/chunk-3BG3AIDP.js.map +7 -0
- package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
- package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
- package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
- package/bundle/{chunk-LGP6TYFI.js → chunk-4AILRHUI.js} +97 -8
- package/bundle/chunk-4AILRHUI.js.map +7 -0
- package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
- package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
- package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
- package/bundle/{chunk-4UL3KINB.js → chunk-5PNJFDSW.js} +8 -8
- package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
- package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
- package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
- package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
- package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
- package/bundle/chunk-BNXV7SZI.js +195 -0
- package/bundle/chunk-BNXV7SZI.js.map +7 -0
- package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
- package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
- package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
- package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
- package/bundle/{chunk-GXL7HJPT.js → chunk-EAX5ZZUL.js} +63 -39
- package/bundle/chunk-EAX5ZZUL.js.map +7 -0
- package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
- package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
- package/bundle/chunk-FGYDIX54.js.map +7 -0
- package/bundle/{chunk-XWRADSXO.js → chunk-GF6NVNA7.js} +15 -5
- package/bundle/chunk-GF6NVNA7.js.map +7 -0
- package/bundle/{chunk-SIFPBTI4.js → chunk-HGSHCQ5F.js} +113 -73
- package/bundle/chunk-HGSHCQ5F.js.map +7 -0
- package/bundle/{chunk-YRU2K3O6.js → chunk-IMIGG5EO.js} +39 -39
- package/bundle/chunk-IMIGG5EO.js.map +7 -0
- package/bundle/{chunk-W4EA4GCA.js → chunk-ITOFPJAV.js} +43 -31
- package/bundle/chunk-ITOFPJAV.js.map +7 -0
- package/bundle/{chunk-UPRZDU6T.js → chunk-IY6UKLPS.js} +3 -3
- package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
- package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
- package/bundle/chunk-J7DRPVMU.js.map +7 -0
- package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
- package/bundle/chunk-JG4BKXBN.js.map +7 -0
- package/bundle/{chunk-5B5B6EHL.js → chunk-JLWYPGWI.js} +5 -5
- package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
- package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
- package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
- package/bundle/{chunk-ONBF5DDU.js → chunk-L72RIPEC.js} +248 -182
- package/bundle/chunk-L72RIPEC.js.map +7 -0
- package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
- package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
- package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
- package/bundle/chunk-OY4Q6AMY.js.map +7 -0
- package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
- package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
- package/bundle/{chunk-BROFMHC2.js → chunk-PB5GF4FG.js} +334 -237
- package/bundle/chunk-PB5GF4FG.js.map +7 -0
- package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
- package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
- package/bundle/{chunk-HKRSMUXJ.js → chunk-SC2Y5NR2.js} +71 -132
- package/bundle/chunk-SC2Y5NR2.js.map +7 -0
- package/bundle/chunk-SFL4EPCZ.js +555 -0
- package/bundle/chunk-SFL4EPCZ.js.map +7 -0
- package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
- package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
- package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
- package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
- package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
- package/bundle/chunk-WC5O5KOE.js +211 -0
- package/bundle/chunk-WC5O5KOE.js.map +7 -0
- package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
- package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
- package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
- package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
- package/bundle/chunk-YJZE4OK3.js +169 -0
- package/bundle/chunk-YJZE4OK3.js.map +7 -0
- package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
- package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
- package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
- package/bundle/{commands-XYEGVUZF.js → commands-2ZW6CMLC.js} +17 -16
- package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
- package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
- package/bundle/context-CL2RSLII.js.map +7 -0
- package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
- package/bundle/{delegation-tools-QKNYQGTQ.js → delegation-tools-WS7Z56KZ.js} +12 -12
- package/bundle/{deploy-EPDWNHJU.js → deploy-AMTVKIMU.js} +2 -2
- package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
- package/bundle/{direct-api-transport-E3LNDBJT.js → direct-api-transport-QNNY2WWP.js} +56 -33
- package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
- package/bundle/{discord-adapter-IT3KP3VB.js → discord-adapter-ABAD56Y2.js} +21 -20
- package/bundle/{discord-adapter-IT3KP3VB.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
- package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
- package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
- package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
- package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
- package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
- package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
- package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
- package/bundle/{heartbeat-tier3-ABWL3P7M.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
- package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
- package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
- package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
- package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
- package/bundle/install-RFKKFSGS.js.map +7 -0
- package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
- package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
- package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
- package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
- package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
- package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
- package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
- package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
- package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
- package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
- package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
- package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
- package/bundle/{message-pipeline-P5GAQU4Z.js → message-pipeline-GRDRWONR.js} +17 -16
- package/bundle/meta.json +3699 -3138
- package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
- package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
- package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
- package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
- package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
- package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
- package/bundle/{orc-tools-4CHEFWSN.js → orc-tools-UZVPONKY.js} +5 -3
- package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
- package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
- package/bundle/peer-client-UITTMWJ2.js.map +7 -0
- package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
- package/bundle/{peer-transport-I6JPLFZ2.js → peer-transport-SI7I72DB.js} +12 -10
- package/bundle/{phase-transport-PGKU2KD4.js → phase-transport-ESWWACZI.js} +17 -17
- package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
- package/bundle/{reconciler-EBKH3JNU.js → reconciler-IEUJXJN2.js} +12 -12
- package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
- package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
- package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
- package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
- package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
- package/bundle/{skill-session-BMSRQSHV.js → skill-session-5HSMXY54.js} +3 -3
- package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
- package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
- package/bundle/{sleep-36XS6MHJ.js → sleep-I4JFASCY.js} +11 -8
- package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
- package/bundle/{spin-TI3TSVVT.js → spin-VHNGNWTD.js} +11 -11
- package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
- package/bundle/{spin-types-BLPYAETA.js → spin-types-C5KOQOPD.js} +7 -3
- package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
- package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
- package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
- package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
- package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
- package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
- package/bundle/{system-status-JZU5FO7B.js → system-status-4LYGOFNO.js} +38 -24
- package/bundle/system-status-4LYGOFNO.js.map +7 -0
- package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
- package/bundle/{telegram-adapter-H6PMFPMB.js → telegram-adapter-O6KIZDY6.js} +69 -46
- package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
- package/bundle/{tool-registry-IZX2IOBM.js → tool-registry-JJMWCQKZ.js} +26 -24
- package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
- package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
- package/bundle/tribe-GDTFYJTK.js +111 -0
- package/bundle/tribe-GDTFYJTK.js.map +7 -0
- package/bundle/{update-MESYO4LO.js → update-HGQAOC5L.js} +3 -3
- package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
- package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
- package/bundle/wire-platform-KKPWNNNQ.js +88 -0
- package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
- package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
- package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
- package/package.json +1 -1
- package/scripts/abtars-watchdog.service +2 -1
- package/scripts/abtars-watchdog.sh +1 -5
- package/scripts/emergency-deploy.sh +2 -2
- package/scripts/emergency-update.sh +88 -41
- package/bundle/chunk-3AAENI2K.js +0 -210
- package/bundle/chunk-3AAENI2K.js.map +0 -7
- package/bundle/chunk-4MULJ5SS.js.map +0 -7
- package/bundle/chunk-4S554KLW.js +0 -105
- package/bundle/chunk-4S554KLW.js.map +0 -7
- package/bundle/chunk-5GCLBUBS.js +0 -257
- package/bundle/chunk-5GCLBUBS.js.map +0 -7
- package/bundle/chunk-BROFMHC2.js.map +0 -7
- package/bundle/chunk-EGL6UMAO.js.map +0 -7
- package/bundle/chunk-EQSG2CRM.js.map +0 -7
- package/bundle/chunk-GXL7HJPT.js.map +0 -7
- package/bundle/chunk-HKRSMUXJ.js.map +0 -7
- package/bundle/chunk-HT2BPTZY.js +0 -241
- package/bundle/chunk-HT2BPTZY.js.map +0 -7
- package/bundle/chunk-HZDLFLRP.js.map +0 -7
- package/bundle/chunk-IKUZPMVA.js +0 -82
- package/bundle/chunk-IKUZPMVA.js.map +0 -7
- package/bundle/chunk-LGP6TYFI.js.map +0 -7
- package/bundle/chunk-ONBF5DDU.js.map +0 -7
- package/bundle/chunk-RWRRGE4U.js +0 -72
- package/bundle/chunk-RWRRGE4U.js.map +0 -7
- package/bundle/chunk-SIFPBTI4.js.map +0 -7
- package/bundle/chunk-VUIX5AGB.js +0 -65
- package/bundle/chunk-VUIX5AGB.js.map +0 -7
- package/bundle/chunk-W4EA4GCA.js.map +0 -7
- package/bundle/chunk-XWRADSXO.js.map +0 -7
- package/bundle/chunk-Y76VUJSF.js +0 -75
- package/bundle/chunk-Y76VUJSF.js.map +0 -7
- package/bundle/chunk-YRU2K3O6.js.map +0 -7
- package/bundle/context-2RJHC2LE.js.map +0 -7
- package/bundle/direct-api-transport-E3LNDBJT.js.map +0 -7
- package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
- package/bundle/heartbeat-tier3-ABWL3P7M.js.map +0 -7
- package/bundle/install-OS3CU7NF.js.map +0 -7
- package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
- package/bundle/peer-client-RGEU5HOK.js.map +0 -7
- package/bundle/peer-jwt-NCCPXJRX.js +0 -18
- package/bundle/public/css/dashboard.css +0 -542
- package/bundle/public/index.html +0 -180
- package/bundle/public/js/app.js +0 -437
- package/bundle/public/memory-universe.js +0 -384
- package/bundle/stream-single-RFJNUTL6.js +0 -34
- package/bundle/stream-single-RFJNUTL6.js.map +0 -7
- package/bundle/subagent-runtime-5QUVES3W.js +0 -14
- package/bundle/system-status-JZU5FO7B.js.map +0 -7
- package/bundle/telegram-adapter-H6PMFPMB.js.map +0 -7
- package/bundle/usage-tracker-NXD364VX.js.map +0 -7
- package/bundle/user-registry-35BW4XKM.js.map +0 -7
- package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
- package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
- /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
- /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
- /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
- /package/bundle/{agent-api-adapter-YAHKQMMZ.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
- /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
- /package/bundle/{agent-registry-GI6CLT3Z.js.map → agent-registry-46A2R5KP.js.map} +0 -0
- /package/bundle/{bootstrap-X2QYIZIJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
- /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
- /package/bundle/{browser-DMARZJIN.js.map → browser-F6BCWJWW.js.map} +0 -0
- /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
- /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
- /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
- /package/bundle/{chunk-KTYGKPYM.js.map → chunk-2NLUT5S2.js.map} +0 -0
- /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
- /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
- /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
- /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
- /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
- /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
- /package/bundle/{chunk-4UL3KINB.js.map → chunk-5PNJFDSW.js.map} +0 -0
- /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
- /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
- /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
- /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
- /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
- /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
- /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
- /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
- /package/bundle/{chunk-UPRZDU6T.js.map → chunk-IY6UKLPS.js.map} +0 -0
- /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
- /package/bundle/{chunk-5B5B6EHL.js.map → chunk-JLWYPGWI.js.map} +0 -0
- /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
- /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
- /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
- /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
- /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
- /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
- /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
- /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
- /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
- /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
- /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
- /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
- /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
- /package/bundle/{commands-XYEGVUZF.js.map → commands-2ZW6CMLC.js.map} +0 -0
- /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
- /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
- /package/bundle/{delegation-tools-QKNYQGTQ.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
- /package/bundle/{deploy-EPDWNHJU.js.map → deploy-AMTVKIMU.js.map} +0 -0
- /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
- /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
- /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
- /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
- /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
- /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
- /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
- /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
- /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
- /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
- /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
- /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
- /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
- /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
- /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
- /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
- /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
- /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
- /package/bundle/{message-pipeline-P5GAQU4Z.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
- /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
- /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
- /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
- /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
- /package/bundle/{orc-tools-4CHEFWSN.js.map → orc-tools-UZVPONKY.js.map} +0 -0
- /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
- /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
- /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
- /package/bundle/{peer-transport-I6JPLFZ2.js.map → phase-transport-ESWWACZI.js.map} +0 -0
- /package/bundle/{phase-transport-PGKU2KD4.js.map → reconcile-GFDQYNBD.js.map} +0 -0
- /package/bundle/{reconciler-EBKH3JNU.js.map → reconciler-IEUJXJN2.js.map} +0 -0
- /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
- /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
- /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
- /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
- /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
- /package/bundle/{skill-session-BMSRQSHV.js.map → skill-session-5HSMXY54.js.map} +0 -0
- /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
- /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
- /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
- /package/bundle/{sleep-36XS6MHJ.js.map → soul-bundle-522C3IRH.js.map} +0 -0
- /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
- /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
- /package/bundle/{spin-TI3TSVVT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
- /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
- /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
- /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
- /package/bundle/{spin-types-BLPYAETA.js.map → stt-PSOPPBV4.js.map} +0 -0
- /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
- /package/bundle/{subagent-runtime-5QUVES3W.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
- /package/bundle/{task-store-W5BFIAIH.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
- /package/bundle/{tool-registry-IZX2IOBM.js.map → transport-config-6MB2K2XC.js.map} +0 -0
- /package/bundle/{tool-sandbox-4UC6GAKA.js.map → update-HGQAOC5L.js.map} +0 -0
- /package/bundle/{transport-config-KBF5W2DP.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
- /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-
|
|
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-
|
|
27
|
+
//# sourceMappingURL=chunk-CK7YTA2F.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
logDebug,
|
|
6
6
|
logInfo,
|
|
7
7
|
logWarn
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
151
|
+
//# sourceMappingURL=chunk-DZJ5QZFD.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_logger,
|
|
5
5
|
logTrace
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
29
|
+
//# sourceMappingURL=chunk-E67KESEG.js.map
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import {
|
|
4
4
|
getEnv,
|
|
5
5
|
init_env_schema
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6PA5JBUU.js";
|
|
7
7
|
import {
|
|
8
8
|
init_logger,
|
|
9
9
|
logInfo,
|
|
10
10
|
logWarn
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-JXYWDAHD.js";
|
|
6
6
|
import {
|
|
7
7
|
getEnv,
|
|
8
8
|
init_env_schema
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-6PA5JBUU.js";
|
|
10
10
|
import {
|
|
11
11
|
init_logger,
|
|
12
12
|
logInfo,
|
|
13
13
|
logWarn
|
|
14
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
119
|
+
if (profAgent && profAgent.model !== startModel) {
|
|
86
120
|
const profTransport = profAgent.provider.transport ?? "api";
|
|
87
121
|
if (profTransport === agentTransport && profAgent.provider.endpoint) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
131
|
-
|
|
132
|
-
|
|
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-
|
|
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:
|
|
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-
|
|
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-
|
|
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": ";;;;;;;;;;;;;;;;AAAA;AAOA;AAaA,IAAM,cAAkD;AAAA,EACtD,WAAW,EAAE,OAAO,aAAa,OAAO,MAAM,YAAY,MAAM,KAAK,YAAY,OAAO,EAAE;AAAA,EAC1F,QAAQ,EAAE,OAAO,UAAU,OAAO,MAAM,YAAY,OAAO,KAAK,aAAa,OAAO,EAAE;AAAA,EACtF,QAAQ,EAAE,OAAO,gBAAgB,OAAO,MAAM,YAAY,MAAM,KAAK,cAAc,OAAO,EAAE;AAAA,EAC5F,SAAS,EAAE,OAAO,WAAW,OAAO,MAAM,YAAY,OAAO,KAAK,eAAe,OAAO,EAAE;AAAA,EAC1F,MAAM,EAAE,OAAO,aAAa,OAAO,MAAM,YAAY,OAAO,KAAK,YAAY,OAAO,EAAE;AACxF;AAEA,SAAS,aAAa,MAAqC;AACzD,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAU,aAAO,OAAO,EAAE;AAAA,IAC/B,KAAK;AAAW,aAAO,OAAO,EAAE;AAAA,IAChC,KAAK;AAAU,aAAO,OAAO,EAAE;AAAA,IAC/B;AAAS,aAAO;AAAA,EAClB;AACF;AASO,SAAS,qBACd,MACA,IACA,WACc;AACd,QAAM,MAAM,EAAE,GAAG,YAAY,IAAI,GAAG,GAAG,UAAU;AACjD,QAAM,UAAU,GAAG,aAAa,WAAW,CAAC,SAAS,IAAI,IAAI;AAC7D,QAAM,QAAQ,GAAG,SAAS,aAAa,IAAI;AAE3C,SAAO,IAAI,aAAa,GAAG,SAAS,GAAG,YAAY;AAAA,IACjD,OAAO,IAAI,SAAS;AAAA,IACpB;AAAA,IACA,YAAY,IAAI;AAAA,IAChB,KAAK,IAAI;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAIA,IAAM,oBAAkD;AAAA,EACtD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,IAAM,oBAAqD;AAAA,EACzD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR;AAIA,eAAsB,wBAAwB,MAAoB,UAA+E,cAA8E;AAC7N,QAAM,EAAE,cAAc,gBAAgB,cAAc,IAAI,MAAM,OAAO,gCAAuB;AAC5F,QAAM,KAAK,cAAc;AACzB,QAAM,YAAY,kBAAkB,IAAI;AACxC,QAAM,WAAW,KAAK,aAAa,WAAW,EAAE,IAAI;AAGpD,QAAM,eAAe,aAAa,KAAK,aAAa,aAAa,EAAE,IAAI;AACvE,QAAM,QAAQ,iBAAiB,MAAM;AACnC,UAAM,KAAK,eAAe;AAC1B,WAAO,EAAE,OAAO,GAAG,OAAO,UAAU,GAAG,UAAU,cAAc,GAAG,cAAc,eAAe,GAAG,eAAe,WAAW,GAAG,WAAW,WAAW,CAAC,EAAE;AAAA,EAC1J,GAAG;AAEH,MAAI,MAAM,SAAS,cAAc,OAAO;AAetC,QAASA,wBAAT,SAA8B,OAAwE;AACpG,UAAI,CAAC,GAAI,QAAO;AAChB,iBAAW,CAAC,EAAE,UAAU,KAAK,OAAO,QAAQ,GAAG,MAAM,GAAG;AAEtD,cAAM,kBAAkB,GAAG,UAAU,WAAW,QAAQ;AACxD,YAAI,iBAAiB,cAAc,SAAS,WAAW,UAAU,SAAS,gBAAgB,UAAU;AAClG,iBAAO;AAAA,YACL,UAAU,gBAAgB;AAAA,YAC1B,QAAQ,gBAAgB,YAAY,OAAO,EAAE,UAAU,gBAAgB,SAAS,IAAI;AAAA,UACtF;AAAA,QACF;AAEA,mBAAW,MAAM,WAAW,aAAa,CAAC,GAAG;AAC3C,cAAI,GAAG,UAAU,MAAO;AACxB,gBAAM,aAAa,GAAG,UAAU,GAAG,QAAQ;AAC3C,cAAI,YAAY,cAAc,SAAS,WAAW,UAAU;AAC1D,mBAAO;AAAA,cACL,UAAU,WAAW;AAAA,cACrB,QAAQ,WAAW,YAAY,OAAO,EAAE,UAAU,WAAW,SAAS,IAAI;AAAA,YAC5E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAxBS,+BAAAA;AAdT,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,oCAAqC;AACjF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,+BAAgC;AACxE,UAAM,SAAS,OAAO,EAAE,UAAU,MAAM,SAAS,aAAa,SAAS;AAGvE,UAAM,aAAa,gBAAgB,MAAM;AAsCzC,UAAM,qBAAqB,eAAe,MAAM,QAAQA,sBAAqB,UAAU,IAAI;AAC3F,UAAM,gBAAgB,oBAAoB,YAAY,MAAM,SAAS,YAAY;AACjF,UAAM,cAAc,oBAAoB,UAAU;AAIlD,UAAM,eAAe,CAAC,OAAe,aAA6B,GAAG,KAAK,IAAI,QAAQ;AACtF,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,aAA8F,CAAC;AAErG,UAAM,eAAe,CAAC,OAAe,UAAkB,iBAAqC,eAA6B;AACvH,YAAM,MAAM,aAAa,OAAO,QAAQ;AACxC,UAAI,eAAe,IAAI,GAAG,EAAG;AAC7B,qBAAe,IAAI,GAAG;AACtB,iBAAW,KAAK,EAAE,OAAO,UAAU,QAAQ,iBAAiB,WAAW,CAAC;AAAA,IAC1E;AAEA,iBAAa,YAAY,eAAe,aAAa,MAAM,aAAa;AAGxE,QAAI,MAAM,UAAU,YAAY;AAC9B,mBAAa,MAAM,OAAO,MAAM,SAAS,YAAY,6BAA6B,QAAQ,MAAM,aAAa;AAAA,IAC/G;AAGA,UAAM,YAAY,KAAK,aAAa,aAAa,EAAE,IAAI;AACvD,UAAM,iBAAiB,MAAM,SAAS,aAAa;AACnD,QAAI,aAAa,UAAU,UAAU,YAAY;AAC/C,YAAM,gBAAgB,UAAU,SAAS,aAAa;AACtD,UAAI,kBAAkB,kBAAkB,UAAU,SAAS,UAAU;AACnE;AAAA,UACE,UAAU;AAAA,UACV,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS,YAAY,OAAO,EAAE,UAAU,UAAU,SAAS,SAAS,IAAI;AAAA,UAClF,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAGA,QAAI,WAAW;AACb,iBAAW,MAAM,UAAU,aAAa,CAAC,GAAG;AAC1C,cAAM,aAAa,IAAI,UAAU,GAAG,QAAQ;AAC5C,cAAM,aAAa,YAAY,YAAY,UAAU,SAAS;AAC9D,YAAI,CAAC,YAAY;AAAE,kBAAQ,YAAY,qBAAqB,GAAG,KAAK,gCAA2B;AAAG;AAAA,QAAU;AAC5G,cAAM,WAAW,YAAY,YAAY,OAAO,EAAE,UAAU,WAAW,SAAS,IAAI;AACpF,qBAAa,GAAG,OAAO,YAAY,UAAU,UAAU,aAAa;AAAA,MACtE;AACA,iBAAW,cAAc,UAAU,SAAS,iBAAiB,CAAC,GAAG;AAC/D,YAAI,CAAC,UAAU,SAAS,UAAU;AAAE,kBAAQ,YAAY,wBAAwB,UAAU,gCAA2B;AAAG;AAAA,QAAU;AAClI,qBAAa,YAAY,UAAU,SAAS,UAAU,QAAQ,UAAU,aAAa;AAAA,MACvF;AAAA,IACF;AAGA,eAAW,MAAM,MAAM,WAAW;AAChC,YAAM,aAAa,IAAI,UAAU,GAAG,QAAQ;AAC5C,YAAM,aAAa,YAAY,YAAY,MAAM,SAAS;AAC1D,UAAI,CAAC,YAAY;AAAE,gBAAQ,YAAY,qBAAqB,GAAG,KAAK,gCAA2B;AAAG;AAAA,MAAU;AAC5G,YAAM,WAAW,YAAY,YAAY,OAAO,EAAE,UAAU,WAAW,SAAS,IAAI;AACpF,mBAAa,GAAG,OAAO,YAAY,UAAU,MAAM,aAAa;AAAA,IAClE;AAGA,UAAMC,SAAQ,MAAM,SAAS,iBAAiB,CAAC;AAC/C,eAAW,cAAcA,QAAO;AAC9B,UAAI,CAAC,MAAM,SAAS,UAAU;AAAE,gBAAQ,YAAY,wBAAwB,UAAU,gCAA2B;AAAG;AAAA,MAAU;AAC9H,mBAAa,YAAY,MAAM,SAAS,UAAU,QAAQ,MAAM,aAAa;AAAA,IAC/E;AAGA,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,qCAAsC;AACnF,UAAM,SAAS,IAAI,eAAe,YAAY,YAAY,IAAI,oBAAoB,CAAC;AAEnF,UAAM,YAAY,IAAI,mBAAmB;AAAA,MACvC,UAAU;AAAA,MACV,QAAQ;AAAA,MAAa,OAAO;AAAA,MAC5B,YAAY,MAAM;AAAA,MAAe,WAAW,MAAM;AAAA,MAClD,UAAU,IAAI,YAAY;AAAA,MAC1B,eAAe,IAAI,iBAAiB;AAAA,IACtC,GAAG,MAAM;AACT,UAAM,UAAU,WAAW;AAC3B,YAAQ,YAAY,GAAG,IAAI,yBAAyB,MAAM,YAAY,WAAW,UAAU,KAAK,WAAW,MAAM,iCAAiC,CAAC,CAAC,QAAQ,GAAG;AAC/J,WAAO,EAAE,WAAW,OAAO,MAAM,MAAM;AAAA,EACzC;AAGA,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,sBAAa;AAC5D,QAAM,SAAS,MAAM,sBAAsB;AAC3C,QAAM,QAAQ,MAAM,SAAS,iBAAiB,CAAC;AAC/C,QAAM,cAAc,CAAC,MAAM,OAAO,GAAG,MAAM,OAAO,OAAK,MAAM,MAAM,KAAK,CAAC;AAEzE,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAM,QAAQ,YAAY,CAAC;AAC3B,UAAM,YAAY,qBAAqB,kBAAkB,IAAI,GAAG;AAAA,MAC9D,SAAS,MAAM,SAAS,OAAO,OAAO,UAAU;AAAA,MAChD,YAAY,OAAO,UAAU;AAAA,MAC7B,UAAU,MAAM,SAAS,OAAO;AAAA,MAChC;AAAA,IACF,CAAC;AACD,QAAI;AACF,YAAM,UAAU,WAAW;AAC3B,UAAI,IAAI,EAAG,SAAQ,YAAY,GAAG,IAAI,2CAA2C,KAAK,EAAE;AACxF,cAAQ,YAAY,GAAG,IAAI,mBAAmB,MAAM,YAAY,WAAW,KAAK,GAAG,IAAI,IAAI,eAAe,EAAE,GAAG;AAC/G,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B,SAAS,KAAK;AACZ,UAAI,IAAI,YAAY,SAAS,GAAG;AAC9B,gBAAQ,YAAY,GAAG,IAAI,WAAW,KAAK,iBAAiB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,aAAa,YAAY,IAAI,CAAC,CAAC,EAAE;AAC7I;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,IAAI,MAAM,GAAG,IAAI,iCAAiC,YAAY,KAAK,IAAI,CAAC,GAAG;AACnF;",
|
|
6
|
+
"names": ["resolveModelEndpoint", "chain"]
|
|
7
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_log_and_swallow,
|
|
5
5
|
logAndSwallow
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
78
|
+
//# sourceMappingURL=chunk-EFGBM555.js.map
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
import {
|
|
4
4
|
init_lazy_require,
|
|
5
5
|
resolveNativeDep
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-Z4FZPB42.js";
|
|
7
7
|
import {
|
|
8
8
|
init_nerve,
|
|
9
9
|
nerve
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-5Y3FJ2Y7.js";
|
|
11
11
|
import {
|
|
12
12
|
init_logger,
|
|
13
13
|
logWarn
|
|
14
|
-
} from "./chunk-
|
|
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
|
|
195
|
+
function kanbanSearch(term) {
|
|
195
196
|
const d = dbOrNull();
|
|
196
|
-
if (!d) return;
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
+
}
|