@band-app/server 0.31.1 → 0.33.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/{TerminalPanel-DdoEObnF.js → TerminalPanel-CyltRZLD.js} +1 -1
- package/dist/client/assets/_basePickBy-Dl99bUuK.js +1 -0
- package/dist/client/assets/{_baseUniq-BZZjCl_a.js → _baseUniq-xYPKjKRI.js} +1 -1
- package/dist/client/assets/addon-unicode11-LsnDChsR.js +1 -0
- package/dist/client/assets/{arc-CHfgBvn_.js → arc-L0FqLNvl.js} +1 -1
- package/dist/client/assets/{architectureDiagram-VXUJARFQ-DQA19xNg.js → architectureDiagram-VXUJARFQ-sxFQR6t8.js} +1 -1
- package/dist/client/assets/{blockDiagram-VD42YOAC-F8PTxmQ_.js → blockDiagram-VD42YOAC-CKyryScy.js} +4 -4
- package/dist/client/assets/{c4Diagram-YG6GDRKO-BJUm36SI.js → c4Diagram-YG6GDRKO-CKkLibM6.js} +1 -1
- package/dist/client/assets/channel-CnUqAM2K.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-C1wjI1w7.js → chunk-4BX2VUAB-B2Q5eiyh.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CGfcCH6v.js → chunk-55IACEB6-Bx7ppH1E.js} +1 -1
- package/dist/client/assets/{chunk-B4BG7PRW-DmVN_q5R.js → chunk-B4BG7PRW-z63abbDt.js} +3 -3
- package/dist/client/assets/{chunk-DI55MBZ5-Cp0-lUyt.js → chunk-DI55MBZ5-CVuxJX-G.js} +3 -3
- package/dist/client/assets/{chunk-FMBD7UC4-BE3Cu6Ut.js → chunk-FMBD7UC4-C4mR-Kqh.js} +1 -1
- package/dist/client/assets/{chunk-QN33PNHL-CPVRy0ja.js → chunk-QN33PNHL-DC9EuvVO.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-C7Y7bhq5.js → chunk-QZHKN3VN-BVfYPmR6.js} +1 -1
- package/dist/client/assets/{chunk-TZMSLE5B-Bi_vlgox.js → chunk-TZMSLE5B-BERfyjOQ.js} +1 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-Bl2ARqSW.js +1 -0
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-Bl2ARqSW.js +1 -0
- package/dist/client/assets/clone-DoC0Yowh.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-CoCMLv_6.js → cose-bilkent-S5V4N54A-CKYh86Nn.js} +1 -1
- package/dist/client/assets/{dagre-6UL2VRFP-EnAkiIUe.js → dagre-6UL2VRFP-CHXYsbsT.js} +2 -2
- package/dist/client/assets/{diagram-PSM6KHXK-C2Y89USX.js → diagram-PSM6KHXK-BgTabbUt.js} +1 -1
- package/dist/client/assets/{diagram-QEK2KX5R-B-lmAMSj.js → diagram-QEK2KX5R-DGko5nSx.js} +2 -2
- package/dist/client/assets/diagram-S2PKOQOG-CE06Gb7p.js +24 -0
- package/dist/client/assets/{erDiagram-Q2GNP2WA-PNRr4PfI.js → erDiagram-Q2GNP2WA-DRAdXF3c.js} +3 -3
- package/dist/client/assets/{flowDiagram-NV44I4VS-DMJLrOve.js → flowDiagram-NV44I4VS-DMdYos4M.js} +3 -3
- package/dist/client/assets/{ganttDiagram-JELNMOA3-B8xTGdhz.js → ganttDiagram-JELNMOA3-B1hq9zyH.js} +5 -5
- package/dist/client/assets/gitGraphDiagram-V2S2FVAM-BX_eqyqV.js +65 -0
- package/dist/client/assets/{graph-DtlkBWdT.js → graph-B1pXNJmu.js} +1 -1
- package/dist/client/assets/highlighted-body-B3W2YXNL-xpTIV5H4.js +1 -0
- package/dist/client/assets/index-61SgNErm.js +3 -0
- package/dist/client/assets/index-67ml7mn1.js +1 -0
- package/dist/client/assets/index-BAlyKPeT.js +1 -0
- package/dist/client/assets/index-BD37kyMP.js +1 -0
- package/dist/client/assets/index-BHygUCeT.js +1 -0
- package/dist/client/assets/{index-DwIIxwyA.js → index-BYm6dlG5.js} +2 -2
- package/dist/client/assets/index-CWczZ7eS.js +1 -0
- package/dist/client/assets/{index-DzmcYgsK.js → index-CoSFZPv4.js} +1 -1
- package/dist/client/assets/index-DNX82GPp.js +1 -0
- package/dist/client/assets/index-DUaIvPpT.js +7 -0
- package/dist/client/assets/index-Dm9xRcT9.js +1 -0
- package/dist/client/assets/index-Do4DO4E-.js +1 -0
- package/dist/client/assets/index-Mpl66MhJ.js +1 -0
- package/dist/client/assets/{infoDiagram-HS3SLOUP-DekD9pOv.js → infoDiagram-HS3SLOUP-DHAIDbZu.js} +1 -1
- package/dist/client/assets/{journeyDiagram-XKPGCS4Q-Fzs0FbeM.js → journeyDiagram-XKPGCS4Q-BJHZIWhu.js} +1 -1
- package/dist/client/assets/{kanban-definition-3W4ZIXB7-6B7ehAZt.js → kanban-definition-3W4ZIXB7-_qzn6_ii.js} +6 -6
- package/dist/client/assets/{layout-CcUD7gHw.js → layout-CksxJldr.js} +1 -1
- package/dist/client/assets/main-D4u0xEOA.css +1 -0
- package/dist/client/assets/main-FnYu011V.js +1002 -0
- package/dist/client/assets/{mindmap-definition-VGOIOE7T-CfY1kt2W.js → mindmap-definition-VGOIOE7T-Deop3o-V.js} +4 -4
- package/dist/client/assets/{pieDiagram-ADFJNKIX-C-ZZw4jN.js → pieDiagram-ADFJNKIX-d4k56ZYA.js} +2 -2
- package/dist/client/assets/{quadrantDiagram-AYHSOK5B-Cn4pxyBH.js → quadrantDiagram-AYHSOK5B-CBA2J09q.js} +1 -1
- package/dist/client/assets/{requirementDiagram-UZGBJVZJ-B0UYN1Sq.js → requirementDiagram-UZGBJVZJ-C6Nnujg6.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DegmNHvK.js → sankeyDiagram-TZEHDZUN-CPfLLuk9.js} +6 -6
- package/dist/client/assets/{sequenceDiagram-WL72ISMW-B8BlHF2c.js → sequenceDiagram-WL72ISMW-C_OY-5TF.js} +6 -6
- package/dist/client/assets/{stateDiagram-FKZM4ZOC-3FR63a_N.js → stateDiagram-FKZM4ZOC-CeuP4CjM.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-B9BH2TF6.js +1 -0
- package/dist/client/assets/{timeline-definition-IT6M3QCI-F2yYpGjm.js → timeline-definition-IT6M3QCI-CL_Rmapn.js} +4 -4
- package/dist/client/assets/{treemap-GDKQZRPO-Br0ExAYs.js → treemap-GDKQZRPO-2uvsx2LQ.js} +1 -1
- package/dist/client/assets/workspace._workspaceId-D3mRY9_6.js +1 -0
- package/dist/client/assets/{workspace._workspaceId-DxBPbkq5.js → workspace._workspaceId-DF3JNMRG.js} +1 -1
- package/dist/client/assets/{xychartDiagram-PRI3JC2R-CnbekSuG.js → xychartDiagram-PRI3JC2R-5Pzm62mv.js} +1 -1
- package/dist/migrations/20260926162113_browser_profiles/migration.sql +12 -0
- package/dist/migrations/20260926162113_browser_profiles/snapshot.json +1520 -0
- package/dist/migrations/20260927123820_agent_sessions/migration.sql +16 -0
- package/dist/migrations/20260927123820_agent_sessions/snapshot.json +1675 -0
- package/dist/openapi.json +2748 -1140
- package/dist/server/assets/{TerminalPanel-CThgG3BY.js → TerminalPanel-DMTU2FMX.js} +1 -1
- package/dist/server/assets/{_basePickBy-DMEcDwoD.js → _basePickBy-CMTHAoTW.js} +2 -2
- package/dist/server/assets/{_baseUniq-C6YEem8Y.js → _baseUniq-DkG_FLLk.js} +1 -1
- package/dist/server/assets/_tanstack-start-manifest_v-cBOqdEgL.js +4 -0
- package/dist/server/assets/addon-unicode11-BhCmKRb7.js +181 -0
- package/dist/server/assets/{arc-CcEw1rIf.js → arc-CSj375cS.js} +1 -1
- package/dist/server/assets/{architecture-7HQA4BMR-BXvzNToj.js → architecture-7HQA4BMR-MwhJw22a.js} +6 -6
- package/dist/server/assets/{architectureDiagram-VXUJARFQ-BliQCKdG.js → architectureDiagram-VXUJARFQ-DyVVxp88.js} +6 -6
- package/dist/server/assets/{blockDiagram-VD42YOAC-CjmYP_Tq.js → blockDiagram-VD42YOAC-aGbi3Kv_.js} +6 -6
- package/dist/server/assets/{c4Diagram-YG6GDRKO-BfRolLuL.js → c4Diagram-YG6GDRKO-DhyUvqPs.js} +2 -2
- package/dist/server/assets/{channel-CmYmU2fF.js → channel-CJthnbp1.js} +1 -1
- package/dist/server/assets/{chunk-4BX2VUAB-DnWdxOy5.js → chunk-4BX2VUAB-Ch7bkquC.js} +1 -1
- package/dist/server/assets/{chunk-55IACEB6-BTmbTQIk.js → chunk-55IACEB6-CLKopZj8.js} +1 -1
- package/dist/server/assets/{chunk-B4BG7PRW-Dd8U8eRH.js → chunk-B4BG7PRW-BVv_KeWC.js} +4 -4
- package/dist/server/assets/{chunk-DI55MBZ5-DOSx8ES_.js → chunk-DI55MBZ5-C0_HSk1s.js} +3 -3
- package/dist/server/assets/{chunk-FMBD7UC4-DoS4CUAI.js → chunk-FMBD7UC4-3fy4TSVt.js} +1 -1
- package/dist/server/assets/{chunk-QN33PNHL-81e5hpqA.js → chunk-QN33PNHL-QdSQZPQz.js} +1 -1
- package/dist/server/assets/{chunk-QZHKN3VN-Cruwx7ml.js → chunk-QZHKN3VN-Dak-YXr5.js} +1 -1
- package/dist/server/assets/{chunk-TZMSLE5B-CVdCnVV1.js → chunk-TZMSLE5B-ThSW8afd.js} +1 -1
- package/dist/server/assets/{classDiagram-v2-WZHVMYZB-CI4dbXAN.js → classDiagram-2ON5EDUG-Cmkciu-2.js} +5 -5
- package/dist/server/assets/{classDiagram-2ON5EDUG-CI4dbXAN.js → classDiagram-v2-WZHVMYZB-Cmkciu-2.js} +5 -5
- package/dist/server/assets/{clone-DCf3XlPY.js → clone-ciZ96ZK2.js} +1 -1
- package/dist/server/assets/{cose-bilkent-S5V4N54A-MuUXxVtC.js → cose-bilkent-S5V4N54A-CP20--8W.js} +1 -1
- package/dist/server/assets/{dagre-6UL2VRFP-C7ckn20c.js → dagre-6UL2VRFP-D9LrmNJH.js} +6 -6
- package/dist/server/assets/{diagram-PSM6KHXK-CMxqFNNc.js → diagram-PSM6KHXK-l3xztHYH.js} +7 -7
- package/dist/server/assets/{diagram-QEK2KX5R-DGn7Wc3l.js → diagram-QEK2KX5R-i9twZ5aj.js} +6 -6
- package/dist/server/assets/{diagram-S2PKOQOG-DCkkbBLl.js → diagram-S2PKOQOG-DIHmhvbo.js} +6 -6
- package/dist/server/assets/{erDiagram-Q2GNP2WA-CKPFaAp2.js → erDiagram-Q2GNP2WA-fMWrL8ta.js} +4 -4
- package/dist/server/assets/{flowDiagram-NV44I4VS-DFf8L08F.js → flowDiagram-NV44I4VS-BqKFb2gL.js} +5 -5
- package/dist/server/assets/{ganttDiagram-JELNMOA3-1-t_r6jX.js → ganttDiagram-JELNMOA3-XwScweUm.js} +1 -1
- package/dist/server/assets/{gitGraph-G5XIXVHT-CXVQFRFs.js → gitGraph-G5XIXVHT-DDO_mRkl.js} +6 -6
- package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-DVqN7ZP0.js → gitGraphDiagram-V2S2FVAM-B2e2LaZt.js} +7 -7
- package/dist/server/assets/{graph-Dot7YH89.js → graph-DqF0fiyC.js} +2 -2
- package/dist/server/assets/{highlighted-body-B3W2YXNL-8cjZuRJ2.js → highlighted-body-B3W2YXNL-B9lH9lqG.js} +1 -1
- package/dist/server/assets/{index-C1hQNNzU.js → index-BFzH6uNZ.js} +1 -2
- package/dist/server/assets/{index-Bi1NreVG.js → index-BRPRiIzs.js} +1 -5
- package/dist/server/assets/{index-D6Vm7E_i.js → index-BZSpvQ87.js} +1 -2
- package/dist/server/assets/{index-BcZgkaNS.js → index-BuxMoI9R.js} +1 -2
- package/dist/server/assets/{index-GgrvHhHi.js → index-C0T5sHCj.js} +1 -3
- package/dist/server/assets/{index-nzUHfYBx.js → index-C35Eg9Oe.js} +1 -2
- package/dist/server/assets/{index-CxlXrP3m.js → index-C4LlK8zq.js} +1 -1
- package/dist/server/assets/{index-B2x1DfYc.js → index-Cz3ed2GU.js} +1 -2
- package/dist/server/assets/{index-BDgBWXBD.js → index-Oepbj3Cu.js} +1 -2
- package/dist/server/assets/{index-Ba8AA28e.js → index-QY-ciJ02.js} +1 -2
- package/dist/server/assets/{index-D3AFKy3U.js → index-dOV5Jyvk.js} +1 -3
- package/dist/server/assets/{index-p6O_x_qN.js → index-iLqcyvvo.js} +1 -2
- package/dist/server/assets/{index-AmUVRRsa.js → index-ihiIN7Vo.js} +1 -2
- package/dist/server/assets/{info-VBDWY6EO-BXRDzzOP.js → info-VBDWY6EO-BSfwYSKN.js} +6 -6
- package/dist/server/assets/{infoDiagram-HS3SLOUP-D2jQYgOa.js → infoDiagram-HS3SLOUP-BcPNSucE.js} +5 -5
- package/dist/server/assets/{journeyDiagram-XKPGCS4Q-bf_S8co7.js → journeyDiagram-XKPGCS4Q-B_JljIi2.js} +4 -4
- package/dist/server/assets/{kanban-definition-3W4ZIXB7-eje5lYLG.js → kanban-definition-3W4ZIXB7-B5aPUZvg.js} +2 -2
- package/dist/server/assets/{layout-D3AhBFqI.js → layout-Cv2BYqNX.js} +4 -4
- package/dist/server/assets/{mermaid-3ZIDBTTL-C-00O3F0.js → mermaid-3ZIDBTTL-D_akVRms.js} +1 -1
- package/dist/server/assets/{mermaid-parser.core-CyX4B1l5.js → mermaid-parser.core-uDeqwrPN.js} +11 -11
- package/dist/server/assets/{mindmap-definition-VGOIOE7T-D51F_plo.js → mindmap-definition-VGOIOE7T-C9LF9XTT.js} +3 -3
- package/dist/server/assets/{packet-DYOGHKS2-CCJkkNTh.js → packet-DYOGHKS2-lRBX1T35.js} +6 -6
- package/dist/server/assets/{pie-VRWISCQL-7Tei6lnA.js → pie-VRWISCQL-BCZ9vmsj.js} +6 -6
- package/dist/server/assets/{pieDiagram-ADFJNKIX-BclaT-41.js → pieDiagram-ADFJNKIX-HYsm0km8.js} +7 -7
- package/dist/server/assets/{quadrantDiagram-AYHSOK5B-CnerVMbZ.js → quadrantDiagram-AYHSOK5B-Fdzz2j2T.js} +1 -1
- package/dist/server/assets/{radar-ZZBFDIW7-QLmbgAT7.js → radar-ZZBFDIW7-iZ-6xOx9.js} +6 -6
- package/dist/server/assets/{requirementDiagram-UZGBJVZJ-a2FIYlfE.js → requirementDiagram-UZGBJVZJ-CeHGAs1A.js} +3 -3
- package/dist/server/assets/{router-DDnNUwTm.js → router-A58OKuIG.js} +52793 -29611
- package/dist/server/assets/{sankeyDiagram-TZEHDZUN-B3I-S6CG.js → sankeyDiagram-TZEHDZUN-DXgjoM9B.js} +1 -1
- package/dist/server/assets/{sequenceDiagram-WL72ISMW-kgJrgJ9r.js → sequenceDiagram-WL72ISMW-BK24aHRm.js} +3 -3
- package/dist/server/assets/{stateDiagram-FKZM4ZOC-C6UTf0ag.js → stateDiagram-FKZM4ZOC-uW8qduwY.js} +8 -8
- package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-Dj0SlbA4.js → stateDiagram-v2-4FDKWEC3-O0D8F8J2.js} +4 -4
- package/dist/server/assets/{timeline-definition-IT6M3QCI-DGPtqtJD.js → timeline-definition-IT6M3QCI-BaSl1O8h.js} +2 -2
- package/dist/server/assets/{treemap-GDKQZRPO-B-wn0rT7.js → treemap-GDKQZRPO-DqxwR6w-.js} +6 -6
- package/dist/server/assets/{workspace._workspaceId-CG5NG8aZ.js → workspace._workspaceId-B09dwAP5.js} +1 -1
- package/dist/server/assets/workspace._workspaceId-CZZSeH-P.js +316 -0
- package/dist/server/assets/{xychartDiagram-PRI3JC2R-BTb4nc1D.js → xychartDiagram-PRI3JC2R-Du3l-FcL.js} +1 -1
- package/dist/server/server.js +2 -2
- package/dist/start-server.mjs +80228 -58130
- package/dist/terminal-daemon.mjs +747 -113
- package/package.json +6 -4
- package/dist/client/assets/_basePickBy-B3BFyLWC.js +0 -1
- package/dist/client/assets/channel-RulspXoY.js +0 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-Db0XAgV5.js +0 -1
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-Db0XAgV5.js +0 -1
- package/dist/client/assets/clone-OMk_JTVX.js +0 -1
- package/dist/client/assets/diagram-S2PKOQOG-D3nbDuM4.js +0 -24
- package/dist/client/assets/gitGraphDiagram-V2S2FVAM-1W-3cgTi.js +0 -65
- package/dist/client/assets/highlighted-body-B3W2YXNL-By10eQ93.js +0 -1
- package/dist/client/assets/index-3OKF_8Is.js +0 -1
- package/dist/client/assets/index-Bgy7cu0a.js +0 -1
- package/dist/client/assets/index-BzNAZ5FA.js +0 -1
- package/dist/client/assets/index-Bzw80mva.js +0 -1
- package/dist/client/assets/index-C0hp-RSv.js +0 -7
- package/dist/client/assets/index-CEIbmBrz.js +0 -1
- package/dist/client/assets/index-D0-MMrtE.js +0 -13
- package/dist/client/assets/index-D1tzUCeW.js +0 -1
- package/dist/client/assets/index-DS648c4_.js +0 -1
- package/dist/client/assets/index-DV4-ZPTy.js +0 -1
- package/dist/client/assets/index-DkJyKKg0.js +0 -1
- package/dist/client/assets/index-Do8FqasK.js +0 -1
- package/dist/client/assets/index-DtgD3j-s.js +0 -6
- package/dist/client/assets/index-UlnCpzJG.js +0 -1
- package/dist/client/assets/index-bqUQQY5s.js +0 -3
- package/dist/client/assets/index-os2U5ZBq.js +0 -1
- package/dist/client/assets/main-B-TE9tSM.js +0 -979
- package/dist/client/assets/main-mRE1Fhv7.css +0 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BrxlUWYt.js +0 -1
- package/dist/client/assets/workspace._workspaceId-C0VOYb-1.js +0 -1
- package/dist/server/assets/_tanstack-start-manifest_v-D-Rf7MMa.js +0 -4
- package/dist/server/assets/index-Bt0zkb77.js +0 -1052
- package/dist/server/assets/index-CImaqmmh.js +0 -1764
- package/dist/server/assets/index-CXGBWoOB.js +0 -2499
- package/dist/server/assets/index-CyFAdMlV.js +0 -1030
- package/dist/server/assets/index-DoE2xDo2.js +0 -653
- package/dist/server/assets/workspace._workspaceId-Dd-upXb6.js +0 -309
package/dist/terminal-daemon.mjs
CHANGED
|
@@ -1283,7 +1283,7 @@ var require_sonic_boom = __commonJS({
|
|
|
1283
1283
|
if (!(this instanceof SonicBoom)) {
|
|
1284
1284
|
return new SonicBoom(opts);
|
|
1285
1285
|
}
|
|
1286
|
-
let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir, retryEAGAIN, fsync, contentMode, mode } = opts || {};
|
|
1286
|
+
let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir2, retryEAGAIN, fsync, contentMode, mode } = opts || {};
|
|
1287
1287
|
fd = fd || dest;
|
|
1288
1288
|
this._len = 0;
|
|
1289
1289
|
this.fd = -1;
|
|
@@ -1308,7 +1308,7 @@ var require_sonic_boom = __commonJS({
|
|
|
1308
1308
|
this.append = append || false;
|
|
1309
1309
|
this.mode = mode;
|
|
1310
1310
|
this.retryEAGAIN = retryEAGAIN || (() => true);
|
|
1311
|
-
this.mkdir =
|
|
1311
|
+
this.mkdir = mkdir2 || false;
|
|
1312
1312
|
let fsWriteSync;
|
|
1313
1313
|
let fsWrite;
|
|
1314
1314
|
if (contentMode === kContentModeBuffer) {
|
|
@@ -2024,7 +2024,7 @@ var require_thread_stream = __commonJS({
|
|
|
2024
2024
|
var { version } = require_package();
|
|
2025
2025
|
var { EventEmitter } = __require("events");
|
|
2026
2026
|
var { Worker } = __require("worker_threads");
|
|
2027
|
-
var { join:
|
|
2027
|
+
var { join: join7 } = __require("path");
|
|
2028
2028
|
var { pathToFileURL } = __require("url");
|
|
2029
2029
|
var { wait } = require_wait();
|
|
2030
2030
|
var {
|
|
@@ -2060,7 +2060,7 @@ var require_thread_stream = __commonJS({
|
|
|
2060
2060
|
function createWorker(stream, opts) {
|
|
2061
2061
|
const { filename, workerData } = opts;
|
|
2062
2062
|
const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
|
|
2063
|
-
const toExecute = bundlerOverrides["thread-stream-worker"] ||
|
|
2063
|
+
const toExecute = bundlerOverrides["thread-stream-worker"] || join7(__dirname, "lib", "worker.js");
|
|
2064
2064
|
const worker = new Worker(toExecute, {
|
|
2065
2065
|
...opts.workerOpts,
|
|
2066
2066
|
trackUnmanagedFds: false,
|
|
@@ -2446,7 +2446,7 @@ var require_transport = __commonJS({
|
|
|
2446
2446
|
"use strict";
|
|
2447
2447
|
var { createRequire } = __require("module");
|
|
2448
2448
|
var getCallers = require_caller();
|
|
2449
|
-
var { join:
|
|
2449
|
+
var { join: join7, isAbsolute, sep: sep2 } = __require("node:path");
|
|
2450
2450
|
var sleep = require_atomic_sleep();
|
|
2451
2451
|
var onExit = require_on_exit_leak_free();
|
|
2452
2452
|
var ThreadStream = require_thread_stream();
|
|
@@ -2509,7 +2509,7 @@ var require_transport = __commonJS({
|
|
|
2509
2509
|
throw new Error("only one of target or targets can be specified");
|
|
2510
2510
|
}
|
|
2511
2511
|
if (targets) {
|
|
2512
|
-
target = bundlerOverrides["pino-worker"] ||
|
|
2512
|
+
target = bundlerOverrides["pino-worker"] || join7(__dirname, "worker.js");
|
|
2513
2513
|
options.targets = targets.filter((dest) => dest.target).map((dest) => {
|
|
2514
2514
|
return {
|
|
2515
2515
|
...dest,
|
|
@@ -2527,7 +2527,7 @@ var require_transport = __commonJS({
|
|
|
2527
2527
|
});
|
|
2528
2528
|
});
|
|
2529
2529
|
} else if (pipeline) {
|
|
2530
|
-
target = bundlerOverrides["pino-worker"] ||
|
|
2530
|
+
target = bundlerOverrides["pino-worker"] || join7(__dirname, "worker.js");
|
|
2531
2531
|
options.pipelines = [pipeline.map((dest) => {
|
|
2532
2532
|
return {
|
|
2533
2533
|
...dest,
|
|
@@ -2549,7 +2549,7 @@ var require_transport = __commonJS({
|
|
|
2549
2549
|
return origin;
|
|
2550
2550
|
}
|
|
2551
2551
|
if (origin === "pino/file") {
|
|
2552
|
-
return
|
|
2552
|
+
return join7(__dirname, "..", "file.js");
|
|
2553
2553
|
}
|
|
2554
2554
|
let fixTarget2;
|
|
2555
2555
|
for (const filePath of callers) {
|
|
@@ -2877,11 +2877,11 @@ var require_tools = __commonJS({
|
|
|
2877
2877
|
}
|
|
2878
2878
|
}
|
|
2879
2879
|
}
|
|
2880
|
-
function buildFormatters(level, bindings,
|
|
2880
|
+
function buildFormatters(level, bindings, log5) {
|
|
2881
2881
|
return {
|
|
2882
2882
|
level,
|
|
2883
2883
|
bindings,
|
|
2884
|
-
log:
|
|
2884
|
+
log: log5
|
|
2885
2885
|
};
|
|
2886
2886
|
}
|
|
2887
2887
|
function normalizeDestFileDescriptor(destination) {
|
|
@@ -3264,11 +3264,11 @@ var require_proto = __commonJS({
|
|
|
3264
3264
|
}
|
|
3265
3265
|
} else instance[serializersSym] = serializers;
|
|
3266
3266
|
if (options.hasOwnProperty("formatters")) {
|
|
3267
|
-
const { level, bindings: chindings, log:
|
|
3267
|
+
const { level, bindings: chindings, log: log5 } = options.formatters;
|
|
3268
3268
|
instance[formattersSym] = buildFormatters(
|
|
3269
3269
|
level || formatters.level,
|
|
3270
3270
|
chindings || resetChildingsFormatter,
|
|
3271
|
-
|
|
3271
|
+
log5 || formatters.log
|
|
3272
3272
|
);
|
|
3273
3273
|
} else {
|
|
3274
3274
|
instance[formattersSym] = buildFormatters(
|
|
@@ -3538,7 +3538,7 @@ var require_safe_stable_stringify = __commonJS({
|
|
|
3538
3538
|
return circularValue;
|
|
3539
3539
|
}
|
|
3540
3540
|
let res = "";
|
|
3541
|
-
let
|
|
3541
|
+
let join7 = ",";
|
|
3542
3542
|
const originalIndentation = indentation;
|
|
3543
3543
|
if (Array.isArray(value)) {
|
|
3544
3544
|
if (value.length === 0) {
|
|
@@ -3552,7 +3552,7 @@ var require_safe_stable_stringify = __commonJS({
|
|
|
3552
3552
|
indentation += spacer;
|
|
3553
3553
|
res += `
|
|
3554
3554
|
${indentation}`;
|
|
3555
|
-
|
|
3555
|
+
join7 = `,
|
|
3556
3556
|
${indentation}`;
|
|
3557
3557
|
}
|
|
3558
3558
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
@@ -3560,13 +3560,13 @@ ${indentation}`;
|
|
|
3560
3560
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3561
3561
|
const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
|
|
3562
3562
|
res += tmp2 !== void 0 ? tmp2 : "null";
|
|
3563
|
-
res +=
|
|
3563
|
+
res += join7;
|
|
3564
3564
|
}
|
|
3565
3565
|
const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
|
|
3566
3566
|
res += tmp !== void 0 ? tmp : "null";
|
|
3567
3567
|
if (value.length - 1 > maximumBreadth) {
|
|
3568
3568
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3569
|
-
res += `${
|
|
3569
|
+
res += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3570
3570
|
}
|
|
3571
3571
|
if (spacer !== "") {
|
|
3572
3572
|
res += `
|
|
@@ -3587,7 +3587,7 @@ ${originalIndentation}`;
|
|
|
3587
3587
|
let separator = "";
|
|
3588
3588
|
if (spacer !== "") {
|
|
3589
3589
|
indentation += spacer;
|
|
3590
|
-
|
|
3590
|
+
join7 = `,
|
|
3591
3591
|
${indentation}`;
|
|
3592
3592
|
whitespace = " ";
|
|
3593
3593
|
}
|
|
@@ -3601,13 +3601,13 @@ ${indentation}`;
|
|
|
3601
3601
|
const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
|
|
3602
3602
|
if (tmp !== void 0) {
|
|
3603
3603
|
res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
|
|
3604
|
-
separator =
|
|
3604
|
+
separator = join7;
|
|
3605
3605
|
}
|
|
3606
3606
|
}
|
|
3607
3607
|
if (keyLength > maximumBreadth) {
|
|
3608
3608
|
const removedKeys = keyLength - maximumBreadth;
|
|
3609
3609
|
res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
|
|
3610
|
-
separator =
|
|
3610
|
+
separator = join7;
|
|
3611
3611
|
}
|
|
3612
3612
|
if (spacer !== "" && separator.length > 1) {
|
|
3613
3613
|
res = `
|
|
@@ -3648,7 +3648,7 @@ ${originalIndentation}`;
|
|
|
3648
3648
|
}
|
|
3649
3649
|
const originalIndentation = indentation;
|
|
3650
3650
|
let res = "";
|
|
3651
|
-
let
|
|
3651
|
+
let join7 = ",";
|
|
3652
3652
|
if (Array.isArray(value)) {
|
|
3653
3653
|
if (value.length === 0) {
|
|
3654
3654
|
return "[]";
|
|
@@ -3661,7 +3661,7 @@ ${originalIndentation}`;
|
|
|
3661
3661
|
indentation += spacer;
|
|
3662
3662
|
res += `
|
|
3663
3663
|
${indentation}`;
|
|
3664
|
-
|
|
3664
|
+
join7 = `,
|
|
3665
3665
|
${indentation}`;
|
|
3666
3666
|
}
|
|
3667
3667
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
@@ -3669,13 +3669,13 @@ ${indentation}`;
|
|
|
3669
3669
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3670
3670
|
const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
|
|
3671
3671
|
res += tmp2 !== void 0 ? tmp2 : "null";
|
|
3672
|
-
res +=
|
|
3672
|
+
res += join7;
|
|
3673
3673
|
}
|
|
3674
3674
|
const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
|
|
3675
3675
|
res += tmp !== void 0 ? tmp : "null";
|
|
3676
3676
|
if (value.length - 1 > maximumBreadth) {
|
|
3677
3677
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3678
|
-
res += `${
|
|
3678
|
+
res += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3679
3679
|
}
|
|
3680
3680
|
if (spacer !== "") {
|
|
3681
3681
|
res += `
|
|
@@ -3688,7 +3688,7 @@ ${originalIndentation}`;
|
|
|
3688
3688
|
let whitespace = "";
|
|
3689
3689
|
if (spacer !== "") {
|
|
3690
3690
|
indentation += spacer;
|
|
3691
|
-
|
|
3691
|
+
join7 = `,
|
|
3692
3692
|
${indentation}`;
|
|
3693
3693
|
whitespace = " ";
|
|
3694
3694
|
}
|
|
@@ -3697,7 +3697,7 @@ ${indentation}`;
|
|
|
3697
3697
|
const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
|
|
3698
3698
|
if (tmp !== void 0) {
|
|
3699
3699
|
res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
|
|
3700
|
-
separator =
|
|
3700
|
+
separator = join7;
|
|
3701
3701
|
}
|
|
3702
3702
|
}
|
|
3703
3703
|
if (spacer !== "" && separator.length > 1) {
|
|
@@ -3755,20 +3755,20 @@ ${originalIndentation}`;
|
|
|
3755
3755
|
indentation += spacer;
|
|
3756
3756
|
let res2 = `
|
|
3757
3757
|
${indentation}`;
|
|
3758
|
-
const
|
|
3758
|
+
const join8 = `,
|
|
3759
3759
|
${indentation}`;
|
|
3760
3760
|
const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
|
|
3761
3761
|
let i = 0;
|
|
3762
3762
|
for (; i < maximumValuesToStringify - 1; i++) {
|
|
3763
3763
|
const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
|
|
3764
3764
|
res2 += tmp2 !== void 0 ? tmp2 : "null";
|
|
3765
|
-
res2 +=
|
|
3765
|
+
res2 += join8;
|
|
3766
3766
|
}
|
|
3767
3767
|
const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
|
|
3768
3768
|
res2 += tmp !== void 0 ? tmp : "null";
|
|
3769
3769
|
if (value.length - 1 > maximumBreadth) {
|
|
3770
3770
|
const removedKeys = value.length - maximumBreadth - 1;
|
|
3771
|
-
res2 += `${
|
|
3771
|
+
res2 += `${join8}"... ${getItemCount(removedKeys)} not stringified"`;
|
|
3772
3772
|
}
|
|
3773
3773
|
res2 += `
|
|
3774
3774
|
${originalIndentation}`;
|
|
@@ -3784,16 +3784,16 @@ ${originalIndentation}`;
|
|
|
3784
3784
|
return '"[Object]"';
|
|
3785
3785
|
}
|
|
3786
3786
|
indentation += spacer;
|
|
3787
|
-
const
|
|
3787
|
+
const join7 = `,
|
|
3788
3788
|
${indentation}`;
|
|
3789
3789
|
let res = "";
|
|
3790
3790
|
let separator = "";
|
|
3791
3791
|
let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
|
|
3792
3792
|
if (isTypedArrayWithEntries(value)) {
|
|
3793
|
-
res += stringifyTypedArray(value,
|
|
3793
|
+
res += stringifyTypedArray(value, join7, maximumBreadth);
|
|
3794
3794
|
keys = keys.slice(value.length);
|
|
3795
3795
|
maximumPropertiesToStringify -= value.length;
|
|
3796
|
-
separator =
|
|
3796
|
+
separator = join7;
|
|
3797
3797
|
}
|
|
3798
3798
|
if (deterministic) {
|
|
3799
3799
|
keys = sort(keys, comparator);
|
|
@@ -3804,13 +3804,13 @@ ${indentation}`;
|
|
|
3804
3804
|
const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
|
|
3805
3805
|
if (tmp !== void 0) {
|
|
3806
3806
|
res += `${separator}${strEscape(key2)}: ${tmp}`;
|
|
3807
|
-
separator =
|
|
3807
|
+
separator = join7;
|
|
3808
3808
|
}
|
|
3809
3809
|
}
|
|
3810
3810
|
if (keyLength > maximumBreadth) {
|
|
3811
3811
|
const removedKeys = keyLength - maximumBreadth;
|
|
3812
3812
|
res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
|
|
3813
|
-
separator =
|
|
3813
|
+
separator = join7;
|
|
3814
3814
|
}
|
|
3815
3815
|
if (separator !== "") {
|
|
3816
3816
|
res = `
|
|
@@ -8596,6 +8596,250 @@ var require_addon_serialize = __commonJS({
|
|
|
8596
8596
|
}
|
|
8597
8597
|
});
|
|
8598
8598
|
|
|
8599
|
+
// ../../node_modules/.pnpm/@xterm+addon-unicode11@0.10.0-beta.291_@xterm+xterm@6.1.0-beta.291/node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js
|
|
8600
|
+
var require_addon_unicode11 = __commonJS({
|
|
8601
|
+
"../../node_modules/.pnpm/@xterm+addon-unicode11@0.10.0-beta.291_@xterm+xterm@6.1.0-beta.291/node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js"(exports, module) {
|
|
8602
|
+
!(function(e, s) {
|
|
8603
|
+
"object" == typeof exports && "object" == typeof module ? module.exports = s() : "function" == typeof define && define.amd ? define([], s) : "object" == typeof exports ? exports.Unicode11Addon = s() : e.Unicode11Addon = s();
|
|
8604
|
+
})(globalThis, () => (() => {
|
|
8605
|
+
"use strict";
|
|
8606
|
+
var e = { 414(e2, s2, t2) {
|
|
8607
|
+
Object.defineProperty(s2, "__esModule", { value: true }), s2.EventUtils = s2.Emitter = void 0;
|
|
8608
|
+
const i2 = t2(426);
|
|
8609
|
+
var r;
|
|
8610
|
+
s2.Emitter = class {
|
|
8611
|
+
constructor() {
|
|
8612
|
+
this._listeners = [], this._disposed = false;
|
|
8613
|
+
}
|
|
8614
|
+
get event() {
|
|
8615
|
+
return this._event || (this._event = (e3, s3, t3) => {
|
|
8616
|
+
if (this._disposed) return (0, i2.toDisposable)(() => {
|
|
8617
|
+
});
|
|
8618
|
+
const r2 = { fn: e3, thisArgs: s3 };
|
|
8619
|
+
this._listeners.push(r2);
|
|
8620
|
+
const o = (0, i2.toDisposable)(() => {
|
|
8621
|
+
const e4 = this._listeners.indexOf(r2);
|
|
8622
|
+
-1 !== e4 && this._listeners.splice(e4, 1);
|
|
8623
|
+
});
|
|
8624
|
+
return t3 && (Array.isArray(t3) ? t3.push(o) : t3.add(o)), o;
|
|
8625
|
+
}), this._event;
|
|
8626
|
+
}
|
|
8627
|
+
fire(e3) {
|
|
8628
|
+
if (!this._disposed) switch (this._listeners.length) {
|
|
8629
|
+
case 0:
|
|
8630
|
+
return;
|
|
8631
|
+
case 1: {
|
|
8632
|
+
const { fn: s3, thisArgs: t3 } = this._listeners[0];
|
|
8633
|
+
return void s3.call(t3, e3);
|
|
8634
|
+
}
|
|
8635
|
+
default: {
|
|
8636
|
+
const s3 = this._listeners.slice();
|
|
8637
|
+
for (const { fn: t3, thisArgs: i3 } of s3) t3.call(i3, e3);
|
|
8638
|
+
}
|
|
8639
|
+
}
|
|
8640
|
+
}
|
|
8641
|
+
dispose() {
|
|
8642
|
+
this._disposed || (this._disposed = true, this._listeners.length = 0);
|
|
8643
|
+
}
|
|
8644
|
+
}, (function(e3) {
|
|
8645
|
+
e3.forward = function(e4, s3) {
|
|
8646
|
+
return e4((e5) => s3.fire(e5));
|
|
8647
|
+
}, e3.map = function(e4, s3) {
|
|
8648
|
+
return (t3, i3, r2) => e4((e5) => t3.call(i3, s3(e5)), void 0, r2);
|
|
8649
|
+
}, e3.any = function(...e4) {
|
|
8650
|
+
return (s3, t3, r2) => {
|
|
8651
|
+
const o = new i2.DisposableStore();
|
|
8652
|
+
for (const i3 of e4) o.add(i3((e5) => s3.call(t3, e5)));
|
|
8653
|
+
return r2 && (Array.isArray(r2) ? r2.push(o) : r2.add(o)), o;
|
|
8654
|
+
};
|
|
8655
|
+
}, e3.runAndSubscribe = function(e4, s3, t3) {
|
|
8656
|
+
return s3(t3), e4((e5) => s3(e5));
|
|
8657
|
+
};
|
|
8658
|
+
})(r || (s2.EventUtils = r = {}));
|
|
8659
|
+
}, 426(e2, s2) {
|
|
8660
|
+
function t2(e3) {
|
|
8661
|
+
return { dispose: e3 };
|
|
8662
|
+
}
|
|
8663
|
+
function i2(e3) {
|
|
8664
|
+
if (!e3) return e3;
|
|
8665
|
+
if (Array.isArray(e3)) {
|
|
8666
|
+
for (const s3 of e3) s3.dispose();
|
|
8667
|
+
return [];
|
|
8668
|
+
}
|
|
8669
|
+
return e3.dispose(), e3;
|
|
8670
|
+
}
|
|
8671
|
+
Object.defineProperty(s2, "__esModule", { value: true }), s2.MutableDisposable = s2.Disposable = s2.DisposableStore = void 0, s2.toDisposable = t2, s2.dispose = i2, s2.combinedDisposable = function(...e3) {
|
|
8672
|
+
return t2(() => i2(e3));
|
|
8673
|
+
};
|
|
8674
|
+
class r {
|
|
8675
|
+
constructor() {
|
|
8676
|
+
this._disposables = /* @__PURE__ */ new Set(), this._isDisposed = false;
|
|
8677
|
+
}
|
|
8678
|
+
get isDisposed() {
|
|
8679
|
+
return this._isDisposed;
|
|
8680
|
+
}
|
|
8681
|
+
add(e3) {
|
|
8682
|
+
return this._isDisposed ? e3.dispose() : this._disposables.add(e3), e3;
|
|
8683
|
+
}
|
|
8684
|
+
dispose() {
|
|
8685
|
+
if (!this._isDisposed) {
|
|
8686
|
+
this._isDisposed = true;
|
|
8687
|
+
for (const e3 of this._disposables) e3.dispose();
|
|
8688
|
+
this._disposables.clear();
|
|
8689
|
+
}
|
|
8690
|
+
}
|
|
8691
|
+
clear() {
|
|
8692
|
+
for (const e3 of this._disposables) e3.dispose();
|
|
8693
|
+
this._disposables.clear();
|
|
8694
|
+
}
|
|
8695
|
+
}
|
|
8696
|
+
s2.DisposableStore = r;
|
|
8697
|
+
class o {
|
|
8698
|
+
constructor() {
|
|
8699
|
+
this._store = new r();
|
|
8700
|
+
}
|
|
8701
|
+
dispose() {
|
|
8702
|
+
this._store.dispose();
|
|
8703
|
+
}
|
|
8704
|
+
_register(e3) {
|
|
8705
|
+
return this._store.add(e3);
|
|
8706
|
+
}
|
|
8707
|
+
}
|
|
8708
|
+
s2.Disposable = o, o.None = Object.freeze({ dispose() {
|
|
8709
|
+
} }), s2.MutableDisposable = class {
|
|
8710
|
+
constructor() {
|
|
8711
|
+
this._isDisposed = false;
|
|
8712
|
+
}
|
|
8713
|
+
get value() {
|
|
8714
|
+
return this._isDisposed ? void 0 : this._value;
|
|
8715
|
+
}
|
|
8716
|
+
set value(e3) {
|
|
8717
|
+
this._isDisposed || e3 === this._value || (this._value?.dispose(), this._value = e3);
|
|
8718
|
+
}
|
|
8719
|
+
clear() {
|
|
8720
|
+
this.value = void 0;
|
|
8721
|
+
}
|
|
8722
|
+
dispose() {
|
|
8723
|
+
this._isDisposed = true, this._value?.dispose(), this._value = void 0;
|
|
8724
|
+
}
|
|
8725
|
+
};
|
|
8726
|
+
}, 765(e2, s2, t2) {
|
|
8727
|
+
Object.defineProperty(s2, "__esModule", { value: true }), s2.UnicodeService = void 0;
|
|
8728
|
+
const i2 = t2(414);
|
|
8729
|
+
class r {
|
|
8730
|
+
constructor() {
|
|
8731
|
+
this._providers = /* @__PURE__ */ Object.create(null), this._active = "", this._onChange = new i2.Emitter(), this.onChange = this._onChange.event;
|
|
8732
|
+
}
|
|
8733
|
+
static extractShouldJoin(e3) {
|
|
8734
|
+
return !!(1 & e3);
|
|
8735
|
+
}
|
|
8736
|
+
static extractWidth(e3) {
|
|
8737
|
+
return e3 >> 1 & 3;
|
|
8738
|
+
}
|
|
8739
|
+
static extractCharKind(e3) {
|
|
8740
|
+
return e3 >> 3;
|
|
8741
|
+
}
|
|
8742
|
+
static createPropertyValue(e3, s3, t3 = false) {
|
|
8743
|
+
return (16777215 & e3) << 3 | (3 & s3) << 1 | (t3 ? 1 : 0);
|
|
8744
|
+
}
|
|
8745
|
+
dispose() {
|
|
8746
|
+
this._onChange.dispose();
|
|
8747
|
+
}
|
|
8748
|
+
get versions() {
|
|
8749
|
+
return Object.keys(this._providers);
|
|
8750
|
+
}
|
|
8751
|
+
get activeVersion() {
|
|
8752
|
+
return this._active;
|
|
8753
|
+
}
|
|
8754
|
+
set activeVersion(e3) {
|
|
8755
|
+
if (!this._providers[e3]) throw new Error(`unknown Unicode version "${e3}"`);
|
|
8756
|
+
this._active = e3, this._activeProvider = this._providers[e3], this._onChange.fire(e3);
|
|
8757
|
+
}
|
|
8758
|
+
register(e3) {
|
|
8759
|
+
this._providers[e3.version] = e3, this._active || (this.activeVersion = e3.version);
|
|
8760
|
+
}
|
|
8761
|
+
wcwidth(e3) {
|
|
8762
|
+
return this._activeProvider.wcwidth(e3);
|
|
8763
|
+
}
|
|
8764
|
+
getStringCellWidth(e3) {
|
|
8765
|
+
let s3 = 0, t3 = 0;
|
|
8766
|
+
const i3 = e3.length;
|
|
8767
|
+
for (let o = 0; o < i3; ++o) {
|
|
8768
|
+
let n = e3.charCodeAt(o);
|
|
8769
|
+
if (55296 <= n && n <= 56319) {
|
|
8770
|
+
if (++o >= i3) return s3 + this.wcwidth(n);
|
|
8771
|
+
const t4 = e3.charCodeAt(o);
|
|
8772
|
+
56320 <= t4 && t4 <= 57343 ? n = 1024 * (n - 55296) + t4 - 56320 + 65536 : s3 += this.wcwidth(t4);
|
|
8773
|
+
}
|
|
8774
|
+
const d = this.charProperties(n, t3);
|
|
8775
|
+
let c = r.extractWidth(d);
|
|
8776
|
+
r.extractShouldJoin(d) && (c -= r.extractWidth(t3)), s3 += c, t3 = d;
|
|
8777
|
+
}
|
|
8778
|
+
return s3;
|
|
8779
|
+
}
|
|
8780
|
+
charProperties(e3, s3) {
|
|
8781
|
+
return this._activeProvider.charProperties(e3, s3);
|
|
8782
|
+
}
|
|
8783
|
+
}
|
|
8784
|
+
s2.UnicodeService = r;
|
|
8785
|
+
}, 384(e2, s2, t2) {
|
|
8786
|
+
Object.defineProperty(s2, "__esModule", { value: true }), s2.UnicodeV11 = void 0;
|
|
8787
|
+
const i2 = t2(765), r = [[768, 879], [1155, 1161], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1536, 1541], [1552, 1562], [1564, 1564], [1611, 1631], [1648, 1648], [1750, 1757], [1759, 1764], [1767, 1768], [1770, 1773], [1807, 1807], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2045, 2045], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2093], [2137, 2139], [2259, 2306], [2362, 2362], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2391], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2558, 2558], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2641, 2641], [2672, 2673], [2677, 2677], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2810, 2815], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2884], [2893, 2893], [2902, 2902], [2914, 2915], [2946, 2946], [3008, 3008], [3021, 3021], [3072, 3072], [3076, 3076], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3170, 3171], [3201, 3201], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3328, 3329], [3387, 3388], [3393, 3396], [3405, 3405], [3426, 3427], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3981, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4151], [4153, 4154], [4157, 4158], [4184, 4185], [4190, 4192], [4209, 4212], [4226, 4226], [4229, 4230], [4237, 4237], [4253, 4253], [4448, 4607], [4957, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6158], [6277, 6278], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6683, 6683], [6742, 6742], [6744, 6750], [6752, 6752], [6754, 6754], [6757, 6764], [6771, 6780], [6783, 6783], [6832, 6846], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7040, 7041], [7074, 7077], [7080, 7081], [7083, 7085], [7142, 7142], [7144, 7145], [7149, 7149], [7151, 7153], [7212, 7219], [7222, 7223], [7376, 7378], [7380, 7392], [7394, 7400], [7405, 7405], [7412, 7412], [7416, 7417], [7616, 7673], [7675, 7679], [8203, 8207], [8234, 8238], [8288, 8292], [8294, 8303], [8400, 8432], [11503, 11505], [11647, 11647], [11744, 11775], [12330, 12333], [12441, 12442], [42607, 42610], [42612, 42621], [42654, 42655], [42736, 42737], [43010, 43010], [43014, 43014], [43019, 43019], [43045, 43046], [43204, 43205], [43232, 43249], [43263, 43263], [43302, 43309], [43335, 43345], [43392, 43394], [43443, 43443], [43446, 43449], [43452, 43453], [43493, 43493], [43561, 43566], [43569, 43570], [43573, 43574], [43587, 43587], [43596, 43596], [43644, 43644], [43696, 43696], [43698, 43700], [43703, 43704], [43710, 43711], [43713, 43713], [43756, 43757], [43766, 43766], [44005, 44005], [44008, 44008], [44013, 44013], [64286, 64286], [65024, 65039], [65056, 65071], [65279, 65279], [65529, 65531]], o = [[66045, 66045], [66272, 66272], [66422, 66426], [68097, 68099], [68101, 68102], [68108, 68111], [68152, 68154], [68159, 68159], [68325, 68326], [68900, 68903], [69446, 69456], [69633, 69633], [69688, 69702], [69759, 69761], [69811, 69814], [69817, 69818], [69821, 69821], [69837, 69837], [69888, 69890], [69927, 69931], [69933, 69940], [70003, 70003], [70016, 70017], [70070, 70078], [70089, 70092], [70191, 70193], [70196, 70196], [70198, 70199], [70206, 70206], [70367, 70367], [70371, 70378], [70400, 70401], [70459, 70460], [70464, 70464], [70502, 70508], [70512, 70516], [70712, 70719], [70722, 70724], [70726, 70726], [70750, 70750], [70835, 70840], [70842, 70842], [70847, 70848], [70850, 70851], [71090, 71093], [71100, 71101], [71103, 71104], [71132, 71133], [71219, 71226], [71229, 71229], [71231, 71232], [71339, 71339], [71341, 71341], [71344, 71349], [71351, 71351], [71453, 71455], [71458, 71461], [71463, 71467], [71727, 71735], [71737, 71738], [72148, 72151], [72154, 72155], [72160, 72160], [72193, 72202], [72243, 72248], [72251, 72254], [72263, 72263], [72273, 72278], [72281, 72283], [72330, 72342], [72344, 72345], [72752, 72758], [72760, 72765], [72767, 72767], [72850, 72871], [72874, 72880], [72882, 72883], [72885, 72886], [73009, 73014], [73018, 73018], [73020, 73021], [73023, 73029], [73031, 73031], [73104, 73105], [73109, 73109], [73111, 73111], [73459, 73460], [78896, 78904], [92912, 92916], [92976, 92982], [94031, 94031], [94095, 94098], [113821, 113822], [113824, 113827], [119143, 119145], [119155, 119170], [119173, 119179], [119210, 119213], [119362, 119364], [121344, 121398], [121403, 121452], [121461, 121461], [121476, 121476], [121499, 121503], [121505, 121519], [122880, 122886], [122888, 122904], [122907, 122913], [122915, 122916], [122918, 122922], [123184, 123190], [123628, 123631], [125136, 125142], [125252, 125258], [917505, 917505], [917536, 917631], [917760, 917999]], n = [[4352, 4447], [8986, 8987], [9001, 9002], [9193, 9196], [9200, 9200], [9203, 9203], [9725, 9726], [9748, 9749], [9800, 9811], [9855, 9855], [9875, 9875], [9889, 9889], [9898, 9899], [9917, 9918], [9924, 9925], [9934, 9934], [9940, 9940], [9962, 9962], [9970, 9971], [9973, 9973], [9978, 9978], [9981, 9981], [9989, 9989], [9994, 9995], [10024, 10024], [10060, 10060], [10062, 10062], [10067, 10069], [10071, 10071], [10133, 10135], [10160, 10160], [10175, 10175], [11035, 11036], [11088, 11088], [11093, 11093], [11904, 11929], [11931, 12019], [12032, 12245], [12272, 12283], [12288, 12329], [12334, 12350], [12353, 12438], [12443, 12543], [12549, 12591], [12593, 12686], [12688, 12730], [12736, 12771], [12784, 12830], [12832, 12871], [12880, 19903], [19968, 42124], [42128, 42182], [43360, 43388], [44032, 55203], [63744, 64255], [65040, 65049], [65072, 65106], [65108, 65126], [65128, 65131], [65281, 65376], [65504, 65510]], d = [[94176, 94179], [94208, 100343], [100352, 101106], [110592, 110878], [110928, 110930], [110948, 110951], [110960, 111355], [126980, 126980], [127183, 127183], [127374, 127374], [127377, 127386], [127488, 127490], [127504, 127547], [127552, 127560], [127568, 127569], [127584, 127589], [127744, 127776], [127789, 127797], [127799, 127868], [127870, 127891], [127904, 127946], [127951, 127955], [127968, 127984], [127988, 127988], [127992, 128062], [128064, 128064], [128066, 128252], [128255, 128317], [128331, 128334], [128336, 128359], [128378, 128378], [128405, 128406], [128420, 128420], [128507, 128591], [128640, 128709], [128716, 128716], [128720, 128722], [128725, 128725], [128747, 128748], [128756, 128762], [128992, 129003], [129293, 129393], [129395, 129398], [129402, 129442], [129445, 129450], [129454, 129482], [129485, 129535], [129648, 129651], [129656, 129658], [129664, 129666], [129680, 129685], [131072, 196605], [196608, 262141]];
|
|
8788
|
+
let c;
|
|
8789
|
+
function a(e3, s3) {
|
|
8790
|
+
let t3, i3 = 0, r2 = s3.length - 1;
|
|
8791
|
+
if (e3 < s3[0][0] || e3 > s3[r2][1]) return false;
|
|
8792
|
+
for (; r2 >= i3; ) if (t3 = i3 + r2 >> 1, e3 > s3[t3][1]) i3 = t3 + 1;
|
|
8793
|
+
else {
|
|
8794
|
+
if (!(e3 < s3[t3][0])) return true;
|
|
8795
|
+
r2 = t3 - 1;
|
|
8796
|
+
}
|
|
8797
|
+
return false;
|
|
8798
|
+
}
|
|
8799
|
+
s2.UnicodeV11 = class {
|
|
8800
|
+
constructor() {
|
|
8801
|
+
if (this.version = "11", !c) {
|
|
8802
|
+
c = new Uint8Array(65536), c.fill(1), c[0] = 0, c.fill(0, 1, 32), c.fill(0, 127, 160);
|
|
8803
|
+
for (let e3 = 0; e3 < r.length; ++e3) c.fill(0, r[e3][0], r[e3][1] + 1);
|
|
8804
|
+
for (let e3 = 0; e3 < n.length; ++e3) c.fill(2, n[e3][0], n[e3][1] + 1);
|
|
8805
|
+
}
|
|
8806
|
+
}
|
|
8807
|
+
wcwidth(e3) {
|
|
8808
|
+
return e3 < 32 ? 0 : e3 < 127 ? 1 : e3 < 65536 ? c[e3] : a(e3, o) ? 0 : a(e3, d) ? 2 : 1;
|
|
8809
|
+
}
|
|
8810
|
+
charProperties(e3, s3) {
|
|
8811
|
+
let t3 = this.wcwidth(e3), r2 = 0 === t3 && 0 !== s3;
|
|
8812
|
+
if (r2) {
|
|
8813
|
+
const e4 = i2.UnicodeService.extractWidth(s3);
|
|
8814
|
+
0 === e4 ? r2 = false : e4 > t3 && (t3 = e4);
|
|
8815
|
+
}
|
|
8816
|
+
return i2.UnicodeService.createPropertyValue(0, t3, r2);
|
|
8817
|
+
}
|
|
8818
|
+
};
|
|
8819
|
+
} }, s = {};
|
|
8820
|
+
function t(i2) {
|
|
8821
|
+
var r = s[i2];
|
|
8822
|
+
if (void 0 !== r) return r.exports;
|
|
8823
|
+
var o = s[i2] = { exports: {} };
|
|
8824
|
+
return e[i2](o, o.exports, t), o.exports;
|
|
8825
|
+
}
|
|
8826
|
+
var i = {};
|
|
8827
|
+
return (() => {
|
|
8828
|
+
var e2 = i;
|
|
8829
|
+
Object.defineProperty(e2, "__esModule", { value: true }), e2.Unicode11Addon = void 0;
|
|
8830
|
+
const s2 = t(384);
|
|
8831
|
+
e2.Unicode11Addon = class {
|
|
8832
|
+
activate(e3) {
|
|
8833
|
+
e3.unicode.register(new s2.UnicodeV11());
|
|
8834
|
+
}
|
|
8835
|
+
dispose() {
|
|
8836
|
+
}
|
|
8837
|
+
};
|
|
8838
|
+
})(), i;
|
|
8839
|
+
})());
|
|
8840
|
+
}
|
|
8841
|
+
});
|
|
8842
|
+
|
|
8599
8843
|
// terminal-daemon.ts
|
|
8600
8844
|
import { fileURLToPath } from "node:url";
|
|
8601
8845
|
import { parseArgs } from "node:util";
|
|
@@ -8611,15 +8855,22 @@ function createLogger(name) {
|
|
|
8611
8855
|
|
|
8612
8856
|
// src/server/infra/terminals/daemon/daemon-server.ts
|
|
8613
8857
|
import { randomBytes as randomBytes2, timingSafeEqual } from "node:crypto";
|
|
8614
|
-
import { chmodSync as chmodSync2, lstatSync as lstatSync2, readFileSync, renameSync as renameSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
|
|
8858
|
+
import { chmodSync as chmodSync2, lstatSync as lstatSync2, readFileSync as readFileSync2, renameSync as renameSync2, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "node:fs";
|
|
8615
8859
|
import { createServer } from "node:net";
|
|
8616
|
-
import { dirname as dirname3 } from "node:path";
|
|
8860
|
+
import { dirname as dirname3, join as join6 } from "node:path";
|
|
8861
|
+
|
|
8862
|
+
// src/server/infra/terminals/node-pty-loader.ts
|
|
8863
|
+
var cachedImport;
|
|
8864
|
+
function preloadNodePty() {
|
|
8865
|
+
cachedImport ??= import("node-pty");
|
|
8866
|
+
return cachedImport;
|
|
8867
|
+
}
|
|
8617
8868
|
|
|
8618
8869
|
// src/server/infra/terminals/terminal-pool.ts
|
|
8619
8870
|
import { randomUUID } from "node:crypto";
|
|
8620
8871
|
import { existsSync as existsSync2, unlinkSync, writeFileSync } from "node:fs";
|
|
8621
8872
|
import { tmpdir } from "node:os";
|
|
8622
|
-
import { join, sep } from "node:path";
|
|
8873
|
+
import { join as join3, sep } from "node:path";
|
|
8623
8874
|
|
|
8624
8875
|
// src/server/infra/process/path.ts
|
|
8625
8876
|
import { execFile } from "node:child_process";
|
|
@@ -8681,13 +8932,212 @@ async function shellPath() {
|
|
|
8681
8932
|
return fallback;
|
|
8682
8933
|
}
|
|
8683
8934
|
|
|
8935
|
+
// src/server/infra/terminals/claude-resume.ts
|
|
8936
|
+
import { readdirSync, statSync } from "node:fs";
|
|
8937
|
+
import { homedir } from "node:os";
|
|
8938
|
+
import { join } from "node:path";
|
|
8939
|
+
var CLAUDE_COMMAND_PATTERN = /^claude(\s|$)/;
|
|
8940
|
+
var CLAUDE_RESUME_FLAG_PATTERN = /(^|\s)(--resume|-r)(\s|$)/;
|
|
8941
|
+
var SESSION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8942
|
+
function isResumableClaudeCommand(command) {
|
|
8943
|
+
if (!command) return false;
|
|
8944
|
+
const trimmed = command.trim();
|
|
8945
|
+
return CLAUDE_COMMAND_PATTERN.test(trimmed) && !CLAUDE_RESUME_FLAG_PATTERN.test(trimmed);
|
|
8946
|
+
}
|
|
8947
|
+
function claudeProjectDir(cwd) {
|
|
8948
|
+
return join(homedir(), ".claude", "projects", cwd.replaceAll("/", "-"));
|
|
8949
|
+
}
|
|
8950
|
+
function findLatestClaudeSessionId(cwd) {
|
|
8951
|
+
const dir = claudeProjectDir(cwd);
|
|
8952
|
+
let names;
|
|
8953
|
+
try {
|
|
8954
|
+
names = readdirSync(dir).filter((name) => name.endsWith(".jsonl"));
|
|
8955
|
+
} catch {
|
|
8956
|
+
return null;
|
|
8957
|
+
}
|
|
8958
|
+
let newest = null;
|
|
8959
|
+
for (const name of names) {
|
|
8960
|
+
let mtimeMs;
|
|
8961
|
+
try {
|
|
8962
|
+
mtimeMs = statSync(join(dir, name)).mtimeMs;
|
|
8963
|
+
} catch {
|
|
8964
|
+
continue;
|
|
8965
|
+
}
|
|
8966
|
+
if (!newest || mtimeMs > newest.mtimeMs) {
|
|
8967
|
+
newest = { id: name.slice(0, -".jsonl".length), mtimeMs };
|
|
8968
|
+
}
|
|
8969
|
+
}
|
|
8970
|
+
if (!newest || !SESSION_ID_PATTERN.test(newest.id)) return null;
|
|
8971
|
+
return newest.id;
|
|
8972
|
+
}
|
|
8973
|
+
function buildClaudeResumeCommand(originalCommand, sessionId) {
|
|
8974
|
+
return `${originalCommand.trim()} --resume ${sessionId}`;
|
|
8975
|
+
}
|
|
8976
|
+
|
|
8977
|
+
// src/server/infra/terminals/pty-error-hints.ts
|
|
8978
|
+
var MODULE_LOAD_PATTERN = /Cannot find module|MODULE_NOT_FOUND|pty\.node/i;
|
|
8979
|
+
var RESOURCE_EXHAUSTION_PATTERN = /\b(EMFILE|ENFILE|ENOMEM|EAGAIN)\b/;
|
|
8980
|
+
function hintForPtySpawnError(err) {
|
|
8981
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
8982
|
+
if (MODULE_LOAD_PATTERN.test(message)) {
|
|
8983
|
+
return "The terminal service could not load its native module. Restart the terminal service from Settings.";
|
|
8984
|
+
}
|
|
8985
|
+
if (RESOURCE_EXHAUSTION_PATTERN.test(message)) {
|
|
8986
|
+
return "Your system cannot start another terminal process. Close unused terminals and try again.";
|
|
8987
|
+
}
|
|
8988
|
+
return "Failed to start the terminal shell.";
|
|
8989
|
+
}
|
|
8990
|
+
|
|
8991
|
+
// src/server/infra/terminals/terminal-history.ts
|
|
8992
|
+
import { readdirSync as readdirSync2, readFileSync, rmSync } from "node:fs";
|
|
8993
|
+
import { mkdir, rename, writeFile } from "node:fs/promises";
|
|
8994
|
+
import { join as join2 } from "node:path";
|
|
8995
|
+
var log = createLogger("terminal-history");
|
|
8996
|
+
var CHECKPOINT_MAX_BYTES = 5 * 1024 * 1024;
|
|
8997
|
+
var TerminalHistoryManager = class {
|
|
8998
|
+
constructor(historyDir) {
|
|
8999
|
+
this.historyDir = historyDir;
|
|
9000
|
+
}
|
|
9001
|
+
sessionDir(terminalId) {
|
|
9002
|
+
return join2(this.historyDir, encodeURIComponent(terminalId));
|
|
9003
|
+
}
|
|
9004
|
+
readMeta(terminalId) {
|
|
9005
|
+
return readJson(join2(this.sessionDir(terminalId), "meta.json"));
|
|
9006
|
+
}
|
|
9007
|
+
readCheckpoint(terminalId) {
|
|
9008
|
+
return readJson(
|
|
9009
|
+
join2(this.sessionDir(terminalId), "checkpoint.json")
|
|
9010
|
+
);
|
|
9011
|
+
}
|
|
9012
|
+
/**
|
|
9013
|
+
* Async: called from the PTY output hot path (`TerminalPool.onData`), so
|
|
9014
|
+
* this must never block the daemon's single event loop the way the
|
|
9015
|
+
* synchronous `fs` calls it replaced (`writeFileSync`/`renameSync`) would —
|
|
9016
|
+
* a slow or networked filesystem could otherwise delay every other
|
|
9017
|
+
* terminal's output delivery, the exact regression issue #676 fixed for a
|
|
9018
|
+
* different code path.
|
|
9019
|
+
*/
|
|
9020
|
+
async writeMeta(terminalId, meta) {
|
|
9021
|
+
await writeJson(this.sessionDir(terminalId), "meta.json", meta);
|
|
9022
|
+
}
|
|
9023
|
+
async writeCheckpoint(terminalId, checkpoint) {
|
|
9024
|
+
const serialized = JSON.stringify(checkpoint);
|
|
9025
|
+
const bytes = Buffer.byteLength(serialized);
|
|
9026
|
+
if (bytes > CHECKPOINT_MAX_BYTES) {
|
|
9027
|
+
log.warn({ terminalId, bytes }, "terminal history checkpoint too large; skipping this write");
|
|
9028
|
+
return;
|
|
9029
|
+
}
|
|
9030
|
+
await writeJson(this.sessionDir(terminalId), "checkpoint.json", checkpoint, serialized);
|
|
9031
|
+
}
|
|
9032
|
+
/** Drop a terminal's saved history: its tab or workspace was actually closed or deleted. */
|
|
9033
|
+
removeSession(terminalId) {
|
|
9034
|
+
try {
|
|
9035
|
+
rmSync(this.sessionDir(terminalId), { recursive: true, force: true });
|
|
9036
|
+
} catch (err) {
|
|
9037
|
+
log.warn({ err, terminalId }, "failed to remove terminal history directory");
|
|
9038
|
+
}
|
|
9039
|
+
}
|
|
9040
|
+
/**
|
|
9041
|
+
* Drop every saved session whose last known `workspaceId` is `workspaceId`
|
|
9042
|
+
* — used when a workspace is deleted. Scans the whole history directory
|
|
9043
|
+
* rather than the pool's live reverse index, which by then may already be
|
|
9044
|
+
* missing terminals that exited (and were never explicitly killed) before
|
|
9045
|
+
* the workspace was removed.
|
|
9046
|
+
*/
|
|
9047
|
+
removeSessionsForWorkspace(workspaceId) {
|
|
9048
|
+
let names;
|
|
9049
|
+
try {
|
|
9050
|
+
names = readdirSync2(this.historyDir);
|
|
9051
|
+
} catch {
|
|
9052
|
+
return;
|
|
9053
|
+
}
|
|
9054
|
+
for (const name of names) {
|
|
9055
|
+
const dir = join2(this.historyDir, name);
|
|
9056
|
+
const meta = readJson(join2(dir, "meta.json"));
|
|
9057
|
+
if (meta?.workspaceId !== workspaceId) continue;
|
|
9058
|
+
try {
|
|
9059
|
+
rmSync(dir, { recursive: true, force: true });
|
|
9060
|
+
} catch (err) {
|
|
9061
|
+
log.warn({ err, dir }, "failed to remove terminal history directory");
|
|
9062
|
+
}
|
|
9063
|
+
}
|
|
9064
|
+
}
|
|
9065
|
+
};
|
|
9066
|
+
function readJson(path) {
|
|
9067
|
+
try {
|
|
9068
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
9069
|
+
} catch {
|
|
9070
|
+
return null;
|
|
9071
|
+
}
|
|
9072
|
+
}
|
|
9073
|
+
async function writeJson(dir, name, value, serialized) {
|
|
9074
|
+
try {
|
|
9075
|
+
await mkdir(dir, { recursive: true, mode: 448 });
|
|
9076
|
+
const path = join2(dir, name);
|
|
9077
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
9078
|
+
await writeFile(tmp, serialized ?? JSON.stringify(value), { mode: 384 });
|
|
9079
|
+
await rename(tmp, path);
|
|
9080
|
+
} catch (err) {
|
|
9081
|
+
log.warn({ err, dir, name }, "failed to write terminal history file");
|
|
9082
|
+
}
|
|
9083
|
+
}
|
|
9084
|
+
|
|
8684
9085
|
// src/server/infra/terminals/terminal-pool.ts
|
|
8685
|
-
var
|
|
9086
|
+
var log2 = createLogger("terminal-pool");
|
|
8686
9087
|
var MAX_SCROLLBACK_SIZE = 1e5;
|
|
8687
9088
|
var HEADLESS_SCROLLBACK_LINES = 1e4;
|
|
8688
9089
|
var MAX_COLS = 1e3;
|
|
8689
9090
|
var MAX_ROWS = 1e3;
|
|
9091
|
+
var HISTORY_CHECKPOINT_INTERVAL_MS = 1e4;
|
|
9092
|
+
var OutputTail = class {
|
|
9093
|
+
constructor(max) {
|
|
9094
|
+
this.max = max;
|
|
9095
|
+
}
|
|
9096
|
+
chunks = [];
|
|
9097
|
+
/** Index of the oldest chunk still held; earlier slots are dropped. */
|
|
9098
|
+
head = 0;
|
|
9099
|
+
/** Total characters in `chunks[head..]`. */
|
|
9100
|
+
size = 0;
|
|
9101
|
+
get length() {
|
|
9102
|
+
return Math.min(this.size, this.max);
|
|
9103
|
+
}
|
|
9104
|
+
append(data) {
|
|
9105
|
+
if (data.length === 0) return;
|
|
9106
|
+
this.chunks.push(data);
|
|
9107
|
+
this.size += data.length;
|
|
9108
|
+
while (this.size - this.chunks[this.head].length >= this.max) {
|
|
9109
|
+
this.size -= this.chunks[this.head].length;
|
|
9110
|
+
this.head += 1;
|
|
9111
|
+
}
|
|
9112
|
+
if (this.head > 64 && this.head * 2 > this.chunks.length) {
|
|
9113
|
+
this.chunks = this.chunks.slice(this.head);
|
|
9114
|
+
this.head = 0;
|
|
9115
|
+
}
|
|
9116
|
+
}
|
|
9117
|
+
toString() {
|
|
9118
|
+
const joined = this.chunks.slice(this.head).join("");
|
|
9119
|
+
this.chunks = [joined];
|
|
9120
|
+
this.head = 0;
|
|
9121
|
+
return joined.length > this.max ? joined.slice(-this.max) : joined;
|
|
9122
|
+
}
|
|
9123
|
+
};
|
|
8690
9124
|
var TerminalPool = class {
|
|
9125
|
+
historyStore;
|
|
9126
|
+
/**
|
|
9127
|
+
* terminalIds whose next `onExit` should prune (not checkpoint) their
|
|
9128
|
+
* history: set by an explicit `kill` / `killWorkspace`, i.e. the tab or
|
|
9129
|
+
* workspace is actually being closed or deleted. `killAll` (daemon
|
|
9130
|
+
* shutdown/restart) deliberately never adds to this set, so those sessions
|
|
9131
|
+
* stay cold-restorable.
|
|
9132
|
+
*/
|
|
9133
|
+
pruneHistoryOnExit = /* @__PURE__ */ new Set();
|
|
9134
|
+
/**
|
|
9135
|
+
* In-flight history checkpoint writes (see {@link checkpointHistoryNow}).
|
|
9136
|
+
* `hasPendingHistoryWrites` lets the daemon's shutdown wait for these
|
|
9137
|
+
* before exiting, since they are async and no longer complete before
|
|
9138
|
+
* `onExit` returns.
|
|
9139
|
+
*/
|
|
9140
|
+
pendingHistoryWrites = /* @__PURE__ */ new Set();
|
|
8691
9141
|
/** terminalId -> session */
|
|
8692
9142
|
terminals = /* @__PURE__ */ new Map();
|
|
8693
9143
|
/** workspaceId -> Set<terminalId> (reverse index for workspace-level cleanup) */
|
|
@@ -8712,6 +9162,9 @@ var TerminalPool = class {
|
|
|
8712
9162
|
/** terminalIds with a shrink-and-restore nudge in flight (see
|
|
8713
9163
|
* {@link nudgeResize} for why concurrent nudges must not compound). */
|
|
8714
9164
|
nudging = /* @__PURE__ */ new Set();
|
|
9165
|
+
constructor(options) {
|
|
9166
|
+
this.historyStore = options?.historyDir ? new TerminalHistoryManager(options.historyDir) : null;
|
|
9167
|
+
}
|
|
8715
9168
|
/**
|
|
8716
9169
|
* Spawn (or return the already-spawning/spawned) PTY for a terminalId.
|
|
8717
9170
|
*
|
|
@@ -8738,6 +9191,8 @@ var TerminalPool = class {
|
|
|
8738
9191
|
async spawnNew(workspaceId, terminalId, workspaceRoot, options, extras) {
|
|
8739
9192
|
const shell = defaultShell();
|
|
8740
9193
|
const resolvedPath = await shellPath();
|
|
9194
|
+
const historyMeta = this.historyStore?.readMeta(terminalId) ?? null;
|
|
9195
|
+
const checkpoint = historyMeta?.workspaceId === workspaceId ? this.historyStore?.readCheckpoint(terminalId) ?? null : null;
|
|
8741
9196
|
const env = {};
|
|
8742
9197
|
for (const [key, value] of Object.entries(extras?.baseEnv ?? process.env)) {
|
|
8743
9198
|
if (value != null) {
|
|
@@ -8758,18 +9213,14 @@ var TerminalPool = class {
|
|
|
8758
9213
|
env.BAND_DISPATCH = "terminal";
|
|
8759
9214
|
let cwd = workspaceRoot;
|
|
8760
9215
|
if (options?.cwd) {
|
|
8761
|
-
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8767
|
-
|
|
8768
|
-
|
|
8769
|
-
cwd = resolved;
|
|
8770
|
-
} else {
|
|
8771
|
-
log.warn("Ignoring cwd %s \u2014 directory does not exist", options.cwd);
|
|
8772
|
-
}
|
|
9216
|
+
cwd = resolveSafeCwd(join3(workspaceRoot, options.cwd), workspaceRoot, "cwd", options.cwd) ?? cwd;
|
|
9217
|
+
} else if (checkpoint?.cwd) {
|
|
9218
|
+
cwd = resolveSafeCwd(
|
|
9219
|
+
checkpoint.cwd,
|
|
9220
|
+
workspaceRoot,
|
|
9221
|
+
"saved terminal history cwd",
|
|
9222
|
+
checkpoint.cwd
|
|
9223
|
+
) ?? cwd;
|
|
8773
9224
|
}
|
|
8774
9225
|
if (!existsSync2(cwd)) {
|
|
8775
9226
|
throw new Error(`Workspace directory does not exist: ${cwd}`);
|
|
@@ -8777,16 +9228,16 @@ var TerminalPool = class {
|
|
|
8777
9228
|
if (!existsSync2(shell)) {
|
|
8778
9229
|
throw new Error(`Shell not found: ${shell}`);
|
|
8779
9230
|
}
|
|
8780
|
-
|
|
9231
|
+
log2.debug(
|
|
8781
9232
|
"Spawning shell %s in %s for terminal %s (PATH=%s)",
|
|
8782
9233
|
shell,
|
|
8783
9234
|
cwd,
|
|
8784
9235
|
terminalId,
|
|
8785
9236
|
resolvedPath.slice(0, 200)
|
|
8786
9237
|
);
|
|
8787
|
-
const nodePty = await import("node-pty");
|
|
8788
9238
|
let ptyProcess;
|
|
8789
9239
|
try {
|
|
9240
|
+
const nodePty = await preloadNodePty();
|
|
8790
9241
|
ptyProcess = nodePty.spawn(shell, [], {
|
|
8791
9242
|
name: "xterm-256color",
|
|
8792
9243
|
cols: 80,
|
|
@@ -8796,8 +9247,8 @@ var TerminalPool = class {
|
|
|
8796
9247
|
});
|
|
8797
9248
|
} catch (err) {
|
|
8798
9249
|
const msg = err instanceof Error ? err.message : String(err);
|
|
8799
|
-
|
|
8800
|
-
throw err;
|
|
9250
|
+
log2.error("pty.spawn failed: %s (shell=%s, cwd=%s)", msg, shell, cwd);
|
|
9251
|
+
throw new Error(hintForPtySpawnError(err));
|
|
8801
9252
|
}
|
|
8802
9253
|
let headless;
|
|
8803
9254
|
let serializeAddon;
|
|
@@ -8806,6 +9257,8 @@ var TerminalPool = class {
|
|
|
8806
9257
|
const { Terminal } = "Terminal" in headlessNs ? headlessNs : headlessNs.default;
|
|
8807
9258
|
const serializeNs = await Promise.resolve().then(() => __toESM(require_addon_serialize(), 1));
|
|
8808
9259
|
const { SerializeAddon } = "SerializeAddon" in serializeNs ? serializeNs : serializeNs.default;
|
|
9260
|
+
const unicode11Ns = await Promise.resolve().then(() => __toESM(require_addon_unicode11(), 1));
|
|
9261
|
+
const { Unicode11Addon } = "Unicode11Addon" in unicode11Ns ? unicode11Ns : unicode11Ns.default;
|
|
8809
9262
|
headless = new Terminal({
|
|
8810
9263
|
cols: 80,
|
|
8811
9264
|
rows: 24,
|
|
@@ -8814,24 +9267,43 @@ var TerminalPool = class {
|
|
|
8814
9267
|
});
|
|
8815
9268
|
serializeAddon = new SerializeAddon();
|
|
8816
9269
|
headless.loadAddon(serializeAddon);
|
|
9270
|
+
headless.loadAddon(
|
|
9271
|
+
new Unicode11Addon()
|
|
9272
|
+
);
|
|
9273
|
+
headless.unicode.activeVersion = "11";
|
|
8817
9274
|
} catch (err) {
|
|
8818
9275
|
ptyProcess.kill();
|
|
8819
9276
|
const msg = err instanceof Error ? err.message : String(err);
|
|
8820
|
-
|
|
9277
|
+
log2.error("headless mirror setup failed for terminal %s: %s", terminalId, msg);
|
|
8821
9278
|
throw err;
|
|
8822
9279
|
}
|
|
8823
9280
|
const session = {
|
|
8824
9281
|
pty: ptyProcess,
|
|
8825
|
-
scrollback:
|
|
9282
|
+
scrollback: new OutputTail(MAX_SCROLLBACK_SIZE),
|
|
8826
9283
|
headless,
|
|
8827
9284
|
serializeAddon,
|
|
8828
9285
|
workspaceId,
|
|
8829
9286
|
seq: 0,
|
|
8830
|
-
|
|
9287
|
+
holds: 0,
|
|
9288
|
+
cleanupOnExit: extras?.cleanupOnExit ?? false,
|
|
9289
|
+
history: this.historyStore ? {
|
|
9290
|
+
cwd,
|
|
9291
|
+
startedAt: historyMeta?.startedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
9292
|
+
sessionCommand: options?.command ?? historyMeta?.sessionCommand,
|
|
9293
|
+
lastCheckpointAt: 0
|
|
9294
|
+
} : void 0
|
|
8831
9295
|
};
|
|
8832
9296
|
this.terminals.set(terminalId, session);
|
|
8833
|
-
if (
|
|
8834
|
-
|
|
9297
|
+
if (checkpoint) {
|
|
9298
|
+
const restored = `${checkpoint.scrollback}\r
|
|
9299
|
+
\x1B[90m--- session restored ---\x1B[0m\r
|
|
9300
|
+
`;
|
|
9301
|
+
session.scrollback.append(restored);
|
|
9302
|
+
session.headless.write(restored);
|
|
9303
|
+
}
|
|
9304
|
+
const commandToRun = options?.command ?? this.claudeResumeCommand(checkpoint, historyMeta, cwd);
|
|
9305
|
+
if (commandToRun) {
|
|
9306
|
+
this.autoRunCommand(session, commandToRun);
|
|
8835
9307
|
}
|
|
8836
9308
|
let ids = this.workspaceTerminals.get(workspaceId);
|
|
8837
9309
|
if (!ids) {
|
|
@@ -8840,10 +9312,7 @@ var TerminalPool = class {
|
|
|
8840
9312
|
}
|
|
8841
9313
|
ids.add(terminalId);
|
|
8842
9314
|
ptyProcess.onData((data) => {
|
|
8843
|
-
session.scrollback
|
|
8844
|
-
if (session.scrollback.length > MAX_SCROLLBACK_SIZE) {
|
|
8845
|
-
session.scrollback = session.scrollback.slice(-MAX_SCROLLBACK_SIZE);
|
|
8846
|
-
}
|
|
9315
|
+
session.scrollback.append(data);
|
|
8847
9316
|
session.headless.write(data);
|
|
8848
9317
|
session.seq += 1;
|
|
8849
9318
|
const seq = session.seq;
|
|
@@ -8856,9 +9325,10 @@ var TerminalPool = class {
|
|
|
8856
9325
|
}
|
|
8857
9326
|
}
|
|
8858
9327
|
}
|
|
9328
|
+
this.maybeCheckpointHistory(terminalId, session);
|
|
8859
9329
|
});
|
|
8860
9330
|
ptyProcess.onExit(({ exitCode: exitCode2 }) => {
|
|
8861
|
-
|
|
9331
|
+
log2.debug("Terminal exited: %s (workspace %s)", terminalId, workspaceId);
|
|
8862
9332
|
const explicitlyKilled = !this.terminals.has(terminalId);
|
|
8863
9333
|
this.terminals.delete(terminalId);
|
|
8864
9334
|
this.outputListeners.delete(terminalId);
|
|
@@ -8875,6 +9345,13 @@ var TerminalPool = class {
|
|
|
8875
9345
|
} catch {
|
|
8876
9346
|
}
|
|
8877
9347
|
}
|
|
9348
|
+
if (this.historyStore) {
|
|
9349
|
+
if (this.pruneHistoryOnExit.delete(terminalId)) {
|
|
9350
|
+
this.historyStore.removeSession(terminalId);
|
|
9351
|
+
} else if (session.history) {
|
|
9352
|
+
this.checkpointHistoryNow(terminalId, session);
|
|
9353
|
+
}
|
|
9354
|
+
}
|
|
8878
9355
|
session.headless.dispose();
|
|
8879
9356
|
const event = {
|
|
8880
9357
|
terminalId,
|
|
@@ -8887,12 +9364,86 @@ var TerminalPool = class {
|
|
|
8887
9364
|
try {
|
|
8888
9365
|
listener(event);
|
|
8889
9366
|
} catch (err) {
|
|
8890
|
-
|
|
9367
|
+
log2.warn("exit listener threw for terminal %s: %s", terminalId, err);
|
|
8891
9368
|
}
|
|
8892
9369
|
}
|
|
8893
9370
|
});
|
|
8894
9371
|
return session;
|
|
8895
9372
|
}
|
|
9373
|
+
/**
|
|
9374
|
+
* A resumable Claude Code command for a cold-restored terminal, or
|
|
9375
|
+
* `undefined` if this isn't one: the checkpoint's saved command must look
|
|
9376
|
+
* like a plain `claude` invocation (see `claude-resume.ts`) and there must
|
|
9377
|
+
* be a Claude Code session transcript for `cwd`. Scoped to Claude Code
|
|
9378
|
+
* only — its on-disk session layout is documented and stable; other
|
|
9379
|
+
* agents' formats weren't verified for this feature.
|
|
9380
|
+
*
|
|
9381
|
+
* Takes the already boundary-checked `cwd` the new shell is actually
|
|
9382
|
+
* spawning in, not the checkpoint's raw saved cwd: if that saved cwd fell
|
|
9383
|
+
* outside the workspace root and `cwd` fell back to `workspaceRoot`, the
|
|
9384
|
+
* resume lookup must follow, not probe a directory the spawn itself
|
|
9385
|
+
* decided not to trust.
|
|
9386
|
+
*/
|
|
9387
|
+
claudeResumeCommand(checkpoint, meta, cwd) {
|
|
9388
|
+
const command = meta?.sessionCommand;
|
|
9389
|
+
if (!checkpoint || !command || !isResumableClaudeCommand(command)) return void 0;
|
|
9390
|
+
const sessionId = findLatestClaudeSessionId(cwd);
|
|
9391
|
+
return sessionId ? buildClaudeResumeCommand(command, sessionId) : void 0;
|
|
9392
|
+
}
|
|
9393
|
+
/**
|
|
9394
|
+
* Checkpoint at most every `HISTORY_CHECKPOINT_INTERVAL_MS`, driven by
|
|
9395
|
+
* output arriving. Deferred off the PTY-output hot path via `setImmediate`:
|
|
9396
|
+
* `serialize()` is synchronous CPU work proportional to the scrollback
|
|
9397
|
+
* size, and running it inline in `onData` would delay delivering this (and
|
|
9398
|
+
* every other terminal's already-pending) output on the daemon's single
|
|
9399
|
+
* event loop — the class of regression issue #676 fixed for a different
|
|
9400
|
+
* code path.
|
|
9401
|
+
*/
|
|
9402
|
+
maybeCheckpointHistory(terminalId, session) {
|
|
9403
|
+
if (!this.historyStore || !session.history) return;
|
|
9404
|
+
const now = Date.now();
|
|
9405
|
+
if (now - session.history.lastCheckpointAt < HISTORY_CHECKPOINT_INTERVAL_MS) return;
|
|
9406
|
+
session.history.lastCheckpointAt = now;
|
|
9407
|
+
setImmediate(() => {
|
|
9408
|
+
if (this.terminals.get(terminalId) === session) {
|
|
9409
|
+
this.checkpointHistoryNow(terminalId, session);
|
|
9410
|
+
}
|
|
9411
|
+
});
|
|
9412
|
+
}
|
|
9413
|
+
/**
|
|
9414
|
+
* Serializes the current screen synchronously — the only part of a
|
|
9415
|
+
* checkpoint that must be, since it must run before `headless.dispose()` on
|
|
9416
|
+
* exit — then hands the actual write off to `TerminalHistoryManager`'s async,
|
|
9417
|
+
* non-blocking I/O. The write is tracked in {@link pendingHistoryWrites} so
|
|
9418
|
+
* a daemon shutdown can wait for it rather than exiting mid-write and
|
|
9419
|
+
* losing a session's last checkpoint; `TerminalHistoryManager` logs its own
|
|
9420
|
+
* failures and never rejects, so there is nothing for this method's caller
|
|
9421
|
+
* to await or catch.
|
|
9422
|
+
*/
|
|
9423
|
+
checkpointHistoryNow(terminalId, session) {
|
|
9424
|
+
if (!this.historyStore || !session.history) return;
|
|
9425
|
+
const { cols, rows } = session.headless;
|
|
9426
|
+
const { cwd, startedAt, sessionCommand } = session.history;
|
|
9427
|
+
const pending = Promise.all([
|
|
9428
|
+
this.historyStore.writeCheckpoint(terminalId, {
|
|
9429
|
+
scrollback: session.serializeAddon.serialize(),
|
|
9430
|
+
cwd,
|
|
9431
|
+
cols,
|
|
9432
|
+
rows
|
|
9433
|
+
}),
|
|
9434
|
+
this.historyStore.writeMeta(terminalId, {
|
|
9435
|
+
workspaceId: session.workspaceId,
|
|
9436
|
+
cwd,
|
|
9437
|
+
cols,
|
|
9438
|
+
rows,
|
|
9439
|
+
startedAt,
|
|
9440
|
+
checkpointedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
9441
|
+
sessionCommand
|
|
9442
|
+
})
|
|
9443
|
+
]);
|
|
9444
|
+
this.pendingHistoryWrites.add(pending);
|
|
9445
|
+
void pending.finally(() => this.pendingHistoryWrites.delete(pending));
|
|
9446
|
+
}
|
|
8896
9447
|
/**
|
|
8897
9448
|
* Auto-run the workspace's initial command inside a freshly spawned PTY,
|
|
8898
9449
|
* robustly.
|
|
@@ -8924,12 +9475,12 @@ var TerminalPool = class {
|
|
|
8924
9475
|
const pty = session.pty;
|
|
8925
9476
|
let cmdFile;
|
|
8926
9477
|
try {
|
|
8927
|
-
cmdFile =
|
|
9478
|
+
cmdFile = join3(tmpdir(), `band-autorun-${randomUUID()}.sh`);
|
|
8928
9479
|
writeFileSync(cmdFile, `${command}
|
|
8929
9480
|
`, { encoding: "utf-8", mode: 384, flag: "wx" });
|
|
8930
9481
|
session.autoRunFile = cmdFile;
|
|
8931
9482
|
} catch (err) {
|
|
8932
|
-
|
|
9483
|
+
log2.warn(
|
|
8933
9484
|
"autoRunCommand: temp-file staging failed (%s); writing command directly",
|
|
8934
9485
|
err instanceof Error ? err.message : String(err)
|
|
8935
9486
|
);
|
|
@@ -8947,7 +9498,7 @@ var TerminalPool = class {
|
|
|
8947
9498
|
try {
|
|
8948
9499
|
pty.write(sourceLine);
|
|
8949
9500
|
} catch (err) {
|
|
8950
|
-
|
|
9501
|
+
log2.warn("autoRunCommand: failed to inject command line (%s)", err);
|
|
8951
9502
|
}
|
|
8952
9503
|
};
|
|
8953
9504
|
let dataDisposed = false;
|
|
@@ -9085,8 +9636,9 @@ var TerminalPool = class {
|
|
|
9085
9636
|
getScrollback(terminalId, lines) {
|
|
9086
9637
|
const session = this.terminals.get(terminalId);
|
|
9087
9638
|
if (!session) return null;
|
|
9088
|
-
|
|
9089
|
-
|
|
9639
|
+
const scrollback = session.scrollback.toString();
|
|
9640
|
+
if (lines == null) return scrollback;
|
|
9641
|
+
const allLines = scrollback.split("\n");
|
|
9090
9642
|
return allLines.slice(-lines).join("\n");
|
|
9091
9643
|
}
|
|
9092
9644
|
/**
|
|
@@ -9129,7 +9681,7 @@ var TerminalPool = class {
|
|
|
9129
9681
|
const session = this.terminals.get(terminalId);
|
|
9130
9682
|
if (!session) return null;
|
|
9131
9683
|
if (session.scrollback.length === 0) return { data: "", seq: session.seq };
|
|
9132
|
-
|
|
9684
|
+
this.holdOutput(terminalId);
|
|
9133
9685
|
let deathWatch;
|
|
9134
9686
|
let drainCap;
|
|
9135
9687
|
try {
|
|
@@ -9147,9 +9699,27 @@ var TerminalPool = class {
|
|
|
9147
9699
|
} finally {
|
|
9148
9700
|
if (deathWatch) clearInterval(deathWatch);
|
|
9149
9701
|
if (drainCap) clearTimeout(drainCap);
|
|
9150
|
-
if (this.terminals.get(terminalId) === session)
|
|
9702
|
+
if (this.terminals.get(terminalId) === session) this.releaseOutput(terminalId);
|
|
9151
9703
|
}
|
|
9152
9704
|
}
|
|
9705
|
+
/**
|
|
9706
|
+
* Stop reading the terminal's PTY until a matching {@link releaseOutput}.
|
|
9707
|
+
* The shell blocks once the kernel's PTY buffer fills, so a flood stops at
|
|
9708
|
+
* its source instead of piling up in memory. Holds nest.
|
|
9709
|
+
*/
|
|
9710
|
+
holdOutput(terminalId) {
|
|
9711
|
+
const session = this.terminals.get(terminalId);
|
|
9712
|
+
if (!session) return;
|
|
9713
|
+
session.holds += 1;
|
|
9714
|
+
if (session.holds === 1) session.pty.pause();
|
|
9715
|
+
}
|
|
9716
|
+
/** Undo one {@link holdOutput}; the PTY resumes when the last is released. */
|
|
9717
|
+
releaseOutput(terminalId) {
|
|
9718
|
+
const session = this.terminals.get(terminalId);
|
|
9719
|
+
if (!session || session.holds === 0) return;
|
|
9720
|
+
session.holds -= 1;
|
|
9721
|
+
if (session.holds === 0) session.pty.resume();
|
|
9722
|
+
}
|
|
9153
9723
|
/**
|
|
9154
9724
|
* Writes data to a terminal's PTY stdin.
|
|
9155
9725
|
* Returns false if the terminal is not found.
|
|
@@ -9181,7 +9751,7 @@ var TerminalPool = class {
|
|
|
9181
9751
|
try {
|
|
9182
9752
|
snapshot = await this.serialize(terminalId);
|
|
9183
9753
|
} catch (err) {
|
|
9184
|
-
|
|
9754
|
+
log2.error("Failed to serialize terminal %s for replay: %s", terminalId, err);
|
|
9185
9755
|
snapshot = { data: "", seq: 0 };
|
|
9186
9756
|
}
|
|
9187
9757
|
if (!snapshot) {
|
|
@@ -9224,6 +9794,7 @@ var TerminalPool = class {
|
|
|
9224
9794
|
kill(terminalId) {
|
|
9225
9795
|
const session = this.terminals.get(terminalId);
|
|
9226
9796
|
if (session) {
|
|
9797
|
+
this.pruneHistoryOnExit.add(terminalId);
|
|
9227
9798
|
session.pty.kill();
|
|
9228
9799
|
this.terminals.delete(terminalId);
|
|
9229
9800
|
const set = this.workspaceTerminals.get(session.workspaceId);
|
|
@@ -9233,6 +9804,8 @@ var TerminalPool = class {
|
|
|
9233
9804
|
this.workspaceTerminals.delete(session.workspaceId);
|
|
9234
9805
|
}
|
|
9235
9806
|
}
|
|
9807
|
+
} else {
|
|
9808
|
+
this.historyStore?.removeSession(terminalId);
|
|
9236
9809
|
}
|
|
9237
9810
|
}
|
|
9238
9811
|
/**
|
|
@@ -9240,15 +9813,18 @@ var TerminalPool = class {
|
|
|
9240
9813
|
*/
|
|
9241
9814
|
killWorkspace(workspaceId) {
|
|
9242
9815
|
const ids = this.workspaceTerminals.get(workspaceId);
|
|
9243
|
-
if (
|
|
9244
|
-
|
|
9245
|
-
|
|
9246
|
-
|
|
9247
|
-
|
|
9248
|
-
|
|
9816
|
+
if (ids) {
|
|
9817
|
+
for (const terminalId of ids) {
|
|
9818
|
+
const session = this.terminals.get(terminalId);
|
|
9819
|
+
if (session) {
|
|
9820
|
+
this.pruneHistoryOnExit.add(terminalId);
|
|
9821
|
+
session.pty.kill();
|
|
9822
|
+
this.terminals.delete(terminalId);
|
|
9823
|
+
}
|
|
9249
9824
|
}
|
|
9825
|
+
this.workspaceTerminals.delete(workspaceId);
|
|
9250
9826
|
}
|
|
9251
|
-
this.
|
|
9827
|
+
this.historyStore?.removeSessionsForWorkspace(workspaceId);
|
|
9252
9828
|
}
|
|
9253
9829
|
/**
|
|
9254
9830
|
* Kill every tracked PTY (server shutdown path).
|
|
@@ -9261,7 +9837,27 @@ var TerminalPool = class {
|
|
|
9261
9837
|
this.workspaceTerminals.clear();
|
|
9262
9838
|
this.outputListeners.clear();
|
|
9263
9839
|
}
|
|
9840
|
+
/**
|
|
9841
|
+
* True while a history checkpoint write is still in flight. The daemon's
|
|
9842
|
+
* shutdown polls this alongside its shells' liveness so it never exits
|
|
9843
|
+
* mid-write and loses the last checkpoint a dying session's `onExit`
|
|
9844
|
+
* kicked off (see {@link checkpointHistoryNow}).
|
|
9845
|
+
*/
|
|
9846
|
+
hasPendingHistoryWrites() {
|
|
9847
|
+
return this.pendingHistoryWrites.size > 0;
|
|
9848
|
+
}
|
|
9264
9849
|
};
|
|
9850
|
+
function resolveSafeCwd(candidate, workspaceRoot, label, original) {
|
|
9851
|
+
if (candidate !== workspaceRoot && !candidate.startsWith(workspaceRoot + sep)) {
|
|
9852
|
+
log2.warn("Ignoring %s %s \u2014 resolves outside workspace root %s", label, original, workspaceRoot);
|
|
9853
|
+
return null;
|
|
9854
|
+
}
|
|
9855
|
+
if (!existsSync2(candidate)) {
|
|
9856
|
+
log2.warn("Ignoring %s %s \u2014 directory does not exist", label, original);
|
|
9857
|
+
return null;
|
|
9858
|
+
}
|
|
9859
|
+
return candidate;
|
|
9860
|
+
}
|
|
9265
9861
|
|
|
9266
9862
|
// src/server/infra/terminals/daemon/endpoint.ts
|
|
9267
9863
|
import { randomBytes } from "node:crypto";
|
|
@@ -9271,11 +9867,11 @@ import {
|
|
|
9271
9867
|
lstatSync,
|
|
9272
9868
|
mkdirSync,
|
|
9273
9869
|
renameSync,
|
|
9274
|
-
statSync,
|
|
9870
|
+
statSync as statSync2,
|
|
9275
9871
|
unlinkSync as unlinkSync2
|
|
9276
9872
|
} from "node:fs";
|
|
9277
9873
|
import { connect } from "node:net";
|
|
9278
|
-
import { dirname, join as
|
|
9874
|
+
import { dirname, join as join4 } from "node:path";
|
|
9279
9875
|
var PROBE_TIMEOUT_MS = 500;
|
|
9280
9876
|
var PUBLISH_ATTEMPTS = 3;
|
|
9281
9877
|
function isProvenDead(outcome) {
|
|
@@ -9310,10 +9906,10 @@ function probeEndpoint(socketPath) {
|
|
|
9310
9906
|
});
|
|
9311
9907
|
}
|
|
9312
9908
|
function privateBindPath(socketPath) {
|
|
9313
|
-
return
|
|
9909
|
+
return join4(dirname(socketPath), `.p${randomBytes(5).toString("hex")}`);
|
|
9314
9910
|
}
|
|
9315
9911
|
async function publishEndpoint(boundPath, canonicalPath, supersede2) {
|
|
9316
|
-
const identity = entryIdentity(boundPath,
|
|
9912
|
+
const identity = entryIdentity(boundPath, statSync2);
|
|
9317
9913
|
if (!identity) throw new Error(`Cannot stat the bound daemon socket at ${boundPath}`);
|
|
9318
9914
|
for (let attempt = 0; attempt < PUBLISH_ATTEMPTS; attempt++) {
|
|
9319
9915
|
try {
|
|
@@ -9370,7 +9966,7 @@ function sameEntry(a, b) {
|
|
|
9370
9966
|
function confirmPublished(canonicalPath, identity, superseded) {
|
|
9371
9967
|
let published;
|
|
9372
9968
|
try {
|
|
9373
|
-
const stats =
|
|
9969
|
+
const stats = statSync2(canonicalPath, { bigint: true });
|
|
9374
9970
|
published = { dev: stats.dev, ino: stats.ino };
|
|
9375
9971
|
} catch (err) {
|
|
9376
9972
|
return errorCode(err) === "ENOENT" ? { status: "lost" } : { status: "inconclusive" };
|
|
@@ -9379,7 +9975,7 @@ function confirmPublished(canonicalPath, identity, superseded) {
|
|
|
9379
9975
|
}
|
|
9380
9976
|
function endpointOwnership(canonicalPath, owned) {
|
|
9381
9977
|
try {
|
|
9382
|
-
const stats =
|
|
9978
|
+
const stats = statSync2(canonicalPath, { bigint: true });
|
|
9383
9979
|
return stats.dev === owned.dev && stats.ino === owned.ino ? "owned" : "lost";
|
|
9384
9980
|
} catch (err) {
|
|
9385
9981
|
return errorCode(err) === "ENOENT" ? "lost" : "indeterminate";
|
|
@@ -9407,36 +10003,37 @@ function errorCode(err) {
|
|
|
9407
10003
|
|
|
9408
10004
|
// src/server/infra/terminals/daemon/protocol.ts
|
|
9409
10005
|
import { createHash } from "node:crypto";
|
|
9410
|
-
import { basename, dirname as dirname2, join as
|
|
10006
|
+
import { basename, dirname as dirname2, join as join5 } from "node:path";
|
|
9411
10007
|
var PROTOCOL_VERSION = 1;
|
|
9412
10008
|
var EXIT_ENDPOINT_OCCUPIED = 20;
|
|
9413
10009
|
var EXIT_ENDPOINT_UNAVAILABLE = 21;
|
|
10010
|
+
var EXIT_NODE_PTY_UNAVAILABLE = 22;
|
|
9414
10011
|
var ENDPOINT_LOST_ERROR = "Terminal daemon no longer owns its endpoint";
|
|
9415
10012
|
var MAX_SOCKET_PATH_BYTES = 103;
|
|
9416
10013
|
function daemonPaths(runDir2, version = PROTOCOL_VERSION) {
|
|
9417
|
-
const inRunDir =
|
|
9418
|
-
const socket = Buffer.byteLength(inRunDir) <= MAX_SOCKET_PATH_BYTES ? inRunDir :
|
|
10014
|
+
const inRunDir = join5(runDir2, `terminal-daemon-v${version}.sock`);
|
|
10015
|
+
const socket = Buffer.byteLength(inRunDir) <= MAX_SOCKET_PATH_BYTES ? inRunDir : join5(
|
|
9419
10016
|
shortSocketDir(),
|
|
9420
10017
|
`td-${createHash("sha256").update(runDir2).digest("hex").slice(0, 16)}-v${version}.sock`
|
|
9421
10018
|
);
|
|
9422
10019
|
return {
|
|
9423
10020
|
runDir: runDir2,
|
|
9424
10021
|
socket,
|
|
9425
|
-
token:
|
|
9426
|
-
pid:
|
|
9427
|
-
log:
|
|
10022
|
+
token: join5(runDir2, `terminal-daemon-v${version}.token`),
|
|
10023
|
+
pid: join5(runDir2, `terminal-daemon-v${version}.pid`),
|
|
10024
|
+
log: join5(runDir2, "terminal-daemon.log")
|
|
9428
10025
|
};
|
|
9429
10026
|
}
|
|
9430
10027
|
function retiredDaemonPaths(paths, tag) {
|
|
9431
10028
|
return {
|
|
9432
10029
|
...paths,
|
|
9433
|
-
socket:
|
|
10030
|
+
socket: join5(dirname2(paths.socket), `.r${tag}`),
|
|
9434
10031
|
token: paths.token.replace(/\.token$/, `.retired-${tag}.token`),
|
|
9435
10032
|
pid: paths.pid.replace(/\.pid$/, `.retired-${tag}.pid`)
|
|
9436
10033
|
};
|
|
9437
10034
|
}
|
|
9438
10035
|
function shortSocketDir() {
|
|
9439
|
-
return
|
|
10036
|
+
return join5("/tmp", `band-${process.getuid?.() ?? "user"}`);
|
|
9440
10037
|
}
|
|
9441
10038
|
function writeFrame(socket, message) {
|
|
9442
10039
|
socket.write(`${JSON.stringify(message)}
|
|
@@ -9483,18 +10080,26 @@ function readFrames(socket, onFrame, maxLineBytes = 64 * 1024 * 1024) {
|
|
|
9483
10080
|
}
|
|
9484
10081
|
|
|
9485
10082
|
// src/server/infra/terminals/daemon/daemon-server.ts
|
|
9486
|
-
var
|
|
10083
|
+
var log3 = createLogger("terminal-daemon");
|
|
9487
10084
|
var HELLO_TIMEOUT_MS = 5e3;
|
|
9488
10085
|
var WATCHDOG_INTERVAL_MS = 2e3;
|
|
9489
10086
|
var SHUTDOWN_GRACE_MS = 2e3;
|
|
9490
10087
|
var INITIAL_ADOPTION_MS = 2 * 6e4;
|
|
9491
10088
|
var MAX_STREAM_BACKLOG_BYTES = 64 * 1024 * 1024;
|
|
10089
|
+
var STREAM_HOLD_BYTES = 128 * 1024;
|
|
10090
|
+
var SMALL_SESSION_CHARS = 4 * 1024;
|
|
9492
10091
|
async function runDaemon(options) {
|
|
9493
10092
|
const { paths, buildId, supersede: supersede2 } = options;
|
|
10093
|
+
try {
|
|
10094
|
+
await preloadNodePty();
|
|
10095
|
+
} catch (err) {
|
|
10096
|
+
log3.error({ err }, "terminal daemon could not load its native module (node-pty); exiting");
|
|
10097
|
+
return EXIT_NODE_PTY_UNAVAILABLE;
|
|
10098
|
+
}
|
|
9494
10099
|
ensurePrivateDir(paths.runDir);
|
|
9495
10100
|
ensurePrivateDir(dirname3(paths.socket));
|
|
9496
10101
|
const token = randomBytes2(32).toString("hex");
|
|
9497
|
-
const pool = new TerminalPool();
|
|
10102
|
+
const pool = new TerminalPool({ historyDir: join6(dirname3(paths.runDir), "terminal-history") });
|
|
9498
10103
|
const clients = /* @__PURE__ */ new Map();
|
|
9499
10104
|
let shuttingDown = false;
|
|
9500
10105
|
let openConnections = 0;
|
|
@@ -9526,13 +10131,13 @@ async function runDaemon(options) {
|
|
|
9526
10131
|
retired = null;
|
|
9527
10132
|
}
|
|
9528
10133
|
if (outcome.status !== "published") {
|
|
9529
|
-
|
|
10134
|
+
log3.warn({ outcome: outcome.status }, "terminal daemon could not publish its endpoint");
|
|
9530
10135
|
await closeServer(server);
|
|
9531
10136
|
return outcome.status === "occupied" ? EXIT_ENDPOINT_OCCUPIED : EXIT_ENDPOINT_UNAVAILABLE;
|
|
9532
10137
|
}
|
|
9533
10138
|
const identity = outcome.identity;
|
|
9534
10139
|
if (retired) {
|
|
9535
|
-
|
|
10140
|
+
log3.info({ retired: retired.socket }, "terminal daemon superseded a daemon of another build");
|
|
9536
10141
|
}
|
|
9537
10142
|
let probingRetired = false;
|
|
9538
10143
|
writePrivateFile(paths.token, token);
|
|
@@ -9545,10 +10150,11 @@ async function runDaemon(options) {
|
|
|
9545
10150
|
entry: options.entry
|
|
9546
10151
|
};
|
|
9547
10152
|
writePrivateFile(paths.pid, JSON.stringify(pidRecord));
|
|
9548
|
-
|
|
10153
|
+
log3.info({ pid: process.pid, socket: paths.socket, buildId }, "terminal daemon ready");
|
|
9549
10154
|
pool.onExit((event) => {
|
|
9550
10155
|
for (const client of clients.values()) {
|
|
9551
10156
|
client.attached.delete(event.terminalId);
|
|
10157
|
+
client.held.delete(event.terminalId);
|
|
9552
10158
|
send(client, "stream", { t: "exit", ...event });
|
|
9553
10159
|
}
|
|
9554
10160
|
reevaluateIdle();
|
|
@@ -9560,7 +10166,7 @@ async function runDaemon(options) {
|
|
|
9560
10166
|
}
|
|
9561
10167
|
if (!endpointLost && endpointOwnership(paths.socket, identity) === "lost") {
|
|
9562
10168
|
endpointLost = true;
|
|
9563
|
-
|
|
10169
|
+
log3.warn({ sessions: pool.size }, "terminal daemon lost its endpoint; draining");
|
|
9564
10170
|
reevaluateIdle();
|
|
9565
10171
|
}
|
|
9566
10172
|
if (retired && !probingRetired) {
|
|
@@ -9571,7 +10177,7 @@ async function runDaemon(options) {
|
|
|
9571
10177
|
if (!isProvenDead(probe) || retired !== target) return;
|
|
9572
10178
|
removeRetiredFiles(target);
|
|
9573
10179
|
retired = null;
|
|
9574
|
-
|
|
10180
|
+
log3.info({ retired: target.socket }, "superseded terminal daemon exited");
|
|
9575
10181
|
reevaluateIdle();
|
|
9576
10182
|
});
|
|
9577
10183
|
}
|
|
@@ -9604,9 +10210,9 @@ async function runDaemon(options) {
|
|
|
9604
10210
|
if (shuttingDown) return;
|
|
9605
10211
|
shuttingDown = true;
|
|
9606
10212
|
if (retired) {
|
|
9607
|
-
|
|
10213
|
+
log3.warn({ retired: retired.socket }, "exiting while a superseded daemon is still running");
|
|
9608
10214
|
}
|
|
9609
|
-
|
|
10215
|
+
log3.info({ reason, sessions: pool.size }, "terminal daemon shutting down");
|
|
9610
10216
|
clearInterval(watchdog);
|
|
9611
10217
|
if (adoptionTimer) clearTimeout(adoptionTimer);
|
|
9612
10218
|
const shells = pool.listAll().map((entry) => entry.pid);
|
|
@@ -9617,7 +10223,7 @@ async function runDaemon(options) {
|
|
|
9617
10223
|
}
|
|
9618
10224
|
const deadline = Date.now() + SHUTDOWN_GRACE_MS;
|
|
9619
10225
|
const waitForShells = setInterval(() => {
|
|
9620
|
-
if (Date.now() < deadline && shells.some(isAlive)) return;
|
|
10226
|
+
if (Date.now() < deadline && (shells.some(isAlive) || pool.hasPendingHistoryWrites())) return;
|
|
9621
10227
|
clearInterval(waitForShells);
|
|
9622
10228
|
process.exit(0);
|
|
9623
10229
|
}, 50);
|
|
@@ -9655,7 +10261,7 @@ async function runDaemon(options) {
|
|
|
9655
10261
|
return;
|
|
9656
10262
|
}
|
|
9657
10263
|
if (hello.buildId !== buildId) {
|
|
9658
|
-
|
|
10264
|
+
log3.info({ daemon: buildId, server: hello.buildId }, "server build differs from daemon");
|
|
9659
10265
|
}
|
|
9660
10266
|
role = hello.role;
|
|
9661
10267
|
client = registerClient(hello.clientId, role, socket);
|
|
@@ -9681,7 +10287,14 @@ async function runDaemon(options) {
|
|
|
9681
10287
|
function registerClient(clientId, role, socket) {
|
|
9682
10288
|
let client = clients.get(clientId);
|
|
9683
10289
|
if (!client) {
|
|
9684
|
-
client = {
|
|
10290
|
+
client = {
|
|
10291
|
+
id: clientId,
|
|
10292
|
+
control: null,
|
|
10293
|
+
stream: null,
|
|
10294
|
+
attached: /* @__PURE__ */ new Map(),
|
|
10295
|
+
held: /* @__PURE__ */ new Set(),
|
|
10296
|
+
sentSinceEmpty: /* @__PURE__ */ new Map()
|
|
10297
|
+
};
|
|
9685
10298
|
clients.set(clientId, client);
|
|
9686
10299
|
}
|
|
9687
10300
|
if (client[role]) return null;
|
|
@@ -9698,6 +10311,7 @@ async function runDaemon(options) {
|
|
|
9698
10311
|
clients.delete(client.id);
|
|
9699
10312
|
for (const unsubscribe of client.attached.values()) unsubscribe();
|
|
9700
10313
|
client.attached.clear();
|
|
10314
|
+
releaseHolds(client);
|
|
9701
10315
|
client.control?.destroy();
|
|
9702
10316
|
client.stream?.destroy();
|
|
9703
10317
|
if (clients.size === 0) retirementRequested = true;
|
|
@@ -9707,12 +10321,31 @@ async function runDaemon(options) {
|
|
|
9707
10321
|
const socket = client[role];
|
|
9708
10322
|
if (!socket || socket.destroyed) return;
|
|
9709
10323
|
if (socket.writableLength > MAX_STREAM_BACKLOG_BYTES) {
|
|
9710
|
-
|
|
10324
|
+
log3.warn({ clientId: client.id }, "server stopped reading; dropping its connection");
|
|
9711
10325
|
dropClient(client);
|
|
9712
10326
|
return;
|
|
9713
10327
|
}
|
|
9714
10328
|
writeFrame(socket, message);
|
|
9715
10329
|
}
|
|
10330
|
+
function sendOutput(client, terminalId, seq, d) {
|
|
10331
|
+
const socket = client.stream;
|
|
10332
|
+
if (socket && socket.writableLength === 0) client.sentSinceEmpty.clear();
|
|
10333
|
+
send(client, "stream", { t: "data", id: terminalId, seq, d });
|
|
10334
|
+
if (!socket || socket.destroyed || clients.get(client.id) !== client) return;
|
|
10335
|
+
const sent = (client.sentSinceEmpty.get(terminalId) ?? 0) + d.length;
|
|
10336
|
+
client.sentSinceEmpty.set(terminalId, sent);
|
|
10337
|
+
if (socket.writableLength < STREAM_HOLD_BYTES || sent <= SMALL_SESSION_CHARS || client.held.has(terminalId)) {
|
|
10338
|
+
return;
|
|
10339
|
+
}
|
|
10340
|
+
client.held.add(terminalId);
|
|
10341
|
+
pool.holdOutput(terminalId);
|
|
10342
|
+
if (client.held.size === 1) socket.once("drain", () => releaseHolds(client));
|
|
10343
|
+
}
|
|
10344
|
+
function releaseHolds(client) {
|
|
10345
|
+
for (const terminalId of client.held) pool.releaseOutput(terminalId);
|
|
10346
|
+
client.held.clear();
|
|
10347
|
+
client.sentSinceEmpty.clear();
|
|
10348
|
+
}
|
|
9716
10349
|
function handleControl(client, frame) {
|
|
9717
10350
|
const message = frame;
|
|
9718
10351
|
if (!hasValidIds(frame)) {
|
|
@@ -9750,6 +10383,7 @@ async function runDaemon(options) {
|
|
|
9750
10383
|
const unsubscribe = client.attached.get(message.terminalId);
|
|
9751
10384
|
client.attached.delete(message.terminalId);
|
|
9752
10385
|
unsubscribe?.();
|
|
10386
|
+
if (client.held.delete(message.terminalId)) pool.releaseOutput(message.terminalId);
|
|
9753
10387
|
return;
|
|
9754
10388
|
}
|
|
9755
10389
|
case "shutdown":
|
|
@@ -9807,7 +10441,7 @@ async function runDaemon(options) {
|
|
|
9807
10441
|
const attached = await pool.attach(
|
|
9808
10442
|
terminalId,
|
|
9809
10443
|
dims,
|
|
9810
|
-
(d, seq) =>
|
|
10444
|
+
(d, seq) => sendOutput(client, terminalId, seq, d)
|
|
9811
10445
|
);
|
|
9812
10446
|
if (!attached) return null;
|
|
9813
10447
|
if (client.attached.has(terminalId) || clients.get(client.id) !== client) {
|
|
@@ -9855,7 +10489,7 @@ function writePrivateFile(path, content) {
|
|
|
9855
10489
|
function copyPrivateFile(from, to) {
|
|
9856
10490
|
let content;
|
|
9857
10491
|
try {
|
|
9858
|
-
content =
|
|
10492
|
+
content = readFileSync2(from, "utf8");
|
|
9859
10493
|
} catch {
|
|
9860
10494
|
return;
|
|
9861
10495
|
}
|
|
@@ -9890,12 +10524,12 @@ function closeServer(server) {
|
|
|
9890
10524
|
}
|
|
9891
10525
|
|
|
9892
10526
|
// terminal-daemon.ts
|
|
9893
|
-
var
|
|
10527
|
+
var log4 = createLogger("terminal-daemon");
|
|
9894
10528
|
process.on("uncaughtException", (err) => {
|
|
9895
|
-
|
|
10529
|
+
log4.error({ err }, "uncaught exception in terminal daemon");
|
|
9896
10530
|
});
|
|
9897
10531
|
process.on("unhandledRejection", (err) => {
|
|
9898
|
-
|
|
10532
|
+
log4.error({ err }, "unhandled rejection in terminal daemon");
|
|
9899
10533
|
});
|
|
9900
10534
|
var { values } = parseArgs({
|
|
9901
10535
|
options: {
|
|
@@ -9906,12 +10540,12 @@ var { values } = parseArgs({
|
|
|
9906
10540
|
});
|
|
9907
10541
|
var runDir = values["run-dir"];
|
|
9908
10542
|
if (!runDir) {
|
|
9909
|
-
|
|
10543
|
+
log4.error("terminal daemon needs --run-dir");
|
|
9910
10544
|
process.exit(2);
|
|
9911
10545
|
}
|
|
9912
10546
|
var supersede = values.supersede?.match(/^(\d+):(\d+)$/);
|
|
9913
10547
|
if (values.supersede !== void 0 && !supersede) {
|
|
9914
|
-
|
|
10548
|
+
log4.error({ supersede: values.supersede }, "terminal daemon got a malformed --supersede");
|
|
9915
10549
|
process.exit(2);
|
|
9916
10550
|
}
|
|
9917
10551
|
var exitCode = await runDaemon({
|