@dylanpiercey/work 0.0.71 → 0.0.72
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/{_DgDsZuoQ.js → _BfXE8Kjn.js} +191 -9
- package/dist/_DLxkSyzt.js +2 -0
- package/dist/{_8t6K8Jk8.js → _DXDmuFjC.js} +62 -62
- package/dist/{_D3qriis-.js → _Dq5wZ9y2.js} +2 -2
- package/dist/index.mjs +160 -133
- package/dist/public/assets/{_B_OHURbh2.js → _-G0Dx3t52.js} +1 -1
- package/dist/public/assets/_-G0Dx3t52.js.br +0 -0
- package/dist/public/assets/{_C-LtCarQ2.js → _B-xEEN4l2.js} +1 -1
- package/dist/public/assets/{_DNdrj0-M2.js → _B0-ns0BU2.js} +1 -1
- package/dist/public/assets/_B0-ns0BU2.js.br +0 -0
- package/dist/public/assets/{_Du4JDj5_.js → _B5x1OTTu.js} +1 -1
- package/dist/public/assets/_B5x1OTTu.js.br +0 -0
- package/dist/public/assets/{_BEEgRpqj.js → _B61wm226.js} +1 -1
- package/dist/public/assets/_B61wm226.js.br +0 -0
- package/dist/public/assets/{_CzxBqeDO.js → _B7OMjNs8.js} +1 -1
- package/dist/public/assets/_B7OMjNs8.js.br +0 -0
- package/dist/public/assets/{_Bn6Hn06S.js → _B7vLPjLl.js} +1 -1
- package/dist/public/assets/_B7vLPjLl.js.br +0 -0
- package/dist/public/assets/{_USmNZPRb.js → _B7vYPsWj.js} +1 -1
- package/dist/public/assets/_B7vYPsWj.js.br +0 -0
- package/dist/public/assets/{_CgENI0zF2.js → _BBWg58GJ2.js} +1 -1
- package/dist/public/assets/_BBWg58GJ2.js.br +0 -0
- package/dist/public/assets/{_CgwQS6LN2.js → _BE8lov_p2.js} +1 -1
- package/dist/public/assets/_BE8lov_p2.js.br +0 -0
- package/dist/public/assets/{_DAun3Lt7.js → _BGhBZpWT.js} +1 -1
- package/dist/public/assets/_BGhBZpWT.js.br +0 -0
- package/dist/public/assets/{_UgQ3KVU7.js → _BKTem58K.js} +1 -1
- package/dist/public/assets/_BKTem58K.js.br +0 -0
- package/dist/public/assets/{_DSg_vc6H2.js → _BLZtgkbJ2.js} +1 -1
- package/dist/public/assets/_BLZtgkbJ2.js.br +0 -0
- package/dist/public/assets/{_DTSUTR0_2.js → _BOQrg7gU2.js} +1 -1
- package/dist/public/assets/_BOQrg7gU2.js.br +0 -0
- package/dist/public/assets/{_BZNMfrgb.js → _BRzgmRS2.js} +1 -1
- package/dist/public/assets/_BRzgmRS2.js.br +0 -0
- package/dist/public/assets/{_CbgTB_-a.js → _BSSf-PYx.js} +1 -1
- package/dist/public/assets/_BSSf-PYx.js.br +0 -0
- package/dist/public/assets/{_B3wjms9s2.js → _BTXq-nPh2.js} +1 -1
- package/dist/public/assets/_BTXq-nPh2.js.br +0 -0
- package/dist/public/assets/{_C_9OeUA2.js → _BUs7NMrG.js} +1 -1
- package/dist/public/assets/_BUs7NMrG.js.br +0 -0
- package/dist/public/assets/{_DbEPPsY1.js → _BXzRffYj.js} +1 -1
- package/dist/public/assets/_BXzRffYj.js.br +0 -0
- package/dist/public/assets/{_DtE0g-o1.js → _B_OOMZsL.js} +1 -1
- package/dist/public/assets/_B_OOMZsL.js.br +0 -0
- package/dist/public/assets/{_DToVjT46.js → _BdVRHt6-.js} +1 -1
- package/dist/public/assets/_BdVRHt6-.js.br +0 -0
- package/dist/public/assets/{_DZss8Wq02.js → _Bj5u_Vnk2.js} +1 -1
- package/dist/public/assets/_Bj5u_Vnk2.js.br +0 -0
- package/dist/public/assets/{_CWVKprFe2.js → _BkrDGdOx2.js} +1 -1
- package/dist/public/assets/_BkrDGdOx2.js.br +0 -0
- package/dist/public/assets/{_BUteNftu.js → _Bohi4mUp.js} +1 -1
- package/dist/public/assets/_Bohi4mUp.js.br +0 -0
- package/dist/public/assets/{_CvMvIBy42.js → _BpJS3XpY2.js} +1 -1
- package/dist/public/assets/_BpJS3XpY2.js.br +0 -0
- package/dist/public/assets/{_CiElF6r4.js → _BqE48K5c.js} +3 -3
- package/dist/public/assets/_BqE48K5c.js.br +0 -0
- package/dist/public/assets/{_uyFxI_FF2.js → _C-uc9hBA2.js} +1 -1
- package/dist/public/assets/_C-uc9hBA2.js.br +0 -0
- package/dist/public/assets/{_DWdZCyBL2.js → _C41DPP-z2.js} +1 -1
- package/dist/public/assets/_C41DPP-z2.js.br +0 -0
- package/dist/public/assets/{_BPH6VN8T2.js → _C5VLAw4k2.js} +1 -1
- package/dist/public/assets/_C5VLAw4k2.js.br +0 -0
- package/dist/public/assets/{_Lot9I7Im.js → _C82GEkZ4.js} +1 -1
- package/dist/public/assets/_C82GEkZ4.js.br +0 -0
- package/dist/public/assets/{_BltuSqY6.js → _CH2m75uw.js} +1 -1
- package/dist/public/assets/_CH2m75uw.js.br +0 -0
- package/dist/public/assets/{_CTdFL4wj.js → _CNClKCWp.js} +1 -1
- package/dist/public/assets/_CNClKCWp.js.br +0 -0
- package/dist/public/assets/{_B5mDTFiX.js → _COZ91m9B.js} +1 -1
- package/dist/public/assets/_COZ91m9B.js.br +0 -0
- package/dist/public/assets/{_C-wce-RA.js → _CTQouXRe.js} +1 -1
- package/dist/public/assets/_CTQouXRe.js.br +0 -0
- package/dist/public/assets/{_BqfMkwYX.js → _CV60RHGa.js} +1 -1
- package/dist/public/assets/_CV60RHGa.js.br +0 -0
- package/dist/public/assets/{_HO-Qb8pn.js → _CWUF1FpI.js} +1 -1
- package/dist/public/assets/_CWUF1FpI.js.br +0 -0
- package/dist/public/assets/{_DPDIk03W2.js → _CYgKydU62.js} +1 -1
- package/dist/public/assets/_CYgKydU62.js.br +0 -0
- package/dist/public/assets/{_BPW0wOMI2.js → _CfjckiVM2.js} +1 -1
- package/dist/public/assets/_CfjckiVM2.js.br +0 -0
- package/dist/public/assets/{_BztBrnhM.js → _ChkNS16f.js} +1 -1
- package/dist/public/assets/_ChkNS16f.js.br +0 -0
- package/dist/public/assets/{_BZK8bxUc.js → _CifL_Zbh.js} +1 -1
- package/dist/public/assets/_CifL_Zbh.js.br +0 -0
- package/dist/public/assets/{_CXSLFN1Q2.js → _CivjiEX92.js} +1 -1
- package/dist/public/assets/_CivjiEX92.js.br +0 -0
- package/dist/public/assets/{_CLGWdoAJ.js → _Clv6arvL.js} +1 -1
- package/dist/public/assets/_Clv6arvL.js.br +0 -0
- package/dist/public/assets/{_CpnXaqgd2.js → _CnIE6_qB2.js} +1 -1
- package/dist/public/assets/_CnIE6_qB2.js.br +0 -0
- package/dist/public/assets/{_CGVLhh2k.js → _Csmr2y3G.js} +1 -1
- package/dist/public/assets/_Csmr2y3G.js.br +0 -0
- package/dist/public/assets/{_DBiZo1op2.js → _CuFX3MHy2.js} +1 -1
- package/dist/public/assets/{_BqrygBOe.js → _D-SthL18.js} +1 -1
- package/dist/public/assets/{_Bd-WyHvg.js → _D1XJzdSj.js} +1 -1
- package/dist/public/assets/_D1XJzdSj.js.br +0 -0
- package/dist/public/assets/{_DXCHOWYL.js → _D5nVZek7.js} +1 -1
- package/dist/public/assets/_D5nVZek7.js.br +0 -0
- package/dist/public/assets/{_Cn0DEemU.js → _DAi07M7i.js} +1 -1
- package/dist/public/assets/_DAi07M7i.js.br +10 -0
- package/dist/public/assets/{_Dp1TBNWN.js → _DFAhtXzm.js} +1 -1
- package/dist/public/assets/_DFAhtXzm.js.br +0 -0
- package/dist/public/assets/{_CS1j3Hb2.js → _DHelzj06.js} +1 -1
- package/dist/public/assets/_DHelzj06.js.br +0 -0
- package/dist/public/assets/{_BFfBgn79.js → _DPL2ZCgQ.js} +1 -1
- package/dist/public/assets/_DPL2ZCgQ.js.br +5 -0
- package/dist/public/assets/{_DwNswmCf.js → _DX2Uab-U.js} +1 -1
- package/dist/public/assets/_DX2Uab-U.js.br +0 -0
- package/dist/public/assets/{_BUeHx4zC2.js → _Dixad7y-2.js} +1 -1
- package/dist/public/assets/_Dixad7y-2.js.br +0 -0
- package/dist/public/assets/{_9aJgLz6G2.js → _DjVNZ4eK2.js} +1 -1
- package/dist/public/assets/_DjVNZ4eK2.js.br +0 -0
- package/dist/public/assets/{_DeMAtQzd.js → _DmLXUxIk.js} +1 -1
- package/dist/public/assets/_DmLXUxIk.js.br +0 -0
- package/dist/public/assets/{_Dcav7tzL.js → _DpCy3kYU.js} +6 -6
- package/dist/public/assets/_DpCy3kYU.js.br +0 -0
- package/dist/public/assets/{__DTZmGl8.js → _DpENgSEx.js} +1 -1
- package/dist/public/assets/_DpENgSEx.js.br +0 -0
- package/dist/public/assets/{_C6jdreqj.js → _Drt_09zp.js} +1 -1
- package/dist/public/assets/_Drt_09zp.js.br +0 -0
- package/dist/public/assets/{_CdHoxy6P.js → _DshD8Ycc.js} +1 -1
- package/dist/public/assets/_DshD8Ycc.js.br +0 -0
- package/dist/public/assets/{_QQHXmR7d.js → _DvcpKhXL.js} +1 -1
- package/dist/public/assets/_DvcpKhXL.js.br +0 -0
- package/dist/public/assets/{_B0h_gNbx.js → _Dx6kLICJ.js} +1 -1
- package/dist/public/assets/_Dx6kLICJ.js.br +0 -0
- package/dist/public/assets/{_Ek1T1FMw.js → _KFiFSJT8.js} +1 -1
- package/dist/public/assets/_KFiFSJT8.js.br +0 -0
- package/dist/public/assets/{_Dbf-xJ6k.js → _LdAm0jkh.js} +1 -1
- package/dist/public/assets/_LdAm0jkh.js.br +0 -0
- package/dist/public/assets/{_B3VIvUTs2.js → _QPczAdMm2.js} +1 -1
- package/dist/public/assets/_QPczAdMm2.js.br +0 -0
- package/dist/public/assets/{_CeVU1yJL.js → _RF9fz9Iu.js} +1 -1
- package/dist/public/assets/_RF9fz9Iu.js.br +0 -0
- package/dist/public/assets/{_COmAhQWL.js → _UxrF5q9P.js} +1 -1
- package/dist/public/assets/_UxrF5q9P.js.br +0 -0
- package/dist/public/assets/{_dAXKSDYL.js → _Wxr28jKW.js} +1 -1
- package/dist/public/assets/_Wxr28jKW.js.br +0 -0
- package/dist/public/assets/{_BKRausc72.js → _Y-mhaywp2.js} +1 -1
- package/dist/public/assets/_Y-mhaywp2.js.br +0 -0
- package/dist/public/assets/{_BPmmCSLY.js → _c9sBllWt.js} +1 -1
- package/dist/public/assets/_c9sBllWt.js.br +0 -0
- package/dist/public/assets/{_DqBuHT5A.js → _ckRann09.js} +1 -1
- package/dist/public/assets/_ckRann09.js.br +0 -0
- package/dist/public/assets/{_BejV602Y.js → _f4WTM4Kz.js} +1 -1
- package/dist/public/assets/_f4WTM4Kz.js.br +0 -0
- package/dist/public/assets/{_AeL166wR2.js → _sUX0JPgf2.js} +1 -1
- package/dist/public/assets/_sUX0JPgf2.js.br +0 -0
- package/dist/public/assets/{_D2vmNrtA.js → _snCcB5_5.js} +1 -1
- package/dist/public/assets/_snCcB5_5.js.br +0 -0
- package/dist/public/assets/{_BYrRgI_G.js → _vWJVVrmZ.js} +1 -1
- package/dist/public/assets/_vWJVVrmZ.js.br +0 -0
- package/dist/public/assets/{_BR_6IGfk.js → _wgItEK0c.js} +1 -1
- package/dist/public/assets/_wgItEK0c.js.br +0 -0
- package/dist/public/assets/{app-page-Bv2S_Tip.css → app-page-CAw2YLYv.css} +1 -1
- package/dist/public/assets/app-page-CAw2YLYv.css.br +0 -0
- package/dist/public/assets/diff-view-DCB49VYM.css +1 -0
- package/dist/public/assets/diff-view-DCB49VYM.css.br +0 -0
- package/dist/public/assets/new-C9qRFMyu.js +1 -0
- package/dist/public/assets/settings-C9qRFMyu.js +1 -0
- package/dist/public/assets/w-C9qRFMyu.js +1 -0
- package/dist/public/assets/w._-C9qRFMyu.js +1 -0
- package/dist/public/assets/w._-phpTDxP7.js +1 -0
- package/package.json +1 -1
- package/dist/_xZfpJdQE.js +0 -2
- package/dist/public/assets/_9aJgLz6G2.js.br +0 -0
- package/dist/public/assets/_AeL166wR2.js.br +0 -0
- package/dist/public/assets/_B0h_gNbx.js.br +0 -0
- package/dist/public/assets/_B3VIvUTs2.js.br +0 -0
- package/dist/public/assets/_B3wjms9s2.js.br +0 -0
- package/dist/public/assets/_B5mDTFiX.js.br +0 -0
- package/dist/public/assets/_BEEgRpqj.js.br +0 -0
- package/dist/public/assets/_BFfBgn79.js.br +0 -0
- package/dist/public/assets/_BKRausc72.js.br +0 -0
- package/dist/public/assets/_BPH6VN8T2.js.br +0 -0
- package/dist/public/assets/_BPW0wOMI2.js.br +0 -0
- package/dist/public/assets/_BPmmCSLY.js.br +0 -0
- package/dist/public/assets/_BR_6IGfk.js.br +0 -0
- package/dist/public/assets/_BUeHx4zC2.js.br +0 -0
- package/dist/public/assets/_BUteNftu.js.br +0 -0
- package/dist/public/assets/_BYrRgI_G.js.br +0 -0
- package/dist/public/assets/_BZK8bxUc.js.br +0 -0
- package/dist/public/assets/_BZNMfrgb.js.br +0 -0
- package/dist/public/assets/_B_OHURbh2.js.br +0 -0
- package/dist/public/assets/_Bd-WyHvg.js.br +0 -0
- package/dist/public/assets/_BejV602Y.js.br +0 -0
- package/dist/public/assets/_BltuSqY6.js.br +0 -0
- package/dist/public/assets/_Bn6Hn06S.js.br +0 -0
- package/dist/public/assets/_BqfMkwYX.js.br +0 -0
- package/dist/public/assets/_BztBrnhM.js.br +0 -0
- package/dist/public/assets/_C-wce-RA.js.br +0 -0
- package/dist/public/assets/_C6jdreqj.js.br +0 -0
- package/dist/public/assets/_CGVLhh2k.js.br +0 -0
- package/dist/public/assets/_CLGWdoAJ.js.br +0 -0
- package/dist/public/assets/_COmAhQWL.js.br +0 -0
- package/dist/public/assets/_CS1j3Hb2.js.br +0 -0
- package/dist/public/assets/_CTdFL4wj.js.br +0 -0
- package/dist/public/assets/_CWVKprFe2.js.br +0 -0
- package/dist/public/assets/_CXSLFN1Q2.js.br +0 -0
- package/dist/public/assets/_C_9OeUA2.js.br +0 -0
- package/dist/public/assets/_CbgTB_-a.js.br +0 -0
- package/dist/public/assets/_CdHoxy6P.js.br +0 -0
- package/dist/public/assets/_CeVU1yJL.js.br +0 -0
- package/dist/public/assets/_CgENI0zF2.js.br +0 -0
- package/dist/public/assets/_CgwQS6LN2.js.br +0 -0
- package/dist/public/assets/_CiElF6r4.js.br +0 -0
- package/dist/public/assets/_Cn0DEemU.js.br +0 -0
- package/dist/public/assets/_CpnXaqgd2.js.br +0 -0
- package/dist/public/assets/_CvMvIBy42.js.br +0 -0
- package/dist/public/assets/_CzxBqeDO.js.br +0 -0
- package/dist/public/assets/_D2vmNrtA.js.br +0 -0
- package/dist/public/assets/_DAun3Lt7.js.br +0 -0
- package/dist/public/assets/_DNdrj0-M2.js.br +0 -0
- package/dist/public/assets/_DPDIk03W2.js.br +0 -0
- package/dist/public/assets/_DSg_vc6H2.js.br +0 -0
- package/dist/public/assets/_DTSUTR0_2.js.br +0 -0
- package/dist/public/assets/_DToVjT46.js.br +0 -0
- package/dist/public/assets/_DWdZCyBL2.js.br +0 -0
- package/dist/public/assets/_DXCHOWYL.js.br +0 -0
- package/dist/public/assets/_DZss8Wq02.js.br +0 -0
- package/dist/public/assets/_DbEPPsY1.js.br +0 -0
- package/dist/public/assets/_Dbf-xJ6k.js.br +0 -0
- package/dist/public/assets/_Dcav7tzL.js.br +0 -0
- package/dist/public/assets/_DeMAtQzd.js.br +0 -0
- package/dist/public/assets/_Dp1TBNWN.js.br +0 -0
- package/dist/public/assets/_DqBuHT5A.js.br +0 -0
- package/dist/public/assets/_DtE0g-o1.js.br +0 -0
- package/dist/public/assets/_Du4JDj5_.js.br +0 -0
- package/dist/public/assets/_DwNswmCf.js.br +0 -0
- package/dist/public/assets/_Ek1T1FMw.js.br +0 -0
- package/dist/public/assets/_HO-Qb8pn.js.br +0 -0
- package/dist/public/assets/_Lot9I7Im.js.br +0 -0
- package/dist/public/assets/_QQHXmR7d.js.br +0 -0
- package/dist/public/assets/_USmNZPRb.js.br +0 -0
- package/dist/public/assets/_UgQ3KVU7.js.br +0 -0
- package/dist/public/assets/__DTZmGl8.js.br +0 -0
- package/dist/public/assets/_dAXKSDYL.js.br +0 -0
- package/dist/public/assets/_uyFxI_FF2.js.br +0 -0
- package/dist/public/assets/app-page-Bv2S_Tip.css.br +0 -0
- package/dist/public/assets/diff-view-rtQ04a8n.css +0 -1
- package/dist/public/assets/diff-view-rtQ04a8n.css.br +0 -0
- package/dist/public/assets/new-ECSvnCXB.js +0 -1
- package/dist/public/assets/settings-ECSvnCXB.js +0 -1
- package/dist/public/assets/w-ECSvnCXB.js +0 -1
- package/dist/public/assets/w._-CEJj3Icr.js +0 -1
- package/dist/public/assets/w._-ECSvnCXB.js +0 -1
|
@@ -6332,9 +6332,15 @@ var viewers = /* @__PURE__ */ new Map();
|
|
|
6332
6332
|
function summaryFromHookPayload(payload) {
|
|
6333
6333
|
if (!payload || typeof payload !== "object") return void 0;
|
|
6334
6334
|
const p = payload;
|
|
6335
|
-
const text = typeof p.last_assistant_message === "string" && p.last_assistant_message || typeof p["last-assistant-message"] === "string" && p["last-assistant-message"] || typeof p.agent_message === "string" && p.agent_message || "";
|
|
6335
|
+
const text = typeof p.last_assistant_message === "string" && p.last_assistant_message || typeof p["last-assistant-message"] === "string" && p["last-assistant-message"] || typeof p.lastAssistantMessage === "string" && p.lastAssistantMessage || typeof p.agent_message === "string" && p.agent_message || "";
|
|
6336
6336
|
if (text) return cleanSummary(text);
|
|
6337
|
-
|
|
6337
|
+
const kind = notificationType(p);
|
|
6338
|
+
if (kind) {
|
|
6339
|
+
const message = typeof p.message === "string" ? p.message.trim() : "";
|
|
6340
|
+
return message ? cleanSummary(message) : NOTIFICATION_LABELS[kind];
|
|
6341
|
+
}
|
|
6342
|
+
if (typeof p.errorDetails === "string" && p.errorDetails.trim()) return cleanSummary(p.errorDetails);
|
|
6343
|
+
if (typeof p.error === "string" && p.error.trim()) return cleanSummary(p.error);
|
|
6338
6344
|
if (p.hook_event_name === "PermissionRequest") {
|
|
6339
6345
|
const input = p.tool_input;
|
|
6340
6346
|
const what = (input && typeof input.command === "string" ? input.command : "") || (typeof p.tool_name === "string" ? p.tool_name : "");
|
|
@@ -6348,6 +6354,61 @@ var NOTIFICATION_LABELS = {
|
|
|
6348
6354
|
elicitation_dialog: "Asking a question",
|
|
6349
6355
|
elicitation_url_dialog: "Needs a browser sign-in"
|
|
6350
6356
|
};
|
|
6357
|
+
/** Notification hooks are one channel for several kinds of event. Only some
|
|
6358
|
+
* mean the agent is blocked on the user; Copilot also routes shell and
|
|
6359
|
+
* inbox chatter through it. Those the state endpoint must drop, not paint
|
|
6360
|
+
* red — the notification is neither "needs input" nor "done". */
|
|
6361
|
+
var CHATTER_NOTIFICATIONS = /* @__PURE__ */ new Set([
|
|
6362
|
+
"shell_completed",
|
|
6363
|
+
"shell_detached_completed",
|
|
6364
|
+
"new_inbox_message",
|
|
6365
|
+
"instruction_discovered",
|
|
6366
|
+
"factory_completed",
|
|
6367
|
+
"unclassified"
|
|
6368
|
+
]);
|
|
6369
|
+
function ignoreHookPayload(payload) {
|
|
6370
|
+
if (!payload || typeof payload !== "object") return false;
|
|
6371
|
+
const p = payload;
|
|
6372
|
+
const kind = notificationType(p);
|
|
6373
|
+
if (kind && CHATTER_NOTIFICATIONS.has(kind)) return true;
|
|
6374
|
+
if (typeof p.subagentType === "string" && p.subagentType) return true;
|
|
6375
|
+
if (p.hookEventName === "stop" && typeof p.reason === "string" && p.reason !== "end_turn") return true;
|
|
6376
|
+
return false;
|
|
6377
|
+
}
|
|
6378
|
+
/** `notification_type` (Claude, Copilot) or `notificationType` (Grok). */
|
|
6379
|
+
function notificationType(p) {
|
|
6380
|
+
const kind = p.notification_type ?? p.notificationType;
|
|
6381
|
+
return typeof kind === "string" ? kind : void 0;
|
|
6382
|
+
}
|
|
6383
|
+
/** Copilot's Stop payload names its transcript but not the last message;
|
|
6384
|
+
* the last non-empty `assistant.message` in that JSONL is it. Reads the
|
|
6385
|
+
* tail only — transcripts grow for the life of a session. */
|
|
6386
|
+
function summaryFromTranscript(payload) {
|
|
6387
|
+
if (!payload || typeof payload !== "object") return void 0;
|
|
6388
|
+
const file = payload.transcript_path;
|
|
6389
|
+
if (typeof file !== "string" || !file.endsWith("events.jsonl")) return void 0;
|
|
6390
|
+
try {
|
|
6391
|
+
const fd = fs.openSync(file, "r");
|
|
6392
|
+
try {
|
|
6393
|
+
const size = fs.fstatSync(fd).size;
|
|
6394
|
+
const len = Math.min(size, 65536);
|
|
6395
|
+
const buf = Buffer.alloc(len);
|
|
6396
|
+
fs.readSync(fd, buf, 0, len, size - len);
|
|
6397
|
+
const lines = buf.toString("utf8").split("\n");
|
|
6398
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
6399
|
+
const line = lines[i];
|
|
6400
|
+
if (!line.includes("\"assistant.message\"")) continue;
|
|
6401
|
+
try {
|
|
6402
|
+
const ev = JSON.parse(line);
|
|
6403
|
+
const content = ev.type === "assistant.message" ? ev.data?.content : void 0;
|
|
6404
|
+
if (typeof content === "string" && content.trim()) return cleanSummary(content);
|
|
6405
|
+
} catch {}
|
|
6406
|
+
}
|
|
6407
|
+
} finally {
|
|
6408
|
+
fs.closeSync(fd);
|
|
6409
|
+
}
|
|
6410
|
+
} catch {}
|
|
6411
|
+
}
|
|
6351
6412
|
/** Notifications that mean the agent is nudging about an idle session
|
|
6352
6413
|
* rather than blocking on one. The hook cannot tell them apart when it
|
|
6353
6414
|
* fires — it reports every notification the same way — so the kind has to
|
|
@@ -6357,8 +6418,8 @@ var NUDGE_NOTIFICATIONS = /* @__PURE__ */ new Set(["idle_prompt"]);
|
|
|
6357
6418
|
/** The reason a hook's `waiting` actually carries, given its payload. */
|
|
6358
6419
|
function reasonFromHookPayload(payload, reported) {
|
|
6359
6420
|
if (reported !== "attention" || !payload || typeof payload !== "object") return reported;
|
|
6360
|
-
const kind = payload
|
|
6361
|
-
return
|
|
6421
|
+
const kind = notificationType(payload);
|
|
6422
|
+
return kind && NUDGE_NOTIFICATIONS.has(kind) ? "done" : reported;
|
|
6362
6423
|
}
|
|
6363
6424
|
/** First meaningful line(s) of an agent message, markdown chrome stripped,
|
|
6364
6425
|
* sized for a push notification. */
|
|
@@ -6448,7 +6509,7 @@ function publishChange(sessionId) {
|
|
|
6448
6509
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
6449
6510
|
if (row?.workspace_id) {
|
|
6450
6511
|
const workspaceId = row.workspace_id;
|
|
6451
|
-
import("./
|
|
6512
|
+
import("./_DLxkSyzt.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
6452
6513
|
return;
|
|
6453
6514
|
}
|
|
6454
6515
|
publish("sessions.changed");
|
|
@@ -6459,8 +6520,12 @@ function publishChange(sessionId) {
|
|
|
6459
6520
|
* workspace or the user's global config. Claude takes an inline settings
|
|
6460
6521
|
* JSON (--settings accepts a JSON string); Codex takes lifecycle hooks via
|
|
6461
6522
|
* `-c` overrides, trusted through a `hooks.state` entry in the same
|
|
6462
|
-
* override layer (see codexHookFlags)
|
|
6463
|
-
*
|
|
6523
|
+
* override layer (see codexHookFlags); Copilot mounts a plugin directory
|
|
6524
|
+
* that lives in work's own data dir (`--plugin-dir`, see copilotPluginDir).
|
|
6525
|
+
* Grok has no flag at all: its hook file also lives in work's data dir, and
|
|
6526
|
+
* the one thing written outside it is a line naming that file in Grok's
|
|
6527
|
+
* hook registry `~/.grok/hooks-paths` (see grokHooksRegistered). Cursor
|
|
6528
|
+
* exposes no hook mechanism, so its sessions get working/idle from pane
|
|
6464
6529
|
* activity (see scraper.ts) and nothing else — a stopped turn and a
|
|
6465
6530
|
* question look the same. */
|
|
6466
6531
|
function stateCurl(state, reason) {
|
|
@@ -6472,7 +6537,122 @@ function stateCurl(state, reason) {
|
|
|
6472
6537
|
* costs them the state their own hook just reported. */
|
|
6473
6538
|
function reportsWorking(agent) {
|
|
6474
6539
|
const family = agentFamily(agent);
|
|
6475
|
-
return family === "claude" || family === "codex";
|
|
6540
|
+
return family === "claude" || family === "codex" || family === "copilot" || family === "grok" && grokHooksOk;
|
|
6541
|
+
}
|
|
6542
|
+
/** Whether Grok's hook registry took work's hook file — without it Grok
|
|
6543
|
+
* reports nothing and the screen has to speak for it. */
|
|
6544
|
+
var grokHooksOk = false;
|
|
6545
|
+
/** Grok hook events → state. Payloads are camelCase (hookEventName,
|
|
6546
|
+
* notificationType, lastAssistantMessage); agent-state.ts reads both
|
|
6547
|
+
* spellings. Notification is matched to the two kinds that mean a prompt is
|
|
6548
|
+
* on screen; Stop fires on shutdown too, with a reason the endpoint uses to
|
|
6549
|
+
* tell a finished turn from a closed session. */
|
|
6550
|
+
var GROK_HOOKS = [
|
|
6551
|
+
["UserPromptSubmit", "working"],
|
|
6552
|
+
["PreToolUse", "working"],
|
|
6553
|
+
["PostToolUse", "working"],
|
|
6554
|
+
[
|
|
6555
|
+
"Notification",
|
|
6556
|
+
"waiting",
|
|
6557
|
+
"attention",
|
|
6558
|
+
"permission_prompt|elicitation_dialog"
|
|
6559
|
+
],
|
|
6560
|
+
[
|
|
6561
|
+
"Stop",
|
|
6562
|
+
"waiting",
|
|
6563
|
+
"done"
|
|
6564
|
+
],
|
|
6565
|
+
[
|
|
6566
|
+
"StopCancelled",
|
|
6567
|
+
"waiting",
|
|
6568
|
+
"done"
|
|
6569
|
+
],
|
|
6570
|
+
[
|
|
6571
|
+
"StopFailure",
|
|
6572
|
+
"waiting",
|
|
6573
|
+
"attention"
|
|
6574
|
+
]
|
|
6575
|
+
];
|
|
6576
|
+
/** Grok discovers hooks from `~/.grok/hooks-paths`: one absolute path per
|
|
6577
|
+
* line, the registry its own `/hooks-add` command appends to. work's hook
|
|
6578
|
+
* file is kept in the data dir — the commands read the port from env, so
|
|
6579
|
+
* the file never needs rewriting — and registered once. Returns false when
|
|
6580
|
+
* the registry cannot be written (hooks then simply don't report). */
|
|
6581
|
+
function grokHooksRegistered() {
|
|
6582
|
+
const file = path.join(config.dataDir, "grok-hooks.json");
|
|
6583
|
+
const hooks = {};
|
|
6584
|
+
for (const [event, state, reason, matcher] of GROK_HOOKS) hooks[event] = [{
|
|
6585
|
+
...matcher ? { matcher } : {},
|
|
6586
|
+
hooks: [{
|
|
6587
|
+
type: "command",
|
|
6588
|
+
command: stateCurl(state, reason),
|
|
6589
|
+
timeout: 5
|
|
6590
|
+
}]
|
|
6591
|
+
}];
|
|
6592
|
+
writeIfChanged(file, JSON.stringify({ hooks }, null, 2));
|
|
6593
|
+
const registry = path.join(process.env.HOME || "", ".grok", "hooks-paths");
|
|
6594
|
+
try {
|
|
6595
|
+
let current = "";
|
|
6596
|
+
try {
|
|
6597
|
+
current = fs.readFileSync(registry, "utf8");
|
|
6598
|
+
} catch {}
|
|
6599
|
+
if (!current.split("\n").some((line) => line.trim() === file)) {
|
|
6600
|
+
fs.mkdirSync(path.dirname(registry), { recursive: true });
|
|
6601
|
+
fs.appendFileSync(registry, `${current && !current.endsWith("\n") ? "\n" : ""}${file}\n`);
|
|
6602
|
+
}
|
|
6603
|
+
grokHooksOk = true;
|
|
6604
|
+
} catch {
|
|
6605
|
+
grokHooksOk = false;
|
|
6606
|
+
}
|
|
6607
|
+
return grokHooksOk;
|
|
6608
|
+
}
|
|
6609
|
+
/** Copilot hook events (Claude-format names, which make it emit Claude's
|
|
6610
|
+
* snake_case payloads: hook_event_name, notification_type…) → state.
|
|
6611
|
+
* Notification rather than PermissionRequest for "needs input": the latter
|
|
6612
|
+
* fires before Copilot's own allow rules, the former only once a prompt is
|
|
6613
|
+
* actually on screen. Its Stop payload has no last message; the server
|
|
6614
|
+
* reads it from transcript_path (see agent-state.ts). */
|
|
6615
|
+
var COPILOT_HOOKS = [
|
|
6616
|
+
["UserPromptSubmit", "working"],
|
|
6617
|
+
["PreToolUse", "working"],
|
|
6618
|
+
["PostToolUse", "working"],
|
|
6619
|
+
[
|
|
6620
|
+
"Notification",
|
|
6621
|
+
"waiting",
|
|
6622
|
+
"attention"
|
|
6623
|
+
],
|
|
6624
|
+
[
|
|
6625
|
+
"Stop",
|
|
6626
|
+
"waiting",
|
|
6627
|
+
"done"
|
|
6628
|
+
]
|
|
6629
|
+
];
|
|
6630
|
+
/** Copilot has no flag or env for inline hooks; the file-free option is a
|
|
6631
|
+
* plugin directory passed with `--plugin-dir`, which loads without a trust
|
|
6632
|
+
* prompt. The plugin is two files kept under work's data dir and rewritten
|
|
6633
|
+
* only when their content changes (a stale hook would report to the wrong
|
|
6634
|
+
* port after a config change). Returns the directory. */
|
|
6635
|
+
function copilotPluginDir() {
|
|
6636
|
+
const dir = path.join(config.dataDir, "copilot-plugin");
|
|
6637
|
+
const hooks = {};
|
|
6638
|
+
for (const [event, state, reason] of COPILOT_HOOKS) hooks[event] = [{ hooks: [{
|
|
6639
|
+
type: "command",
|
|
6640
|
+
command: stateCurl(state, reason)
|
|
6641
|
+
}] }];
|
|
6642
|
+
writeIfChanged(path.join(dir, ".claude-plugin", "plugin.json"), JSON.stringify({
|
|
6643
|
+
name: "work-session-state",
|
|
6644
|
+
version: "1",
|
|
6645
|
+
description: "Reports this session's working / needs-input / done state to work."
|
|
6646
|
+
}, null, 2));
|
|
6647
|
+
writeIfChanged(path.join(dir, "hooks", "hooks.json"), JSON.stringify({ hooks }, null, 2));
|
|
6648
|
+
return dir;
|
|
6649
|
+
}
|
|
6650
|
+
function writeIfChanged(file, content) {
|
|
6651
|
+
try {
|
|
6652
|
+
if (fs.readFileSync(file, "utf8") === content) return;
|
|
6653
|
+
} catch {}
|
|
6654
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
6655
|
+
fs.writeFileSync(file, content);
|
|
6476
6656
|
}
|
|
6477
6657
|
/** Codex hook events → the state each reports. Same shape as Claude's:
|
|
6478
6658
|
* a prompt or a tool call means working, Stop means the turn is done,
|
|
@@ -6554,6 +6734,8 @@ function agentLaunchFlags(agent) {
|
|
|
6554
6734
|
} })];
|
|
6555
6735
|
}
|
|
6556
6736
|
if (family === "codex") return codexHookFlags();
|
|
6737
|
+
if (family === "copilot") return ["--plugin-dir", copilotPluginDir()];
|
|
6738
|
+
if (family === "grok") grokHooksRegistered();
|
|
6557
6739
|
return [];
|
|
6558
6740
|
}
|
|
6559
6741
|
//#endregion
|
|
@@ -6903,4 +7085,4 @@ function sleep(ms) {
|
|
|
6903
7085
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
6904
7086
|
}
|
|
6905
7087
|
//#endregion
|
|
6906
|
-
export {
|
|
7088
|
+
export { all as $, saveSubscription as A, preferredAgent as B, setAgentPhase as C, summaryFromTranscript as D, summaryFromHookPayload as E, agentChoices as F, ghKnownHosts as G, setPref as H, allPrefs as I, which as J, miseVersions as K, disabledAgents as L, subscribe as M, subscriberCount as N, deleteSubscription as O, subscriberJoins as P, toolById as Q, enabledAgents as R, reasonFromHookPayload as S, setSessionViewers as T, setSetting as U, setDisabledAgents as V, doctor as W, TOOLS as X, DEFAULT_GITHUB_HOST as Y, agentById as Z, tmuxName as _, ensureTmuxServer as a, git as at, clearAgentPhase as b, killWorkspaceSessions as c, config as ct, newSessionArgs as d, db as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, gh as it, publish as j, pushPublicKey as k, listSessions as l, renameSession as m, clearTmuxStarted as n, workspacePath as nt, getSession as o, run$1 as ot, panePids as p, setupPath as q, createSession as r, TMUX_SOCKET as rt, killSession as s, tmux as st, cleanEnv as t, get as tt, markTmuxStarted as u, tmuxWasStarted as v, setScrapedPhase as w, ignoreHookPayload as x, reportsWorking as y, getSetting as z };
|