@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.
Files changed (246) hide show
  1. package/dist/{_DgDsZuoQ.js → _BfXE8Kjn.js} +191 -9
  2. package/dist/_DLxkSyzt.js +2 -0
  3. package/dist/{_8t6K8Jk8.js → _DXDmuFjC.js} +62 -62
  4. package/dist/{_D3qriis-.js → _Dq5wZ9y2.js} +2 -2
  5. package/dist/index.mjs +160 -133
  6. package/dist/public/assets/{_B_OHURbh2.js → _-G0Dx3t52.js} +1 -1
  7. package/dist/public/assets/_-G0Dx3t52.js.br +0 -0
  8. package/dist/public/assets/{_C-LtCarQ2.js → _B-xEEN4l2.js} +1 -1
  9. package/dist/public/assets/{_DNdrj0-M2.js → _B0-ns0BU2.js} +1 -1
  10. package/dist/public/assets/_B0-ns0BU2.js.br +0 -0
  11. package/dist/public/assets/{_Du4JDj5_.js → _B5x1OTTu.js} +1 -1
  12. package/dist/public/assets/_B5x1OTTu.js.br +0 -0
  13. package/dist/public/assets/{_BEEgRpqj.js → _B61wm226.js} +1 -1
  14. package/dist/public/assets/_B61wm226.js.br +0 -0
  15. package/dist/public/assets/{_CzxBqeDO.js → _B7OMjNs8.js} +1 -1
  16. package/dist/public/assets/_B7OMjNs8.js.br +0 -0
  17. package/dist/public/assets/{_Bn6Hn06S.js → _B7vLPjLl.js} +1 -1
  18. package/dist/public/assets/_B7vLPjLl.js.br +0 -0
  19. package/dist/public/assets/{_USmNZPRb.js → _B7vYPsWj.js} +1 -1
  20. package/dist/public/assets/_B7vYPsWj.js.br +0 -0
  21. package/dist/public/assets/{_CgENI0zF2.js → _BBWg58GJ2.js} +1 -1
  22. package/dist/public/assets/_BBWg58GJ2.js.br +0 -0
  23. package/dist/public/assets/{_CgwQS6LN2.js → _BE8lov_p2.js} +1 -1
  24. package/dist/public/assets/_BE8lov_p2.js.br +0 -0
  25. package/dist/public/assets/{_DAun3Lt7.js → _BGhBZpWT.js} +1 -1
  26. package/dist/public/assets/_BGhBZpWT.js.br +0 -0
  27. package/dist/public/assets/{_UgQ3KVU7.js → _BKTem58K.js} +1 -1
  28. package/dist/public/assets/_BKTem58K.js.br +0 -0
  29. package/dist/public/assets/{_DSg_vc6H2.js → _BLZtgkbJ2.js} +1 -1
  30. package/dist/public/assets/_BLZtgkbJ2.js.br +0 -0
  31. package/dist/public/assets/{_DTSUTR0_2.js → _BOQrg7gU2.js} +1 -1
  32. package/dist/public/assets/_BOQrg7gU2.js.br +0 -0
  33. package/dist/public/assets/{_BZNMfrgb.js → _BRzgmRS2.js} +1 -1
  34. package/dist/public/assets/_BRzgmRS2.js.br +0 -0
  35. package/dist/public/assets/{_CbgTB_-a.js → _BSSf-PYx.js} +1 -1
  36. package/dist/public/assets/_BSSf-PYx.js.br +0 -0
  37. package/dist/public/assets/{_B3wjms9s2.js → _BTXq-nPh2.js} +1 -1
  38. package/dist/public/assets/_BTXq-nPh2.js.br +0 -0
  39. package/dist/public/assets/{_C_9OeUA2.js → _BUs7NMrG.js} +1 -1
  40. package/dist/public/assets/_BUs7NMrG.js.br +0 -0
  41. package/dist/public/assets/{_DbEPPsY1.js → _BXzRffYj.js} +1 -1
  42. package/dist/public/assets/_BXzRffYj.js.br +0 -0
  43. package/dist/public/assets/{_DtE0g-o1.js → _B_OOMZsL.js} +1 -1
  44. package/dist/public/assets/_B_OOMZsL.js.br +0 -0
  45. package/dist/public/assets/{_DToVjT46.js → _BdVRHt6-.js} +1 -1
  46. package/dist/public/assets/_BdVRHt6-.js.br +0 -0
  47. package/dist/public/assets/{_DZss8Wq02.js → _Bj5u_Vnk2.js} +1 -1
  48. package/dist/public/assets/_Bj5u_Vnk2.js.br +0 -0
  49. package/dist/public/assets/{_CWVKprFe2.js → _BkrDGdOx2.js} +1 -1
  50. package/dist/public/assets/_BkrDGdOx2.js.br +0 -0
  51. package/dist/public/assets/{_BUteNftu.js → _Bohi4mUp.js} +1 -1
  52. package/dist/public/assets/_Bohi4mUp.js.br +0 -0
  53. package/dist/public/assets/{_CvMvIBy42.js → _BpJS3XpY2.js} +1 -1
  54. package/dist/public/assets/_BpJS3XpY2.js.br +0 -0
  55. package/dist/public/assets/{_CiElF6r4.js → _BqE48K5c.js} +3 -3
  56. package/dist/public/assets/_BqE48K5c.js.br +0 -0
  57. package/dist/public/assets/{_uyFxI_FF2.js → _C-uc9hBA2.js} +1 -1
  58. package/dist/public/assets/_C-uc9hBA2.js.br +0 -0
  59. package/dist/public/assets/{_DWdZCyBL2.js → _C41DPP-z2.js} +1 -1
  60. package/dist/public/assets/_C41DPP-z2.js.br +0 -0
  61. package/dist/public/assets/{_BPH6VN8T2.js → _C5VLAw4k2.js} +1 -1
  62. package/dist/public/assets/_C5VLAw4k2.js.br +0 -0
  63. package/dist/public/assets/{_Lot9I7Im.js → _C82GEkZ4.js} +1 -1
  64. package/dist/public/assets/_C82GEkZ4.js.br +0 -0
  65. package/dist/public/assets/{_BltuSqY6.js → _CH2m75uw.js} +1 -1
  66. package/dist/public/assets/_CH2m75uw.js.br +0 -0
  67. package/dist/public/assets/{_CTdFL4wj.js → _CNClKCWp.js} +1 -1
  68. package/dist/public/assets/_CNClKCWp.js.br +0 -0
  69. package/dist/public/assets/{_B5mDTFiX.js → _COZ91m9B.js} +1 -1
  70. package/dist/public/assets/_COZ91m9B.js.br +0 -0
  71. package/dist/public/assets/{_C-wce-RA.js → _CTQouXRe.js} +1 -1
  72. package/dist/public/assets/_CTQouXRe.js.br +0 -0
  73. package/dist/public/assets/{_BqfMkwYX.js → _CV60RHGa.js} +1 -1
  74. package/dist/public/assets/_CV60RHGa.js.br +0 -0
  75. package/dist/public/assets/{_HO-Qb8pn.js → _CWUF1FpI.js} +1 -1
  76. package/dist/public/assets/_CWUF1FpI.js.br +0 -0
  77. package/dist/public/assets/{_DPDIk03W2.js → _CYgKydU62.js} +1 -1
  78. package/dist/public/assets/_CYgKydU62.js.br +0 -0
  79. package/dist/public/assets/{_BPW0wOMI2.js → _CfjckiVM2.js} +1 -1
  80. package/dist/public/assets/_CfjckiVM2.js.br +0 -0
  81. package/dist/public/assets/{_BztBrnhM.js → _ChkNS16f.js} +1 -1
  82. package/dist/public/assets/_ChkNS16f.js.br +0 -0
  83. package/dist/public/assets/{_BZK8bxUc.js → _CifL_Zbh.js} +1 -1
  84. package/dist/public/assets/_CifL_Zbh.js.br +0 -0
  85. package/dist/public/assets/{_CXSLFN1Q2.js → _CivjiEX92.js} +1 -1
  86. package/dist/public/assets/_CivjiEX92.js.br +0 -0
  87. package/dist/public/assets/{_CLGWdoAJ.js → _Clv6arvL.js} +1 -1
  88. package/dist/public/assets/_Clv6arvL.js.br +0 -0
  89. package/dist/public/assets/{_CpnXaqgd2.js → _CnIE6_qB2.js} +1 -1
  90. package/dist/public/assets/_CnIE6_qB2.js.br +0 -0
  91. package/dist/public/assets/{_CGVLhh2k.js → _Csmr2y3G.js} +1 -1
  92. package/dist/public/assets/_Csmr2y3G.js.br +0 -0
  93. package/dist/public/assets/{_DBiZo1op2.js → _CuFX3MHy2.js} +1 -1
  94. package/dist/public/assets/{_BqrygBOe.js → _D-SthL18.js} +1 -1
  95. package/dist/public/assets/{_Bd-WyHvg.js → _D1XJzdSj.js} +1 -1
  96. package/dist/public/assets/_D1XJzdSj.js.br +0 -0
  97. package/dist/public/assets/{_DXCHOWYL.js → _D5nVZek7.js} +1 -1
  98. package/dist/public/assets/_D5nVZek7.js.br +0 -0
  99. package/dist/public/assets/{_Cn0DEemU.js → _DAi07M7i.js} +1 -1
  100. package/dist/public/assets/_DAi07M7i.js.br +10 -0
  101. package/dist/public/assets/{_Dp1TBNWN.js → _DFAhtXzm.js} +1 -1
  102. package/dist/public/assets/_DFAhtXzm.js.br +0 -0
  103. package/dist/public/assets/{_CS1j3Hb2.js → _DHelzj06.js} +1 -1
  104. package/dist/public/assets/_DHelzj06.js.br +0 -0
  105. package/dist/public/assets/{_BFfBgn79.js → _DPL2ZCgQ.js} +1 -1
  106. package/dist/public/assets/_DPL2ZCgQ.js.br +5 -0
  107. package/dist/public/assets/{_DwNswmCf.js → _DX2Uab-U.js} +1 -1
  108. package/dist/public/assets/_DX2Uab-U.js.br +0 -0
  109. package/dist/public/assets/{_BUeHx4zC2.js → _Dixad7y-2.js} +1 -1
  110. package/dist/public/assets/_Dixad7y-2.js.br +0 -0
  111. package/dist/public/assets/{_9aJgLz6G2.js → _DjVNZ4eK2.js} +1 -1
  112. package/dist/public/assets/_DjVNZ4eK2.js.br +0 -0
  113. package/dist/public/assets/{_DeMAtQzd.js → _DmLXUxIk.js} +1 -1
  114. package/dist/public/assets/_DmLXUxIk.js.br +0 -0
  115. package/dist/public/assets/{_Dcav7tzL.js → _DpCy3kYU.js} +6 -6
  116. package/dist/public/assets/_DpCy3kYU.js.br +0 -0
  117. package/dist/public/assets/{__DTZmGl8.js → _DpENgSEx.js} +1 -1
  118. package/dist/public/assets/_DpENgSEx.js.br +0 -0
  119. package/dist/public/assets/{_C6jdreqj.js → _Drt_09zp.js} +1 -1
  120. package/dist/public/assets/_Drt_09zp.js.br +0 -0
  121. package/dist/public/assets/{_CdHoxy6P.js → _DshD8Ycc.js} +1 -1
  122. package/dist/public/assets/_DshD8Ycc.js.br +0 -0
  123. package/dist/public/assets/{_QQHXmR7d.js → _DvcpKhXL.js} +1 -1
  124. package/dist/public/assets/_DvcpKhXL.js.br +0 -0
  125. package/dist/public/assets/{_B0h_gNbx.js → _Dx6kLICJ.js} +1 -1
  126. package/dist/public/assets/_Dx6kLICJ.js.br +0 -0
  127. package/dist/public/assets/{_Ek1T1FMw.js → _KFiFSJT8.js} +1 -1
  128. package/dist/public/assets/_KFiFSJT8.js.br +0 -0
  129. package/dist/public/assets/{_Dbf-xJ6k.js → _LdAm0jkh.js} +1 -1
  130. package/dist/public/assets/_LdAm0jkh.js.br +0 -0
  131. package/dist/public/assets/{_B3VIvUTs2.js → _QPczAdMm2.js} +1 -1
  132. package/dist/public/assets/_QPczAdMm2.js.br +0 -0
  133. package/dist/public/assets/{_CeVU1yJL.js → _RF9fz9Iu.js} +1 -1
  134. package/dist/public/assets/_RF9fz9Iu.js.br +0 -0
  135. package/dist/public/assets/{_COmAhQWL.js → _UxrF5q9P.js} +1 -1
  136. package/dist/public/assets/_UxrF5q9P.js.br +0 -0
  137. package/dist/public/assets/{_dAXKSDYL.js → _Wxr28jKW.js} +1 -1
  138. package/dist/public/assets/_Wxr28jKW.js.br +0 -0
  139. package/dist/public/assets/{_BKRausc72.js → _Y-mhaywp2.js} +1 -1
  140. package/dist/public/assets/_Y-mhaywp2.js.br +0 -0
  141. package/dist/public/assets/{_BPmmCSLY.js → _c9sBllWt.js} +1 -1
  142. package/dist/public/assets/_c9sBllWt.js.br +0 -0
  143. package/dist/public/assets/{_DqBuHT5A.js → _ckRann09.js} +1 -1
  144. package/dist/public/assets/_ckRann09.js.br +0 -0
  145. package/dist/public/assets/{_BejV602Y.js → _f4WTM4Kz.js} +1 -1
  146. package/dist/public/assets/_f4WTM4Kz.js.br +0 -0
  147. package/dist/public/assets/{_AeL166wR2.js → _sUX0JPgf2.js} +1 -1
  148. package/dist/public/assets/_sUX0JPgf2.js.br +0 -0
  149. package/dist/public/assets/{_D2vmNrtA.js → _snCcB5_5.js} +1 -1
  150. package/dist/public/assets/_snCcB5_5.js.br +0 -0
  151. package/dist/public/assets/{_BYrRgI_G.js → _vWJVVrmZ.js} +1 -1
  152. package/dist/public/assets/_vWJVVrmZ.js.br +0 -0
  153. package/dist/public/assets/{_BR_6IGfk.js → _wgItEK0c.js} +1 -1
  154. package/dist/public/assets/_wgItEK0c.js.br +0 -0
  155. package/dist/public/assets/{app-page-Bv2S_Tip.css → app-page-CAw2YLYv.css} +1 -1
  156. package/dist/public/assets/app-page-CAw2YLYv.css.br +0 -0
  157. package/dist/public/assets/diff-view-DCB49VYM.css +1 -0
  158. package/dist/public/assets/diff-view-DCB49VYM.css.br +0 -0
  159. package/dist/public/assets/new-C9qRFMyu.js +1 -0
  160. package/dist/public/assets/settings-C9qRFMyu.js +1 -0
  161. package/dist/public/assets/w-C9qRFMyu.js +1 -0
  162. package/dist/public/assets/w._-C9qRFMyu.js +1 -0
  163. package/dist/public/assets/w._-phpTDxP7.js +1 -0
  164. package/package.json +1 -1
  165. package/dist/_xZfpJdQE.js +0 -2
  166. package/dist/public/assets/_9aJgLz6G2.js.br +0 -0
  167. package/dist/public/assets/_AeL166wR2.js.br +0 -0
  168. package/dist/public/assets/_B0h_gNbx.js.br +0 -0
  169. package/dist/public/assets/_B3VIvUTs2.js.br +0 -0
  170. package/dist/public/assets/_B3wjms9s2.js.br +0 -0
  171. package/dist/public/assets/_B5mDTFiX.js.br +0 -0
  172. package/dist/public/assets/_BEEgRpqj.js.br +0 -0
  173. package/dist/public/assets/_BFfBgn79.js.br +0 -0
  174. package/dist/public/assets/_BKRausc72.js.br +0 -0
  175. package/dist/public/assets/_BPH6VN8T2.js.br +0 -0
  176. package/dist/public/assets/_BPW0wOMI2.js.br +0 -0
  177. package/dist/public/assets/_BPmmCSLY.js.br +0 -0
  178. package/dist/public/assets/_BR_6IGfk.js.br +0 -0
  179. package/dist/public/assets/_BUeHx4zC2.js.br +0 -0
  180. package/dist/public/assets/_BUteNftu.js.br +0 -0
  181. package/dist/public/assets/_BYrRgI_G.js.br +0 -0
  182. package/dist/public/assets/_BZK8bxUc.js.br +0 -0
  183. package/dist/public/assets/_BZNMfrgb.js.br +0 -0
  184. package/dist/public/assets/_B_OHURbh2.js.br +0 -0
  185. package/dist/public/assets/_Bd-WyHvg.js.br +0 -0
  186. package/dist/public/assets/_BejV602Y.js.br +0 -0
  187. package/dist/public/assets/_BltuSqY6.js.br +0 -0
  188. package/dist/public/assets/_Bn6Hn06S.js.br +0 -0
  189. package/dist/public/assets/_BqfMkwYX.js.br +0 -0
  190. package/dist/public/assets/_BztBrnhM.js.br +0 -0
  191. package/dist/public/assets/_C-wce-RA.js.br +0 -0
  192. package/dist/public/assets/_C6jdreqj.js.br +0 -0
  193. package/dist/public/assets/_CGVLhh2k.js.br +0 -0
  194. package/dist/public/assets/_CLGWdoAJ.js.br +0 -0
  195. package/dist/public/assets/_COmAhQWL.js.br +0 -0
  196. package/dist/public/assets/_CS1j3Hb2.js.br +0 -0
  197. package/dist/public/assets/_CTdFL4wj.js.br +0 -0
  198. package/dist/public/assets/_CWVKprFe2.js.br +0 -0
  199. package/dist/public/assets/_CXSLFN1Q2.js.br +0 -0
  200. package/dist/public/assets/_C_9OeUA2.js.br +0 -0
  201. package/dist/public/assets/_CbgTB_-a.js.br +0 -0
  202. package/dist/public/assets/_CdHoxy6P.js.br +0 -0
  203. package/dist/public/assets/_CeVU1yJL.js.br +0 -0
  204. package/dist/public/assets/_CgENI0zF2.js.br +0 -0
  205. package/dist/public/assets/_CgwQS6LN2.js.br +0 -0
  206. package/dist/public/assets/_CiElF6r4.js.br +0 -0
  207. package/dist/public/assets/_Cn0DEemU.js.br +0 -0
  208. package/dist/public/assets/_CpnXaqgd2.js.br +0 -0
  209. package/dist/public/assets/_CvMvIBy42.js.br +0 -0
  210. package/dist/public/assets/_CzxBqeDO.js.br +0 -0
  211. package/dist/public/assets/_D2vmNrtA.js.br +0 -0
  212. package/dist/public/assets/_DAun3Lt7.js.br +0 -0
  213. package/dist/public/assets/_DNdrj0-M2.js.br +0 -0
  214. package/dist/public/assets/_DPDIk03W2.js.br +0 -0
  215. package/dist/public/assets/_DSg_vc6H2.js.br +0 -0
  216. package/dist/public/assets/_DTSUTR0_2.js.br +0 -0
  217. package/dist/public/assets/_DToVjT46.js.br +0 -0
  218. package/dist/public/assets/_DWdZCyBL2.js.br +0 -0
  219. package/dist/public/assets/_DXCHOWYL.js.br +0 -0
  220. package/dist/public/assets/_DZss8Wq02.js.br +0 -0
  221. package/dist/public/assets/_DbEPPsY1.js.br +0 -0
  222. package/dist/public/assets/_Dbf-xJ6k.js.br +0 -0
  223. package/dist/public/assets/_Dcav7tzL.js.br +0 -0
  224. package/dist/public/assets/_DeMAtQzd.js.br +0 -0
  225. package/dist/public/assets/_Dp1TBNWN.js.br +0 -0
  226. package/dist/public/assets/_DqBuHT5A.js.br +0 -0
  227. package/dist/public/assets/_DtE0g-o1.js.br +0 -0
  228. package/dist/public/assets/_Du4JDj5_.js.br +0 -0
  229. package/dist/public/assets/_DwNswmCf.js.br +0 -0
  230. package/dist/public/assets/_Ek1T1FMw.js.br +0 -0
  231. package/dist/public/assets/_HO-Qb8pn.js.br +0 -0
  232. package/dist/public/assets/_Lot9I7Im.js.br +0 -0
  233. package/dist/public/assets/_QQHXmR7d.js.br +0 -0
  234. package/dist/public/assets/_USmNZPRb.js.br +0 -0
  235. package/dist/public/assets/_UgQ3KVU7.js.br +0 -0
  236. package/dist/public/assets/__DTZmGl8.js.br +0 -0
  237. package/dist/public/assets/_dAXKSDYL.js.br +0 -0
  238. package/dist/public/assets/_uyFxI_FF2.js.br +0 -0
  239. package/dist/public/assets/app-page-Bv2S_Tip.css.br +0 -0
  240. package/dist/public/assets/diff-view-rtQ04a8n.css +0 -1
  241. package/dist/public/assets/diff-view-rtQ04a8n.css.br +0 -0
  242. package/dist/public/assets/new-ECSvnCXB.js +0 -1
  243. package/dist/public/assets/settings-ECSvnCXB.js +0 -1
  244. package/dist/public/assets/w-ECSvnCXB.js +0 -1
  245. package/dist/public/assets/w._-CEJj3Icr.js +0 -1
  246. 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
- if (typeof p.notification_type === "string") return NOTIFICATION_LABELS[p.notification_type];
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.notification_type;
6361
- return typeof kind === "string" && NUDGE_NOTIFICATIONS.has(kind) ? "done" : reported;
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("./_xZfpJdQE.js").then((m) => m.notifySessionsChanged(workspaceId));
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). Grok, Cursor and Copilot expose no
6463
- * file-free hook mechanism, so their sessions get working/idle from pane
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 { get as $, subscribe as A, setPref as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, disabledAgents as F, setupPath as G, doctor as H, enabledAgents as I, TOOLS as J, which as K, getSetting as L, subscriberJoins as M, agentChoices as N, saveSubscription as O, allPrefs as P, db as Q, preferredAgent as R, setAgentPhase as S, summaryFromHookPayload as T, ghKnownHosts as U, setSetting as V, miseVersions as W, toolById as X, agentById as Y, all as Z, tmuxName as _, ensureTmuxServer as a, tmux as at, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, workspacePath as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, run$1 as it, subscriberCount as j, publish as k, listSessions as l, renameSession as m, clearTmuxStarted as n, gh as nt, getSession as o, config as ot, panePids as p, DEFAULT_GITHUB_HOST as q, createSession as r, git as rt, killSession as s, cleanEnv as t, TMUX_SOCKET as tt, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, setDisabledAgents as z };
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 };
@@ -0,0 +1,2 @@
1
+ import { f as notifySessionsChanged } from "./_BfXE8Kjn.js";
2
+ export { notifySessionsChanged };