@dylanpiercey/work 0.0.139 → 0.0.141
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/{_B9jB3eUh.js → _CZz7Wyts.js} +17 -17
- package/dist/{_BlEiBDGk.js → _CgMVRC4h.js} +182 -48
- package/dist/_CwAYWKgO.js +2 -0
- package/dist/{_Dkhw1NHC.js → _jYLlSG8J.js} +69 -69
- package/dist/index.mjs +350 -344
- package/dist/public/assets/{_CuS5H1zc.js → _B1B7SsmR.js} +1 -1
- package/dist/public/assets/_B1B7SsmR.js.br +0 -0
- package/dist/public/assets/{_D1VBE8Ni.js → _B1nEnOeR.js} +1 -1
- package/dist/public/assets/_B1nEnOeR.js.br +0 -0
- package/dist/public/assets/{_DzkQ59tO2.js → _B2vPwdLW2.js} +1 -1
- package/dist/public/assets/_B2vPwdLW2.js.br +0 -0
- package/dist/public/assets/{_BaPmPjXa.js → _B2zlBhgP.js} +1 -1
- package/dist/public/assets/_B2zlBhgP.js.br +0 -0
- package/dist/public/assets/{_BGQP06_w.js → _B3-rUIWu.js} +1 -1
- package/dist/public/assets/_B3-rUIWu.js.br +0 -0
- package/dist/public/assets/{_Cy053Jd0.js → _B3v2Mxg9.js} +1 -1
- package/dist/public/assets/_B3v2Mxg9.js.br +0 -0
- package/dist/public/assets/{_B6VbLzOa.js → _B4zQcDgs.js} +1 -1
- package/dist/public/assets/_B4zQcDgs.js.br +0 -0
- package/dist/public/assets/{_BhN1afwu.js → _B7g6vstf.js} +1 -1
- package/dist/public/assets/_B7g6vstf.js.br +0 -0
- package/dist/public/assets/{_aT-vIKyZ.js → _B8bLTrAR.js} +1 -1
- package/dist/public/assets/_B8bLTrAR.js.br +0 -0
- package/dist/public/assets/{_DMtHQg6p.js → _BERiWLR2.js} +1 -1
- package/dist/public/assets/_BERiWLR2.js.br +0 -0
- package/dist/public/assets/{_Bhn5BezI.js → _BG6eCCtD.js} +1 -1
- package/dist/public/assets/_BG6eCCtD.js.br +0 -0
- package/dist/public/assets/{_DCyA_kCN2.js → _BIGq6NLW2.js} +1 -1
- package/dist/public/assets/_BIGq6NLW2.js.br +0 -0
- package/dist/public/assets/{_DxbZoYq92.js → _BJL8EzDT2.js} +1 -1
- package/dist/public/assets/_BJL8EzDT2.js.br +0 -0
- package/dist/public/assets/{_DEwoT19i.js → _BMjuOAQ4.js} +1 -1
- package/dist/public/assets/_BMjuOAQ4.js.br +0 -0
- package/dist/public/assets/{_wWYYdpzZ2.js → _BNv3fPjT2.js} +1 -1
- package/dist/public/assets/_BNv3fPjT2.js.br +0 -0
- package/dist/public/assets/{_DsUtXotp.js → _BQazGBwX.js} +1 -1
- package/dist/public/assets/_BQazGBwX.js.br +0 -0
- package/dist/public/assets/{_PaKRa2cB.js → _BY-WvMhs.js} +1 -1
- package/dist/public/assets/_BY-WvMhs.js.br +0 -0
- package/dist/public/assets/{_BZb7VTF_.js → _BZJVwhA5.js} +1 -1
- package/dist/public/assets/_BZJVwhA5.js.br +0 -0
- package/dist/public/assets/{_Dh6dMgTO2.js → _B_wawL6J2.js} +1 -1
- package/dist/public/assets/_B_wawL6J2.js.br +0 -0
- package/dist/public/assets/{_wPGOV0BF2.js → _Ba8vUCRv2.js} +1 -1
- package/dist/public/assets/_Ba8vUCRv2.js.br +0 -0
- package/dist/public/assets/{_dIGPKWvv.js → _BcTQMZit.js} +1 -1
- package/dist/public/assets/_BcTQMZit.js.br +0 -0
- package/dist/public/assets/{_DYl8DmZ32.js → _Blhy_Vd12.js} +1 -1
- package/dist/public/assets/_Blhy_Vd12.js.br +0 -0
- package/dist/public/assets/{_CL5pEkPF2.js → _BuLSZuTT2.js} +1 -1
- package/dist/public/assets/{_diJBCZr0.js → _BuNhyEVe.js} +1 -1
- package/dist/public/assets/_BuNhyEVe.js.br +0 -0
- package/dist/public/assets/{_Cch7T0VL.js → _C2WEo047.js} +1 -1
- package/dist/public/assets/_C2WEo047.js.br +0 -0
- package/dist/public/assets/{_HGe5zAKn.js → _C5QblKM6.js} +1 -1
- package/dist/public/assets/_C5QblKM6.js.br +0 -0
- package/dist/public/assets/{_CVH-iW95.js → _CBHyOOZB.js} +1 -1
- package/dist/public/assets/_CBHyOOZB.js.br +0 -0
- package/dist/public/assets/{_D-bpXh2X.js → _CFGDp3Sw.js} +1 -1
- package/dist/public/assets/_CFGDp3Sw.js.br +0 -0
- package/dist/public/assets/{_DLatqs0j2.js → _CNPgjl1-2.js} +1 -1
- package/dist/public/assets/_CNPgjl1-2.js.br +0 -0
- package/dist/public/assets/{_Dva2q_M42.js → _CSJQogH62.js} +1 -1
- package/dist/public/assets/_CSJQogH62.js.br +0 -0
- package/dist/public/assets/{_DQ_V1iRl.js → _CUjz6cMW.js} +1 -1
- package/dist/public/assets/_CUjz6cMW.js.br +0 -0
- package/dist/public/assets/{_BB_Fnyr12.js → _CWHyYnLM2.js} +1 -1
- package/dist/public/assets/_CWHyYnLM2.js.br +0 -0
- package/dist/public/assets/{_ChYdBfr12.js → _CWzOnDwF2.js} +1 -1
- package/dist/public/assets/_CWzOnDwF2.js.br +0 -0
- package/dist/public/assets/{_D6jIULmr.js → _CXcrI0KH.js} +1 -1
- package/dist/public/assets/_CXcrI0KH.js.br +0 -0
- package/dist/public/assets/{_C0q1PWW32.js → _CYK6BCWH2.js} +1 -1
- package/dist/public/assets/_CYK6BCWH2.js.br +0 -0
- package/dist/public/assets/{_ZCuYNM1I.js → _CYSMKo7F.js} +1 -1
- package/dist/public/assets/_CYSMKo7F.js.br +0 -0
- package/dist/public/assets/{_DIho-aMJ.js → _CfpVtrZd.js} +1 -1
- package/dist/public/assets/_CfpVtrZd.js.br +0 -0
- package/dist/public/assets/{_aldud3NO.js → _CftRvTVW.js} +1 -1
- package/dist/public/assets/_CftRvTVW.js.br +0 -0
- package/dist/public/assets/{_DSdwFJ0A2.js → _ClSO8TOE2.js} +1 -1
- package/dist/public/assets/_ClSO8TOE2.js.br +0 -0
- package/dist/public/assets/{_ZDvJObO5.js → _CoIipOdm.js} +1 -1
- package/dist/public/assets/_CoIipOdm.js.br +0 -0
- package/dist/public/assets/{_TdrV18MH2.js → _CpqV5nOZ2.js} +1 -1
- package/dist/public/assets/_CpqV5nOZ2.js.br +0 -0
- package/dist/public/assets/{_DxbJYPG-.js → _Cs_1C06H.js} +1 -1
- package/dist/public/assets/_Cs_1C06H.js.br +0 -0
- package/dist/public/assets/{_Ds18FW1c2.js → _CxrdJ7hp2.js} +1 -1
- package/dist/public/assets/_CxrdJ7hp2.js.br +0 -0
- package/dist/public/assets/{_xB1z2QtX.js → _CygMTO1C.js} +1 -1
- package/dist/public/assets/_CygMTO1C.js.br +0 -0
- package/dist/public/assets/{_CFuHFLFa.js → _CznrmqM4.js} +1 -1
- package/dist/public/assets/_CznrmqM4.js.br +0 -0
- package/dist/public/assets/{_BeLud53W.js → _DA_VGkH6.js} +1 -1
- package/dist/public/assets/_DA_VGkH6.js.br +0 -0
- package/dist/public/assets/{_BsJV1REp.js → _DFGJGEpB.js} +1 -1
- package/dist/public/assets/_DFGJGEpB.js.br +0 -0
- package/dist/public/assets/{_CmuVbspY.js → _DLzJNX7C.js} +1 -1
- package/dist/public/assets/_DLzJNX7C.js.br +0 -0
- package/dist/public/assets/{_B8H0uW8P2.js → _DMc_yyoD2.js} +1 -1
- package/dist/public/assets/_DMc_yyoD2.js.br +0 -0
- package/dist/public/assets/{_DNr5neqU.js → _DMi37Owt.js} +1 -1
- package/dist/public/assets/_DMi37Owt.js.br +0 -0
- package/dist/public/assets/{_92PbBTGk.js → _DRT4_m9d.js} +1 -1
- package/dist/public/assets/_DRT4_m9d.js.br +0 -0
- package/dist/public/assets/{_CpJVAK8n.js → _DV6VXtzH.js} +5 -5
- package/dist/public/assets/_DV6VXtzH.js.br +0 -0
- package/dist/public/assets/{_DhAV7qp1.js → _DVIdvZ6L.js} +1 -1
- package/dist/public/assets/_DVIdvZ6L.js.br +0 -0
- package/dist/public/assets/{_BGNNvIXK.js → _DXOGRSbq.js} +1 -1
- package/dist/public/assets/_DXOGRSbq.js.br +0 -0
- package/dist/public/assets/{_B5v9Fbq22.js → _Da8gt_F52.js} +1 -1
- package/dist/public/assets/_Da8gt_F52.js.br +0 -0
- package/dist/public/assets/{_LhXY5_qe.js → _DbTEN3Co.js} +1 -1
- package/dist/public/assets/_DbTEN3Co.js.br +0 -0
- package/dist/public/assets/{_Cu02oWXx2.js → _Dbp391kL2.js} +1 -1
- package/dist/public/assets/{_XQS1q-bq.js → _DcfWOyup.js} +1 -1
- package/dist/public/assets/_DcfWOyup.js.br +0 -0
- package/dist/public/assets/{_D_FvYbxf2.js → _Dd4lKEYp2.js} +1 -1
- package/dist/public/assets/_Dd4lKEYp2.js.br +0 -0
- package/dist/public/assets/{_CehEzybz.js → _DgCQT80U.js} +1 -1
- package/dist/public/assets/_DgCQT80U.js.br +0 -0
- package/dist/public/assets/{_D5pc6mWE.js → _DhEdWcLh.js} +1 -1
- package/dist/public/assets/_DhEdWcLh.js.br +0 -0
- package/dist/public/assets/{_DIh7WZ2F.js → _DiHWQ-Ew.js} +1 -1
- package/dist/public/assets/_DiHWQ-Ew.js.br +0 -0
- package/dist/public/assets/{_DkWy_Ueq2.js → _DjcyEwVn2.js} +1 -1
- package/dist/public/assets/_DjcyEwVn2.js.br +0 -0
- package/dist/public/assets/{_-ZAbZMp6.js → _Dm-zlffy.js} +6 -6
- package/dist/public/assets/_Dm-zlffy.js.br +0 -0
- package/dist/public/assets/{_CyoDpMQK.js → _DnhKP7pH.js} +1 -1
- package/dist/public/assets/_DnhKP7pH.js.br +0 -0
- package/dist/public/assets/{_F7htPBBT.js → _DpJdqIrj.js} +1 -1
- package/dist/public/assets/_DpJdqIrj.js.br +0 -0
- package/dist/public/assets/{_DPdZCztx.js → _DqxT_h3w.js} +1 -1
- package/dist/public/assets/_DqxT_h3w.js.br +0 -0
- package/dist/public/assets/{_WSGgcdni.js → _Dt461FGT.js} +1 -1
- package/dist/public/assets/_Dt461FGT.js.br +0 -0
- package/dist/public/assets/{_CsDtf7Ry.js → _DvHOWoGF.js} +1 -1
- package/dist/public/assets/_DvHOWoGF.js.br +0 -0
- package/dist/public/assets/{_C3S9wfaW2.js → _N8vS2ulD2.js} +1 -1
- package/dist/public/assets/_N8vS2ulD2.js.br +0 -0
- package/dist/public/assets/{_CJFNHs4a2.js → _ToAhQlpQ2.js} +1 -1
- package/dist/public/assets/_ToAhQlpQ2.js.br +0 -0
- package/dist/public/assets/{_CiUgu93c.js → _TsHAzFfC.js} +1 -1
- package/dist/public/assets/_TsHAzFfC.js.br +0 -0
- package/dist/public/assets/{_DMRjmpFD2.js → _ZVf0cDT12.js} +1 -1
- package/dist/public/assets/_ZVf0cDT12.js.br +0 -0
- package/dist/public/assets/{_Y2b8aPrG.js → __g_2CBHN.js} +1 -1
- package/dist/public/assets/__g_2CBHN.js.br +0 -0
- package/dist/public/assets/{_Ctew4jWT.js → _hN1-RJcA.js} +1 -1
- package/dist/public/assets/{_CEjnOCam.js → _p1qRbXAM.js} +1 -1
- package/dist/public/assets/_p1qRbXAM.js.br +0 -0
- package/dist/public/assets/app-page-B-xb0lEG.css +1 -0
- package/dist/public/assets/app-page-B-xb0lEG.css.br +0 -0
- package/dist/public/assets/diff-view-CPZTgZs3.css +1 -0
- package/dist/public/assets/diff-view-CPZTgZs3.css.br +0 -0
- package/dist/public/assets/new-BMnZANmK.js +1 -0
- package/dist/public/assets/settings-BMnZANmK.js +1 -0
- package/dist/public/assets/w-BMnZANmK.js +1 -0
- package/dist/public/assets/w._-BMnZANmK.js +1 -0
- package/dist/public/assets/w._-C_I4x7J1.js +1 -0
- package/lib/setup/catalog.mjs +3 -2
- package/lib/share/manifest.mjs +3 -3
- package/package.json +1 -1
- package/dist/_BNGMa45b.js +0 -2
- package/dist/public/assets/_-ZAbZMp6.js.br +0 -0
- package/dist/public/assets/_92PbBTGk.js.br +0 -0
- package/dist/public/assets/_B5v9Fbq22.js.br +0 -0
- package/dist/public/assets/_B6VbLzOa.js.br +0 -0
- package/dist/public/assets/_B8H0uW8P2.js.br +0 -0
- package/dist/public/assets/_BB_Fnyr12.js.br +0 -0
- package/dist/public/assets/_BGNNvIXK.js.br +0 -0
- package/dist/public/assets/_BGQP06_w.js.br +0 -0
- package/dist/public/assets/_BZb7VTF_.js.br +0 -0
- package/dist/public/assets/_BaPmPjXa.js.br +0 -0
- package/dist/public/assets/_BeLud53W.js.br +0 -0
- package/dist/public/assets/_BhN1afwu.js.br +0 -0
- package/dist/public/assets/_Bhn5BezI.js.br +0 -0
- package/dist/public/assets/_BsJV1REp.js.br +0 -0
- package/dist/public/assets/_C0q1PWW32.js.br +0 -0
- package/dist/public/assets/_C3S9wfaW2.js.br +0 -0
- package/dist/public/assets/_CEjnOCam.js.br +0 -0
- package/dist/public/assets/_CFuHFLFa.js.br +0 -0
- package/dist/public/assets/_CJFNHs4a2.js.br +0 -0
- package/dist/public/assets/_CVH-iW95.js.br +0 -0
- package/dist/public/assets/_Cch7T0VL.js.br +0 -0
- package/dist/public/assets/_CehEzybz.js.br +0 -0
- package/dist/public/assets/_ChYdBfr12.js.br +0 -0
- package/dist/public/assets/_CiUgu93c.js.br +0 -0
- package/dist/public/assets/_CmuVbspY.js.br +0 -0
- package/dist/public/assets/_CpJVAK8n.js.br +0 -0
- package/dist/public/assets/_CsDtf7Ry.js.br +0 -0
- package/dist/public/assets/_CuS5H1zc.js.br +0 -0
- package/dist/public/assets/_Cy053Jd0.js.br +0 -0
- package/dist/public/assets/_CyoDpMQK.js.br +0 -0
- package/dist/public/assets/_D-bpXh2X.js.br +0 -0
- package/dist/public/assets/_D1VBE8Ni.js.br +0 -0
- package/dist/public/assets/_D5pc6mWE.js.br +0 -0
- package/dist/public/assets/_D6jIULmr.js.br +0 -0
- package/dist/public/assets/_DCyA_kCN2.js.br +0 -0
- package/dist/public/assets/_DEwoT19i.js.br +0 -0
- package/dist/public/assets/_DIh7WZ2F.js.br +0 -0
- package/dist/public/assets/_DIho-aMJ.js.br +0 -0
- package/dist/public/assets/_DLatqs0j2.js.br +0 -0
- package/dist/public/assets/_DMRjmpFD2.js.br +0 -0
- package/dist/public/assets/_DMtHQg6p.js.br +0 -0
- package/dist/public/assets/_DNr5neqU.js.br +0 -0
- package/dist/public/assets/_DPdZCztx.js.br +0 -0
- package/dist/public/assets/_DQ_V1iRl.js.br +0 -0
- package/dist/public/assets/_DSdwFJ0A2.js.br +0 -0
- package/dist/public/assets/_DYl8DmZ32.js.br +0 -0
- package/dist/public/assets/_D_FvYbxf2.js.br +0 -0
- package/dist/public/assets/_Dh6dMgTO2.js.br +0 -0
- package/dist/public/assets/_DhAV7qp1.js.br +0 -0
- package/dist/public/assets/_DkWy_Ueq2.js.br +0 -0
- package/dist/public/assets/_Ds18FW1c2.js.br +0 -0
- package/dist/public/assets/_DsUtXotp.js.br +0 -0
- package/dist/public/assets/_Dva2q_M42.js.br +0 -0
- package/dist/public/assets/_DxbJYPG-.js.br +0 -0
- package/dist/public/assets/_DxbZoYq92.js.br +0 -0
- package/dist/public/assets/_DzkQ59tO2.js.br +0 -0
- package/dist/public/assets/_F7htPBBT.js.br +0 -0
- package/dist/public/assets/_HGe5zAKn.js.br +0 -0
- package/dist/public/assets/_LhXY5_qe.js.br +0 -0
- package/dist/public/assets/_PaKRa2cB.js.br +0 -0
- package/dist/public/assets/_TdrV18MH2.js.br +0 -0
- package/dist/public/assets/_WSGgcdni.js.br +0 -0
- package/dist/public/assets/_XQS1q-bq.js.br +0 -0
- package/dist/public/assets/_Y2b8aPrG.js.br +0 -0
- package/dist/public/assets/_ZCuYNM1I.js.br +0 -0
- package/dist/public/assets/_ZDvJObO5.js.br +0 -0
- package/dist/public/assets/_aT-vIKyZ.js.br +0 -0
- package/dist/public/assets/_aldud3NO.js.br +0 -0
- package/dist/public/assets/_dIGPKWvv.js.br +0 -0
- package/dist/public/assets/_diJBCZr0.js.br +0 -0
- package/dist/public/assets/_wPGOV0BF2.js.br +0 -0
- package/dist/public/assets/_wWYYdpzZ2.js.br +0 -0
- package/dist/public/assets/_xB1z2QtX.js.br +0 -0
- package/dist/public/assets/app-page-DhekpIyo.css +0 -1
- package/dist/public/assets/app-page-DhekpIyo.css.br +0 -0
- package/dist/public/assets/diff-view-B6mpGFZy.css +0 -1
- package/dist/public/assets/diff-view-B6mpGFZy.css.br +0 -0
- package/dist/public/assets/new-DAfon2Hw.js +0 -1
- package/dist/public/assets/settings-DAfon2Hw.js +0 -1
- package/dist/public/assets/w-DAfon2Hw.js +0 -1
- package/dist/public/assets/w._-C05PxvAg.js +0 -1
- package/dist/public/assets/w._-DAfon2Hw.js +0 -1
|
@@ -1968,14 +1968,14 @@ function repoLabel(fullName) {
|
|
|
1968
1968
|
return fullName;
|
|
1969
1969
|
}
|
|
1970
1970
|
var toastKind = {
|
|
1971
|
-
error: "
|
|
1972
|
-
warn: "
|
|
1973
|
-
info: "
|
|
1971
|
+
error: "_bA",
|
|
1972
|
+
warn: "_bB",
|
|
1973
|
+
info: "_bC"
|
|
1974
1974
|
};
|
|
1975
1975
|
var toastTitle = {
|
|
1976
|
-
error: "
|
|
1977
|
-
warn: "
|
|
1978
|
-
info: "
|
|
1976
|
+
error: "_bD",
|
|
1977
|
+
warn: "_bE",
|
|
1978
|
+
info: "_bF"
|
|
1979
1979
|
};
|
|
1980
1980
|
//#endregion
|
|
1981
1981
|
//#region src/styles/tokens.css.ts
|
|
@@ -2021,18 +2021,18 @@ var toast_default = _template("F", (input) => {
|
|
|
2021
2021
|
const kind = inputKind || "error";
|
|
2022
2022
|
const placement = inputPlacement || "float";
|
|
2023
2023
|
const placementClass = {
|
|
2024
|
-
float: "
|
|
2025
|
-
inline: "
|
|
2024
|
+
float: "_by",
|
|
2025
|
+
inline: "_bz"
|
|
2026
2026
|
}[placement];
|
|
2027
2027
|
_html(`<div${_attr_class([
|
|
2028
|
-
"
|
|
2028
|
+
"_bx",
|
|
2029
2029
|
toastKind[kind],
|
|
2030
2030
|
placementClass,
|
|
2031
2031
|
inputClass
|
|
2032
2032
|
])} role=${kind === "error" ? "alert" : "status"}${_attrs_partial(htmlInput, {
|
|
2033
2033
|
class: 1,
|
|
2034
2034
|
role: 1
|
|
2035
|
-
}, "a", $scope0_id, "div")}><div${_attr_class("
|
|
2035
|
+
}, "a", $scope0_id, "div")}><div${_attr_class("_bG")}>`);
|
|
2036
2036
|
_if(() => {
|
|
2037
2037
|
if (title) {
|
|
2038
2038
|
const $scope1_id = _scope_id();
|
|
@@ -2044,7 +2044,7 @@ var toast_default = _template("F", (input) => {
|
|
|
2044
2044
|
_if(() => {
|
|
2045
2045
|
if (content) {
|
|
2046
2046
|
const $scope2_id = _scope_id();
|
|
2047
|
-
_html(`<div${_attr_class("
|
|
2047
|
+
_html(`<div${_attr_class("_bH")}>`);
|
|
2048
2048
|
_dynamic_tag($scope2_id, "b", content, {}, 0, 0, $sg__input_content);
|
|
2049
2049
|
_html("</div>");
|
|
2050
2050
|
$si__input_content && writeScope($scope2_id, { _: _scope_with_id($scope0_id) });
|
|
@@ -2055,7 +2055,7 @@ var toast_default = _template("F", (input) => {
|
|
|
2055
2055
|
_if(() => {
|
|
2056
2056
|
if (action || onDismiss) {
|
|
2057
2057
|
const $scope3_id = _scope_id();
|
|
2058
|
-
_html(`<div${_attr_class(["
|
|
2058
|
+
_html(`<div${_attr_class(["_bI", action && "_bJ"])}>`);
|
|
2059
2059
|
_if(() => {
|
|
2060
2060
|
if (action) {
|
|
2061
2061
|
const $scope4_id = _scope_id();
|
|
@@ -2067,7 +2067,7 @@ var toast_default = _template("F", (input) => {
|
|
|
2067
2067
|
_if(() => {
|
|
2068
2068
|
if (onDismiss) {
|
|
2069
2069
|
const $scope5_id = _scope_id();
|
|
2070
|
-
_html(`<button${_attr_class([iconBtnRow, "
|
|
2070
|
+
_html(`<button${_attr_class([iconBtnRow, "_bK"])} type=button title=Dismiss aria-label=Dismiss>`);
|
|
2071
2071
|
icon_xmark_default({ size: 14 });
|
|
2072
2072
|
_html(`</button>${_el_resume($scope5_id, "a")}`);
|
|
2073
2073
|
_script($scope5_id, "F0");
|
|
@@ -2182,8 +2182,8 @@ function theme() {
|
|
|
2182
2182
|
function setTheme(mode) {
|
|
2183
2183
|
set("theme", mode === "system" ? null : mode);
|
|
2184
2184
|
}
|
|
2185
|
-
var sectionCount = "
|
|
2186
|
-
var row = "
|
|
2185
|
+
var sectionCount = "_bk _L _M";
|
|
2186
|
+
var row = "_bv _bn";
|
|
2187
2187
|
var iconBtn = "_3 _j";
|
|
2188
2188
|
//#endregion
|
|
2189
2189
|
//#region src/tags/icons/icon-refresh.marko
|
|
@@ -2329,8 +2329,8 @@ var icon_sidebar_default = _template("mb", (input) => {
|
|
|
2329
2329
|
});
|
|
2330
2330
|
_serialize_if($scope0_reason, 0) && writeScope($scope0_id, { a: _existing_scope($childScope) });
|
|
2331
2331
|
});
|
|
2332
|
-
var findInput = "
|
|
2333
|
-
var findIconBtn = "
|
|
2332
|
+
var findInput = "_gC _l";
|
|
2333
|
+
var findIconBtn = "_gF _j";
|
|
2334
2334
|
//#endregion
|
|
2335
2335
|
//#region src/tags/icons/icon-arrow-down.marko
|
|
2336
2336
|
var icon_arrow_down_default = _template("K", (input) => {
|
|
@@ -266,8 +266,9 @@ var agents_default = [
|
|
|
266
266
|
//#endregion
|
|
267
267
|
//#region lib/setup/catalog.mjs
|
|
268
268
|
/** Machine tools. `required` ones gate readiness; the rest are the utilities
|
|
269
|
-
* agents reach for constantly (
|
|
270
|
-
* mise, except the system packages the installer provides
|
|
269
|
+
* agents reach for constantly (search, JSON, HTTP, process tools). Static
|
|
270
|
+
* binaries via mise, except the system packages the installer provides
|
|
271
|
+
* (git, tmux). */
|
|
271
272
|
var TOOLS = [
|
|
272
273
|
{
|
|
273
274
|
id: "git",
|
|
@@ -6500,21 +6501,24 @@ var viewers = /* @__PURE__ */ new Map();
|
|
|
6500
6501
|
function setAgentPhase(sessionId, phase, reason, summary) {
|
|
6501
6502
|
if (phase === "waiting" && reason === "done") {
|
|
6502
6503
|
if (summary) summaries.set(sessionId, summary);
|
|
6503
|
-
|
|
6504
|
+
notify(sessionId, "done");
|
|
6504
6505
|
if (phases.has(sessionId)) applyChange(sessionId, () => {
|
|
6505
6506
|
phases.delete(sessionId);
|
|
6506
6507
|
reasons.delete(sessionId);
|
|
6507
|
-
});
|
|
6508
|
+
}, true);
|
|
6508
6509
|
return;
|
|
6509
6510
|
}
|
|
6510
6511
|
if (phase === "waiting" && summary) summaries.set(sessionId, summary);
|
|
6511
|
-
else if (phase === "working")
|
|
6512
|
+
else if (phase === "working") {
|
|
6513
|
+
summaries.delete(sessionId);
|
|
6514
|
+
reasons.delete(sessionId);
|
|
6515
|
+
}
|
|
6512
6516
|
const next = phase === "waiting" && reason ? reason : reasons.get(sessionId);
|
|
6513
6517
|
if (phases.get(sessionId) === phase && reasons.get(sessionId) === next) return;
|
|
6514
6518
|
applyChange(sessionId, () => {
|
|
6515
6519
|
phases.set(sessionId, phase);
|
|
6516
6520
|
if (phase === "waiting" && reason) reasons.set(sessionId, reason);
|
|
6517
|
-
});
|
|
6521
|
+
}, true);
|
|
6518
6522
|
}
|
|
6519
6523
|
/** Live visible-terminal count per session, reported by the term server;
|
|
6520
6524
|
* a session someone is watching does not push notifications. */
|
|
@@ -6563,23 +6567,26 @@ function clearAgentPhase(sessionId) {
|
|
|
6563
6567
|
function agentPhase(sessionId) {
|
|
6564
6568
|
return phases.get(sessionId) ?? scraped.get(sessionId);
|
|
6565
6569
|
}
|
|
6566
|
-
/**
|
|
6567
|
-
*
|
|
6570
|
+
/** A freshly booted server's first scans re-derive scraped state from
|
|
6571
|
+
* panes that were already that way — that must not re-buzz every device
|
|
6572
|
+
* after a deploy. Hook reports are exempt: each is a real transition the
|
|
6573
|
+
* agent just made, and one that lands right after a restart (the turn
|
|
6574
|
+
* that was running through it) is exactly the one worth hearing about. */
|
|
6568
6575
|
var BOOT_GRACE_MS = 15e3;
|
|
6569
6576
|
var bootedAt = Date.now();
|
|
6570
|
-
function applyChange(sessionId, mutate) {
|
|
6577
|
+
function applyChange(sessionId, mutate, fromHook = false) {
|
|
6571
6578
|
const before = agentPhase(sessionId);
|
|
6572
6579
|
mutate();
|
|
6573
6580
|
const after = agentPhase(sessionId);
|
|
6574
6581
|
if (before === after) return;
|
|
6575
6582
|
publishChange(sessionId);
|
|
6576
|
-
if (after === "waiting" && before !== "waiting" && Date.now() - bootedAt > BOOT_GRACE_MS) notify(sessionId, reasons.get(sessionId) ?? "attention");
|
|
6583
|
+
if (after === "waiting" && before !== "waiting" && (fromHook || Date.now() - bootedAt > BOOT_GRACE_MS)) notify(sessionId, reasons.get(sessionId) ?? "attention");
|
|
6577
6584
|
}
|
|
6578
6585
|
function publishChange(sessionId) {
|
|
6579
6586
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
6580
6587
|
if (row?.workspace_id) {
|
|
6581
6588
|
const workspaceId = row.workspace_id;
|
|
6582
|
-
import("./
|
|
6589
|
+
import("./_CwAYWKgO.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
6583
6590
|
return;
|
|
6584
6591
|
}
|
|
6585
6592
|
publish("sessions.changed");
|
|
@@ -6592,33 +6599,33 @@ function publishChange(sessionId) {
|
|
|
6592
6599
|
* come from the env tmux gave the pane (see sessions.ts). */
|
|
6593
6600
|
function stateCurl(state, reason) {
|
|
6594
6601
|
const qs = `session=$WORK_SESSION_ID&state=${state}` + (reason ? `&reason=${reason}` : "");
|
|
6595
|
-
return `[ -n "$WORK_SESSION_ID" ] && curl -sf -m
|
|
6602
|
+
return `[ -n "$WORK_SESSION_ID" ] && curl -sf -m 2 --retry 2 --retry-delay 1 --retry-connrefused -X POST "http://127.0.0.1:\${WORK_APP_PORT:-${config.appPort}}/api/agent-state?${qs}" -H 'content-type: application/json' --data-binary @- >/dev/null 2>&1; exit 0`;
|
|
6596
6603
|
}
|
|
6597
6604
|
/** Claude-format hook groups (`{matcher?, hooks:[{type:"command",command}]}`)
|
|
6598
6605
|
* for a hook map — the JSON shape Claude, Copilot plugins and Grok all read. */
|
|
6599
6606
|
function claudeStyleHooks(map, extra = {}) {
|
|
6600
6607
|
const hooks = {};
|
|
6601
|
-
for (const [event, state, reason, matcher] of map) hooks[event]
|
|
6608
|
+
for (const [event, state, reason, matcher] of map) (hooks[event] ??= []).push({
|
|
6602
6609
|
...matcher ? { matcher } : {},
|
|
6603
6610
|
hooks: [{
|
|
6604
6611
|
type: "command",
|
|
6605
6612
|
command: stateCurl(state, reason),
|
|
6606
6613
|
...extra
|
|
6607
6614
|
}]
|
|
6608
|
-
}
|
|
6615
|
+
});
|
|
6609
6616
|
return hooks;
|
|
6610
6617
|
}
|
|
6611
6618
|
var NOTIFICATION_LABELS = {
|
|
6612
6619
|
permission_prompt: "Waiting for permission",
|
|
6613
|
-
idle_prompt: "Waiting for your reply",
|
|
6614
6620
|
agent_needs_input: "Waiting for input",
|
|
6615
6621
|
elicitation_dialog: "Asking a question",
|
|
6616
6622
|
elicitation_url_dialog: "Needs a browser sign-in"
|
|
6617
6623
|
};
|
|
6618
6624
|
/** Notifications that mean the agent is nudging about an idle session
|
|
6619
|
-
* rather than blocking on one
|
|
6620
|
-
*
|
|
6621
|
-
* merely sat there
|
|
6625
|
+
* rather than blocking on one. Stop already said the turn ended and
|
|
6626
|
+
* pushed for it; reporting the nudge too painted the nav red for a
|
|
6627
|
+
* session that merely sat there, and — read as "done" — buzzed a second
|
|
6628
|
+
* time a minute after every finish. Dropped entirely. */
|
|
6622
6629
|
var NUDGE_NOTIFICATIONS = /* @__PURE__ */ new Set(["idle_prompt"]);
|
|
6623
6630
|
function str$1(v) {
|
|
6624
6631
|
return typeof v === "string" ? v.trim() : "";
|
|
@@ -6629,11 +6636,12 @@ function notificationType(p) {
|
|
|
6629
6636
|
}
|
|
6630
6637
|
/** Read a Claude-format payload: last message on Stop, the CLI's own
|
|
6631
6638
|
* notification line (or a label for its type) on Notification, and the
|
|
6632
|
-
* idle nudge
|
|
6633
|
-
*
|
|
6639
|
+
* idle nudge dropped. Families that speak this dialect start here and
|
|
6640
|
+
* add their own quirks. */
|
|
6634
6641
|
function readClaudeStyle(p, reported) {
|
|
6635
6642
|
const kind = notificationType(p);
|
|
6636
|
-
|
|
6643
|
+
if (NUDGE_NOTIFICATIONS.has(kind)) return { ignore: true };
|
|
6644
|
+
const reason = reported;
|
|
6637
6645
|
const text = str$1(p.last_assistant_message) || str$1(p["last-assistant-message"]) || str$1(p.lastAssistantMessage);
|
|
6638
6646
|
if (text) return {
|
|
6639
6647
|
reason,
|
|
@@ -7146,15 +7154,46 @@ async function claudeRow(account) {
|
|
|
7146
7154
|
const fallback = loaded.payload ? null : claudeJsonFallback(account);
|
|
7147
7155
|
return markStale(parseRow$4(account, loaded.payload ?? fallback, fallback ? "claude.json" : loaded.source), account.label, tokenExpired(account), loaded.reason);
|
|
7148
7156
|
}
|
|
7157
|
+
//#endregion
|
|
7158
|
+
//#region src/agents/claude/index.ts
|
|
7159
|
+
var meta$6 = meta_default$6;
|
|
7160
|
+
/** The tool Claude asks the user a question with. Its prompt is a wait
|
|
7161
|
+
* like any other, but the turn has not ended, so no Stop or Notification
|
|
7162
|
+
* says so — PreToolUse on this tool is the only signal, and PostToolUse
|
|
7163
|
+
* (the answer arrived) clears it. */
|
|
7164
|
+
var QUESTION_TOOL = "AskUserQuestion";
|
|
7165
|
+
/** Claude's dialect plus the question tool's prompt text. */
|
|
7166
|
+
function readHook$4(p, reported) {
|
|
7167
|
+
const read = readClaudeStyle(p, reported);
|
|
7168
|
+
if (read.ignore) return read;
|
|
7169
|
+
if (p.hook_event_name === "PreToolUse" && p.tool_name === QUESTION_TOOL) {
|
|
7170
|
+
const input = p.tool_input;
|
|
7171
|
+
const q = str$1(input?.questions?.[0]?.question);
|
|
7172
|
+
read.summary = q ? cleanSummary(q) : "Asking a question";
|
|
7173
|
+
}
|
|
7174
|
+
return read;
|
|
7175
|
+
}
|
|
7149
7176
|
/** Claude Code takes its settings inline (`--settings` accepts a JSON
|
|
7150
7177
|
* string), so the hooks travel in argv and nothing is written anywhere.
|
|
7151
7178
|
* Its Notification hook fires for permission prompts and questions —
|
|
7152
|
-
* and for the idle nudge, which readClaudeStyle
|
|
7179
|
+
* and for the idle nudge, which readClaudeStyle drops. */
|
|
7153
7180
|
var claude = {
|
|
7154
|
-
meta:
|
|
7181
|
+
meta: meta$6,
|
|
7155
7182
|
launchFlags: () => ["--settings", JSON.stringify({ hooks: claudeStyleHooks([
|
|
7156
7183
|
["UserPromptSubmit", "working"],
|
|
7157
|
-
[
|
|
7184
|
+
[
|
|
7185
|
+
"PreToolUse",
|
|
7186
|
+
"working",
|
|
7187
|
+
void 0,
|
|
7188
|
+
`^(?!${QUESTION_TOOL}$)`
|
|
7189
|
+
],
|
|
7190
|
+
[
|
|
7191
|
+
"PreToolUse",
|
|
7192
|
+
"waiting",
|
|
7193
|
+
"attention",
|
|
7194
|
+
`^${QUESTION_TOOL}$`
|
|
7195
|
+
],
|
|
7196
|
+
["PostToolUse", "working"],
|
|
7158
7197
|
[
|
|
7159
7198
|
"Stop",
|
|
7160
7199
|
"waiting",
|
|
@@ -7172,7 +7211,7 @@ var claude = {
|
|
|
7172
7211
|
"CLAUDECODE",
|
|
7173
7212
|
"AI_AGENT"
|
|
7174
7213
|
],
|
|
7175
|
-
readHook:
|
|
7214
|
+
readHook: readHook$4,
|
|
7176
7215
|
usage: () => Promise.all(claudeAccounts().map((account) => claudeRow(account)))
|
|
7177
7216
|
};
|
|
7178
7217
|
//#endregion
|
|
@@ -7529,9 +7568,19 @@ function lastMessageFromTranscript(p) {
|
|
|
7529
7568
|
}
|
|
7530
7569
|
} catch {}
|
|
7531
7570
|
}
|
|
7571
|
+
/** Two menus Copilot can draw before its input box, both of which would
|
|
7572
|
+
* swallow a pasted first prompt. A session work ends is killed with its
|
|
7573
|
+
* tmux pane, so Copilot's own registry still lists it as open and every
|
|
7574
|
+
* later launch offers to restore it (Esc starts fresh). A workspace it has
|
|
7575
|
+
* not seen gets the folder-trust prompt, with Yes preselected. */
|
|
7576
|
+
function startupPrompt(screen) {
|
|
7577
|
+
if (/Restore interrupted sessions/.test(screen)) return ["Escape"];
|
|
7578
|
+
if (/remember this folder for future sessions/.test(screen)) return ["Enter"];
|
|
7579
|
+
}
|
|
7532
7580
|
var copilot = {
|
|
7533
7581
|
meta: meta$4,
|
|
7534
7582
|
launchFlags: () => ["--plugin-dir", pluginDir()],
|
|
7583
|
+
startupPrompt,
|
|
7535
7584
|
reportsWorking: () => true,
|
|
7536
7585
|
envPrefixes: ["COPILOT_"],
|
|
7537
7586
|
readHook: readHook$2,
|
|
@@ -7650,6 +7699,7 @@ async function cursorRow() {
|
|
|
7650
7699
|
* nothing else — a stopped turn and a question look the same. */
|
|
7651
7700
|
var cursor = {
|
|
7652
7701
|
meta: meta_default$3,
|
|
7702
|
+
readyScreen: /Plan, search, build anything|Add a follow-up/,
|
|
7653
7703
|
usage: () => cursorRow().then((row) => [row])
|
|
7654
7704
|
};
|
|
7655
7705
|
//#endregion
|
|
@@ -7786,9 +7836,21 @@ var HOOKS = claudeStyleHooks([
|
|
|
7786
7836
|
"attention"
|
|
7787
7837
|
]
|
|
7788
7838
|
], { timeout: 5 });
|
|
7789
|
-
|
|
7790
|
-
|
|
7791
|
-
|
|
7839
|
+
var HOOK_FILE = () => path.join(config.dataDir, "grok-hooks.json");
|
|
7840
|
+
var REGISTRY = () => path.join(process.env.HOME || "", ".grok", "hooks-paths");
|
|
7841
|
+
/** Whether Grok's hook registry names work's hook file — without it Grok
|
|
7842
|
+
* reports nothing and the screen has to speak for it. Read from disk, not
|
|
7843
|
+
* remembered from a launch: a session that outlives the app process still
|
|
7844
|
+
* has its hooks, and a flag reset by the restart would put the scraper
|
|
7845
|
+
* back on a session that reports for itself. */
|
|
7846
|
+
function registered() {
|
|
7847
|
+
try {
|
|
7848
|
+
const file = HOOK_FILE();
|
|
7849
|
+
return fs.readFileSync(REGISTRY(), "utf8").split("\n").some((line) => line.trim() === file);
|
|
7850
|
+
} catch {
|
|
7851
|
+
return false;
|
|
7852
|
+
}
|
|
7853
|
+
}
|
|
7792
7854
|
/** Grok has no flag for hooks. It discovers them from `~/.grok/hooks-paths`:
|
|
7793
7855
|
* one absolute path per line, the registry its own `/hooks-add` command
|
|
7794
7856
|
* appends to. work's hook file is kept in the data dir — the commands read
|
|
@@ -7796,9 +7858,9 @@ var registered = false;
|
|
|
7796
7858
|
* once. The one line in that registry is the only thing work writes
|
|
7797
7859
|
* outside its own dir for any agent. */
|
|
7798
7860
|
function registerHooks() {
|
|
7799
|
-
const file =
|
|
7861
|
+
const file = HOOK_FILE();
|
|
7800
7862
|
writeIfChanged(file, JSON.stringify({ hooks: HOOKS }, null, 2));
|
|
7801
|
-
const registry =
|
|
7863
|
+
const registry = REGISTRY();
|
|
7802
7864
|
try {
|
|
7803
7865
|
let current = "";
|
|
7804
7866
|
try {
|
|
@@ -7808,11 +7870,7 @@ function registerHooks() {
|
|
|
7808
7870
|
fs.mkdirSync(path.dirname(registry), { recursive: true });
|
|
7809
7871
|
fs.appendFileSync(registry, `${current && !current.endsWith("\n") ? "\n" : ""}${file}\n`);
|
|
7810
7872
|
}
|
|
7811
|
-
|
|
7812
|
-
} catch {
|
|
7813
|
-
registered = false;
|
|
7814
|
-
}
|
|
7815
|
-
return registered;
|
|
7873
|
+
} catch {}
|
|
7816
7874
|
}
|
|
7817
7875
|
function readHook$1(p, reported) {
|
|
7818
7876
|
if (str$1(p.subagentType)) return { ignore: true };
|
|
@@ -7830,7 +7888,7 @@ var grok = {
|
|
|
7830
7888
|
registerHooks();
|
|
7831
7889
|
return [];
|
|
7832
7890
|
},
|
|
7833
|
-
reportsWorking:
|
|
7891
|
+
reportsWorking: registered,
|
|
7834
7892
|
promptAsArgv: true,
|
|
7835
7893
|
envPrefixes: ["GROK_"],
|
|
7836
7894
|
readHook: readHook$1,
|
|
@@ -7918,21 +7976,23 @@ export const WorkSessionState = async () => {
|
|
|
7918
7976
|
};
|
|
7919
7977
|
};
|
|
7920
7978
|
`;
|
|
7979
|
+
var PLUGIN_FILE = () => path.join(config.dataDir, "opencode-plugin.js");
|
|
7921
7980
|
/** Whether the plugin is on disk for opencode to load — without it the
|
|
7922
|
-
* screen has to speak for the session.
|
|
7923
|
-
|
|
7981
|
+
* screen has to speak for the session. Checked on disk rather than
|
|
7982
|
+
* remembered from a launch, so a session that outlives the app process
|
|
7983
|
+
* is still known to report for itself. */
|
|
7984
|
+
function installed() {
|
|
7985
|
+
return fs.existsSync(PLUGIN_FILE());
|
|
7986
|
+
}
|
|
7924
7987
|
/** opencode resolves a `plugin` entry that looks like a path as a local
|
|
7925
7988
|
* file, and reads `OPENCODE_CONFIG_CONTENT` as one more config layer that
|
|
7926
7989
|
* merges over the user's own. Together that loads work's plugin from
|
|
7927
7990
|
* work's data dir without writing a line into ~/.config/opencode. */
|
|
7928
7991
|
function pluginConfig() {
|
|
7929
|
-
const file =
|
|
7992
|
+
const file = PLUGIN_FILE();
|
|
7930
7993
|
try {
|
|
7931
7994
|
writeIfChanged(file, PLUGIN(config.appPort));
|
|
7932
|
-
|
|
7933
|
-
} catch {
|
|
7934
|
-
installed = false;
|
|
7935
|
-
}
|
|
7995
|
+
} catch {}
|
|
7936
7996
|
return JSON.stringify({ plugin: [file] });
|
|
7937
7997
|
}
|
|
7938
7998
|
function readHook(p, reported) {
|
|
@@ -7955,8 +8015,9 @@ var AGENTS = [
|
|
|
7955
8015
|
grok,
|
|
7956
8016
|
{
|
|
7957
8017
|
meta: meta$1,
|
|
8018
|
+
readyScreen: /Ask anything/,
|
|
7958
8019
|
launchEnv: () => ({ OPENCODE_CONFIG_CONTENT: pluginConfig() }),
|
|
7959
|
-
reportsWorking:
|
|
8020
|
+
reportsWorking: installed,
|
|
7960
8021
|
envPrefixes: ["OPENCODE_"],
|
|
7961
8022
|
readHook
|
|
7962
8023
|
},
|
|
@@ -7985,6 +8046,14 @@ function agentLaunchEnv(id) {
|
|
|
7985
8046
|
function reportsWorking(id) {
|
|
7986
8047
|
return agentFor(id)?.reportsWorking?.() ?? false;
|
|
7987
8048
|
}
|
|
8049
|
+
/** Keys that answer whatever startup prompt the CLI is showing, if any. */
|
|
8050
|
+
function startupPromptKeys(id, screen) {
|
|
8051
|
+
return agentFor(id)?.startupPrompt?.(screen);
|
|
8052
|
+
}
|
|
8053
|
+
/** The input-box marker for CLIs whose splash looks settled early. */
|
|
8054
|
+
function readyScreen(id) {
|
|
8055
|
+
return agentFor(id)?.readyScreen;
|
|
8056
|
+
}
|
|
7988
8057
|
/** Cold launch takes the first prompt as argv rather than a paste. */
|
|
7989
8058
|
function promptAsArgv(id) {
|
|
7990
8059
|
return agentFor(id)?.promptAsArgv ?? false;
|
|
@@ -8104,7 +8173,7 @@ async function sendToSession(id, text, size) {
|
|
|
8104
8173
|
}
|
|
8105
8174
|
await tmux(newSessionArgs(session, wsPath, "-d", void 0, size), env);
|
|
8106
8175
|
markTmuxStarted(id);
|
|
8107
|
-
await
|
|
8176
|
+
await waitForAgent(name, env, session.agent);
|
|
8108
8177
|
}
|
|
8109
8178
|
const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
|
|
8110
8179
|
await tmux([
|
|
@@ -8122,7 +8191,7 @@ async function sendToSession(id, text, size) {
|
|
|
8122
8191
|
"-t",
|
|
8123
8192
|
name
|
|
8124
8193
|
], env);
|
|
8125
|
-
await
|
|
8194
|
+
await waitStill(name, env, PASTE_SETTLE_MS);
|
|
8126
8195
|
await tmux([
|
|
8127
8196
|
"send-keys",
|
|
8128
8197
|
"-t",
|
|
@@ -8350,8 +8419,73 @@ function cleanEnv() {
|
|
|
8350
8419
|
env.PATH = [...parts, ...bins.filter((bin) => !parts.includes(bin))].join(":");
|
|
8351
8420
|
return forceUtf8Locale(env);
|
|
8352
8421
|
}
|
|
8353
|
-
|
|
8354
|
-
|
|
8422
|
+
/** Upper bound on waiting for an agent to be ready for input; past it
|
|
8423
|
+
* the paste goes in regardless (a TUI with a boot animation never settles). */
|
|
8424
|
+
var AGENT_BOOT_MS = 8e3;
|
|
8425
|
+
/** A drawn screen that has not changed for this long is a TUI at rest. */
|
|
8426
|
+
var SCREEN_STILL_MS = 600;
|
|
8427
|
+
/** Resolve once the agent is the pane's foreground process and has drawn
|
|
8428
|
+
* a screen that then held still — opencode is foreground in 0.4 s and
|
|
8429
|
+
* paints its prompt at 2.4 s; Claude is ready in about a second. */
|
|
8430
|
+
async function waitForAgent(name, env, agent) {
|
|
8431
|
+
const until = Date.now() + AGENT_BOOT_MS;
|
|
8432
|
+
while (Date.now() < until) {
|
|
8433
|
+
const c = (await tmux([
|
|
8434
|
+
"display",
|
|
8435
|
+
"-p",
|
|
8436
|
+
"-t",
|
|
8437
|
+
name,
|
|
8438
|
+
"#{pane_current_command}"
|
|
8439
|
+
], env).catch(() => "")).trim();
|
|
8440
|
+
if (c && !/^(bash|zsh|sh|fish|login|-?\w*sh)$/.test(c)) break;
|
|
8441
|
+
await sleep(150);
|
|
8442
|
+
}
|
|
8443
|
+
const ready = readyScreen(agent);
|
|
8444
|
+
for (let i = 0; i < 3; i++) {
|
|
8445
|
+
await waitStill(name, env, until - Date.now(), ready);
|
|
8446
|
+
const keys = startupPromptKeys(agent, await tmux([
|
|
8447
|
+
"capture-pane",
|
|
8448
|
+
"-p",
|
|
8449
|
+
"-t",
|
|
8450
|
+
name
|
|
8451
|
+
], env).catch(() => ""));
|
|
8452
|
+
if (!keys?.length) return;
|
|
8453
|
+
await tmux([
|
|
8454
|
+
"send-keys",
|
|
8455
|
+
"-t",
|
|
8456
|
+
name,
|
|
8457
|
+
...keys
|
|
8458
|
+
], env);
|
|
8459
|
+
await sleep(300);
|
|
8460
|
+
}
|
|
8461
|
+
}
|
|
8462
|
+
/** Resolve once the pane has drawn something and then held still for
|
|
8463
|
+
* SCREEN_STILL_MS, or after `maxMs` (a TUI with an animation never
|
|
8464
|
+
* settles; a blank pane never draws). */
|
|
8465
|
+
async function waitStill(name, env, maxMs, ready) {
|
|
8466
|
+
const until = Date.now() + Math.max(0, maxMs);
|
|
8467
|
+
let last = "";
|
|
8468
|
+
let stillSince = 0;
|
|
8469
|
+
while (Date.now() < until) {
|
|
8470
|
+
const drawn = (await tmux([
|
|
8471
|
+
"capture-pane",
|
|
8472
|
+
"-p",
|
|
8473
|
+
"-t",
|
|
8474
|
+
name
|
|
8475
|
+
], env).catch(() => "")).trim();
|
|
8476
|
+
if (drawn && (!ready || ready.test(drawn))) {
|
|
8477
|
+
if (drawn === last) {
|
|
8478
|
+
if (Date.now() - stillSince >= SCREEN_STILL_MS) return;
|
|
8479
|
+
} else {
|
|
8480
|
+
last = drawn;
|
|
8481
|
+
stillSince = Date.now();
|
|
8482
|
+
}
|
|
8483
|
+
}
|
|
8484
|
+
await sleep(150);
|
|
8485
|
+
}
|
|
8486
|
+
}
|
|
8487
|
+
/** Upper bound on the pasted text settling on screen before Enter. */
|
|
8488
|
+
var PASTE_SETTLE_MS = 2500;
|
|
8355
8489
|
/** Command for a session kind: the instance's binary (`claude2`,
|
|
8356
8490
|
* `cursor-agent`), nothing for `shell`; `command.<agent>` in settings still
|
|
8357
8491
|
* overrides for one-off wrappers.
|