@band-app/server 0.21.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/DockviewBrowserContainer-c5TBCFK6.js +5 -0
- package/dist/client/assets/DockviewTerminalContainer-De1DHQ5S.js +2 -0
- package/dist/client/assets/TerminalPanel-DR6CDpEJ.js +5 -0
- package/dist/client/assets/{_basePickBy-D17RbSpA.js → _basePickBy-DjS8T81h.js} +1 -1
- package/dist/client/assets/{_baseUniq-9xolxnuZ.js → _baseUniq-BoA3Q22r.js} +1 -1
- package/dist/client/assets/{arc-CrFKrBMt.js → arc-DzFH-F6i.js} +1 -1
- package/dist/client/assets/{architectureDiagram-VXUJARFQ-Ke3p_Mqb.js → architectureDiagram-VXUJARFQ-DpWdRDqh.js} +1 -1
- package/dist/client/assets/{blockDiagram-VD42YOAC-TqBKFyqZ.js → blockDiagram-VD42YOAC-In-FvNuA.js} +1 -1
- package/dist/client/assets/{c4Diagram-YG6GDRKO-BEH8KTZ4.js → c4Diagram-YG6GDRKO-uWim35od.js} +1 -1
- package/dist/client/assets/channel-BwZLW4yW.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-CtLV-I7X.js → chunk-4BX2VUAB-uNqF21Qn.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DNYJbC9p.js → chunk-55IACEB6-BEB0DppO.js} +1 -1
- package/dist/client/assets/{chunk-B4BG7PRW-C9SV78wP.js → chunk-B4BG7PRW-Csf_UWBG.js} +1 -1
- package/dist/client/assets/{chunk-DI55MBZ5-BA6YDHhu.js → chunk-DI55MBZ5-ehQAiitH.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-xclQ8Cf4.js → chunk-FMBD7UC4-Ddw3wom4.js} +1 -1
- package/dist/client/assets/{chunk-QN33PNHL-CbKttxM9.js → chunk-QN33PNHL-ICAdKyID.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-Bx8-ojjW.js → chunk-QZHKN3VN-CWKRx0Nc.js} +1 -1
- package/dist/client/assets/{chunk-TZMSLE5B-C2ws4lNY.js → chunk-TZMSLE5B-DEAJFNe9.js} +1 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-CVjdMCqG.js +1 -0
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-CVjdMCqG.js +1 -0
- package/dist/client/assets/clone-Dj_6A90e.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CvTq6GKB.js → cose-bilkent-S5V4N54A-CbS4okPK.js} +1 -1
- package/dist/client/assets/{dagre-6UL2VRFP-CvAkVLYR.js → dagre-6UL2VRFP-BsLKz8AK.js} +1 -1
- package/dist/client/assets/{diagram-PSM6KHXK-CjqPnfjV.js → diagram-PSM6KHXK-M6PnJuei.js} +1 -1
- package/dist/client/assets/{diagram-QEK2KX5R-CAbD5at_.js → diagram-QEK2KX5R-B__5YbI4.js} +1 -1
- package/dist/client/assets/{diagram-S2PKOQOG-npaoXBaA.js → diagram-S2PKOQOG-DKHL_M-B.js} +1 -1
- package/dist/client/assets/{erDiagram-Q2GNP2WA-B7Ii4ixk.js → erDiagram-Q2GNP2WA-BfFW0JbE.js} +1 -1
- package/dist/client/assets/{flowDiagram-NV44I4VS-CWJlEjhJ.js → flowDiagram-NV44I4VS-DjhRrkWq.js} +1 -1
- package/dist/client/assets/{ganttDiagram-JELNMOA3-DpzdgJxa.js → ganttDiagram-JELNMOA3-COYeUCef.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-6unjAycz.js → gitGraphDiagram-V2S2FVAM-BxnB-BVL.js} +1 -1
- package/dist/client/assets/{graph-VXOljtS_.js → graph-B6AmaXta.js} +1 -1
- package/dist/client/assets/{highlighted-body-B3W2YXNL-Dr38PYps.js → highlighted-body-B3W2YXNL-wXSbO2Nz.js} +1 -1
- package/dist/client/assets/{index-Gsci2MjP.js → index-B-xrNHzx.js} +1 -1
- package/dist/client/assets/{index-B5eNC7JU.js → index-BR4JJgox.js} +1 -1
- package/dist/client/assets/{index-B-If-Bxk.js → index-B_tLkjtQ.js} +1 -1
- package/dist/client/assets/{index-Cyigja8G.js → index-Bu4tJzS5.js} +1 -1
- package/dist/client/assets/{index-BeL8lEkE.js → index-C5FWnSNO.js} +1 -1
- package/dist/client/assets/{index-sO-gKrgS.js → index-C9my7XIp.js} +1 -1
- package/dist/client/assets/{index-GAorhXcd.js → index-CFh_QYgy.js} +1 -1
- package/dist/client/assets/{index-BH6O4VK4.js → index-CXAmq9J9.js} +1 -1
- package/dist/client/assets/{index-C8JM5Fw6.js → index-DKFuGU2w.js} +1 -1
- package/dist/client/assets/{index-C5S6lhjM.js → index-DOipD6Mc.js} +1 -1
- package/dist/client/assets/{index-1bfqbPx4.js → index-DPAcHZUY.js} +1 -1
- package/dist/client/assets/{index-D7HqwOng.js → index-DQcyjj1n.js} +1 -1
- package/dist/client/assets/{index-CDZv1r4Q.js → index-DjFJyRsb.js} +1 -1
- package/dist/client/assets/{index-0smwvcI5.js → index-YemckZzk.js} +1 -1
- package/dist/client/assets/index-baLsgCNJ.js +1 -0
- package/dist/client/assets/{index-vsxjm_hQ.js → index-dPGgxYg7.js} +1 -1
- package/dist/client/assets/{index-Dt4yFYKg.js → index-e6iwsWag.js} +1 -1
- package/dist/client/assets/{index-WAvNcNBw.js → index-oWFAyhhb.js} +1 -1
- package/dist/client/assets/{infoDiagram-HS3SLOUP-CSXE28ng.js → infoDiagram-HS3SLOUP-8jgZTWHc.js} +1 -1
- package/dist/client/assets/{journeyDiagram-XKPGCS4Q-C22Q_X0X.js → journeyDiagram-XKPGCS4Q-C7UnOrYP.js} +1 -1
- package/dist/client/assets/{kanban-definition-3W4ZIXB7-DY-wTFE4.js → kanban-definition-3W4ZIXB7-BfAJ2XMs.js} +1 -1
- package/dist/client/assets/{layout-Dc5Px3_i.js → layout-BFiS4INQ.js} +1 -1
- package/dist/client/assets/{main-3W4_bdX9.js → main-SDku1HcN.js} +215 -215
- package/dist/client/assets/main-tmFPjHOC.css +1 -0
- package/dist/client/assets/{mindmap-definition-VGOIOE7T-DjlIeb28.js → mindmap-definition-VGOIOE7T-CHJqgPgK.js} +1 -1
- package/dist/client/assets/{pieDiagram-ADFJNKIX-CAYazJeR.js → pieDiagram-ADFJNKIX-v1PBCyig.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-AYHSOK5B-DqOUuCMa.js → quadrantDiagram-AYHSOK5B-BmSciYlO.js} +1 -1
- package/dist/client/assets/{requirementDiagram-UZGBJVZJ-ga9OYiX3.js → requirementDiagram-UZGBJVZJ-Cpc8-ItX.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DT4gli4B.js → sankeyDiagram-TZEHDZUN-BimDWo8J.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WL72ISMW-DaZ5nFau.js → sequenceDiagram-WL72ISMW-CL72CIvP.js} +1 -1
- package/dist/client/assets/{square-terminal-DH5KC33k.js → square-terminal-DAh77hNm.js} +1 -1
- package/dist/client/assets/{stateDiagram-FKZM4ZOC-CKKdKiLu.js → stateDiagram-FKZM4ZOC-DPD5YOcB.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAf0jK91.js +1 -0
- package/dist/client/assets/{timeline-definition-IT6M3QCI-BwdepkjX.js → timeline-definition-IT6M3QCI-UujIEPPc.js} +1 -1
- package/dist/client/assets/{treemap-GDKQZRPO-CHiLww4s.js → treemap-GDKQZRPO-CnxwYqSA.js} +1 -1
- package/dist/client/assets/{workspace._workspaceId-D1BWy1Ur.js → workspace._workspaceId--WY7ydFH.js} +1 -1
- package/dist/client/assets/{workspace._workspaceId-Quiswnjw.js → workspace._workspaceId-jpBhz8sr.js} +2 -2
- package/dist/client/assets/{xychartDiagram-PRI3JC2R-DawkS0Sm.js → xychartDiagram-PRI3JC2R-QNPzTKdU.js} +1 -1
- package/dist/openapi.json +158 -0
- package/dist/server/assets/{DockviewBrowserContainer-SjtAFOaO.js → DockviewBrowserContainer-B8W-NI5l.js} +16 -3
- package/dist/server/assets/{DockviewTerminalContainer-D6-3suIN.js → DockviewTerminalContainer-D6ZTAITZ.js} +29 -6
- package/dist/server/assets/{TerminalPanel-DA2GjlrE.js → TerminalPanel-D1qOucYL.js} +73 -2
- package/dist/server/assets/{_basePickBy-mQwpcWuA.js → _basePickBy-DCBLSYIo.js} +2 -2
- package/dist/server/assets/{_baseUniq-BqTMAIfp.js → _baseUniq-D6dm-LAQ.js} +1 -1
- package/dist/server/assets/_tanstack-start-manifest_v-BffwvUC-.js +4 -0
- package/dist/server/assets/{arc-CfotX0XO.js → arc-BAoORaWl.js} +1 -1
- package/dist/server/assets/{architecture-7HQA4BMR-w7SRxWR3.js → architecture-7HQA4BMR-bh4pvUjy.js} +6 -6
- package/dist/server/assets/{architectureDiagram-VXUJARFQ-DJFhyyCh.js → architectureDiagram-VXUJARFQ-B6S0AQBn.js} +6 -6
- package/dist/server/assets/{blockDiagram-VD42YOAC-6rxJggh1.js → blockDiagram-VD42YOAC-DLnnO4-n.js} +6 -6
- package/dist/server/assets/{c4Diagram-YG6GDRKO-D3y86IYm.js → c4Diagram-YG6GDRKO-CqN2DKBx.js} +2 -2
- package/dist/server/assets/{channel-BvsPpLae.js → channel-f3Ahc3R0.js} +1 -1
- package/dist/server/assets/{chunk-4BX2VUAB-BhVS4SR2.js → chunk-4BX2VUAB-CuDavVBE.js} +1 -1
- package/dist/server/assets/{chunk-55IACEB6-DKZQfAUk.js → chunk-55IACEB6-D_qe5s0S.js} +1 -1
- package/dist/server/assets/{chunk-B4BG7PRW-CTFHJOgm.js → chunk-B4BG7PRW-C0ML39A6.js} +4 -4
- package/dist/server/assets/{chunk-DI55MBZ5-D4oMyPFU.js → chunk-DI55MBZ5-DGj3ha0C.js} +3 -3
- package/dist/server/assets/{chunk-FMBD7UC4-C--TorDk.js → chunk-FMBD7UC4-D-f7FIcf.js} +1 -1
- package/dist/server/assets/{chunk-QN33PNHL-Bq5t-J27.js → chunk-QN33PNHL-DSo_m7vF.js} +1 -1
- package/dist/server/assets/{chunk-QZHKN3VN-D9QKIA24.js → chunk-QZHKN3VN-gT8icS8l.js} +1 -1
- package/dist/server/assets/{chunk-TZMSLE5B-DsPVSWvD.js → chunk-TZMSLE5B-CoUTe4U3.js} +1 -1
- package/dist/server/assets/{classDiagram-v2-WZHVMYZB-BDvFA_gY.js → classDiagram-2ON5EDUG-CbQuH3ni.js} +5 -5
- package/dist/server/assets/{classDiagram-2ON5EDUG-BDvFA_gY.js → classDiagram-v2-WZHVMYZB-CbQuH3ni.js} +5 -5
- package/dist/server/assets/{clone-CCgsMGyI.js → clone-DhkQMQiL.js} +1 -1
- package/dist/server/assets/{cose-bilkent-S5V4N54A-6FhE7VMC.js → cose-bilkent-S5V4N54A-Q7Nl8Zqm.js} +1 -1
- package/dist/server/assets/{dagre-6UL2VRFP-B2XCzgyl.js → dagre-6UL2VRFP-RuiqkM_u.js} +6 -6
- package/dist/server/assets/{diagram-PSM6KHXK-C3a4H4k4.js → diagram-PSM6KHXK-mvCbaKci.js} +7 -7
- package/dist/server/assets/{diagram-QEK2KX5R-Cr2uQFcl.js → diagram-QEK2KX5R-B30M6IEM.js} +6 -6
- package/dist/server/assets/{diagram-S2PKOQOG-B02qDgDh.js → diagram-S2PKOQOG-BapZgpGh.js} +6 -6
- package/dist/server/assets/{erDiagram-Q2GNP2WA-COfTfgT3.js → erDiagram-Q2GNP2WA-LKD5sOpF.js} +4 -4
- package/dist/server/assets/{flowDiagram-NV44I4VS-DMHyjH0P.js → flowDiagram-NV44I4VS-Cg70kWHZ.js} +5 -5
- package/dist/server/assets/{ganttDiagram-JELNMOA3-tZWVaeIh.js → ganttDiagram-JELNMOA3-CpgS7Gbo.js} +1 -1
- package/dist/server/assets/{gitGraph-G5XIXVHT-CZ_Z3kfk.js → gitGraph-G5XIXVHT-BX-0wA2S.js} +6 -6
- package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-BE9qq2Q5.js → gitGraphDiagram-V2S2FVAM-BNe2zRpL.js} +7 -7
- package/dist/server/assets/{graph-BzW4XaDV.js → graph-BohWfDeQ.js} +2 -2
- package/dist/server/assets/{highlighted-body-B3W2YXNL-D0yX7NC8.js → highlighted-body-B3W2YXNL-DpfzVM5P.js} +1 -1
- package/dist/server/assets/{index-BkVmoV0_.js → index-B6FFge5B.js} +2 -2
- package/dist/server/assets/{index-BjZusA5s.js → index-BMCwJ6BW.js} +2 -2
- package/dist/server/assets/{index-D3IdMBz4.js → index-C4lG0OWB.js} +2 -2
- package/dist/server/assets/{index-DLYVbCsD.js → index-CE_oTIBT.js} +2 -2
- package/dist/server/assets/{index-BddxWcBo.js → index-CTCq_dqo.js} +4 -4
- package/dist/server/assets/{index-GYPGaDq3.js → index-CUej4Ihg.js} +2 -2
- package/dist/server/assets/{index-CSJXca8g.js → index-CWhqy8Ta.js} +2 -2
- package/dist/server/assets/{index-BhGU4xre.js → index-CnNg602B.js} +2 -2
- package/dist/server/assets/{index-BHpOY7Dw.js → index-Cvf2IVNx.js} +5 -5
- package/dist/server/assets/{index-BXnk_LSs.js → index-Cvmi6T35.js} +1 -1
- package/dist/server/assets/{index-Dgiv8n6K.js → index-Cyz3st2N.js} +2 -2
- package/dist/server/assets/{index-DHC4nyMa.js → index-Cznd5qP8.js} +5 -5
- package/dist/server/assets/{index-CEEnohTX.js → index-DF9DvOkv.js} +2 -2
- package/dist/server/assets/{index-DXdGHSqq.js → index-DoAhyHsE.js} +3 -3
- package/dist/server/assets/{index-WDxgib-p.js → index-DsRToCeg.js} +1 -23
- package/dist/server/assets/{index-BNF8mJRP.js → index-W2MLsk-k.js} +2 -2
- package/dist/server/assets/{index-DSjoHOQR.js → index-y6X09Ksj.js} +2 -2
- package/dist/server/assets/{index-DrE9X1gh.js → index-z7NiBua9.js} +3 -3
- package/dist/server/assets/{info-VBDWY6EO-DaBZazBe.js → info-VBDWY6EO-BQ8N2eDS.js} +6 -6
- package/dist/server/assets/{infoDiagram-HS3SLOUP-Bu1EpnUn.js → infoDiagram-HS3SLOUP-I1ZLYjFY.js} +5 -5
- package/dist/server/assets/{journeyDiagram-XKPGCS4Q-C2IfyEys.js → journeyDiagram-XKPGCS4Q-lFTyhPiV.js} +4 -4
- package/dist/server/assets/{kanban-definition-3W4ZIXB7-Dmos0qrE.js → kanban-definition-3W4ZIXB7-BEr5w27W.js} +2 -2
- package/dist/server/assets/{layout-B_sWGtIR.js → layout-2KXyirN2.js} +4 -4
- package/dist/server/assets/{mermaid-3ZIDBTTL-BW1cNMu3.js → mermaid-3ZIDBTTL-BfFd_m4-.js} +1 -1
- package/dist/server/assets/{mermaid-parser.core-C0KGu9_Y.js → mermaid-parser.core-SoqLW9t8.js} +11 -11
- package/dist/server/assets/{mindmap-definition-VGOIOE7T-C_mzYt-R.js → mindmap-definition-VGOIOE7T-D9ZbRdf_.js} +3 -3
- package/dist/server/assets/{packet-DYOGHKS2-DYttG_nQ.js → packet-DYOGHKS2-B2EvMQj5.js} +6 -6
- package/dist/server/assets/{pie-VRWISCQL-BuhC4M0x.js → pie-VRWISCQL-YRbpkB5e.js} +6 -6
- package/dist/server/assets/{pieDiagram-ADFJNKIX-DexUC2dZ.js → pieDiagram-ADFJNKIX-Bat_eWvt.js} +7 -7
- package/dist/server/assets/{quadrantDiagram-AYHSOK5B-I-ZcwW4o.js → quadrantDiagram-AYHSOK5B-CtqGnRnF.js} +1 -1
- package/dist/server/assets/{radar-ZZBFDIW7-CotKU5eu.js → radar-ZZBFDIW7-DvOi2qX_.js} +6 -6
- package/dist/server/assets/{requirementDiagram-UZGBJVZJ-Ea8SMq7y.js → requirementDiagram-UZGBJVZJ-CtysqbZ4.js} +3 -3
- package/dist/server/assets/{router-Cp26PX4S.js → router-ChvYGLZB.js} +28144 -27943
- package/dist/server/assets/{sankeyDiagram-TZEHDZUN-qAb9c_VI.js → sankeyDiagram-TZEHDZUN-BTLsDOUO.js} +1 -1
- package/dist/server/assets/{sequenceDiagram-WL72ISMW-DhHw376S.js → sequenceDiagram-WL72ISMW-CK0kbINT.js} +3 -3
- package/dist/server/assets/{square-terminal-urq6IDN2.js → square-terminal-BLO1pEjb.js} +1 -1
- package/dist/server/assets/{stateDiagram-FKZM4ZOC-AZXk6dET.js → stateDiagram-FKZM4ZOC-D5FS7RFa.js} +8 -8
- package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-C8Sgtsj6.js → stateDiagram-v2-4FDKWEC3-DoCLlTuy.js} +4 -4
- package/dist/server/assets/{timeline-definition-IT6M3QCI-D34GNHxa.js → timeline-definition-IT6M3QCI-jFqO_Cet.js} +2 -2
- package/dist/server/assets/{treemap-GDKQZRPO-CfD3pUzb.js → treemap-GDKQZRPO-CuHJYOCT.js} +6 -6
- package/dist/server/assets/{workspace._workspaceId-D87t1HVW.js → workspace._workspaceId-B0M_Sxj3.js} +1 -1
- package/dist/server/assets/{workspace._workspaceId-CweIY_H0.js → workspace._workspaceId-CGq293LY.js} +3 -3
- package/dist/server/assets/{xychartDiagram-PRI3JC2R-CWxcKTdW.js → xychartDiagram-PRI3JC2R-DPvU_7PC.js} +1 -1
- package/dist/server/server.js +2 -2
- package/dist/start-server.mjs +388 -247
- package/package.json +4 -4
- package/dist/client/assets/DockviewBrowserContainer-6vGRAPMq.js +0 -5
- package/dist/client/assets/DockviewTerminalContainer-COlPnAN7.js +0 -2
- package/dist/client/assets/TerminalPanel-DNBLPQEb.js +0 -5
- package/dist/client/assets/channel-Cx_aQUiM.js +0 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-CDZ4gS0y.js +0 -1
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-CDZ4gS0y.js +0 -1
- package/dist/client/assets/clone-CNiiW5Ay.js +0 -1
- package/dist/client/assets/index-CN_mH_uK.js +0 -1
- package/dist/client/assets/main-BgcIGjy5.css +0 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CSXqjPLc.js +0 -1
- package/dist/server/assets/_tanstack-start-manifest_v-PthNKGfG.js +0 -4
package/dist/start-server.mjs
CHANGED
|
@@ -6501,11 +6501,11 @@ var require_tools = __commonJS({
|
|
|
6501
6501
|
}
|
|
6502
6502
|
}
|
|
6503
6503
|
}
|
|
6504
|
-
function buildFormatters(level, bindings,
|
|
6504
|
+
function buildFormatters(level, bindings, log47) {
|
|
6505
6505
|
return {
|
|
6506
6506
|
level,
|
|
6507
6507
|
bindings,
|
|
6508
|
-
log:
|
|
6508
|
+
log: log47
|
|
6509
6509
|
};
|
|
6510
6510
|
}
|
|
6511
6511
|
function normalizeDestFileDescriptor(destination) {
|
|
@@ -6888,11 +6888,11 @@ var require_proto = __commonJS({
|
|
|
6888
6888
|
}
|
|
6889
6889
|
} else instance[serializersSym] = serializers;
|
|
6890
6890
|
if (options2.hasOwnProperty("formatters")) {
|
|
6891
|
-
const { level, bindings: chindings, log:
|
|
6891
|
+
const { level, bindings: chindings, log: log47 } = options2.formatters;
|
|
6892
6892
|
instance[formattersSym] = buildFormatters(
|
|
6893
6893
|
level || formatters.level,
|
|
6894
6894
|
chindings || resetChildingsFormatter,
|
|
6895
|
-
|
|
6895
|
+
log47 || formatters.log
|
|
6896
6896
|
);
|
|
6897
6897
|
} else {
|
|
6898
6898
|
instance[formattersSym] = buildFormatters(
|
|
@@ -87212,11 +87212,11 @@ var require_core = __commonJS({
|
|
|
87212
87212
|
Ajv2.ValidationError = validation_error_1.default;
|
|
87213
87213
|
Ajv2.MissingRefError = ref_error_1.default;
|
|
87214
87214
|
exports.default = Ajv2;
|
|
87215
|
-
function checkOptions(checkOpts, options2, msg,
|
|
87215
|
+
function checkOptions(checkOpts, options2, msg, log47 = "error") {
|
|
87216
87216
|
for (const key in checkOpts) {
|
|
87217
87217
|
const opt = key;
|
|
87218
87218
|
if (opt in options2)
|
|
87219
|
-
this.logger[
|
|
87219
|
+
this.logger[log47](`${msg}: option ${key}. ${checkOpts[opt]}`);
|
|
87220
87220
|
}
|
|
87221
87221
|
}
|
|
87222
87222
|
function getSchEnv(keyRef) {
|
|
@@ -102529,16 +102529,89 @@ function listenerCount() {
|
|
|
102529
102529
|
// src/server/infra/setup/setup-runner.ts
|
|
102530
102530
|
import { spawn as spawn5 } from "node:child_process";
|
|
102531
102531
|
|
|
102532
|
+
// src/server/infra/process/path.ts
|
|
102533
|
+
import { execFile as execFile3 } from "node:child_process";
|
|
102534
|
+
import { existsSync as existsSync4 } from "node:fs";
|
|
102535
|
+
import { delimiter } from "node:path";
|
|
102536
|
+
function defaultShell() {
|
|
102537
|
+
if (process.env.SHELL) return process.env.SHELL;
|
|
102538
|
+
if (process.platform === "win32") return process.env.ComSpec || "cmd.exe";
|
|
102539
|
+
for (const candidate of ["/bin/zsh", "/bin/bash", "/bin/sh"]) {
|
|
102540
|
+
if (existsSync4(candidate)) return candidate;
|
|
102541
|
+
}
|
|
102542
|
+
return "/bin/sh";
|
|
102543
|
+
}
|
|
102544
|
+
var cachedBinDirs = null;
|
|
102545
|
+
function extraBinDirs() {
|
|
102546
|
+
if (cachedBinDirs) return cachedBinDirs;
|
|
102547
|
+
if (process.platform === "darwin") {
|
|
102548
|
+
cachedBinDirs = ["/opt/homebrew/bin", "/usr/local/bin"];
|
|
102549
|
+
} else if (process.platform === "linux") {
|
|
102550
|
+
const dirs = [];
|
|
102551
|
+
const linuxbrew = "/home/linuxbrew/.linuxbrew/bin";
|
|
102552
|
+
if (existsSync4(linuxbrew)) dirs.push(linuxbrew);
|
|
102553
|
+
dirs.push("/usr/local/bin");
|
|
102554
|
+
cachedBinDirs = dirs;
|
|
102555
|
+
} else {
|
|
102556
|
+
cachedBinDirs = [];
|
|
102557
|
+
}
|
|
102558
|
+
return cachedBinDirs;
|
|
102559
|
+
}
|
|
102560
|
+
function prependBinDirs(path3) {
|
|
102561
|
+
return [...extraBinDirs(), ...path3 ? [path3] : []].join(delimiter);
|
|
102562
|
+
}
|
|
102563
|
+
var cachedShellPath = null;
|
|
102564
|
+
async function shellPath() {
|
|
102565
|
+
if (cachedShellPath) return cachedShellPath;
|
|
102566
|
+
const shell = defaultShell();
|
|
102567
|
+
try {
|
|
102568
|
+
const result = await new Promise((resolve12, reject) => {
|
|
102569
|
+
execFile3(shell, ["-li", "-c", "echo $PATH"], { timeout: 5e3 }, (err, stdout) => {
|
|
102570
|
+
if (err) {
|
|
102571
|
+
reject(err);
|
|
102572
|
+
return;
|
|
102573
|
+
}
|
|
102574
|
+
resolve12(stdout.trim());
|
|
102575
|
+
});
|
|
102576
|
+
});
|
|
102577
|
+
if (result) {
|
|
102578
|
+
cachedShellPath = result;
|
|
102579
|
+
return result;
|
|
102580
|
+
}
|
|
102581
|
+
} catch {
|
|
102582
|
+
}
|
|
102583
|
+
const fallback = prependBinDirs(process.env.PATH);
|
|
102584
|
+
cachedShellPath = fallback;
|
|
102585
|
+
return fallback;
|
|
102586
|
+
}
|
|
102587
|
+
async function whichBinary(name3) {
|
|
102588
|
+
const resolvedPath = await shellPath();
|
|
102589
|
+
try {
|
|
102590
|
+
const result = await new Promise((resolve12, reject) => {
|
|
102591
|
+
execFile3("which", [name3], { env: { ...process.env, PATH: resolvedPath } }, (err, stdout) => {
|
|
102592
|
+
if (err) {
|
|
102593
|
+
reject(err);
|
|
102594
|
+
return;
|
|
102595
|
+
}
|
|
102596
|
+
resolve12(stdout.trim());
|
|
102597
|
+
});
|
|
102598
|
+
});
|
|
102599
|
+
return result || null;
|
|
102600
|
+
} catch {
|
|
102601
|
+
return null;
|
|
102602
|
+
}
|
|
102603
|
+
}
|
|
102604
|
+
|
|
102532
102605
|
// src/server/infra/setup/project-config.ts
|
|
102533
102606
|
init_src();
|
|
102534
102607
|
init_zod();
|
|
102535
|
-
import { existsSync as
|
|
102608
|
+
import { existsSync as existsSync5, readFileSync as readFileSync6 } from "node:fs";
|
|
102536
102609
|
import { join as join14 } from "node:path";
|
|
102537
102610
|
var log10 = createLogger("project-config");
|
|
102538
102611
|
function loadProjectConfig(worktreePath, projectPath) {
|
|
102539
102612
|
for (const base2 of [worktreePath, projectPath]) {
|
|
102540
102613
|
const configPath = join14(base2, ".band", "config.json");
|
|
102541
|
-
if (
|
|
102614
|
+
if (existsSync5(configPath)) {
|
|
102542
102615
|
try {
|
|
102543
102616
|
return JSON.parse(readFileSync6(configPath, "utf-8"));
|
|
102544
102617
|
} catch {
|
|
@@ -102550,7 +102623,7 @@ function loadProjectConfig(worktreePath, projectPath) {
|
|
|
102550
102623
|
var CopyFilesSchema = external_exports.array(external_exports.string()).optional();
|
|
102551
102624
|
function getCopyFiles(projectPath) {
|
|
102552
102625
|
const configPath = join14(projectPath, ".band", "config.json");
|
|
102553
|
-
if (!
|
|
102626
|
+
if (!existsSync5(configPath)) return null;
|
|
102554
102627
|
let raw;
|
|
102555
102628
|
try {
|
|
102556
102629
|
raw = JSON.parse(readFileSync6(configPath, "utf-8"));
|
|
@@ -102589,7 +102662,7 @@ function runSetup(workspaceId, worktreePath, projectPath, onComplete) {
|
|
|
102589
102662
|
cwd: worktreePath,
|
|
102590
102663
|
env: {
|
|
102591
102664
|
...parentEnv,
|
|
102592
|
-
PATH:
|
|
102665
|
+
PATH: prependBinDirs(process.env.PATH)
|
|
102593
102666
|
},
|
|
102594
102667
|
stdio: ["ignore", "pipe", "pipe"]
|
|
102595
102668
|
});
|
|
@@ -114637,7 +114710,7 @@ var WorkspaceCard = (0, import_react21.memo)(function WorkspaceCard2({
|
|
|
114637
114710
|
openWorkspace(workspaceId);
|
|
114638
114711
|
}
|
|
114639
114712
|
};
|
|
114640
|
-
const className = `@container group flex flex-row items-center justify-between pl-3 pr-2 py-1 min-h-9 min-w-0 overflow-hidden cursor-pointer select-none touch-manipulation transition-colors hover:bg-accent/50 [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:py-2 ${isActive ? "
|
|
114713
|
+
const className = `@container group flex flex-row items-center justify-between rounded-md pl-3 pr-2 py-1 min-h-9 min-w-0 overflow-hidden cursor-pointer select-none touch-manipulation transition-colors hover:bg-accent/50 [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:py-2 ${isActive ? "bg-primary/15 hover:bg-primary/15" : isFocused ? "bg-accent" : ""} ${href ? "no-underline text-inherit" : ""}`;
|
|
114641
114714
|
const containerProps = {
|
|
114642
114715
|
ref: cardRef,
|
|
114643
114716
|
className,
|
|
@@ -118540,7 +118613,7 @@ var cmdClickLinkPlugin = ViewPlugin.fromClass(
|
|
|
118540
118613
|
|
|
118541
118614
|
// src/server/infra/git/git-client.ts
|
|
118542
118615
|
init_src();
|
|
118543
|
-
import { execFile as
|
|
118616
|
+
import { execFile as execFile4 } from "node:child_process";
|
|
118544
118617
|
import { readFile, stat as stat3 } from "node:fs/promises";
|
|
118545
118618
|
import { join as join15 } from "node:path";
|
|
118546
118619
|
var log11 = createLogger("git");
|
|
@@ -118599,15 +118672,13 @@ async function resolveDetachedBranch(worktreePath) {
|
|
|
118599
118672
|
}
|
|
118600
118673
|
function gitCmd() {
|
|
118601
118674
|
const env = { ...process.env };
|
|
118602
|
-
|
|
118603
|
-
env.PATH = `/opt/homebrew/bin:/usr/local/bin:${env.PATH}`;
|
|
118604
|
-
}
|
|
118675
|
+
env.PATH = prependBinDirs(env.PATH);
|
|
118605
118676
|
return { command: "git", env };
|
|
118606
118677
|
}
|
|
118607
118678
|
function execGit(args, cwd) {
|
|
118608
118679
|
const { command, env } = gitCmd();
|
|
118609
118680
|
return new Promise((resolve12, reject) => {
|
|
118610
|
-
|
|
118681
|
+
execFile4(command, args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
|
|
118611
118682
|
if (err) {
|
|
118612
118683
|
reject(new Error(stderr || err.message));
|
|
118613
118684
|
return;
|
|
@@ -118618,11 +118689,9 @@ function execGit(args, cwd) {
|
|
|
118618
118689
|
}
|
|
118619
118690
|
function execGh(args, cwd) {
|
|
118620
118691
|
const env = { ...process.env };
|
|
118621
|
-
|
|
118622
|
-
env.PATH = `/opt/homebrew/bin:/usr/local/bin:${env.PATH}`;
|
|
118623
|
-
}
|
|
118692
|
+
env.PATH = prependBinDirs(env.PATH);
|
|
118624
118693
|
return new Promise((resolve12, reject) => {
|
|
118625
|
-
|
|
118694
|
+
execFile4("gh", args, { cwd, env, maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => {
|
|
118626
118695
|
if (err) {
|
|
118627
118696
|
reject(new Error(stderr || err.message));
|
|
118628
118697
|
return;
|
|
@@ -118857,11 +118926,11 @@ function parseBatchedCIResponse(data, aliases, defaultBranches) {
|
|
|
118857
118926
|
}
|
|
118858
118927
|
|
|
118859
118928
|
// src/server/infra/db/queries/projects.ts
|
|
118860
|
-
import { existsSync as
|
|
118929
|
+
import { existsSync as existsSync6 } from "node:fs";
|
|
118861
118930
|
import { join as join16 } from "node:path";
|
|
118862
118931
|
function reconcileKindForProject(project) {
|
|
118863
|
-
if (!
|
|
118864
|
-
const detectedKind =
|
|
118932
|
+
if (!existsSync6(project.path)) return false;
|
|
118933
|
+
const detectedKind = existsSync6(join16(project.path, ".git")) ? "git" : "plain";
|
|
118865
118934
|
if (detectedKind === project.kind) return false;
|
|
118866
118935
|
project.kind = detectedKind;
|
|
118867
118936
|
if (detectedKind === "plain") {
|
|
@@ -120412,7 +120481,7 @@ init_src();
|
|
|
120412
120481
|
init_zod();
|
|
120413
120482
|
import { execFile as execFile6 } from "node:child_process";
|
|
120414
120483
|
import { randomUUID as randomUUID3 } from "node:crypto";
|
|
120415
|
-
import { existsSync as
|
|
120484
|
+
import { existsSync as existsSync9, mkdirSync as mkdirSync5, unlinkSync as unlinkSync3 } from "node:fs";
|
|
120416
120485
|
import { rm } from "node:fs/promises";
|
|
120417
120486
|
import { join as join20 } from "node:path";
|
|
120418
120487
|
import { promisify as promisify2 } from "node:util";
|
|
@@ -120683,52 +120752,6 @@ init_src();
|
|
|
120683
120752
|
import { spawn as spawn6 } from "node:child_process";
|
|
120684
120753
|
import { dirname as dirname2, join as join17, resolve as resolve3 } from "node:path";
|
|
120685
120754
|
import { fileURLToPath } from "node:url";
|
|
120686
|
-
|
|
120687
|
-
// src/server/infra/process/path.ts
|
|
120688
|
-
import { execFile as execFile4 } from "node:child_process";
|
|
120689
|
-
var cachedShellPath = null;
|
|
120690
|
-
async function shellPath() {
|
|
120691
|
-
if (cachedShellPath) return cachedShellPath;
|
|
120692
|
-
const shell = process.env.SHELL || "/bin/zsh";
|
|
120693
|
-
try {
|
|
120694
|
-
const result = await new Promise((resolve12, reject) => {
|
|
120695
|
-
execFile4(shell, ["-li", "-c", "echo $PATH"], { timeout: 5e3 }, (err, stdout) => {
|
|
120696
|
-
if (err) {
|
|
120697
|
-
reject(err);
|
|
120698
|
-
return;
|
|
120699
|
-
}
|
|
120700
|
-
resolve12(stdout.trim());
|
|
120701
|
-
});
|
|
120702
|
-
});
|
|
120703
|
-
if (result) {
|
|
120704
|
-
cachedShellPath = result;
|
|
120705
|
-
return result;
|
|
120706
|
-
}
|
|
120707
|
-
} catch {
|
|
120708
|
-
}
|
|
120709
|
-
const fallback = `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH || ""}`;
|
|
120710
|
-
cachedShellPath = fallback;
|
|
120711
|
-
return fallback;
|
|
120712
|
-
}
|
|
120713
|
-
async function whichBinary(name3) {
|
|
120714
|
-
const resolvedPath = await shellPath();
|
|
120715
|
-
try {
|
|
120716
|
-
const result = await new Promise((resolve12, reject) => {
|
|
120717
|
-
execFile4("which", [name3], { env: { ...process.env, PATH: resolvedPath } }, (err, stdout) => {
|
|
120718
|
-
if (err) {
|
|
120719
|
-
reject(err);
|
|
120720
|
-
return;
|
|
120721
|
-
}
|
|
120722
|
-
resolve12(stdout.trim());
|
|
120723
|
-
});
|
|
120724
|
-
});
|
|
120725
|
-
return result || null;
|
|
120726
|
-
} catch {
|
|
120727
|
-
return null;
|
|
120728
|
-
}
|
|
120729
|
-
}
|
|
120730
|
-
|
|
120731
|
-
// src/server/infra/lsp/lsp-manager.ts
|
|
120732
120755
|
var workspaceQueries = new WorkspaceQueries();
|
|
120733
120756
|
var __dirname2 = dirname2(fileURLToPath(import.meta.url));
|
|
120734
120757
|
var log16 = createLogger("lsp");
|
|
@@ -120828,7 +120851,7 @@ init_src();
|
|
|
120828
120851
|
import { execFile as execFile5 } from "node:child_process";
|
|
120829
120852
|
import {
|
|
120830
120853
|
copyFileSync as copyFileSync2,
|
|
120831
|
-
existsSync as
|
|
120854
|
+
existsSync as existsSync7,
|
|
120832
120855
|
globSync,
|
|
120833
120856
|
mkdirSync as mkdirSync4,
|
|
120834
120857
|
readFileSync as readFileSync7,
|
|
@@ -120961,7 +120984,7 @@ function resolveFromConfig(projectPath, missing) {
|
|
|
120961
120984
|
}
|
|
120962
120985
|
async function resolveFromWorktreeInclude(projectPath) {
|
|
120963
120986
|
const includePath = join18(projectPath, ".worktreeinclude");
|
|
120964
|
-
if (!
|
|
120987
|
+
if (!existsSync7(includePath)) return [];
|
|
120965
120988
|
const includeContent = readFileSync7(includePath, "utf-8");
|
|
120966
120989
|
const hasPatterns = includeContent.split(/\r?\n/).some((line2) => {
|
|
120967
120990
|
const trimmed = line2.trim();
|
|
@@ -122559,6 +122582,92 @@ var CronjobService = class {
|
|
|
122559
122582
|
};
|
|
122560
122583
|
var cronjobService = new CronjobService();
|
|
122561
122584
|
|
|
122585
|
+
// src/server/services/panel-focus-service.ts
|
|
122586
|
+
init_src();
|
|
122587
|
+
var log21 = createLogger("panel-focus-service");
|
|
122588
|
+
var PANEL_FOCUS_TYPE = "panel_focus";
|
|
122589
|
+
function focusRowId(workspaceId) {
|
|
122590
|
+
return `${PANEL_FOCUS_TYPE}:${workspaceId}`;
|
|
122591
|
+
}
|
|
122592
|
+
var PanelFocusService = class {
|
|
122593
|
+
/** workspaceId → last-focused panel ids. */
|
|
122594
|
+
focus = /* @__PURE__ */ new Map();
|
|
122595
|
+
/**
|
|
122596
|
+
* Workspaces whose focus row has been loaded from the DB into `focus`.
|
|
122597
|
+
* Separate from the map's own key presence because a workspace can have a
|
|
122598
|
+
* loaded-but-empty record (row absent) — we still don't want to re-hit the
|
|
122599
|
+
* DB on every read.
|
|
122600
|
+
*/
|
|
122601
|
+
hydrated = /* @__PURE__ */ new Set();
|
|
122602
|
+
/** Workspaces that already have a `panel_states` row (drives insert vs update). */
|
|
122603
|
+
persisted = /* @__PURE__ */ new Set();
|
|
122604
|
+
/**
|
|
122605
|
+
* Load a workspace's focus row from the DB on first access. Cheap and
|
|
122606
|
+
* idempotent — subsequent calls short-circuit on the `hydrated` set.
|
|
122607
|
+
*/
|
|
122608
|
+
ensureHydrated(workspaceId) {
|
|
122609
|
+
if (this.hydrated.has(workspaceId)) return;
|
|
122610
|
+
this.hydrated.add(workspaceId);
|
|
122611
|
+
const rows = listPanelStatesForWorkspace(workspaceId, PANEL_FOCUS_TYPE);
|
|
122612
|
+
const row = rows[0];
|
|
122613
|
+
if (!row) return;
|
|
122614
|
+
this.persisted.add(workspaceId);
|
|
122615
|
+
try {
|
|
122616
|
+
const parsed = JSON.parse(row.state);
|
|
122617
|
+
this.focus.set(workspaceId, {
|
|
122618
|
+
chat: parsed.chat,
|
|
122619
|
+
terminal: parsed.terminal,
|
|
122620
|
+
browser: parsed.browser
|
|
122621
|
+
});
|
|
122622
|
+
} catch (err) {
|
|
122623
|
+
log21.warn({ workspaceId, err }, "failed to parse persisted panel focus; ignoring");
|
|
122624
|
+
}
|
|
122625
|
+
}
|
|
122626
|
+
/** Get the last-focused panel ids for a workspace. */
|
|
122627
|
+
get(workspaceId) {
|
|
122628
|
+
this.ensureHydrated(workspaceId);
|
|
122629
|
+
return { ...this.focus.get(workspaceId) ?? {} };
|
|
122630
|
+
}
|
|
122631
|
+
/**
|
|
122632
|
+
* Record that `panelId` is the last-focused panel of `panelType` in
|
|
122633
|
+
* `workspaceId`. Write-through: updates the in-memory map and upserts the
|
|
122634
|
+
* backing `panel_states` row.
|
|
122635
|
+
*/
|
|
122636
|
+
set(workspaceId, panelType, panelId) {
|
|
122637
|
+
this.ensureHydrated(workspaceId);
|
|
122638
|
+
const current2 = this.focus.get(workspaceId) ?? {};
|
|
122639
|
+
if (current2[panelType] === panelId) return;
|
|
122640
|
+
const next = { ...current2, [panelType]: panelId };
|
|
122641
|
+
this.focus.set(workspaceId, next);
|
|
122642
|
+
const now = Date.now();
|
|
122643
|
+
const state = JSON.stringify(next);
|
|
122644
|
+
if (this.persisted.has(workspaceId)) {
|
|
122645
|
+
updatePanelState(focusRowId(workspaceId), { state, updatedAt: now });
|
|
122646
|
+
} else {
|
|
122647
|
+
insertPanelState({
|
|
122648
|
+
id: focusRowId(workspaceId),
|
|
122649
|
+
workspaceId,
|
|
122650
|
+
panelType: PANEL_FOCUS_TYPE,
|
|
122651
|
+
state,
|
|
122652
|
+
createdAt: now,
|
|
122653
|
+
updatedAt: now
|
|
122654
|
+
});
|
|
122655
|
+
this.persisted.add(workspaceId);
|
|
122656
|
+
}
|
|
122657
|
+
}
|
|
122658
|
+
/**
|
|
122659
|
+
* Drop all focus tracking for a workspace. Called from the workspace delete
|
|
122660
|
+
* path so the row doesn't outlive the workspace.
|
|
122661
|
+
*/
|
|
122662
|
+
remove(workspaceId) {
|
|
122663
|
+
this.focus.delete(workspaceId);
|
|
122664
|
+
this.hydrated.delete(workspaceId);
|
|
122665
|
+
this.persisted.delete(workspaceId);
|
|
122666
|
+
deletePanelState(focusRowId(workspaceId));
|
|
122667
|
+
}
|
|
122668
|
+
};
|
|
122669
|
+
var panelFocusService = new PanelFocusService();
|
|
122670
|
+
|
|
122562
122671
|
// src/server/services/terminal-service.ts
|
|
122563
122672
|
init_src();
|
|
122564
122673
|
init_zod();
|
|
@@ -122566,10 +122675,10 @@ init_zod();
|
|
|
122566
122675
|
// src/server/infra/terminals/terminal-pool.ts
|
|
122567
122676
|
init_src();
|
|
122568
122677
|
import { randomUUID as randomUUID2 } from "node:crypto";
|
|
122569
|
-
import { existsSync as
|
|
122678
|
+
import { existsSync as existsSync8, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
122570
122679
|
import { tmpdir } from "node:os";
|
|
122571
122680
|
import { join as join19, sep as sep3 } from "node:path";
|
|
122572
|
-
var
|
|
122681
|
+
var log22 = createLogger("terminal-pool");
|
|
122573
122682
|
var MAX_SCROLLBACK_SIZE = 1e5;
|
|
122574
122683
|
var TerminalPool = class {
|
|
122575
122684
|
/** terminalId -> session */
|
|
@@ -122586,7 +122695,7 @@ var TerminalPool = class {
|
|
|
122586
122695
|
* stays oblivious to the workspace registry.
|
|
122587
122696
|
*/
|
|
122588
122697
|
async spawn(workspaceId, terminalId, workspaceRoot, options2) {
|
|
122589
|
-
const shell =
|
|
122698
|
+
const shell = defaultShell();
|
|
122590
122699
|
const resolvedPath = await shellPath();
|
|
122591
122700
|
const env = {};
|
|
122592
122701
|
for (const [key, value] of Object.entries(process.env)) {
|
|
@@ -122607,24 +122716,24 @@ var TerminalPool = class {
|
|
|
122607
122716
|
if (options2?.cwd) {
|
|
122608
122717
|
const resolved = join19(workspaceRoot, options2.cwd);
|
|
122609
122718
|
if (resolved !== workspaceRoot && !resolved.startsWith(workspaceRoot + sep3)) {
|
|
122610
|
-
|
|
122719
|
+
log22.warn(
|
|
122611
122720
|
"Ignoring cwd %s \u2014 resolves outside workspace root %s",
|
|
122612
122721
|
options2.cwd,
|
|
122613
122722
|
workspaceRoot
|
|
122614
122723
|
);
|
|
122615
|
-
} else if (
|
|
122724
|
+
} else if (existsSync8(resolved)) {
|
|
122616
122725
|
cwd = resolved;
|
|
122617
122726
|
} else {
|
|
122618
|
-
|
|
122727
|
+
log22.warn("Ignoring cwd %s \u2014 directory does not exist", options2.cwd);
|
|
122619
122728
|
}
|
|
122620
122729
|
}
|
|
122621
|
-
if (!
|
|
122730
|
+
if (!existsSync8(cwd)) {
|
|
122622
122731
|
throw new Error(`Workspace directory does not exist: ${cwd}`);
|
|
122623
122732
|
}
|
|
122624
|
-
if (!
|
|
122733
|
+
if (!existsSync8(shell)) {
|
|
122625
122734
|
throw new Error(`Shell not found: ${shell}`);
|
|
122626
122735
|
}
|
|
122627
|
-
|
|
122736
|
+
log22.debug(
|
|
122628
122737
|
"Spawning shell %s in %s for terminal %s (PATH=%s)",
|
|
122629
122738
|
shell,
|
|
122630
122739
|
cwd,
|
|
@@ -122643,7 +122752,7 @@ var TerminalPool = class {
|
|
|
122643
122752
|
});
|
|
122644
122753
|
} catch (err) {
|
|
122645
122754
|
const msg = err instanceof Error ? err.message : String(err);
|
|
122646
|
-
|
|
122755
|
+
log22.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
|
|
122647
122756
|
throw err;
|
|
122648
122757
|
}
|
|
122649
122758
|
const session = { pty: ptyProcess, scrollback: "", workspaceId };
|
|
@@ -122673,7 +122782,7 @@ var TerminalPool = class {
|
|
|
122673
122782
|
}
|
|
122674
122783
|
});
|
|
122675
122784
|
ptyProcess.onExit(() => {
|
|
122676
|
-
|
|
122785
|
+
log22.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
|
|
122677
122786
|
this.terminals.delete(terminalId);
|
|
122678
122787
|
this.outputListeners.delete(terminalId);
|
|
122679
122788
|
const set = this.workspaceTerminals.get(workspaceId);
|
|
@@ -122728,7 +122837,7 @@ var TerminalPool = class {
|
|
|
122728
122837
|
`, { encoding: "utf-8", mode: 384, flag: "wx" });
|
|
122729
122838
|
session.autoRunFile = cmdFile;
|
|
122730
122839
|
} catch (err) {
|
|
122731
|
-
|
|
122840
|
+
log22.warn(
|
|
122732
122841
|
"autoRunCommand: temp-file staging failed (%s); writing command directly",
|
|
122733
122842
|
err instanceof Error ? err.message : String(err)
|
|
122734
122843
|
);
|
|
@@ -122746,7 +122855,7 @@ var TerminalPool = class {
|
|
|
122746
122855
|
try {
|
|
122747
122856
|
pty.write(sourceLine);
|
|
122748
122857
|
} catch (err) {
|
|
122749
|
-
|
|
122858
|
+
log22.warn("autoRunCommand: failed to inject command line (%s)", err);
|
|
122750
122859
|
}
|
|
122751
122860
|
};
|
|
122752
122861
|
let dataDisposed = false;
|
|
@@ -122925,7 +123034,7 @@ function removeTerminalFromLayout(workspaceId, terminalId) {
|
|
|
122925
123034
|
}
|
|
122926
123035
|
|
|
122927
123036
|
// src/server/services/terminal-service.ts
|
|
122928
|
-
var
|
|
123037
|
+
var log23 = createLogger("terminal-service");
|
|
122929
123038
|
var TerminalPaneConfigSchema = external_exports.object({
|
|
122930
123039
|
name: external_exports.string().optional(),
|
|
122931
123040
|
command: external_exports.string().optional(),
|
|
@@ -123083,7 +123192,7 @@ var TerminalService = class {
|
|
|
123083
123192
|
if (!terminalBlock) return null;
|
|
123084
123193
|
const result = WorkspaceTerminalConfigSchema.safeParse(terminalBlock);
|
|
123085
123194
|
if (!result.success) {
|
|
123086
|
-
|
|
123195
|
+
log23.warn(
|
|
123087
123196
|
"Invalid workspace.terminal config: %s",
|
|
123088
123197
|
result.error.issues.map((i2) => `${i2.path.join(".")}: ${i2.message}`).join("; ")
|
|
123089
123198
|
);
|
|
@@ -123096,7 +123205,7 @@ var terminalService = new TerminalService();
|
|
|
123096
123205
|
|
|
123097
123206
|
// src/server/services/workspace-service.ts
|
|
123098
123207
|
var execFileAsync2 = promisify2(execFile6);
|
|
123099
|
-
var
|
|
123208
|
+
var log24 = createLogger("workspace-service");
|
|
123100
123209
|
var workspaceVia = external_exports.enum(["chat", "terminal"]);
|
|
123101
123210
|
var workspaceCreateInput = external_exports.object({
|
|
123102
123211
|
project: external_exports.string(),
|
|
@@ -123280,10 +123389,10 @@ var WorkspaceService = class {
|
|
|
123280
123389
|
try {
|
|
123281
123390
|
const copied = await copyWorkspaceFiles(project.path, worktreePath);
|
|
123282
123391
|
if (copied.length > 0) {
|
|
123283
|
-
|
|
123392
|
+
log24.info({ workspaceId, count: copied.length }, "copied workspace files into new worktree");
|
|
123284
123393
|
}
|
|
123285
123394
|
} catch (err) {
|
|
123286
|
-
|
|
123395
|
+
log24.warn({ err, workspaceId }, "copyWorkspaceFiles raised \u2014 continuing");
|
|
123287
123396
|
}
|
|
123288
123397
|
const defaultChat = chatService.getOrCreateDefault(workspaceId);
|
|
123289
123398
|
let via = input.via ?? "chat";
|
|
@@ -123296,7 +123405,7 @@ var WorkspaceService = class {
|
|
|
123296
123405
|
adapter.abort?.();
|
|
123297
123406
|
if (!invocation || invocation.unsupported) {
|
|
123298
123407
|
const reason = invocation?.reason ?? "adapter does not expose cliInvocation";
|
|
123299
|
-
|
|
123408
|
+
log24.warn(
|
|
123300
123409
|
{ workspaceId, agentId: input.codingAgentId, reason },
|
|
123301
123410
|
"via=terminal requested but adapter does not support it; falling back to chat"
|
|
123302
123411
|
);
|
|
@@ -123306,7 +123415,7 @@ var WorkspaceService = class {
|
|
|
123306
123415
|
terminalId = randomUUID3();
|
|
123307
123416
|
}
|
|
123308
123417
|
} catch (err) {
|
|
123309
|
-
|
|
123418
|
+
log24.warn(
|
|
123310
123419
|
{
|
|
123311
123420
|
err: err instanceof Error ? err.message : String(err),
|
|
123312
123421
|
workspaceId,
|
|
@@ -123324,7 +123433,7 @@ var WorkspaceService = class {
|
|
|
123324
123433
|
}).then(() => {
|
|
123325
123434
|
emit({ kind: "terminal-created", workspaceId, terminalId });
|
|
123326
123435
|
}).catch((err) => {
|
|
123327
|
-
|
|
123436
|
+
log24.error(
|
|
123328
123437
|
{
|
|
123329
123438
|
err: err instanceof Error ? err.message : String(err),
|
|
123330
123439
|
workspaceId,
|
|
@@ -123395,7 +123504,7 @@ var WorkspaceService = class {
|
|
|
123395
123504
|
const terminalId = randomUUID3();
|
|
123396
123505
|
await terminalService.spawn(chat.workspaceId, terminalId, { command });
|
|
123397
123506
|
emit({ kind: "terminal-created", workspaceId: chat.workspaceId, terminalId });
|
|
123398
|
-
|
|
123507
|
+
log24.info(
|
|
123399
123508
|
{ chatId, workspaceId: chat.workspaceId, terminalId },
|
|
123400
123509
|
"continue chat session in terminal"
|
|
123401
123510
|
);
|
|
@@ -123461,31 +123570,32 @@ var WorkspaceService = class {
|
|
|
123461
123570
|
browserService.removeAllForWorkspace(workspaceId);
|
|
123462
123571
|
terminalService.killWorkspace(workspaceId);
|
|
123463
123572
|
terminalService.deleteLayout(workspaceId);
|
|
123573
|
+
panelFocusService.remove(workspaceId);
|
|
123464
123574
|
killWorkspaceServers(workspaceId);
|
|
123465
123575
|
cronjobService.removeForKey(workspaceId);
|
|
123466
123576
|
try {
|
|
123467
123577
|
const deletedTasks = new TaskQueries().deleteWorkspaceTasks(workspaceId);
|
|
123468
123578
|
if (deletedTasks > 0) {
|
|
123469
|
-
|
|
123579
|
+
log24.info({ workspaceId, count: deletedTasks }, "deleted workspace tasks on removal");
|
|
123470
123580
|
}
|
|
123471
123581
|
} catch (err) {
|
|
123472
|
-
|
|
123582
|
+
log24.error({ workspaceId, err }, "failed to delete workspace tasks on removal");
|
|
123473
123583
|
}
|
|
123474
123584
|
try {
|
|
123475
123585
|
const deletedEvents = this.usageEventQueries.deleteWorkspaceEvents(workspaceId);
|
|
123476
123586
|
if (deletedEvents > 0) {
|
|
123477
|
-
|
|
123587
|
+
log24.info(
|
|
123478
123588
|
{ workspaceId, count: deletedEvents },
|
|
123479
123589
|
"deleted workspace usage events on removal"
|
|
123480
123590
|
);
|
|
123481
123591
|
}
|
|
123482
123592
|
} catch (err) {
|
|
123483
|
-
|
|
123593
|
+
log24.error({ workspaceId, err }, "failed to delete workspace usage events on removal");
|
|
123484
123594
|
}
|
|
123485
123595
|
try {
|
|
123486
123596
|
this.usageScanStateQueries.deleteWorkspace(workspaceId);
|
|
123487
123597
|
} catch (err) {
|
|
123488
|
-
|
|
123598
|
+
log24.error({ workspaceId, err }, "failed to delete workspace usage scan state on removal");
|
|
123489
123599
|
}
|
|
123490
123600
|
emit({ kind: "remove", workspaceId });
|
|
123491
123601
|
const projPath = project.path;
|
|
@@ -123498,13 +123608,13 @@ var WorkspaceService = class {
|
|
|
123498
123608
|
cwd: worktreePath,
|
|
123499
123609
|
env: {
|
|
123500
123610
|
...process.env,
|
|
123501
|
-
PATH:
|
|
123611
|
+
PATH: prependBinDirs(process.env.PATH)
|
|
123502
123612
|
},
|
|
123503
123613
|
encoding: "utf-8",
|
|
123504
123614
|
timeout: 6e4
|
|
123505
123615
|
});
|
|
123506
123616
|
} catch (err) {
|
|
123507
|
-
|
|
123617
|
+
log24.warn({ err, workspaceId }, "teardown script failed");
|
|
123508
123618
|
}
|
|
123509
123619
|
}
|
|
123510
123620
|
try {
|
|
@@ -123517,7 +123627,7 @@ var WorkspaceService = class {
|
|
|
123517
123627
|
try {
|
|
123518
123628
|
await rm(worktreePath, { recursive: true, force: true });
|
|
123519
123629
|
} catch (err) {
|
|
123520
|
-
|
|
123630
|
+
log24.warn({ err, workspaceId, worktreePath }, "manual worktree rm failed");
|
|
123521
123631
|
}
|
|
123522
123632
|
try {
|
|
123523
123633
|
await execFileAsync2(command, ["worktree", "prune"], {
|
|
@@ -123526,7 +123636,7 @@ var WorkspaceService = class {
|
|
|
123526
123636
|
encoding: "utf-8"
|
|
123527
123637
|
});
|
|
123528
123638
|
} catch (err) {
|
|
123529
|
-
|
|
123639
|
+
log24.warn({ err, workspaceId }, "git worktree prune failed");
|
|
123530
123640
|
}
|
|
123531
123641
|
}
|
|
123532
123642
|
if (branchToDelete) {
|
|
@@ -123540,7 +123650,7 @@ var WorkspaceService = class {
|
|
|
123540
123650
|
}
|
|
123541
123651
|
}
|
|
123542
123652
|
})().catch((err) => {
|
|
123543
|
-
|
|
123653
|
+
log24.error({ err, workspaceId }, "background workspace cleanup failed");
|
|
123544
123654
|
});
|
|
123545
123655
|
});
|
|
123546
123656
|
return { ok: true };
|
|
@@ -123833,7 +123943,7 @@ var WorkspaceService = class {
|
|
|
123833
123943
|
*/
|
|
123834
123944
|
async runScript(input) {
|
|
123835
123945
|
const scriptPath = join20(input.path, ".band", input.scriptType);
|
|
123836
|
-
if (!
|
|
123946
|
+
if (!existsSync9(scriptPath)) {
|
|
123837
123947
|
throw new Error(`Script "${input.scriptType}" not found`);
|
|
123838
123948
|
}
|
|
123839
123949
|
try {
|
|
@@ -123847,7 +123957,7 @@ var WorkspaceService = class {
|
|
|
123847
123957
|
var workspaceService = new WorkspaceService();
|
|
123848
123958
|
|
|
123849
123959
|
// src/server/services/task-service.ts
|
|
123850
|
-
var
|
|
123960
|
+
var log25 = createLogger("task-service");
|
|
123851
123961
|
var taskQueries = new TaskQueries();
|
|
123852
123962
|
function listFiles(dir) {
|
|
123853
123963
|
try {
|
|
@@ -123940,7 +124050,7 @@ function persistTask(task) {
|
|
|
123940
124050
|
chatId: task.chatId
|
|
123941
124051
|
});
|
|
123942
124052
|
} catch (err) {
|
|
123943
|
-
|
|
124053
|
+
log25.warn({ err, taskId: task.taskRecordId }, "failed to persist task");
|
|
123944
124054
|
}
|
|
123945
124055
|
}
|
|
123946
124056
|
function broadcast(chatId, chunk) {
|
|
@@ -123964,7 +124074,7 @@ function broadcast(chatId, chunk) {
|
|
|
123964
124074
|
}
|
|
123965
124075
|
const subs = listeners2.get(chatId);
|
|
123966
124076
|
if (!subs || subs.size === 0) {
|
|
123967
|
-
|
|
124077
|
+
log25.warn({ chatId, chunkType: chunk.type }, "broadcast: no listeners");
|
|
123968
124078
|
return;
|
|
123969
124079
|
}
|
|
123970
124080
|
for (const listener of subs) {
|
|
@@ -124028,7 +124138,7 @@ function submitTask(options2) {
|
|
|
124028
124138
|
});
|
|
124029
124139
|
}
|
|
124030
124140
|
runTask(chatId, task).catch((err) => {
|
|
124031
|
-
|
|
124141
|
+
log25.error({ chatId, err }, "task execution failed");
|
|
124032
124142
|
if (task.status === "running") {
|
|
124033
124143
|
task.status = "failed";
|
|
124034
124144
|
task.completedAt = Date.now();
|
|
@@ -124070,7 +124180,7 @@ function abortTask(chatId) {
|
|
|
124070
124180
|
chatService.updateStatus(chatId, "idle");
|
|
124071
124181
|
const updated = upsertWorkspaceStatus(task.workspaceId, { status: "waiting" });
|
|
124072
124182
|
emit({ kind: "update", status: updated });
|
|
124073
|
-
|
|
124183
|
+
log25.info({ chatId }, "task aborted by user");
|
|
124074
124184
|
return true;
|
|
124075
124185
|
}
|
|
124076
124186
|
function cancelTask(taskId) {
|
|
@@ -124095,7 +124205,7 @@ function cancelTask(taskId) {
|
|
|
124095
124205
|
chatService.updateStatus(chatId, "idle");
|
|
124096
124206
|
const updated = upsertWorkspaceStatus(task.workspaceId, { status: "waiting" });
|
|
124097
124207
|
emit({ kind: "update", status: updated });
|
|
124098
|
-
|
|
124208
|
+
log25.info({ chatId, taskId }, "task cancelled (was running in-memory)");
|
|
124099
124209
|
return { cancelled: true, workspaceId: task.workspaceId };
|
|
124100
124210
|
}
|
|
124101
124211
|
}
|
|
@@ -124103,7 +124213,7 @@ function cancelTask(taskId) {
|
|
|
124103
124213
|
if (record2) {
|
|
124104
124214
|
const updated = upsertWorkspaceStatus(record2.workspaceId, { status: "waiting" });
|
|
124105
124215
|
emit({ kind: "update", status: updated });
|
|
124106
|
-
|
|
124216
|
+
log25.info({ taskId, workspaceId: record2.workspaceId }, "orphaned task cancelled");
|
|
124107
124217
|
return { cancelled: true, workspaceId: record2.workspaceId };
|
|
124108
124218
|
}
|
|
124109
124219
|
return { cancelled: false };
|
|
@@ -124123,7 +124233,7 @@ async function runTask(chatId, task) {
|
|
|
124123
124233
|
const taskAgentId = task.codingAgentId;
|
|
124124
124234
|
const resolvedAgentId = taskAgentId ?? chatSession?.agent;
|
|
124125
124235
|
const needsReplace = taskAgentId && taskAgentId !== chatSession?.agent;
|
|
124126
|
-
|
|
124236
|
+
log25.info(
|
|
124127
124237
|
{ chatId, taskAgentId, chatAgent: chatSession?.agent, resolvedAgentId, needsReplace },
|
|
124128
124238
|
"resolving agent for task"
|
|
124129
124239
|
);
|
|
@@ -124170,7 +124280,7 @@ async function runTask(chatId, task) {
|
|
|
124170
124280
|
[File sharing: to send a file to the user, write or copy it to ${sharedDir}/ and it will appear as a downloadable file card in the chat.]`;
|
|
124171
124281
|
const effectivePrompt = task.sessionId ? task.agentPrompt : task.agentPrompt + fileSharingHint;
|
|
124172
124282
|
for await (const event of agent.runSession(effectivePrompt, task.sessionId, sessionOptions)) {
|
|
124173
|
-
|
|
124283
|
+
log25.info({ chatId, eventType: event.type }, "task event");
|
|
124174
124284
|
switch (event.type) {
|
|
124175
124285
|
case "session-start": {
|
|
124176
124286
|
task.sessionId = event.sessionId;
|
|
@@ -124370,7 +124480,7 @@ async function runTask(chatId, task) {
|
|
|
124370
124480
|
break;
|
|
124371
124481
|
}
|
|
124372
124482
|
case "session-id-resolved": {
|
|
124373
|
-
|
|
124483
|
+
log25.info(
|
|
124374
124484
|
{ chatId, previous: event.previousSessionId, resolved: event.resolvedSessionId },
|
|
124375
124485
|
"session ID resolved"
|
|
124376
124486
|
);
|
|
@@ -124473,7 +124583,7 @@ ${queued.text}`;
|
|
|
124473
124583
|
});
|
|
124474
124584
|
autoStarted = true;
|
|
124475
124585
|
} catch (err) {
|
|
124476
|
-
|
|
124586
|
+
log25.warn({ chatId, err }, "failed to auto-start queued task");
|
|
124477
124587
|
}
|
|
124478
124588
|
}
|
|
124479
124589
|
}
|
|
@@ -124648,7 +124758,7 @@ var taskService = new TaskService();
|
|
|
124648
124758
|
var HISTORY_PAGE_SIZE = 50;
|
|
124649
124759
|
|
|
124650
124760
|
// src/api/chat-events.ts
|
|
124651
|
-
var
|
|
124761
|
+
var log26 = createLogger("chat-events");
|
|
124652
124762
|
var COLD_REPLAY_LIMIT = HISTORY_PAGE_SIZE;
|
|
124653
124763
|
async function handleChatEvents(req, res, chatId) {
|
|
124654
124764
|
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
@@ -124729,7 +124839,7 @@ async function handleChatEvents(req, res, chatId) {
|
|
|
124729
124839
|
chatWorkspaceId: chat?.workspaceId ?? explicitWorkspaceId,
|
|
124730
124840
|
agentTypeHint: chat?.agent
|
|
124731
124841
|
}).catch((err) => {
|
|
124732
|
-
|
|
124842
|
+
log26.warn({ chatId, err }, "replay phase failed; continuing to live tail");
|
|
124733
124843
|
});
|
|
124734
124844
|
try {
|
|
124735
124845
|
while (!res.destroyed && !writer.closed) {
|
|
@@ -124809,7 +124919,7 @@ async function replayPast(opts) {
|
|
|
124809
124919
|
}
|
|
124810
124920
|
}
|
|
124811
124921
|
} catch (err) {
|
|
124812
|
-
|
|
124922
|
+
log26.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
|
|
124813
124923
|
}
|
|
124814
124924
|
}
|
|
124815
124925
|
if (!jsonlEmittedAny && buf) {
|
|
@@ -124856,7 +124966,7 @@ async function replayPast(opts) {
|
|
|
124856
124966
|
}
|
|
124857
124967
|
}
|
|
124858
124968
|
} catch (err) {
|
|
124859
|
-
|
|
124969
|
+
log26.warn({ chatId, sessionId, err }, "JSONL backfill failed; falling through to buffer");
|
|
124860
124970
|
}
|
|
124861
124971
|
}
|
|
124862
124972
|
if (buf) {
|
|
@@ -124964,7 +125074,7 @@ function chunkToChatEvent(chunk, _sessionId) {
|
|
|
124964
125074
|
|
|
124965
125075
|
// src/api/chat-history.ts
|
|
124966
125076
|
init_src();
|
|
124967
|
-
var
|
|
125077
|
+
var log27 = createLogger("chat-history");
|
|
124968
125078
|
var DEFAULT_PAGE_LIMIT = HISTORY_PAGE_SIZE;
|
|
124969
125079
|
var MAX_PAGE_LIMIT = 200;
|
|
124970
125080
|
var MAX_CHAT_ID_LENGTH = 200;
|
|
@@ -125027,7 +125137,7 @@ async function handleChatHistory(req, res, chatId) {
|
|
|
125027
125137
|
oldestOffset: result.firstOffset
|
|
125028
125138
|
});
|
|
125029
125139
|
} catch (err) {
|
|
125030
|
-
|
|
125140
|
+
log27.warn(
|
|
125031
125141
|
{ chatId: chatId.slice(0, 8), err: err instanceof Error ? err.message : String(err) },
|
|
125032
125142
|
"chat-history: failed to read older page"
|
|
125033
125143
|
);
|
|
@@ -125067,7 +125177,7 @@ async function saveUploadedFilesDetailed(fileParts) {
|
|
|
125067
125177
|
}
|
|
125068
125178
|
|
|
125069
125179
|
// src/api/chat-submit.ts
|
|
125070
|
-
var
|
|
125180
|
+
var log28 = createLogger("chat-submit");
|
|
125071
125181
|
function readBody(req) {
|
|
125072
125182
|
return new Promise((resolve12, reject) => {
|
|
125073
125183
|
const chunks = [];
|
|
@@ -125104,7 +125214,7 @@ async function handleChatSubmit(req, res, chatId) {
|
|
|
125104
125214
|
if (files && files.length > 0) {
|
|
125105
125215
|
savedFiles = await saveUploadedFilesDetailed(files);
|
|
125106
125216
|
if (savedFiles.length !== files.length) {
|
|
125107
|
-
|
|
125217
|
+
log28.warn(
|
|
125108
125218
|
{ chatId, submitted: files.length, saved: savedFiles.length },
|
|
125109
125219
|
"chat-submit: some file uploads were dropped (malformed data URL?)"
|
|
125110
125220
|
);
|
|
@@ -125134,7 +125244,7 @@ ${text3}`;
|
|
|
125134
125244
|
model,
|
|
125135
125245
|
codingAgentId
|
|
125136
125246
|
});
|
|
125137
|
-
|
|
125247
|
+
log28.info({ chatId, workspaceId }, "chat-submit: task started");
|
|
125138
125248
|
sendJson2(res, 200, { ok: true, queued: false });
|
|
125139
125249
|
} catch (err) {
|
|
125140
125250
|
if (err instanceof TaskConflictError) {
|
|
@@ -125149,7 +125259,7 @@ ${text3}`;
|
|
|
125149
125259
|
}))
|
|
125150
125260
|
}
|
|
125151
125261
|
});
|
|
125152
|
-
|
|
125262
|
+
log28.info({ chatId, workspaceId }, "chat-submit: task busy, message queued");
|
|
125153
125263
|
sendJson2(res, 200, { ok: true, queued: true });
|
|
125154
125264
|
return;
|
|
125155
125265
|
}
|
|
@@ -125157,7 +125267,7 @@ ${text3}`;
|
|
|
125157
125267
|
sendJson2(res, 404, { error: err.message });
|
|
125158
125268
|
return;
|
|
125159
125269
|
}
|
|
125160
|
-
|
|
125270
|
+
log28.error({ chatId, err }, "chat-submit: unexpected error");
|
|
125161
125271
|
sendJson2(res, 500, { error: "Internal server error" });
|
|
125162
125272
|
}
|
|
125163
125273
|
}
|
|
@@ -136563,7 +136673,7 @@ import { extname as extname2, isAbsolute as isAbsolute2 } from "node:path";
|
|
|
136563
136673
|
|
|
136564
136674
|
// src/server/infra/browser-host/host-state.ts
|
|
136565
136675
|
init_src();
|
|
136566
|
-
var
|
|
136676
|
+
var log29 = createLogger("browser-host");
|
|
136567
136677
|
var DESKTOP_CDP_HOST = "127.0.0.1";
|
|
136568
136678
|
var DESKTOP_CDP_PORT = 9223;
|
|
136569
136679
|
var globalAny = globalThis;
|
|
@@ -136614,7 +136724,7 @@ async function ensureCdpTargetId(bandTabId) {
|
|
|
136614
136724
|
reject: rejectFn,
|
|
136615
136725
|
timeoutId
|
|
136616
136726
|
});
|
|
136617
|
-
|
|
136727
|
+
log29.info(
|
|
136618
136728
|
"ensureCdpTargetId emitting ensureView for %s (url=%s, listeners=%d)",
|
|
136619
136729
|
bandTabId,
|
|
136620
136730
|
tab.url,
|
|
@@ -136628,13 +136738,13 @@ async function ensureCdpTargetId(bandTabId) {
|
|
|
136628
136738
|
url: tab.url
|
|
136629
136739
|
});
|
|
136630
136740
|
} catch (err) {
|
|
136631
|
-
|
|
136741
|
+
log29.warn("ensureView listener threw: %s", err instanceof Error ? err.message : err);
|
|
136632
136742
|
}
|
|
136633
136743
|
}
|
|
136634
136744
|
return promise;
|
|
136635
136745
|
}
|
|
136636
136746
|
function resolveTargetReady(bandTabId, cdpTargetId) {
|
|
136637
|
-
|
|
136747
|
+
log29.info("resolveTargetReady %s \u2192 %s", bandTabId, cdpTargetId);
|
|
136638
136748
|
targetIdByBandTabId.set(bandTabId, cdpTargetId);
|
|
136639
136749
|
const pending2 = pendingEnsures.get(bandTabId);
|
|
136640
136750
|
if (pending2) {
|
|
@@ -136644,7 +136754,7 @@ function resolveTargetReady(bandTabId, cdpTargetId) {
|
|
|
136644
136754
|
}
|
|
136645
136755
|
}
|
|
136646
136756
|
function markTargetDestroyed(bandTabId) {
|
|
136647
|
-
|
|
136757
|
+
log29.info("markTargetDestroyed %s", bandTabId);
|
|
136648
136758
|
targetIdByBandTabId.delete(bandTabId);
|
|
136649
136759
|
const pending2 = pendingEnsures.get(bandTabId);
|
|
136650
136760
|
if (pending2) {
|
|
@@ -136655,10 +136765,10 @@ function markTargetDestroyed(bandTabId) {
|
|
|
136655
136765
|
}
|
|
136656
136766
|
function onEnsureView(listener) {
|
|
136657
136767
|
ensureListeners.add(listener);
|
|
136658
|
-
|
|
136768
|
+
log29.info("onEnsureView subscriber added (total=%d)", ensureListeners.size);
|
|
136659
136769
|
return () => {
|
|
136660
136770
|
ensureListeners.delete(listener);
|
|
136661
|
-
|
|
136771
|
+
log29.info("onEnsureView subscriber removed (total=%d)", ensureListeners.size);
|
|
136662
136772
|
if (ensureListeners.size === 0) {
|
|
136663
136773
|
for (const [bandTabId, pending2] of pendingEnsures) {
|
|
136664
136774
|
clearTimeout(pending2.timeoutId);
|
|
@@ -136698,7 +136808,7 @@ var t2 = initTRPC.context().create();
|
|
|
136698
136808
|
var publicProcedure = t2.procedure;
|
|
136699
136809
|
|
|
136700
136810
|
// src/server/api/browser-host/router.ts
|
|
136701
|
-
var
|
|
136811
|
+
var log30 = createLogger("trpc.browser-host");
|
|
136702
136812
|
var MAX_FILE_SIZE = 1024 * 1024;
|
|
136703
136813
|
var LANG_MAP = {
|
|
136704
136814
|
".js": "javascript",
|
|
@@ -136821,7 +136931,7 @@ var browserHostRouter = t2.router({
|
|
|
136821
136931
|
// can confirm in the server log that the bridge component actually
|
|
136822
136932
|
// executed. Drop once the experiment is stable.
|
|
136823
136933
|
ping: publicProcedure.input(external_exports.object({ where: external_exports.string() })).mutation(({ input }) => {
|
|
136824
|
-
|
|
136934
|
+
log30.info("browserHost.ping from %s", input.where);
|
|
136825
136935
|
return { ok: true };
|
|
136826
136936
|
}),
|
|
136827
136937
|
ensureView: publicProcedure.subscription(async function* (opts) {
|
|
@@ -136941,7 +137051,7 @@ var chatRouter = t2.router({
|
|
|
136941
137051
|
// src/server/api/chats/router.ts
|
|
136942
137052
|
init_src();
|
|
136943
137053
|
init_zod();
|
|
136944
|
-
var
|
|
137054
|
+
var log31 = createLogger("chats-router");
|
|
136945
137055
|
var chatLayoutRouter = t2.router({
|
|
136946
137056
|
get: publicProcedure.input(external_exports.object({ workspaceId: external_exports.string() })).query(({ input }) => {
|
|
136947
137057
|
return { tree: chatService.getLayout(input.workspaceId) };
|
|
@@ -137086,7 +137196,7 @@ var chatsRouter = t2.router({
|
|
|
137086
137196
|
summary = info?.summary;
|
|
137087
137197
|
lastModified = info?.lastModified;
|
|
137088
137198
|
} catch (err) {
|
|
137089
|
-
|
|
137199
|
+
log31.warn(
|
|
137090
137200
|
{ chatId: input.chatId, sessionId: input.sessionId, err },
|
|
137091
137201
|
"setActiveSession: getSessionInfo failed"
|
|
137092
137202
|
);
|
|
@@ -137391,7 +137501,7 @@ function throwAsTRPCError(err) {
|
|
|
137391
137501
|
init_zod();
|
|
137392
137502
|
|
|
137393
137503
|
// src/server/services/editor-service.ts
|
|
137394
|
-
import { existsSync as
|
|
137504
|
+
import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync8 } from "node:fs";
|
|
137395
137505
|
import { isAbsolute as isAbsolute4, join as join25, resolve as resolve6, sep as sep4 } from "node:path";
|
|
137396
137506
|
|
|
137397
137507
|
// src/server/services/file-watcher.ts
|
|
@@ -137488,10 +137598,10 @@ function subscribeToFileChanges(workspaceId, listener) {
|
|
|
137488
137598
|
|
|
137489
137599
|
// src/server/services/formatter.ts
|
|
137490
137600
|
init_src();
|
|
137491
|
-
import { existsSync as
|
|
137601
|
+
import { existsSync as existsSync10, realpathSync as realpathSync4 } from "node:fs";
|
|
137492
137602
|
import { basename, dirname as dirname5, isAbsolute as isAbsolute3, join as join24, resolve as resolvePath } from "node:path";
|
|
137493
137603
|
import prettier from "prettier";
|
|
137494
|
-
var
|
|
137604
|
+
var log32 = createLogger("formatter");
|
|
137495
137605
|
var FormatterError = class extends Error {
|
|
137496
137606
|
code;
|
|
137497
137607
|
detail;
|
|
@@ -137515,7 +137625,7 @@ async function formatFile(worktreePath, filePath, content2, options2 = {}) {
|
|
|
137515
137625
|
const ignorePath = resolvePath(worktreePath, ".prettierignore");
|
|
137516
137626
|
const info = await prettier.getFileInfo(absFile, {
|
|
137517
137627
|
resolveConfig: true,
|
|
137518
|
-
ignorePath:
|
|
137628
|
+
ignorePath: existsSync10(ignorePath) ? ignorePath : void 0
|
|
137519
137629
|
});
|
|
137520
137630
|
if (info.ignored) {
|
|
137521
137631
|
return {
|
|
@@ -137546,7 +137656,7 @@ async function formatFile(worktreePath, filePath, content2, options2 = {}) {
|
|
|
137546
137656
|
}
|
|
137547
137657
|
const changed = formatted !== content2;
|
|
137548
137658
|
if (changed) {
|
|
137549
|
-
|
|
137659
|
+
log32.info(
|
|
137550
137660
|
"Formatted %s with parser=%s (%d bytes in)",
|
|
137551
137661
|
absFile,
|
|
137552
137662
|
info.inferredParser,
|
|
@@ -137699,7 +137809,7 @@ var EditorOpenError = class extends Error {
|
|
|
137699
137809
|
}
|
|
137700
137810
|
};
|
|
137701
137811
|
function canonicalizeMaybeMissing(p6) {
|
|
137702
|
-
if (
|
|
137812
|
+
if (existsSync11(p6)) {
|
|
137703
137813
|
try {
|
|
137704
137814
|
return realpathSync5(p6);
|
|
137705
137815
|
} catch {
|
|
@@ -137709,7 +137819,7 @@ function canonicalizeMaybeMissing(p6) {
|
|
|
137709
137819
|
const parts = p6.split(sep4);
|
|
137710
137820
|
for (let i2 = parts.length - 1; i2 > 0; i2--) {
|
|
137711
137821
|
const prefix = parts.slice(0, i2).join(sep4) || sep4;
|
|
137712
|
-
if (
|
|
137822
|
+
if (existsSync11(prefix)) {
|
|
137713
137823
|
try {
|
|
137714
137824
|
const canonicalPrefix = realpathSync5(prefix);
|
|
137715
137825
|
return join25(canonicalPrefix, ...parts.slice(i2));
|
|
@@ -138101,8 +138211,19 @@ var SystemService = class {
|
|
|
138101
138211
|
* `$PATH` (typically via `shellPath()`) so `brew` itself is locatable
|
|
138102
138212
|
* even when the Node process inherited a stripped-down PATH from
|
|
138103
138213
|
* launchd / Electron.
|
|
138214
|
+
*
|
|
138215
|
+
* Homebrew is macOS-only here: a stock Linux host has no `brew`, so
|
|
138216
|
+
* shelling out to it would fail with an opaque ENOENT. Guard on
|
|
138217
|
+
* `darwin` and surface a distro-appropriate hint on every other
|
|
138218
|
+
* platform — the message bubbles up to the dashboard's install flow as
|
|
138219
|
+
* a normal error instead of a crash.
|
|
138104
138220
|
*/
|
|
138105
138221
|
async installCloudflared(resolvedPath) {
|
|
138222
|
+
if (process.platform !== "darwin") {
|
|
138223
|
+
throw new Error(
|
|
138224
|
+
"Automatic cloudflared install is only supported on macOS (via Homebrew). On Linux, install it with your package manager (e.g. `sudo apt install cloudflared` or `sudo dnf install cloudflared`) or download it from https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/ and re-open the tunnel."
|
|
138225
|
+
);
|
|
138226
|
+
}
|
|
138106
138227
|
await brewInstall("cloudflared", resolvedPath);
|
|
138107
138228
|
}
|
|
138108
138229
|
/**
|
|
@@ -138241,7 +138362,7 @@ init_zod();
|
|
|
138241
138362
|
|
|
138242
138363
|
// src/server/services/model-refresh-service.ts
|
|
138243
138364
|
init_src();
|
|
138244
|
-
var
|
|
138365
|
+
var log33 = createLogger("model-refresh");
|
|
138245
138366
|
var ModelRefreshService = class {
|
|
138246
138367
|
constructor(queries = new SettingsQueries()) {
|
|
138247
138368
|
this.queries = queries;
|
|
@@ -138294,7 +138415,7 @@ var ModelRefreshService = class {
|
|
|
138294
138415
|
const models = await agent.listModels();
|
|
138295
138416
|
return models.map(toCachedModel);
|
|
138296
138417
|
} catch (err) {
|
|
138297
|
-
|
|
138418
|
+
log33.warn({ agentId, err }, "failed to load adapter defaults; returning empty list");
|
|
138298
138419
|
return [];
|
|
138299
138420
|
}
|
|
138300
138421
|
}
|
|
@@ -138331,7 +138452,7 @@ var ModelRefreshService = class {
|
|
|
138331
138452
|
}
|
|
138332
138453
|
} catch (err) {
|
|
138333
138454
|
error2 = classifyRefreshError(err);
|
|
138334
|
-
|
|
138455
|
+
log33.warn({ agentId, err }, "failed to refresh models; keeping prior cache");
|
|
138335
138456
|
}
|
|
138336
138457
|
if (fresh) {
|
|
138337
138458
|
const cachedFresh = fresh.map(toCachedModel);
|
|
@@ -138459,7 +138580,7 @@ var ModelRefreshService = class {
|
|
|
138459
138580
|
const agents = this.queries.load().codingAgents ?? [];
|
|
138460
138581
|
const idx = agents.findIndex((a6) => a6.id === agentId);
|
|
138461
138582
|
if (idx === -1) {
|
|
138462
|
-
|
|
138583
|
+
log33.warn({ agentId }, "refresh result for unknown agent; not persisting");
|
|
138463
138584
|
return false;
|
|
138464
138585
|
}
|
|
138465
138586
|
const next = agents.map(
|
|
@@ -138537,6 +138658,25 @@ var modesRouter = t2.router({
|
|
|
138537
138658
|
})
|
|
138538
138659
|
});
|
|
138539
138660
|
|
|
138661
|
+
// src/server/api/panel-focus/router.ts
|
|
138662
|
+
init_zod();
|
|
138663
|
+
var focusPanelType = external_exports.enum(["chat", "terminal", "browser"]);
|
|
138664
|
+
var panelFocusRouter = t2.router({
|
|
138665
|
+
get: publicProcedure.input(external_exports.object({ workspaceId: external_exports.string() })).query(({ input }) => {
|
|
138666
|
+
return panelFocusService.get(input.workspaceId);
|
|
138667
|
+
}),
|
|
138668
|
+
set: publicProcedure.input(
|
|
138669
|
+
external_exports.object({
|
|
138670
|
+
workspaceId: external_exports.string(),
|
|
138671
|
+
panelType: focusPanelType,
|
|
138672
|
+
panelId: external_exports.string()
|
|
138673
|
+
})
|
|
138674
|
+
).mutation(({ input }) => {
|
|
138675
|
+
panelFocusService.set(input.workspaceId, input.panelType, input.panelId);
|
|
138676
|
+
return { ok: true };
|
|
138677
|
+
})
|
|
138678
|
+
});
|
|
138679
|
+
|
|
138540
138680
|
// src/server/api/prereqs/router.ts
|
|
138541
138681
|
var prereqsRouter = t2.router({
|
|
138542
138682
|
check: publicProcedure.query(async () => {
|
|
@@ -138553,7 +138693,7 @@ var prereqsRouter = t2.router({
|
|
|
138553
138693
|
init_zod();
|
|
138554
138694
|
|
|
138555
138695
|
// src/server/services/project-service.ts
|
|
138556
|
-
import { existsSync as
|
|
138696
|
+
import { existsSync as existsSync12 } from "node:fs";
|
|
138557
138697
|
import { basename as basename2, join as join27, resolve as resolve7 } from "node:path";
|
|
138558
138698
|
var ProjectService = class {
|
|
138559
138699
|
constructor(queries = new ProjectQueries(), git = new GitClient(), settings = settingsService, statusQueries = new WorkspaceStatusQueries()) {
|
|
@@ -138630,7 +138770,7 @@ var ProjectService = class {
|
|
|
138630
138770
|
*/
|
|
138631
138771
|
checkPath(path3) {
|
|
138632
138772
|
const resolvedPath = resolve7(path3);
|
|
138633
|
-
const isGitRepo =
|
|
138773
|
+
const isGitRepo = existsSync12(join27(resolvedPath, ".git"));
|
|
138634
138774
|
return { isGitRepo };
|
|
138635
138775
|
}
|
|
138636
138776
|
/**
|
|
@@ -138666,7 +138806,7 @@ var ProjectService = class {
|
|
|
138666
138806
|
}
|
|
138667
138807
|
}
|
|
138668
138808
|
const resolvedPath = resolve7(path3);
|
|
138669
|
-
const kind =
|
|
138809
|
+
const kind = existsSync12(join27(resolvedPath, ".git")) ? "git" : "plain";
|
|
138670
138810
|
let defaultBranch = "main";
|
|
138671
138811
|
let worktrees2 = [];
|
|
138672
138812
|
if (kind === "git") {
|
|
@@ -138724,7 +138864,7 @@ var ProjectService = class {
|
|
|
138724
138864
|
message: `Project "${name3}" is already a git project`
|
|
138725
138865
|
});
|
|
138726
138866
|
}
|
|
138727
|
-
if (!
|
|
138867
|
+
if (!existsSync12(project.path)) {
|
|
138728
138868
|
throw new TRPCError({
|
|
138729
138869
|
code: "NOT_FOUND",
|
|
138730
138870
|
message: `Project path "${project.path}" no longer exists. Remove the project and re-add it.`
|
|
@@ -138842,7 +138982,7 @@ init_src();
|
|
|
138842
138982
|
init_zod();
|
|
138843
138983
|
import { realpathSync as realpathSync6 } from "node:fs";
|
|
138844
138984
|
import { join as join28, resolve as resolve8, sep as sep5 } from "node:path";
|
|
138845
|
-
var
|
|
138985
|
+
var log34 = createLogger("trpc.queue");
|
|
138846
138986
|
var queuedFileSchema = external_exports.object({
|
|
138847
138987
|
mediaType: external_exports.string(),
|
|
138848
138988
|
url: external_exports.string(),
|
|
@@ -138874,7 +139014,7 @@ async function resolveQueuedFiles(chatId, files) {
|
|
|
138874
139014
|
const derivedPath = file.path ?? (uploadsUrlMatch ? join28(bandHome(), "uploads", uploadsUrlMatch[1]) : void 0);
|
|
138875
139015
|
if (derivedPath) {
|
|
138876
139016
|
if (!isPathWithinUploadDir(derivedPath)) {
|
|
138877
|
-
|
|
139017
|
+
log34.warn(
|
|
138878
139018
|
{ chatId, path: derivedPath, filename: file.filename },
|
|
138879
139019
|
"queue: dropping file with path outside uploads directory"
|
|
138880
139020
|
);
|
|
@@ -138899,7 +139039,7 @@ async function resolveQueuedFiles(chatId, files) {
|
|
|
138899
139039
|
});
|
|
138900
139040
|
continue;
|
|
138901
139041
|
}
|
|
138902
|
-
|
|
139042
|
+
log34.warn(
|
|
138903
139043
|
{ chatId, url: file.url, filename: file.filename },
|
|
138904
139044
|
"queue: dropping file with no path and non-data URL \u2014 cannot recover disk path"
|
|
138905
139045
|
);
|
|
@@ -138907,7 +139047,7 @@ async function resolveQueuedFiles(chatId, files) {
|
|
|
138907
139047
|
if (needsSave.length > 0) {
|
|
138908
139048
|
const saved = await saveUploadedFilesDetailed(needsSave);
|
|
138909
139049
|
if (saved.length !== needsSave.length) {
|
|
138910
|
-
|
|
139050
|
+
log34.error(
|
|
138911
139051
|
{ chatId, expected: needsSave.length, got: saved.length },
|
|
138912
139052
|
"queue: saveUploadedFilesDetailed returned unexpected count \u2014 dropping data-URL files (cannot map 1:1)"
|
|
138913
139053
|
);
|
|
@@ -138940,7 +139080,7 @@ var queueRouter = t2.router({
|
|
|
138940
139080
|
try {
|
|
138941
139081
|
files = await resolveQueuedFiles(chatId, input.files);
|
|
138942
139082
|
} catch (err) {
|
|
138943
|
-
|
|
139083
|
+
log34.error(
|
|
138944
139084
|
{ chatId, err: err instanceof Error ? err.message : err },
|
|
138945
139085
|
"queue.push: failed to persist file uploads; enqueuing text only"
|
|
138946
139086
|
);
|
|
@@ -138976,7 +139116,7 @@ var queueRouter = t2.router({
|
|
|
138976
139116
|
files: await resolveQueuedFiles(chatId, m11.files)
|
|
138977
139117
|
};
|
|
138978
139118
|
} catch (err) {
|
|
138979
|
-
|
|
139119
|
+
log34.error(
|
|
138980
139120
|
{ chatId, messageId: m11.id, err: err instanceof Error ? err.message : err },
|
|
138981
139121
|
"queue: failed to resolve files for queued message; dropping its files"
|
|
138982
139122
|
);
|
|
@@ -139101,7 +139241,7 @@ function aggregateTurnsByHourAndModel(snap, provider) {
|
|
|
139101
139241
|
}
|
|
139102
139242
|
return Array.from(buckets2.values());
|
|
139103
139243
|
}
|
|
139104
|
-
var
|
|
139244
|
+
var log35 = createLogger("usage-scanner");
|
|
139105
139245
|
var SCHEDULER_KEY2 = Symbol.for("band.usage-scanner");
|
|
139106
139246
|
var g14 = globalThis;
|
|
139107
139247
|
if (!g14[SCHEDULER_KEY2]) {
|
|
@@ -139163,14 +139303,14 @@ var UsageScannerService = class {
|
|
|
139163
139303
|
try {
|
|
139164
139304
|
totalRows += await this.scanPair(ws, a6);
|
|
139165
139305
|
} catch (err) {
|
|
139166
|
-
|
|
139306
|
+
log35.warn(
|
|
139167
139307
|
{ err, workspaceId: ws.workspaceId, agentType: a6.agentType },
|
|
139168
139308
|
"usage scanner pair failed"
|
|
139169
139309
|
);
|
|
139170
139310
|
}
|
|
139171
139311
|
}
|
|
139172
139312
|
}
|
|
139173
|
-
|
|
139313
|
+
log35.debug(
|
|
139174
139314
|
{ durationMs: this.now() - started, workspaces: workspaces.length, rowsWritten: totalRows },
|
|
139175
139315
|
"usage scanner tick complete"
|
|
139176
139316
|
);
|
|
@@ -139215,7 +139355,7 @@ var UsageScannerService = class {
|
|
|
139215
139355
|
try {
|
|
139216
139356
|
agent = await this.createWorkspaceAgent(ws.worktreePath, a6.agentId);
|
|
139217
139357
|
} catch (err) {
|
|
139218
|
-
|
|
139358
|
+
log35.debug({ err, agentId: a6.agentId }, "failed to instantiate agent for scan");
|
|
139219
139359
|
return 0;
|
|
139220
139360
|
}
|
|
139221
139361
|
if (!agent.listSessions || !agent.getSessionUsage) return 0;
|
|
@@ -139224,7 +139364,7 @@ var UsageScannerService = class {
|
|
|
139224
139364
|
try {
|
|
139225
139365
|
sessions = await agent.listSessions(ws.worktreePath);
|
|
139226
139366
|
} catch (err) {
|
|
139227
|
-
|
|
139367
|
+
log35.debug(
|
|
139228
139368
|
{ err, agentId: a6.agentId, worktreePath: ws.worktreePath },
|
|
139229
139369
|
"listSessions failed during usage scan"
|
|
139230
139370
|
);
|
|
@@ -139240,7 +139380,7 @@ var UsageScannerService = class {
|
|
|
139240
139380
|
try {
|
|
139241
139381
|
snap = await agent.getSessionUsage(s6.sessionId, ws.worktreePath);
|
|
139242
139382
|
} catch (err) {
|
|
139243
|
-
|
|
139383
|
+
log35.debug(
|
|
139244
139384
|
{ err, sessionId: s6.sessionId, agentType: a6.agentType },
|
|
139245
139385
|
"getSessionUsage failed"
|
|
139246
139386
|
);
|
|
@@ -139278,7 +139418,7 @@ var UsageScannerService = class {
|
|
|
139278
139418
|
this.scanState.set(ws.workspaceId, a6.agentType, maxObserved);
|
|
139279
139419
|
}
|
|
139280
139420
|
if (changed.length > slice.length) {
|
|
139281
|
-
|
|
139421
|
+
log35.debug(
|
|
139282
139422
|
{
|
|
139283
139423
|
workspaceId: ws.workspaceId,
|
|
139284
139424
|
agentType: a6.agentType,
|
|
@@ -139333,11 +139473,11 @@ function startUsageScanner(options2 = {}) {
|
|
|
139333
139473
|
const intervalMs = options2.intervalMs ?? USAGE_SCAN_INTERVAL_MS;
|
|
139334
139474
|
const svc = getUsageScannerService();
|
|
139335
139475
|
svc.tick().catch((err) => {
|
|
139336
|
-
|
|
139476
|
+
log35.warn({ err }, "initial usage scanner tick failed");
|
|
139337
139477
|
});
|
|
139338
139478
|
const timer = setInterval(() => {
|
|
139339
139479
|
svc.tick().catch((err) => {
|
|
139340
|
-
|
|
139480
|
+
log35.warn({ err }, "scheduled usage scanner tick failed");
|
|
139341
139481
|
});
|
|
139342
139482
|
}, intervalMs);
|
|
139343
139483
|
timer.unref();
|
|
@@ -139459,7 +139599,7 @@ init_zod();
|
|
|
139459
139599
|
|
|
139460
139600
|
// src/server/services/session-service.ts
|
|
139461
139601
|
init_src();
|
|
139462
|
-
var
|
|
139602
|
+
var log36 = createLogger("session-service");
|
|
139463
139603
|
var SessionService = class {
|
|
139464
139604
|
/**
|
|
139465
139605
|
* List past sessions for a workspace's chat pane.
|
|
@@ -139479,7 +139619,7 @@ var SessionService = class {
|
|
|
139479
139619
|
if (!agent.supportedFeatures.sessionListing || !agent.listSessions) {
|
|
139480
139620
|
return { sessions: [], supported: false };
|
|
139481
139621
|
}
|
|
139482
|
-
|
|
139622
|
+
log36.debug({ chatId, workspaceId: input.workspaceId }, "listing past sessions for chat");
|
|
139483
139623
|
const allSessions = await agent.listSessions(workspace.worktree.path);
|
|
139484
139624
|
return { sessions: allSessions, supported: true };
|
|
139485
139625
|
}
|
|
@@ -139635,7 +139775,7 @@ function getToken() {
|
|
|
139635
139775
|
}
|
|
139636
139776
|
|
|
139637
139777
|
// src/server/infra/tunnels/tunnel-client.ts
|
|
139638
|
-
var
|
|
139778
|
+
var log37 = createLogger("tunnel");
|
|
139639
139779
|
var TunnelClient = class _TunnelClient {
|
|
139640
139780
|
tunnelProcess = null;
|
|
139641
139781
|
tunnelUrl = null;
|
|
@@ -139659,7 +139799,7 @@ var TunnelClient = class _TunnelClient {
|
|
|
139659
139799
|
}
|
|
139660
139800
|
spawnTunnel(options2, resolvedPath) {
|
|
139661
139801
|
const args = ["tunnel", "--config", "/dev/null", "--url", `http://localhost:${options2.port}`];
|
|
139662
|
-
|
|
139802
|
+
log37.debug("spawning cloudflared %s", args.join(" "));
|
|
139663
139803
|
return new Promise((resolve12, reject) => {
|
|
139664
139804
|
const child = spawn7("cloudflared", args, {
|
|
139665
139805
|
env: { ...process.env, PATH: resolvedPath },
|
|
@@ -139673,12 +139813,12 @@ var TunnelClient = class _TunnelClient {
|
|
|
139673
139813
|
for (const line2 of text3.split("\n")) {
|
|
139674
139814
|
const trimmed = line2.trim();
|
|
139675
139815
|
if (!trimmed) continue;
|
|
139676
|
-
|
|
139816
|
+
log37.debug("output: %s", trimmed);
|
|
139677
139817
|
const url = _TunnelClient.extractUrl(trimmed);
|
|
139678
139818
|
if (url) {
|
|
139679
139819
|
const token = getToken();
|
|
139680
139820
|
this.tunnelUrl = _TunnelClient.appendToken(url, token);
|
|
139681
|
-
|
|
139821
|
+
log37.debug("detected URL: %s", this.tunnelUrl);
|
|
139682
139822
|
emit({ kind: "tunnel-url", url: this.tunnelUrl });
|
|
139683
139823
|
if (!settled) {
|
|
139684
139824
|
settled = true;
|
|
@@ -139693,7 +139833,7 @@ var TunnelClient = class _TunnelClient {
|
|
|
139693
139833
|
handleOutput(data);
|
|
139694
139834
|
});
|
|
139695
139835
|
child.on("error", (err) => {
|
|
139696
|
-
|
|
139836
|
+
log37.debug("process error: %s", err.message);
|
|
139697
139837
|
this.tunnelProcess = null;
|
|
139698
139838
|
this.tunnelUrl = null;
|
|
139699
139839
|
emit({ kind: "tunnel-error", error: err.message });
|
|
@@ -139703,7 +139843,7 @@ var TunnelClient = class _TunnelClient {
|
|
|
139703
139843
|
}
|
|
139704
139844
|
});
|
|
139705
139845
|
child.on("exit", (code) => {
|
|
139706
|
-
|
|
139846
|
+
log37.debug("process exited with code: %d", code ?? -1);
|
|
139707
139847
|
const wasRunning = this.tunnelProcess !== null && settled;
|
|
139708
139848
|
this.tunnelProcess = null;
|
|
139709
139849
|
this.tunnelUrl = null;
|
|
@@ -139725,7 +139865,7 @@ var TunnelClient = class _TunnelClient {
|
|
|
139725
139865
|
});
|
|
139726
139866
|
setTimeout(() => {
|
|
139727
139867
|
if (!settled) {
|
|
139728
|
-
|
|
139868
|
+
log37.debug("30s timeout reached, resolving without URL");
|
|
139729
139869
|
settled = true;
|
|
139730
139870
|
resolve12();
|
|
139731
139871
|
}
|
|
@@ -139734,12 +139874,12 @@ var TunnelClient = class _TunnelClient {
|
|
|
139734
139874
|
}
|
|
139735
139875
|
async start(options2) {
|
|
139736
139876
|
if (this.startInProgress) {
|
|
139737
|
-
|
|
139877
|
+
log37.debug("start: start already in progress, waiting...");
|
|
139738
139878
|
await this.startInProgress;
|
|
139739
139879
|
return;
|
|
139740
139880
|
}
|
|
139741
139881
|
if (this.tunnelProcess) {
|
|
139742
|
-
|
|
139882
|
+
log37.debug("start: already running, re-emitting URL");
|
|
139743
139883
|
if (this.tunnelUrl) {
|
|
139744
139884
|
emit({ kind: "tunnel-url", url: this.tunnelUrl });
|
|
139745
139885
|
}
|
|
@@ -139804,7 +139944,7 @@ var TunnelService = class {
|
|
|
139804
139944
|
var tunnelService = new TunnelService();
|
|
139805
139945
|
|
|
139806
139946
|
// src/server/api/system/router.ts
|
|
139807
|
-
var
|
|
139947
|
+
var log38 = createLogger("trpc.system");
|
|
139808
139948
|
var systemRouter = t2.router({
|
|
139809
139949
|
/**
|
|
139810
139950
|
* Combined liveness probe — webserver is always true if this query
|
|
@@ -139812,15 +139952,15 @@ var systemRouter = t2.router({
|
|
|
139812
139952
|
* an interval to drive the bottom-bar status pill.
|
|
139813
139953
|
*/
|
|
139814
139954
|
health: publicProcedure.query(() => {
|
|
139815
|
-
|
|
139955
|
+
log38.debug("services.health called");
|
|
139816
139956
|
const tunnel = tunnelService.getStatus();
|
|
139817
|
-
|
|
139957
|
+
log38.debug({ tunnel }, "services.health: tunnel status");
|
|
139818
139958
|
const result = {
|
|
139819
139959
|
webserver: true,
|
|
139820
139960
|
tunnel: tunnel.running,
|
|
139821
139961
|
tunnel_url: tunnel.url
|
|
139822
139962
|
};
|
|
139823
|
-
|
|
139963
|
+
log38.debug({ result }, "services.health result");
|
|
139824
139964
|
return result;
|
|
139825
139965
|
}),
|
|
139826
139966
|
// Activity level controls how often the branch-status poller fires.
|
|
@@ -139938,7 +140078,7 @@ var systemRouter = t2.router({
|
|
|
139938
140078
|
// src/server/api/tasks/router.ts
|
|
139939
140079
|
init_src();
|
|
139940
140080
|
init_zod();
|
|
139941
|
-
var
|
|
140081
|
+
var log39 = createLogger("tasks-router");
|
|
139942
140082
|
var tasksRouter = t2.router({
|
|
139943
140083
|
list: publicProcedure.input(
|
|
139944
140084
|
external_exports.object({
|
|
@@ -140001,7 +140141,7 @@ var tasksRouter = t2.router({
|
|
|
140001
140141
|
if (input.files && input.files.length > 0) {
|
|
140002
140142
|
const savedFiles = await saveUploadedFilesDetailed(input.files);
|
|
140003
140143
|
if (savedFiles.length !== input.files.length) {
|
|
140004
|
-
|
|
140144
|
+
log39.warn(
|
|
140005
140145
|
{ chatId, submitted: input.files.length, saved: savedFiles.length },
|
|
140006
140146
|
"tasks.submit: some file uploads were dropped (malformed data URL?)"
|
|
140007
140147
|
);
|
|
@@ -140223,25 +140363,25 @@ var terminalsRouters = {
|
|
|
140223
140363
|
// src/server/api/tunnel/router.ts
|
|
140224
140364
|
init_src();
|
|
140225
140365
|
init_zod();
|
|
140226
|
-
var
|
|
140366
|
+
var log40 = createLogger("trpc.tunnel");
|
|
140227
140367
|
var tunnelRouter = t2.router({
|
|
140228
140368
|
status: publicProcedure.query(() => {
|
|
140229
140369
|
return tunnelService.getStatus();
|
|
140230
140370
|
}),
|
|
140231
140371
|
start: publicProcedure.input(external_exports.object({}).optional()).mutation(async () => {
|
|
140232
|
-
|
|
140372
|
+
log40.debug("tunnel.start called");
|
|
140233
140373
|
try {
|
|
140234
140374
|
await tunnelService.start();
|
|
140235
140375
|
} catch (err) {
|
|
140236
|
-
|
|
140376
|
+
log40.debug({ err }, "tunnel.start: startTunnel failed");
|
|
140237
140377
|
return { ok: true, url: null };
|
|
140238
140378
|
}
|
|
140239
140379
|
const status = tunnelService.getStatus();
|
|
140240
|
-
|
|
140380
|
+
log40.debug({ status }, "tunnel.start: after startTunnel");
|
|
140241
140381
|
if (status.url) {
|
|
140242
140382
|
return { ok: true, url: status.url };
|
|
140243
140383
|
}
|
|
140244
|
-
|
|
140384
|
+
log40.debug("tunnel.start: no URL available");
|
|
140245
140385
|
return { ok: true, url: null };
|
|
140246
140386
|
}),
|
|
140247
140387
|
stop: publicProcedure.mutation(async () => {
|
|
@@ -140255,10 +140395,10 @@ init_zod();
|
|
|
140255
140395
|
|
|
140256
140396
|
// src/server/services/diff-service.ts
|
|
140257
140397
|
init_src();
|
|
140258
|
-
import { existsSync as
|
|
140398
|
+
import { existsSync as existsSync13 } from "node:fs";
|
|
140259
140399
|
import { readFile as readFile2, rm as rm2 } from "node:fs/promises";
|
|
140260
140400
|
import { join as join29, resolve as resolve9, sep as sep6 } from "node:path";
|
|
140261
|
-
var
|
|
140401
|
+
var log41 = createLogger("diff-service");
|
|
140262
140402
|
var EMPTY_TREE_ARGS = ["hash-object", "-t", "tree", "/dev/null"];
|
|
140263
140403
|
var EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
140264
140404
|
async function resolveDiffContext(cwd, defaultBranch, diffMode, compareBranchInput) {
|
|
@@ -140363,7 +140503,7 @@ var DiffService = class {
|
|
|
140363
140503
|
);
|
|
140364
140504
|
branches = output.trim().split("\n").map((b10) => b10.trim()).filter(Boolean);
|
|
140365
140505
|
} catch (err) {
|
|
140366
|
-
|
|
140506
|
+
log41.error(
|
|
140367
140507
|
`listBranches: for-each-ref failed for ${cwd}: ${err instanceof Error ? err.message : err}`
|
|
140368
140508
|
);
|
|
140369
140509
|
}
|
|
@@ -140462,7 +140602,7 @@ var DiffService = class {
|
|
|
140462
140602
|
async getDiffSummary(workspaceId, options2) {
|
|
140463
140603
|
const workspace = this.workspaces.resolve(workspaceId);
|
|
140464
140604
|
if (!workspace) throw new WorkspaceNotFoundError(workspaceId);
|
|
140465
|
-
const hasGit =
|
|
140605
|
+
const hasGit = existsSync13(join29(workspace.worktree.path, ".git"));
|
|
140466
140606
|
if (workspace.project.kind === "plain" || !hasGit) {
|
|
140467
140607
|
const defaultBranch2 = workspace.project.defaultBranch;
|
|
140468
140608
|
return {
|
|
@@ -140594,7 +140734,7 @@ var DiffService = class {
|
|
|
140594
140734
|
var diffService = new DiffService();
|
|
140595
140735
|
|
|
140596
140736
|
// src/server/services/files-service.ts
|
|
140597
|
-
import { existsSync as
|
|
140737
|
+
import { existsSync as existsSync14 } from "node:fs";
|
|
140598
140738
|
import { cp, mkdir as mkdir2, readdir as readdir2, readFile as readFile3, rename, rm as rm3, stat as stat4, writeFile as writeFile2 } from "node:fs/promises";
|
|
140599
140739
|
import { dirname as dirname7, extname as extname3, join as join30, resolve as resolve10, sep as sep7 } from "node:path";
|
|
140600
140740
|
var MAX_FILE_SIZE2 = 1024 * 1024;
|
|
@@ -140713,11 +140853,11 @@ var FilesService = class {
|
|
|
140713
140853
|
async createFile(workspaceId, path3, content2 = "") {
|
|
140714
140854
|
const { root, target } = this.resolveInside(workspaceId, path3, { allowRoot: false });
|
|
140715
140855
|
this.assertNotGitInternals(root, target, "create");
|
|
140716
|
-
if (
|
|
140856
|
+
if (existsSync14(target)) {
|
|
140717
140857
|
throw new Error("A file or directory already exists at this path");
|
|
140718
140858
|
}
|
|
140719
140859
|
const parent = dirname7(target);
|
|
140720
|
-
if (!
|
|
140860
|
+
if (!existsSync14(parent)) {
|
|
140721
140861
|
throw new Error("Parent directory does not exist");
|
|
140722
140862
|
}
|
|
140723
140863
|
const parentStat = await stat4(parent);
|
|
@@ -140730,11 +140870,11 @@ var FilesService = class {
|
|
|
140730
140870
|
async createDirectory(workspaceId, path3) {
|
|
140731
140871
|
const { root, target } = this.resolveInside(workspaceId, path3, { allowRoot: false });
|
|
140732
140872
|
this.assertNotGitInternals(root, target, "create");
|
|
140733
|
-
if (
|
|
140873
|
+
if (existsSync14(target)) {
|
|
140734
140874
|
throw new Error("A file or directory already exists at this path");
|
|
140735
140875
|
}
|
|
140736
140876
|
const parent = dirname7(target);
|
|
140737
|
-
if (!
|
|
140877
|
+
if (!existsSync14(parent)) {
|
|
140738
140878
|
throw new Error("Parent directory does not exist");
|
|
140739
140879
|
}
|
|
140740
140880
|
const parentStat = await stat4(parent);
|
|
@@ -140775,11 +140915,11 @@ var FilesService = class {
|
|
|
140775
140915
|
} catch {
|
|
140776
140916
|
throw new Error("Source path does not exist");
|
|
140777
140917
|
}
|
|
140778
|
-
if (
|
|
140918
|
+
if (existsSync14(toTarget)) {
|
|
140779
140919
|
throw new Error("A file or directory already exists at the destination");
|
|
140780
140920
|
}
|
|
140781
140921
|
const toParent = dirname7(toTarget);
|
|
140782
|
-
if (!
|
|
140922
|
+
if (!existsSync14(toParent)) {
|
|
140783
140923
|
throw new Error("Destination parent directory does not exist");
|
|
140784
140924
|
}
|
|
140785
140925
|
const toParentStat = await stat4(toParent);
|
|
@@ -140811,11 +140951,11 @@ var FilesService = class {
|
|
|
140811
140951
|
if (entryStat.isDirectory() && toTarget.startsWith(fromTarget + sep7)) {
|
|
140812
140952
|
throw new Error("Cannot copy a directory into itself");
|
|
140813
140953
|
}
|
|
140814
|
-
if (
|
|
140954
|
+
if (existsSync14(toTarget)) {
|
|
140815
140955
|
throw new Error("A file or directory already exists at the destination");
|
|
140816
140956
|
}
|
|
140817
140957
|
const toParent = dirname7(toTarget);
|
|
140818
|
-
if (!
|
|
140958
|
+
if (!existsSync14(toParent)) {
|
|
140819
140959
|
throw new Error("Destination parent directory does not exist");
|
|
140820
140960
|
}
|
|
140821
140961
|
const toParentStat = await stat4(toParent);
|
|
@@ -142344,6 +142484,7 @@ var appRouter = t2.router({
|
|
|
142344
142484
|
chat: chatRouter,
|
|
142345
142485
|
browsers: browsersRouter,
|
|
142346
142486
|
browserLayout: browserLayoutRouter,
|
|
142487
|
+
panelFocus: panelFocusRouter,
|
|
142347
142488
|
tasks: tasksRouter,
|
|
142348
142489
|
sessions: sessionsRouter,
|
|
142349
142490
|
...terminalsRouters,
|
|
@@ -142479,7 +142620,7 @@ function getScalarHtml(specUrl) {
|
|
|
142479
142620
|
|
|
142480
142621
|
// src/server/api/terminals/ws.ts
|
|
142481
142622
|
init_src();
|
|
142482
|
-
var
|
|
142623
|
+
var log42 = createLogger("terminal-ws");
|
|
142483
142624
|
var MAX_CLOSE_REASON_BYTES = 123;
|
|
142484
142625
|
var HEARTBEAT_INTERVAL_MS2 = 3e4;
|
|
142485
142626
|
function clampCloseReason(reason) {
|
|
@@ -142551,7 +142692,7 @@ async function handleTerminalConnection(ws, req) {
|
|
|
142551
142692
|
session = await terminalService.spawn(workspaceId, terminalId, spawnOpts);
|
|
142552
142693
|
} catch (err) {
|
|
142553
142694
|
const msg = err instanceof Error ? err.message : String(err);
|
|
142554
|
-
|
|
142695
|
+
log42.error("Failed to spawn terminal %s for workspace %s: %s", terminalId, workspaceId, msg);
|
|
142555
142696
|
safeClose(ws, 4001, msg);
|
|
142556
142697
|
return;
|
|
142557
142698
|
}
|
|
@@ -142565,7 +142706,7 @@ async function handleTerminalConnection(ws, req) {
|
|
|
142565
142706
|
});
|
|
142566
142707
|
}
|
|
142567
142708
|
function attachSession(ws, terminalId, workspaceId, session, isNew) {
|
|
142568
|
-
|
|
142709
|
+
log42.debug(
|
|
142569
142710
|
"Terminal %s: %s (workspace %s)",
|
|
142570
142711
|
isNew ? "connected" : "reconnected",
|
|
142571
142712
|
terminalId,
|
|
@@ -142594,7 +142735,7 @@ function attachSession(ws, terminalId, workspaceId, session, isNew) {
|
|
|
142594
142735
|
}, 3e3);
|
|
142595
142736
|
const exitDisposable = session.pty.onExit(({ exitCode }) => {
|
|
142596
142737
|
clearInterval(processInterval);
|
|
142597
|
-
|
|
142738
|
+
log42.debug("PTY exited with code %d for terminal %s", exitCode, terminalId);
|
|
142598
142739
|
if (ws.readyState === ws.OPEN) {
|
|
142599
142740
|
ws.close(1e3, "Terminal exited");
|
|
142600
142741
|
}
|
|
@@ -142622,7 +142763,7 @@ function attachSession(ws, terminalId, workspaceId, session, isNew) {
|
|
|
142622
142763
|
clearInterval(pingInterval);
|
|
142623
142764
|
dataDisposable.dispose();
|
|
142624
142765
|
exitDisposable.dispose();
|
|
142625
|
-
|
|
142766
|
+
log42.debug("Terminal disconnected: %s (PTY kept alive)", terminalId);
|
|
142626
142767
|
});
|
|
142627
142768
|
}
|
|
142628
142769
|
function handleMessage(ws, terminalId, session, message) {
|
|
@@ -142658,7 +142799,7 @@ function stripTerminalQueries(data) {
|
|
|
142658
142799
|
|
|
142659
142800
|
// src/server/infra/browser-host/cdp-proxy.ts
|
|
142660
142801
|
init_src();
|
|
142661
|
-
var
|
|
142802
|
+
var log43 = createLogger("cdp-proxy");
|
|
142662
142803
|
async function handleCdpConnection(ws, req) {
|
|
142663
142804
|
const url = new URL(req.url ?? "", `http://${req.headers.host}`);
|
|
142664
142805
|
const bandTabId = url.searchParams.get("bandTabId");
|
|
@@ -142681,17 +142822,17 @@ async function handleCdpConnection(ws, req) {
|
|
|
142681
142822
|
cdpTargetId = await ensureCdpTargetId(bandTabId);
|
|
142682
142823
|
} catch (err) {
|
|
142683
142824
|
const message = err instanceof Error ? err.message : String(err);
|
|
142684
|
-
|
|
142825
|
+
log43.debug("ensureCdpTargetId failed for %s: %s", bandTabId, message);
|
|
142685
142826
|
if (ws.readyState === ws.OPEN) {
|
|
142686
142827
|
ws.close(4001, message.slice(0, 123));
|
|
142687
142828
|
}
|
|
142688
142829
|
return;
|
|
142689
142830
|
}
|
|
142690
142831
|
const upstreamUrl = `ws://${DESKTOP_CDP_HOST}:${DESKTOP_CDP_PORT}/devtools/page/${encodeURIComponent(cdpTargetId)}`;
|
|
142691
|
-
|
|
142832
|
+
log43.info("CDP proxy connecting bandTabId=%s upstream=%s", bandTabId, upstreamUrl);
|
|
142692
142833
|
upstream = new wrapper_default(upstreamUrl);
|
|
142693
142834
|
upstream.on("open", () => {
|
|
142694
|
-
|
|
142835
|
+
log43.info("CDP upstream open bandTabId=%s pending=%d", bandTabId, pending2.length);
|
|
142695
142836
|
for (const msg of pending2) {
|
|
142696
142837
|
upstream?.send(msg);
|
|
142697
142838
|
}
|
|
@@ -142703,20 +142844,20 @@ async function handleCdpConnection(ws, req) {
|
|
|
142703
142844
|
}
|
|
142704
142845
|
});
|
|
142705
142846
|
upstream.on("error", (err) => {
|
|
142706
|
-
|
|
142847
|
+
log43.warn("CDP upstream error bandTabId=%s: %s", bandTabId, err.message);
|
|
142707
142848
|
markTargetDestroyed(bandTabId);
|
|
142708
142849
|
if (ws.readyState === ws.OPEN) {
|
|
142709
142850
|
ws.close(4001, `Desktop CDP error: ${err.message}`.slice(0, 123));
|
|
142710
142851
|
}
|
|
142711
142852
|
});
|
|
142712
142853
|
upstream.on("close", (code) => {
|
|
142713
|
-
|
|
142854
|
+
log43.info("CDP upstream closed bandTabId=%s code=%d", bandTabId, code);
|
|
142714
142855
|
if (ws.readyState === ws.OPEN) {
|
|
142715
142856
|
ws.close(1e3, "Upstream closed");
|
|
142716
142857
|
}
|
|
142717
142858
|
});
|
|
142718
142859
|
ws.on("close", () => {
|
|
142719
|
-
|
|
142860
|
+
log43.debug("CDP client closed bandTabId=%s", bandTabId);
|
|
142720
142861
|
if (upstream && (upstream.readyState === wrapper_default.OPEN || upstream.readyState === wrapper_default.CONNECTING)) {
|
|
142721
142862
|
try {
|
|
142722
142863
|
upstream.close();
|
|
@@ -142725,7 +142866,7 @@ async function handleCdpConnection(ws, req) {
|
|
|
142725
142866
|
}
|
|
142726
142867
|
});
|
|
142727
142868
|
ws.on("error", (err) => {
|
|
142728
|
-
|
|
142869
|
+
log43.debug("CDP client error bandTabId=%s: %s", bandTabId, err.message);
|
|
142729
142870
|
try {
|
|
142730
142871
|
upstream?.close();
|
|
142731
142872
|
} catch {
|
|
@@ -142735,7 +142876,7 @@ async function handleCdpConnection(ws, req) {
|
|
|
142735
142876
|
|
|
142736
142877
|
// src/server/infra/browser-host/cdp-targets.ts
|
|
142737
142878
|
init_src();
|
|
142738
|
-
var
|
|
142879
|
+
var log44 = createLogger("cdp-targets");
|
|
142739
142880
|
var CdpUnreachableError = class extends Error {
|
|
142740
142881
|
constructor(message) {
|
|
142741
142882
|
super(message);
|
|
@@ -142791,7 +142932,7 @@ async function captureSnapshot(bandTabId) {
|
|
|
142791
142932
|
});
|
|
142792
142933
|
ws.on("error", (err) => {
|
|
142793
142934
|
clearTimeout(timeout);
|
|
142794
|
-
|
|
142935
|
+
log44.debug("captureSnapshot ws error for tab %s: %s", bandTabId, err.message);
|
|
142795
142936
|
markTargetDestroyed(bandTabId);
|
|
142796
142937
|
settle(new CdpUnreachableError(err.message));
|
|
142797
142938
|
});
|
|
@@ -142811,7 +142952,7 @@ function runMigrations() {
|
|
|
142811
142952
|
|
|
142812
142953
|
// src/server/infra/lsp/lsp-proxy.ts
|
|
142813
142954
|
init_src();
|
|
142814
|
-
var
|
|
142955
|
+
var log45 = createLogger("lsp-proxy");
|
|
142815
142956
|
function frameMessage(json2) {
|
|
142816
142957
|
const body = Buffer.from(json2, "utf-8");
|
|
142817
142958
|
const header = `Content-Length: ${body.byteLength}\r
|
|
@@ -142829,7 +142970,7 @@ function createFrameParser(onMessage) {
|
|
|
142829
142970
|
const headerStr = buffer.subarray(0, separatorIdx).toString("ascii");
|
|
142830
142971
|
const match = headerStr.match(/Content-Length:\s*(\d+)/i);
|
|
142831
142972
|
if (!match) {
|
|
142832
|
-
|
|
142973
|
+
log45.warn("Malformed LSP header: %s", headerStr);
|
|
142833
142974
|
buffer = buffer.subarray(separatorIdx + 4);
|
|
142834
142975
|
continue;
|
|
142835
142976
|
}
|
|
@@ -142862,7 +143003,7 @@ async function handleLspConnection(ws, req) {
|
|
|
142862
143003
|
session = await getOrSpawnServer(workspaceId, lang);
|
|
142863
143004
|
} catch (err) {
|
|
142864
143005
|
const message = err instanceof Error ? err.message : String(err);
|
|
142865
|
-
|
|
143006
|
+
log45.error(
|
|
142866
143007
|
"Failed to spawn %s language server for workspace %s: %s",
|
|
142867
143008
|
lang,
|
|
142868
143009
|
workspaceId,
|
|
@@ -142876,12 +143017,12 @@ async function handleLspConnection(ws, req) {
|
|
|
142876
143017
|
ws.close(4002, "Language server stdio not available");
|
|
142877
143018
|
return;
|
|
142878
143019
|
}
|
|
142879
|
-
|
|
143020
|
+
log45.debug("LSP client connected: %s/%s", workspaceId, lang);
|
|
142880
143021
|
const pendingRequests = /* @__PURE__ */ new Map();
|
|
142881
143022
|
const retriedIds = /* @__PURE__ */ new Set();
|
|
142882
143023
|
const RETRY_DELAY_MS = 2e3;
|
|
142883
143024
|
const parseFrame = createFrameParser((json2) => {
|
|
142884
|
-
|
|
143025
|
+
log45.debug(
|
|
142885
143026
|
"LSP stdout [%s/%s]: %s",
|
|
142886
143027
|
workspaceId,
|
|
142887
143028
|
lang,
|
|
@@ -142893,7 +143034,7 @@ async function handleLspConnection(ws, req) {
|
|
|
142893
143034
|
const originalRequest = pendingRequests.get(msg.id);
|
|
142894
143035
|
retriedIds.add(msg.id);
|
|
142895
143036
|
pendingRequests.delete(msg.id);
|
|
142896
|
-
|
|
143037
|
+
log45.debug(
|
|
142897
143038
|
"LSP retrying request %d after 'No Project' error [%s/%s]",
|
|
142898
143039
|
msg.id,
|
|
142899
143040
|
workspaceId,
|
|
@@ -142915,14 +143056,14 @@ async function handleLspConnection(ws, req) {
|
|
|
142915
143056
|
const onStdoutData = (chunk) => parseFrame(chunk);
|
|
142916
143057
|
lspProcess.stdout.on("data", onStdoutData);
|
|
142917
143058
|
const onExit = (code) => {
|
|
142918
|
-
|
|
143059
|
+
log45.debug("LSP server exited (code %s), closing WebSocket", String(code));
|
|
142919
143060
|
if (ws.readyState === ws.OPEN) {
|
|
142920
143061
|
ws.close(1e3, "Language server exited");
|
|
142921
143062
|
}
|
|
142922
143063
|
};
|
|
142923
143064
|
lspProcess.on("exit", onExit);
|
|
142924
143065
|
function forwardToStdin(json2) {
|
|
142925
|
-
|
|
143066
|
+
log45.debug(
|
|
142926
143067
|
"LSP stdin [%s/%s]: %s",
|
|
142927
143068
|
workspaceId,
|
|
142928
143069
|
lang,
|
|
@@ -142949,7 +143090,7 @@ async function handleLspConnection(ws, req) {
|
|
|
142949
143090
|
ws.on("close", () => {
|
|
142950
143091
|
lspProcess.stdout?.off("data", onStdoutData);
|
|
142951
143092
|
lspProcess.off("exit", onExit);
|
|
142952
|
-
|
|
143093
|
+
log45.debug("LSP client disconnected: %s/%s (server kept alive)", workspaceId, lang);
|
|
142953
143094
|
});
|
|
142954
143095
|
}
|
|
142955
143096
|
|
|
@@ -143097,7 +143238,7 @@ async function installSkills(opts = {}) {
|
|
|
143097
143238
|
}
|
|
143098
143239
|
|
|
143099
143240
|
// src/server/services/setup-service.ts
|
|
143100
|
-
var
|
|
143241
|
+
var log46 = createLogger("setup");
|
|
143101
143242
|
var AGENT_CHECKS = [
|
|
143102
143243
|
{ id: "claude-code", type: "claude-code", label: "Claude Code", binary: "claude" },
|
|
143103
143244
|
{ id: "codex", type: "codex", label: "Codex", binary: "codex" },
|
|
@@ -143114,7 +143255,7 @@ async function runFirstTimeSetup() {
|
|
|
143114
143255
|
]);
|
|
143115
143256
|
for (const r6 of results) {
|
|
143116
143257
|
if (r6.status === "rejected") {
|
|
143117
|
-
|
|
143258
|
+
log46.warn(
|
|
143118
143259
|
"Setup step failed: %s",
|
|
143119
143260
|
r6.reason instanceof Error ? r6.reason.message : String(r6.reason)
|
|
143120
143261
|
);
|
|
@@ -143128,7 +143269,7 @@ async function refreshAgentModelsInBackground() {
|
|
|
143128
143269
|
const ok2 = results.filter((r6) => !r6.error).length;
|
|
143129
143270
|
const failed = results.length - ok2;
|
|
143130
143271
|
if (results.length > 0) {
|
|
143131
|
-
|
|
143272
|
+
log46.info(
|
|
143132
143273
|
"Background model refresh: %d/%d agents updated (%d failed)",
|
|
143133
143274
|
ok2,
|
|
143134
143275
|
results.length,
|
|
@@ -143136,7 +143277,7 @@ async function refreshAgentModelsInBackground() {
|
|
|
143136
143277
|
);
|
|
143137
143278
|
}
|
|
143138
143279
|
} catch (err) {
|
|
143139
|
-
|
|
143280
|
+
log46.warn(
|
|
143140
143281
|
"Background model refresh failed: %s",
|
|
143141
143282
|
err instanceof Error ? err.message : String(err)
|
|
143142
143283
|
);
|
|
@@ -143150,7 +143291,7 @@ async function ensureProjectStateInSync() {
|
|
|
143150
143291
|
try {
|
|
143151
143292
|
await syncService.syncWorktrees();
|
|
143152
143293
|
} catch (err) {
|
|
143153
|
-
|
|
143294
|
+
log46.warn(
|
|
143154
143295
|
"Failed to sync project state at boot: %s",
|
|
143155
143296
|
err instanceof Error ? err.message : String(err)
|
|
143156
143297
|
);
|
|
@@ -143161,22 +143302,22 @@ async function ensureCliInstalled() {
|
|
|
143161
143302
|
try {
|
|
143162
143303
|
cliStatus = await checkCli();
|
|
143163
143304
|
} catch (err) {
|
|
143164
|
-
|
|
143305
|
+
log46.warn("Could not check CLI status: %s", err instanceof Error ? err.message : String(err));
|
|
143165
143306
|
return;
|
|
143166
143307
|
}
|
|
143167
143308
|
if (cliStatus === "Installed") {
|
|
143168
143309
|
return;
|
|
143169
143310
|
}
|
|
143170
143311
|
if (cliStatus !== "NotInstalled") {
|
|
143171
|
-
|
|
143312
|
+
log46.warn("CLI not auto-installed (status: %s)", cliStatus);
|
|
143172
143313
|
return;
|
|
143173
143314
|
}
|
|
143174
|
-
|
|
143315
|
+
log46.info("Installing band CLI...");
|
|
143175
143316
|
try {
|
|
143176
143317
|
await installCli();
|
|
143177
|
-
|
|
143318
|
+
log46.info("CLI installed to /usr/local/bin/band");
|
|
143178
143319
|
} catch (err) {
|
|
143179
|
-
|
|
143320
|
+
log46.warn("CLI installation failed: %s", err instanceof Error ? err.message : String(err));
|
|
143180
143321
|
}
|
|
143181
143322
|
}
|
|
143182
143323
|
async function ensureDefaultCodingAgents() {
|
|
@@ -143185,17 +143326,17 @@ async function ensureDefaultCodingAgents() {
|
|
|
143185
143326
|
if (Array.isArray(existing) && existing.length > 0) {
|
|
143186
143327
|
return;
|
|
143187
143328
|
}
|
|
143188
|
-
|
|
143329
|
+
log46.info("Detecting installed coding agents...");
|
|
143189
143330
|
const detected = [];
|
|
143190
143331
|
for (const check2 of AGENT_CHECKS) {
|
|
143191
143332
|
const path3 = await systemService.whichBinary(check2.binary);
|
|
143192
143333
|
if (path3) {
|
|
143193
|
-
|
|
143334
|
+
log46.info("Detected coding agent: %s (%s)", check2.id, path3);
|
|
143194
143335
|
detected.push({ id: check2.id, type: check2.type, label: check2.label });
|
|
143195
143336
|
}
|
|
143196
143337
|
}
|
|
143197
143338
|
if (detected.length === 0) {
|
|
143198
|
-
|
|
143339
|
+
log46.info("No coding agent CLIs detected on PATH");
|
|
143199
143340
|
return;
|
|
143200
143341
|
}
|
|
143201
143342
|
const current2 = loadSettings();
|
|
@@ -143204,7 +143345,7 @@ async function ensureDefaultCodingAgents() {
|
|
|
143204
143345
|
current2.defaultCodingAgent = detected[0].id;
|
|
143205
143346
|
}
|
|
143206
143347
|
saveSettings(current2);
|
|
143207
|
-
|
|
143348
|
+
log46.info("Enabled %d coding agent(s); default = %s", detected.length, current2.defaultCodingAgent);
|
|
143208
143349
|
}
|
|
143209
143350
|
function ensureNotificationDefaults() {
|
|
143210
143351
|
const settings = loadSettings();
|
|
@@ -143216,7 +143357,7 @@ function ensureNotificationDefaults() {
|
|
|
143216
143357
|
...settings,
|
|
143217
143358
|
notifications: { ...notifications, soundOnNeedsAttention: true }
|
|
143218
143359
|
});
|
|
143219
|
-
|
|
143360
|
+
log46.info("Set default notifications.soundOnNeedsAttention = true");
|
|
143220
143361
|
}
|
|
143221
143362
|
async function ensureClaudeHooks() {
|
|
143222
143363
|
try {
|
|
@@ -143225,9 +143366,9 @@ async function ensureClaudeHooks() {
|
|
|
143225
143366
|
return;
|
|
143226
143367
|
}
|
|
143227
143368
|
await installHooks();
|
|
143228
|
-
|
|
143369
|
+
log46.info("Installed Claude Code hooks");
|
|
143229
143370
|
} catch (err) {
|
|
143230
|
-
|
|
143371
|
+
log46.warn(
|
|
143231
143372
|
"Failed to install Claude Code hooks: %s",
|
|
143232
143373
|
err instanceof Error ? err.message : String(err)
|
|
143233
143374
|
);
|
|
@@ -143235,11 +143376,11 @@ async function ensureClaudeHooks() {
|
|
|
143235
143376
|
}
|
|
143236
143377
|
async function ensureSkillsInstalled() {
|
|
143237
143378
|
try {
|
|
143238
|
-
const result = await installSkills({ log:
|
|
143379
|
+
const result = await installSkills({ log: log46 });
|
|
143239
143380
|
const wrote = result.written.length + result.updated.length;
|
|
143240
143381
|
const linkChange = result.linked.length;
|
|
143241
143382
|
if (wrote > 0 || linkChange > 0 || result.conflicts.length > 0) {
|
|
143242
|
-
|
|
143383
|
+
log46.info(
|
|
143243
143384
|
"Synced CLI skills (shared: %d written, %d updated, %d unchanged; symlinks: %d created, %d already-linked, %d conflicts, %d skipped)",
|
|
143244
143385
|
result.written.length,
|
|
143245
143386
|
result.updated.length,
|
|
@@ -143251,7 +143392,7 @@ async function ensureSkillsInstalled() {
|
|
|
143251
143392
|
);
|
|
143252
143393
|
}
|
|
143253
143394
|
} catch (err) {
|
|
143254
|
-
|
|
143395
|
+
log46.warn("Failed to sync CLI skills: %s", err instanceof Error ? err.message : String(err));
|
|
143255
143396
|
}
|
|
143256
143397
|
}
|
|
143257
143398
|
var SetupService = class {
|