@dylanpiercey/work 0.0.140 → 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/{_BVHQZ1Ks.js → _CZz7Wyts.js} +17 -17
- package/dist/{_BXzfMZ_J.js → _CgMVRC4h.js} +179 -46
- package/dist/_CwAYWKgO.js +2 -0
- package/dist/{_CZd0I4nH.js → _jYLlSG8J.js} +79 -79
- package/dist/index.mjs +350 -344
- package/dist/public/assets/{_DKY8j24h.js → _B1B7SsmR.js} +1 -1
- package/dist/public/assets/_B1B7SsmR.js.br +0 -0
- package/dist/public/assets/{_D4OqQzgl.js → _B1nEnOeR.js} +1 -1
- package/dist/public/assets/_B1nEnOeR.js.br +0 -0
- package/dist/public/assets/{_C3Zk3OTU2.js → _B2vPwdLW2.js} +1 -1
- package/dist/public/assets/_B2vPwdLW2.js.br +0 -0
- package/dist/public/assets/{_B9ZAbzhF.js → _B2zlBhgP.js} +1 -1
- package/dist/public/assets/_B2zlBhgP.js.br +0 -0
- package/dist/public/assets/{_BbYPTPnv.js → _B3-rUIWu.js} +1 -1
- package/dist/public/assets/_B3-rUIWu.js.br +0 -0
- package/dist/public/assets/{_D6-73p3r.js → _B3v2Mxg9.js} +1 -1
- package/dist/public/assets/_B3v2Mxg9.js.br +0 -0
- package/dist/public/assets/{_BhFgAjkS.js → _B4zQcDgs.js} +1 -1
- package/dist/public/assets/_B4zQcDgs.js.br +0 -0
- package/dist/public/assets/{_Cp2jGFuU.js → _B7g6vstf.js} +1 -1
- package/dist/public/assets/_B7g6vstf.js.br +0 -0
- package/dist/public/assets/{_DJ2tTUOp.js → _B8bLTrAR.js} +1 -1
- package/dist/public/assets/_B8bLTrAR.js.br +0 -0
- package/dist/public/assets/{_DMmYo41H.js → _BERiWLR2.js} +1 -1
- package/dist/public/assets/_BERiWLR2.js.br +0 -0
- package/dist/public/assets/{_Dbx8VtKF.js → _BG6eCCtD.js} +1 -1
- package/dist/public/assets/_BG6eCCtD.js.br +0 -0
- package/dist/public/assets/{_DTBjw9eZ2.js → _BIGq6NLW2.js} +1 -1
- package/dist/public/assets/_BIGq6NLW2.js.br +0 -0
- package/dist/public/assets/{_BAQCbH2P2.js → _BJL8EzDT2.js} +1 -1
- package/dist/public/assets/_BJL8EzDT2.js.br +0 -0
- package/dist/public/assets/{_CQ3jYFa7.js → _BMjuOAQ4.js} +1 -1
- package/dist/public/assets/_BMjuOAQ4.js.br +0 -0
- package/dist/public/assets/{_AXvUJPqu2.js → _BNv3fPjT2.js} +1 -1
- package/dist/public/assets/_BNv3fPjT2.js.br +0 -0
- package/dist/public/assets/{_Bg_QV64o.js → _BQazGBwX.js} +1 -1
- package/dist/public/assets/_BQazGBwX.js.br +0 -0
- package/dist/public/assets/{_CTE7ghx3.js → _BY-WvMhs.js} +1 -1
- package/dist/public/assets/_BY-WvMhs.js.br +0 -0
- package/dist/public/assets/{_W3k8p4Ek.js → _BZJVwhA5.js} +1 -1
- package/dist/public/assets/_BZJVwhA5.js.br +0 -0
- package/dist/public/assets/{_BufLBhD52.js → _B_wawL6J2.js} +1 -1
- package/dist/public/assets/_B_wawL6J2.js.br +0 -0
- package/dist/public/assets/{_CmFZdEqe2.js → _Ba8vUCRv2.js} +1 -1
- package/dist/public/assets/_Ba8vUCRv2.js.br +0 -0
- package/dist/public/assets/{_BMpT9JnR.js → _BcTQMZit.js} +1 -1
- package/dist/public/assets/_BcTQMZit.js.br +0 -0
- package/dist/public/assets/{_CHRR_tdf2.js → _Blhy_Vd12.js} +1 -1
- package/dist/public/assets/_Blhy_Vd12.js.br +0 -0
- package/dist/public/assets/{_CJ9NIpKB2.js → _BuLSZuTT2.js} +1 -1
- package/dist/public/assets/{_cJ8FGCbf.js → _BuNhyEVe.js} +1 -1
- package/dist/public/assets/_BuNhyEVe.js.br +0 -0
- package/dist/public/assets/{_BcNyP4hq.js → _C2WEo047.js} +1 -1
- package/dist/public/assets/_C2WEo047.js.br +0 -0
- package/dist/public/assets/{_C4Z5tewe.js → _C5QblKM6.js} +1 -1
- package/dist/public/assets/_C5QblKM6.js.br +0 -0
- package/dist/public/assets/{_BuwtIM5I.js → _CBHyOOZB.js} +1 -1
- package/dist/public/assets/_CBHyOOZB.js.br +0 -0
- package/dist/public/assets/{_CgAhtyGH.js → _CFGDp3Sw.js} +1 -1
- package/dist/public/assets/_CFGDp3Sw.js.br +0 -0
- package/dist/public/assets/{_CTM65Tgs2.js → _CNPgjl1-2.js} +1 -1
- package/dist/public/assets/_CNPgjl1-2.js.br +0 -0
- package/dist/public/assets/{_DnGbQ0u92.js → _CSJQogH62.js} +1 -1
- package/dist/public/assets/_CSJQogH62.js.br +0 -0
- package/dist/public/assets/{_xrYLiFvZ.js → _CUjz6cMW.js} +1 -1
- package/dist/public/assets/_CUjz6cMW.js.br +0 -0
- package/dist/public/assets/{_a2HWPwTI2.js → _CWHyYnLM2.js} +1 -1
- package/dist/public/assets/_CWHyYnLM2.js.br +0 -0
- package/dist/public/assets/{_yDHOPHcI2.js → _CWzOnDwF2.js} +1 -1
- package/dist/public/assets/_CWzOnDwF2.js.br +0 -0
- package/dist/public/assets/{_DxmtmcQJ.js → _CXcrI0KH.js} +1 -1
- package/dist/public/assets/_CXcrI0KH.js.br +0 -0
- package/dist/public/assets/{_BfitEsfk2.js → _CYK6BCWH2.js} +1 -1
- package/dist/public/assets/_CYK6BCWH2.js.br +0 -0
- package/dist/public/assets/{_CpSY65dR.js → _CYSMKo7F.js} +1 -1
- package/dist/public/assets/_CYSMKo7F.js.br +0 -0
- package/dist/public/assets/{_aNDhwIJ9.js → _CfpVtrZd.js} +1 -1
- package/dist/public/assets/_CfpVtrZd.js.br +0 -0
- package/dist/public/assets/{_CQtiXk-1.js → _CftRvTVW.js} +1 -1
- package/dist/public/assets/_CftRvTVW.js.br +0 -0
- package/dist/public/assets/{_D2D61dAJ2.js → _ClSO8TOE2.js} +1 -1
- package/dist/public/assets/_ClSO8TOE2.js.br +0 -0
- package/dist/public/assets/{_wtrNcQUN.js → _CoIipOdm.js} +1 -1
- package/dist/public/assets/_CoIipOdm.js.br +0 -0
- package/dist/public/assets/{_Vg-VYt882.js → _CpqV5nOZ2.js} +1 -1
- package/dist/public/assets/_CpqV5nOZ2.js.br +0 -0
- package/dist/public/assets/{_YCkwa36v.js → _Cs_1C06H.js} +1 -1
- package/dist/public/assets/_Cs_1C06H.js.br +0 -0
- package/dist/public/assets/{_Bg6nm0G42.js → _CxrdJ7hp2.js} +1 -1
- package/dist/public/assets/_CxrdJ7hp2.js.br +0 -0
- package/dist/public/assets/{_B-G2jcQS.js → _CygMTO1C.js} +1 -1
- package/dist/public/assets/_CygMTO1C.js.br +0 -0
- package/dist/public/assets/{_Bmj60xc8.js → _CznrmqM4.js} +1 -1
- package/dist/public/assets/_CznrmqM4.js.br +0 -0
- package/dist/public/assets/{_BoPD9t5q.js → _DA_VGkH6.js} +1 -1
- package/dist/public/assets/_DA_VGkH6.js.br +0 -0
- package/dist/public/assets/{_DPI9uiRH.js → _DFGJGEpB.js} +1 -1
- package/dist/public/assets/_DFGJGEpB.js.br +0 -0
- package/dist/public/assets/{_C7fBne76.js → _DLzJNX7C.js} +1 -1
- package/dist/public/assets/_DLzJNX7C.js.br +0 -0
- package/dist/public/assets/{_DFMDH4tV2.js → _DMc_yyoD2.js} +1 -1
- package/dist/public/assets/_DMc_yyoD2.js.br +0 -0
- package/dist/public/assets/{_CcOLUAUB.js → _DMi37Owt.js} +1 -1
- package/dist/public/assets/_DMi37Owt.js.br +0 -0
- package/dist/public/assets/{_Bhm39j0U.js → _DRT4_m9d.js} +1 -1
- package/dist/public/assets/_DRT4_m9d.js.br +0 -0
- package/dist/public/assets/{_VnhmzZ9q.js → _DV6VXtzH.js} +5 -5
- package/dist/public/assets/_DV6VXtzH.js.br +0 -0
- package/dist/public/assets/{_B3yGzEa9.js → _DVIdvZ6L.js} +1 -1
- package/dist/public/assets/_DVIdvZ6L.js.br +0 -0
- package/dist/public/assets/{_DB76xuHC.js → _DXOGRSbq.js} +1 -1
- package/dist/public/assets/_DXOGRSbq.js.br +0 -0
- package/dist/public/assets/{_NBVVn24L2.js → _Da8gt_F52.js} +1 -1
- package/dist/public/assets/_Da8gt_F52.js.br +0 -0
- package/dist/public/assets/{_CHkTCCZL.js → _DbTEN3Co.js} +1 -1
- package/dist/public/assets/_DbTEN3Co.js.br +0 -0
- package/dist/public/assets/{_CmHQ_mnt2.js → _Dbp391kL2.js} +1 -1
- package/dist/public/assets/{_BAC2OLTW.js → _DcfWOyup.js} +1 -1
- package/dist/public/assets/_DcfWOyup.js.br +0 -0
- package/dist/public/assets/{_CWfLljks2.js → _Dd4lKEYp2.js} +1 -1
- package/dist/public/assets/_Dd4lKEYp2.js.br +0 -0
- package/dist/public/assets/{_BKuREDTF.js → _DgCQT80U.js} +1 -1
- package/dist/public/assets/_DgCQT80U.js.br +0 -0
- package/dist/public/assets/{_IHwiKLGt.js → _DhEdWcLh.js} +1 -1
- package/dist/public/assets/_DhEdWcLh.js.br +0 -0
- package/dist/public/assets/{_gGP1uofp.js → _DiHWQ-Ew.js} +1 -1
- package/dist/public/assets/_DiHWQ-Ew.js.br +0 -0
- package/dist/public/assets/{_jDIdu88k2.js → _DjcyEwVn2.js} +1 -1
- package/dist/public/assets/_DjcyEwVn2.js.br +0 -0
- package/dist/public/assets/{_BEIP10I4.js → _Dm-zlffy.js} +6 -6
- package/dist/public/assets/_Dm-zlffy.js.br +0 -0
- package/dist/public/assets/{_8J7bPMB9.js → _DnhKP7pH.js} +1 -1
- package/dist/public/assets/_DnhKP7pH.js.br +0 -0
- package/dist/public/assets/{_DUP19um8.js → _DpJdqIrj.js} +1 -1
- package/dist/public/assets/_DpJdqIrj.js.br +0 -0
- package/dist/public/assets/{_YjXp8Fa7.js → _DqxT_h3w.js} +1 -1
- package/dist/public/assets/_DqxT_h3w.js.br +0 -0
- package/dist/public/assets/{_pTrFhub3.js → _Dt461FGT.js} +1 -1
- package/dist/public/assets/_Dt461FGT.js.br +0 -0
- package/dist/public/assets/{_bjzjp9qV.js → _DvHOWoGF.js} +1 -1
- package/dist/public/assets/_DvHOWoGF.js.br +0 -0
- package/dist/public/assets/{_CXkMfc5M2.js → _N8vS2ulD2.js} +1 -1
- package/dist/public/assets/_N8vS2ulD2.js.br +0 -0
- package/dist/public/assets/{_BgRQhjCQ2.js → _ToAhQlpQ2.js} +1 -1
- package/dist/public/assets/_ToAhQlpQ2.js.br +0 -0
- package/dist/public/assets/{_BC1i3jO8.js → _TsHAzFfC.js} +1 -1
- package/dist/public/assets/_TsHAzFfC.js.br +0 -0
- package/dist/public/assets/{_CZQJ7BmY2.js → _ZVf0cDT12.js} +1 -1
- package/dist/public/assets/_ZVf0cDT12.js.br +0 -0
- package/dist/public/assets/{_DmqG9yJU.js → __g_2CBHN.js} +1 -1
- package/dist/public/assets/__g_2CBHN.js.br +0 -0
- package/dist/public/assets/{_BCaOQTDy.js → _hN1-RJcA.js} +1 -1
- package/dist/public/assets/{_DsmPrDz6.js → _p1qRbXAM.js} +1 -1
- package/dist/public/assets/_p1qRbXAM.js.br +0 -0
- package/dist/public/assets/{app-page-DD8AAZI2.css → app-page-B-xb0lEG.css} +1 -1
- 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/package.json +1 -1
- package/dist/_D2thrkJX.js +0 -2
- package/dist/public/assets/_8J7bPMB9.js.br +0 -0
- package/dist/public/assets/_AXvUJPqu2.js.br +0 -0
- package/dist/public/assets/_B-G2jcQS.js.br +0 -0
- package/dist/public/assets/_B3yGzEa9.js.br +0 -0
- package/dist/public/assets/_B9ZAbzhF.js.br +0 -0
- package/dist/public/assets/_BAC2OLTW.js.br +0 -0
- package/dist/public/assets/_BAQCbH2P2.js.br +0 -0
- package/dist/public/assets/_BC1i3jO8.js.br +0 -0
- package/dist/public/assets/_BEIP10I4.js.br +0 -0
- package/dist/public/assets/_BKuREDTF.js.br +0 -0
- package/dist/public/assets/_BMpT9JnR.js.br +0 -0
- package/dist/public/assets/_BbYPTPnv.js.br +0 -0
- package/dist/public/assets/_BcNyP4hq.js.br +0 -0
- package/dist/public/assets/_BfitEsfk2.js.br +0 -0
- package/dist/public/assets/_Bg6nm0G42.js.br +0 -0
- package/dist/public/assets/_BgRQhjCQ2.js.br +0 -0
- package/dist/public/assets/_Bg_QV64o.js.br +0 -0
- package/dist/public/assets/_BhFgAjkS.js.br +0 -0
- package/dist/public/assets/_Bhm39j0U.js.br +0 -0
- package/dist/public/assets/_Bmj60xc8.js.br +0 -0
- package/dist/public/assets/_BoPD9t5q.js.br +0 -0
- package/dist/public/assets/_BufLBhD52.js.br +0 -0
- package/dist/public/assets/_BuwtIM5I.js.br +0 -0
- package/dist/public/assets/_C3Zk3OTU2.js.br +0 -0
- package/dist/public/assets/_C4Z5tewe.js.br +0 -0
- package/dist/public/assets/_C7fBne76.js.br +0 -0
- package/dist/public/assets/_CHRR_tdf2.js.br +0 -0
- package/dist/public/assets/_CHkTCCZL.js.br +0 -0
- package/dist/public/assets/_CQ3jYFa7.js.br +0 -0
- package/dist/public/assets/_CQtiXk-1.js.br +0 -0
- package/dist/public/assets/_CTE7ghx3.js.br +0 -0
- package/dist/public/assets/_CTM65Tgs2.js.br +0 -0
- package/dist/public/assets/_CWfLljks2.js.br +0 -0
- package/dist/public/assets/_CXkMfc5M2.js.br +0 -0
- package/dist/public/assets/_CZQJ7BmY2.js.br +0 -0
- package/dist/public/assets/_CcOLUAUB.js.br +0 -0
- package/dist/public/assets/_CgAhtyGH.js.br +0 -0
- package/dist/public/assets/_CmFZdEqe2.js.br +0 -0
- package/dist/public/assets/_Cp2jGFuU.js.br +0 -0
- package/dist/public/assets/_CpSY65dR.js.br +0 -0
- package/dist/public/assets/_D2D61dAJ2.js.br +0 -0
- package/dist/public/assets/_D4OqQzgl.js.br +0 -0
- package/dist/public/assets/_D6-73p3r.js.br +0 -0
- package/dist/public/assets/_DB76xuHC.js.br +0 -0
- package/dist/public/assets/_DFMDH4tV2.js.br +0 -0
- package/dist/public/assets/_DJ2tTUOp.js.br +0 -0
- package/dist/public/assets/_DKY8j24h.js.br +0 -0
- package/dist/public/assets/_DMmYo41H.js.br +0 -0
- package/dist/public/assets/_DPI9uiRH.js.br +0 -0
- package/dist/public/assets/_DTBjw9eZ2.js.br +0 -0
- package/dist/public/assets/_DUP19um8.js.br +0 -0
- package/dist/public/assets/_Dbx8VtKF.js.br +0 -0
- package/dist/public/assets/_DmqG9yJU.js.br +0 -0
- package/dist/public/assets/_DnGbQ0u92.js.br +0 -0
- package/dist/public/assets/_DsmPrDz6.js.br +0 -0
- package/dist/public/assets/_DxmtmcQJ.js.br +0 -0
- package/dist/public/assets/_IHwiKLGt.js.br +0 -0
- package/dist/public/assets/_NBVVn24L2.js.br +0 -0
- package/dist/public/assets/_Vg-VYt882.js.br +0 -0
- package/dist/public/assets/_VnhmzZ9q.js.br +0 -0
- package/dist/public/assets/_W3k8p4Ek.js.br +0 -0
- package/dist/public/assets/_YCkwa36v.js.br +0 -0
- package/dist/public/assets/_YjXp8Fa7.js.br +0 -0
- package/dist/public/assets/_a2HWPwTI2.js.br +0 -0
- package/dist/public/assets/_aNDhwIJ9.js.br +0 -0
- package/dist/public/assets/_bjzjp9qV.js.br +0 -0
- package/dist/public/assets/_cJ8FGCbf.js.br +0 -0
- package/dist/public/assets/_gGP1uofp.js.br +0 -0
- package/dist/public/assets/_jDIdu88k2.js.br +0 -0
- package/dist/public/assets/_pTrFhub3.js.br +0 -0
- package/dist/public/assets/_wtrNcQUN.js.br +0 -0
- package/dist/public/assets/_xrYLiFvZ.js.br +0 -0
- package/dist/public/assets/_yDHOPHcI2.js.br +0 -0
- package/dist/public/assets/app-page-DD8AAZI2.css.br +0 -0
- package/dist/public/assets/diff-view-CigyjzyU.css +0 -1
- package/dist/public/assets/diff-view-CigyjzyU.css.br +0 -0
- package/dist/public/assets/new-CeNxYCDk.js +0 -1
- package/dist/public/assets/settings-CeNxYCDk.js +0 -1
- package/dist/public/assets/w-CeNxYCDk.js +0 -1
- package/dist/public/assets/w._-CY06s2qp.js +0 -1
- package/dist/public/assets/w._-CeNxYCDk.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) => {
|
|
@@ -6501,21 +6501,24 @@ var viewers = /* @__PURE__ */ new Map();
|
|
|
6501
6501
|
function setAgentPhase(sessionId, phase, reason, summary) {
|
|
6502
6502
|
if (phase === "waiting" && reason === "done") {
|
|
6503
6503
|
if (summary) summaries.set(sessionId, summary);
|
|
6504
|
-
|
|
6504
|
+
notify(sessionId, "done");
|
|
6505
6505
|
if (phases.has(sessionId)) applyChange(sessionId, () => {
|
|
6506
6506
|
phases.delete(sessionId);
|
|
6507
6507
|
reasons.delete(sessionId);
|
|
6508
|
-
});
|
|
6508
|
+
}, true);
|
|
6509
6509
|
return;
|
|
6510
6510
|
}
|
|
6511
6511
|
if (phase === "waiting" && summary) summaries.set(sessionId, summary);
|
|
6512
|
-
else if (phase === "working")
|
|
6512
|
+
else if (phase === "working") {
|
|
6513
|
+
summaries.delete(sessionId);
|
|
6514
|
+
reasons.delete(sessionId);
|
|
6515
|
+
}
|
|
6513
6516
|
const next = phase === "waiting" && reason ? reason : reasons.get(sessionId);
|
|
6514
6517
|
if (phases.get(sessionId) === phase && reasons.get(sessionId) === next) return;
|
|
6515
6518
|
applyChange(sessionId, () => {
|
|
6516
6519
|
phases.set(sessionId, phase);
|
|
6517
6520
|
if (phase === "waiting" && reason) reasons.set(sessionId, reason);
|
|
6518
|
-
});
|
|
6521
|
+
}, true);
|
|
6519
6522
|
}
|
|
6520
6523
|
/** Live visible-terminal count per session, reported by the term server;
|
|
6521
6524
|
* a session someone is watching does not push notifications. */
|
|
@@ -6564,23 +6567,26 @@ function clearAgentPhase(sessionId) {
|
|
|
6564
6567
|
function agentPhase(sessionId) {
|
|
6565
6568
|
return phases.get(sessionId) ?? scraped.get(sessionId);
|
|
6566
6569
|
}
|
|
6567
|
-
/**
|
|
6568
|
-
*
|
|
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. */
|
|
6569
6575
|
var BOOT_GRACE_MS = 15e3;
|
|
6570
6576
|
var bootedAt = Date.now();
|
|
6571
|
-
function applyChange(sessionId, mutate) {
|
|
6577
|
+
function applyChange(sessionId, mutate, fromHook = false) {
|
|
6572
6578
|
const before = agentPhase(sessionId);
|
|
6573
6579
|
mutate();
|
|
6574
6580
|
const after = agentPhase(sessionId);
|
|
6575
6581
|
if (before === after) return;
|
|
6576
6582
|
publishChange(sessionId);
|
|
6577
|
-
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");
|
|
6578
6584
|
}
|
|
6579
6585
|
function publishChange(sessionId) {
|
|
6580
6586
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
6581
6587
|
if (row?.workspace_id) {
|
|
6582
6588
|
const workspaceId = row.workspace_id;
|
|
6583
|
-
import("./
|
|
6589
|
+
import("./_CwAYWKgO.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
6584
6590
|
return;
|
|
6585
6591
|
}
|
|
6586
6592
|
publish("sessions.changed");
|
|
@@ -6593,33 +6599,33 @@ function publishChange(sessionId) {
|
|
|
6593
6599
|
* come from the env tmux gave the pane (see sessions.ts). */
|
|
6594
6600
|
function stateCurl(state, reason) {
|
|
6595
6601
|
const qs = `session=$WORK_SESSION_ID&state=${state}` + (reason ? `&reason=${reason}` : "");
|
|
6596
|
-
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`;
|
|
6597
6603
|
}
|
|
6598
6604
|
/** Claude-format hook groups (`{matcher?, hooks:[{type:"command",command}]}`)
|
|
6599
6605
|
* for a hook map — the JSON shape Claude, Copilot plugins and Grok all read. */
|
|
6600
6606
|
function claudeStyleHooks(map, extra = {}) {
|
|
6601
6607
|
const hooks = {};
|
|
6602
|
-
for (const [event, state, reason, matcher] of map) hooks[event]
|
|
6608
|
+
for (const [event, state, reason, matcher] of map) (hooks[event] ??= []).push({
|
|
6603
6609
|
...matcher ? { matcher } : {},
|
|
6604
6610
|
hooks: [{
|
|
6605
6611
|
type: "command",
|
|
6606
6612
|
command: stateCurl(state, reason),
|
|
6607
6613
|
...extra
|
|
6608
6614
|
}]
|
|
6609
|
-
}
|
|
6615
|
+
});
|
|
6610
6616
|
return hooks;
|
|
6611
6617
|
}
|
|
6612
6618
|
var NOTIFICATION_LABELS = {
|
|
6613
6619
|
permission_prompt: "Waiting for permission",
|
|
6614
|
-
idle_prompt: "Waiting for your reply",
|
|
6615
6620
|
agent_needs_input: "Waiting for input",
|
|
6616
6621
|
elicitation_dialog: "Asking a question",
|
|
6617
6622
|
elicitation_url_dialog: "Needs a browser sign-in"
|
|
6618
6623
|
};
|
|
6619
6624
|
/** Notifications that mean the agent is nudging about an idle session
|
|
6620
|
-
* rather than blocking on one
|
|
6621
|
-
*
|
|
6622
|
-
* 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. */
|
|
6623
6629
|
var NUDGE_NOTIFICATIONS = /* @__PURE__ */ new Set(["idle_prompt"]);
|
|
6624
6630
|
function str$1(v) {
|
|
6625
6631
|
return typeof v === "string" ? v.trim() : "";
|
|
@@ -6630,11 +6636,12 @@ function notificationType(p) {
|
|
|
6630
6636
|
}
|
|
6631
6637
|
/** Read a Claude-format payload: last message on Stop, the CLI's own
|
|
6632
6638
|
* notification line (or a label for its type) on Notification, and the
|
|
6633
|
-
* idle nudge
|
|
6634
|
-
*
|
|
6639
|
+
* idle nudge dropped. Families that speak this dialect start here and
|
|
6640
|
+
* add their own quirks. */
|
|
6635
6641
|
function readClaudeStyle(p, reported) {
|
|
6636
6642
|
const kind = notificationType(p);
|
|
6637
|
-
|
|
6643
|
+
if (NUDGE_NOTIFICATIONS.has(kind)) return { ignore: true };
|
|
6644
|
+
const reason = reported;
|
|
6638
6645
|
const text = str$1(p.last_assistant_message) || str$1(p["last-assistant-message"]) || str$1(p.lastAssistantMessage);
|
|
6639
6646
|
if (text) return {
|
|
6640
6647
|
reason,
|
|
@@ -7147,15 +7154,46 @@ async function claudeRow(account) {
|
|
|
7147
7154
|
const fallback = loaded.payload ? null : claudeJsonFallback(account);
|
|
7148
7155
|
return markStale(parseRow$4(account, loaded.payload ?? fallback, fallback ? "claude.json" : loaded.source), account.label, tokenExpired(account), loaded.reason);
|
|
7149
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
|
+
}
|
|
7150
7176
|
/** Claude Code takes its settings inline (`--settings` accepts a JSON
|
|
7151
7177
|
* string), so the hooks travel in argv and nothing is written anywhere.
|
|
7152
7178
|
* Its Notification hook fires for permission prompts and questions —
|
|
7153
|
-
* and for the idle nudge, which readClaudeStyle
|
|
7179
|
+
* and for the idle nudge, which readClaudeStyle drops. */
|
|
7154
7180
|
var claude = {
|
|
7155
|
-
meta:
|
|
7181
|
+
meta: meta$6,
|
|
7156
7182
|
launchFlags: () => ["--settings", JSON.stringify({ hooks: claudeStyleHooks([
|
|
7157
7183
|
["UserPromptSubmit", "working"],
|
|
7158
|
-
[
|
|
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"],
|
|
7159
7197
|
[
|
|
7160
7198
|
"Stop",
|
|
7161
7199
|
"waiting",
|
|
@@ -7173,7 +7211,7 @@ var claude = {
|
|
|
7173
7211
|
"CLAUDECODE",
|
|
7174
7212
|
"AI_AGENT"
|
|
7175
7213
|
],
|
|
7176
|
-
readHook:
|
|
7214
|
+
readHook: readHook$4,
|
|
7177
7215
|
usage: () => Promise.all(claudeAccounts().map((account) => claudeRow(account)))
|
|
7178
7216
|
};
|
|
7179
7217
|
//#endregion
|
|
@@ -7530,9 +7568,19 @@ function lastMessageFromTranscript(p) {
|
|
|
7530
7568
|
}
|
|
7531
7569
|
} catch {}
|
|
7532
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
|
+
}
|
|
7533
7580
|
var copilot = {
|
|
7534
7581
|
meta: meta$4,
|
|
7535
7582
|
launchFlags: () => ["--plugin-dir", pluginDir()],
|
|
7583
|
+
startupPrompt,
|
|
7536
7584
|
reportsWorking: () => true,
|
|
7537
7585
|
envPrefixes: ["COPILOT_"],
|
|
7538
7586
|
readHook: readHook$2,
|
|
@@ -7651,6 +7699,7 @@ async function cursorRow() {
|
|
|
7651
7699
|
* nothing else — a stopped turn and a question look the same. */
|
|
7652
7700
|
var cursor = {
|
|
7653
7701
|
meta: meta_default$3,
|
|
7702
|
+
readyScreen: /Plan, search, build anything|Add a follow-up/,
|
|
7654
7703
|
usage: () => cursorRow().then((row) => [row])
|
|
7655
7704
|
};
|
|
7656
7705
|
//#endregion
|
|
@@ -7787,9 +7836,21 @@ var HOOKS = claudeStyleHooks([
|
|
|
7787
7836
|
"attention"
|
|
7788
7837
|
]
|
|
7789
7838
|
], { timeout: 5 });
|
|
7790
|
-
|
|
7791
|
-
|
|
7792
|
-
|
|
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
|
+
}
|
|
7793
7854
|
/** Grok has no flag for hooks. It discovers them from `~/.grok/hooks-paths`:
|
|
7794
7855
|
* one absolute path per line, the registry its own `/hooks-add` command
|
|
7795
7856
|
* appends to. work's hook file is kept in the data dir — the commands read
|
|
@@ -7797,9 +7858,9 @@ var registered = false;
|
|
|
7797
7858
|
* once. The one line in that registry is the only thing work writes
|
|
7798
7859
|
* outside its own dir for any agent. */
|
|
7799
7860
|
function registerHooks() {
|
|
7800
|
-
const file =
|
|
7861
|
+
const file = HOOK_FILE();
|
|
7801
7862
|
writeIfChanged(file, JSON.stringify({ hooks: HOOKS }, null, 2));
|
|
7802
|
-
const registry =
|
|
7863
|
+
const registry = REGISTRY();
|
|
7803
7864
|
try {
|
|
7804
7865
|
let current = "";
|
|
7805
7866
|
try {
|
|
@@ -7809,11 +7870,7 @@ function registerHooks() {
|
|
|
7809
7870
|
fs.mkdirSync(path.dirname(registry), { recursive: true });
|
|
7810
7871
|
fs.appendFileSync(registry, `${current && !current.endsWith("\n") ? "\n" : ""}${file}\n`);
|
|
7811
7872
|
}
|
|
7812
|
-
|
|
7813
|
-
} catch {
|
|
7814
|
-
registered = false;
|
|
7815
|
-
}
|
|
7816
|
-
return registered;
|
|
7873
|
+
} catch {}
|
|
7817
7874
|
}
|
|
7818
7875
|
function readHook$1(p, reported) {
|
|
7819
7876
|
if (str$1(p.subagentType)) return { ignore: true };
|
|
@@ -7831,7 +7888,7 @@ var grok = {
|
|
|
7831
7888
|
registerHooks();
|
|
7832
7889
|
return [];
|
|
7833
7890
|
},
|
|
7834
|
-
reportsWorking:
|
|
7891
|
+
reportsWorking: registered,
|
|
7835
7892
|
promptAsArgv: true,
|
|
7836
7893
|
envPrefixes: ["GROK_"],
|
|
7837
7894
|
readHook: readHook$1,
|
|
@@ -7919,21 +7976,23 @@ export const WorkSessionState = async () => {
|
|
|
7919
7976
|
};
|
|
7920
7977
|
};
|
|
7921
7978
|
`;
|
|
7979
|
+
var PLUGIN_FILE = () => path.join(config.dataDir, "opencode-plugin.js");
|
|
7922
7980
|
/** Whether the plugin is on disk for opencode to load — without it the
|
|
7923
|
-
* screen has to speak for the session.
|
|
7924
|
-
|
|
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
|
+
}
|
|
7925
7987
|
/** opencode resolves a `plugin` entry that looks like a path as a local
|
|
7926
7988
|
* file, and reads `OPENCODE_CONFIG_CONTENT` as one more config layer that
|
|
7927
7989
|
* merges over the user's own. Together that loads work's plugin from
|
|
7928
7990
|
* work's data dir without writing a line into ~/.config/opencode. */
|
|
7929
7991
|
function pluginConfig() {
|
|
7930
|
-
const file =
|
|
7992
|
+
const file = PLUGIN_FILE();
|
|
7931
7993
|
try {
|
|
7932
7994
|
writeIfChanged(file, PLUGIN(config.appPort));
|
|
7933
|
-
|
|
7934
|
-
} catch {
|
|
7935
|
-
installed = false;
|
|
7936
|
-
}
|
|
7995
|
+
} catch {}
|
|
7937
7996
|
return JSON.stringify({ plugin: [file] });
|
|
7938
7997
|
}
|
|
7939
7998
|
function readHook(p, reported) {
|
|
@@ -7956,8 +8015,9 @@ var AGENTS = [
|
|
|
7956
8015
|
grok,
|
|
7957
8016
|
{
|
|
7958
8017
|
meta: meta$1,
|
|
8018
|
+
readyScreen: /Ask anything/,
|
|
7959
8019
|
launchEnv: () => ({ OPENCODE_CONFIG_CONTENT: pluginConfig() }),
|
|
7960
|
-
reportsWorking:
|
|
8020
|
+
reportsWorking: installed,
|
|
7961
8021
|
envPrefixes: ["OPENCODE_"],
|
|
7962
8022
|
readHook
|
|
7963
8023
|
},
|
|
@@ -7986,6 +8046,14 @@ function agentLaunchEnv(id) {
|
|
|
7986
8046
|
function reportsWorking(id) {
|
|
7987
8047
|
return agentFor(id)?.reportsWorking?.() ?? false;
|
|
7988
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
|
+
}
|
|
7989
8057
|
/** Cold launch takes the first prompt as argv rather than a paste. */
|
|
7990
8058
|
function promptAsArgv(id) {
|
|
7991
8059
|
return agentFor(id)?.promptAsArgv ?? false;
|
|
@@ -8105,7 +8173,7 @@ async function sendToSession(id, text, size) {
|
|
|
8105
8173
|
}
|
|
8106
8174
|
await tmux(newSessionArgs(session, wsPath, "-d", void 0, size), env);
|
|
8107
8175
|
markTmuxStarted(id);
|
|
8108
|
-
await
|
|
8176
|
+
await waitForAgent(name, env, session.agent);
|
|
8109
8177
|
}
|
|
8110
8178
|
const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
|
|
8111
8179
|
await tmux([
|
|
@@ -8123,7 +8191,7 @@ async function sendToSession(id, text, size) {
|
|
|
8123
8191
|
"-t",
|
|
8124
8192
|
name
|
|
8125
8193
|
], env);
|
|
8126
|
-
await
|
|
8194
|
+
await waitStill(name, env, PASTE_SETTLE_MS);
|
|
8127
8195
|
await tmux([
|
|
8128
8196
|
"send-keys",
|
|
8129
8197
|
"-t",
|
|
@@ -8351,8 +8419,73 @@ function cleanEnv() {
|
|
|
8351
8419
|
env.PATH = [...parts, ...bins.filter((bin) => !parts.includes(bin))].join(":");
|
|
8352
8420
|
return forceUtf8Locale(env);
|
|
8353
8421
|
}
|
|
8354
|
-
|
|
8355
|
-
|
|
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;
|
|
8356
8489
|
/** Command for a session kind: the instance's binary (`claude2`,
|
|
8357
8490
|
* `cursor-agent`), nothing for `shell`; `command.<agent>` in settings still
|
|
8358
8491
|
* overrides for one-off wrappers.
|