@herbertgao/pi-extensions 2026.10.2 → 2026.10.4

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 (362) hide show
  1. package/README.md +6 -12
  2. package/THIRD_PARTY_NOTICES.md +5 -1
  3. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +8 -0
  4. package/node_modules/@herbertgao/pi-subagents/README.md +1 -1
  5. package/node_modules/@herbertgao/pi-subagents/package.json +4 -5
  6. package/node_modules/@herbertgao/pi-subagents/src/index.ts +1 -1
  7. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +1 -1
  8. package/node_modules/@herbertgao/pi-subagents/src/mention-clone.ts +48 -72
  9. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +1 -1
  10. package/node_modules/@herbertgao/pi-subagents/src/output-file.ts +15 -6
  11. package/node_modules/@herbertgao/pi-subagents/src/workflow/collisions.ts +4 -1
  12. package/node_modules/@herbertgao/pi-subagents/src/workflow/json-schema.ts +9 -8
  13. package/node_modules/@narumitw/pi-caffeinate/dist/index.ts +6 -1
  14. package/node_modules/@narumitw/pi-caffeinate/dist/index.ts.map +2 -2
  15. package/node_modules/@narumitw/pi-caffeinate/package.json +1 -1
  16. package/node_modules/@narumitw/pi-caffeinate/src/dbus-inhibit.ts +13 -1
  17. package/node_modules/pi-lens/CHANGELOG.md +95 -0
  18. package/node_modules/pi-lens/README.md +1 -0
  19. package/node_modules/pi-lens/dist/chunk-2FQ62SPM.js +83 -0
  20. package/node_modules/pi-lens/dist/{chunk-6P62QVEA.js → chunk-2UMYMRI3.js} +2 -2
  21. package/node_modules/pi-lens/dist/{chunk-O6TQT6RI.js → chunk-34OCDWOS.js} +1 -1
  22. package/node_modules/pi-lens/dist/{chunk-XK4CIILI.js → chunk-3FERWMCH.js} +26 -26
  23. package/node_modules/pi-lens/dist/{chunk-ZAWW3AF6.js → chunk-3JL6IFD7.js} +8 -8
  24. package/node_modules/pi-lens/dist/{chunk-OAXNDZJ7.js → chunk-3JSEWUWI.js} +8 -4
  25. package/node_modules/pi-lens/dist/{chunk-RPD5K5NC.js → chunk-3MRXIJ6I.js} +2 -2
  26. package/node_modules/pi-lens/dist/{chunk-IVP5KAB7.js → chunk-3P4PF2BX.js} +14 -14
  27. package/node_modules/pi-lens/dist/{chunk-5THXD6X5.js → chunk-3PNFWVHT.js} +2 -2
  28. package/node_modules/pi-lens/dist/{chunk-VD4JQCQC.js → chunk-3TTPKMEF.js} +37 -37
  29. package/node_modules/pi-lens/dist/{chunk-7F72PXY2.js → chunk-5JHXUETW.js} +3 -3
  30. package/node_modules/pi-lens/dist/{chunk-5ZEJHV35.js → chunk-64LU2OVH.js} +2 -2
  31. package/node_modules/pi-lens/dist/{chunk-ODEEOXPH.js → chunk-6B5I6ICN.js} +11 -11
  32. package/node_modules/pi-lens/dist/{chunk-5RXBNSW2.js → chunk-6P54TMWL.js} +16 -8
  33. package/node_modules/pi-lens/dist/{chunk-K6VYLB2U.js → chunk-6UYA642J.js} +12 -12
  34. package/node_modules/pi-lens/dist/{chunk-V7R425XG.js → chunk-6XX5HCLK.js} +4 -4
  35. package/node_modules/pi-lens/dist/{chunk-D6QS3U6M.js → chunk-7AXO3ZDF.js} +15 -15
  36. package/node_modules/pi-lens/dist/{chunk-YGVYKNSN.js → chunk-7BX5DWSA.js} +59 -12
  37. package/node_modules/pi-lens/dist/{chunk-N3YQJI6O.js → chunk-7ELY2CSM.js} +7 -4
  38. package/node_modules/pi-lens/dist/{chunk-AWE5TMPO.js → chunk-7M4T5N3V.js} +13 -13
  39. package/node_modules/pi-lens/dist/{chunk-AJ3QXTRQ.js → chunk-AFZYMAIV.js} +33 -33
  40. package/node_modules/pi-lens/dist/{chunk-AJXODZY6.js → chunk-ALQRYH6O.js} +12 -12
  41. package/node_modules/pi-lens/dist/{chunk-AJVLWNFN.js → chunk-AXKPQ6ZI.js} +5 -5
  42. package/node_modules/pi-lens/dist/{chunk-HWBZIGMJ.js → chunk-BHWHXMQ2.js} +8 -8
  43. package/node_modules/pi-lens/dist/{chunk-IXEBJSUE.js → chunk-BJF25SUG.js} +10 -10
  44. package/node_modules/pi-lens/dist/{chunk-GVXA6CCE.js → chunk-BNKLYOOO.js} +1 -1
  45. package/node_modules/pi-lens/dist/{chunk-T4ERT73Y.js → chunk-CBD2B5CP.js} +20 -20
  46. package/node_modules/pi-lens/dist/{chunk-O5WILGMI.js → chunk-CFYISHUW.js} +5 -5
  47. package/node_modules/pi-lens/dist/{chunk-EOKRQ3SA.js → chunk-CMU4RMJB.js} +1 -1
  48. package/node_modules/pi-lens/dist/{chunk-YSNFMJKN.js → chunk-CULQYFLU.js} +2 -2
  49. package/node_modules/pi-lens/dist/{chunk-ORTMY4Q4.js → chunk-D65GOCJB.js} +21 -14
  50. package/node_modules/pi-lens/dist/{chunk-NTUJEGDZ.js → chunk-D6YF5HKX.js} +2 -2
  51. package/node_modules/pi-lens/dist/{chunk-BRJKOBZP.js → chunk-DMS52BEP.js} +17 -6
  52. package/node_modules/pi-lens/dist/{chunk-NL5GLMFI.js → chunk-ELVWJYRV.js} +11 -11
  53. package/node_modules/pi-lens/dist/{chunk-4W2PLC4J.js → chunk-EUT3B22Y.js} +12 -12
  54. package/node_modules/pi-lens/dist/{chunk-GUOGVTCQ.js → chunk-F5VLZHUW.js} +1 -1
  55. package/node_modules/pi-lens/dist/{chunk-I7SPGOWI.js → chunk-FGALODG3.js} +1 -1
  56. package/node_modules/pi-lens/dist/{chunk-Q5U6FMDI.js → chunk-G3RLJYA2.js} +12 -6
  57. package/node_modules/pi-lens/dist/{chunk-FJNKANOS.js → chunk-GAYGGICG.js} +9 -9
  58. package/node_modules/pi-lens/dist/{chunk-HVUZXSWK.js → chunk-H2W2AXD3.js} +38 -40
  59. package/node_modules/pi-lens/dist/{chunk-VHQLPIRJ.js → chunk-H5EV3VMF.js} +2 -2
  60. package/node_modules/pi-lens/dist/{chunk-27BBHSZC.js → chunk-HREZQCT3.js} +3 -3
  61. package/node_modules/pi-lens/dist/{chunk-TT22N74J.js → chunk-HSIRMK2D.js} +12 -12
  62. package/node_modules/pi-lens/dist/{chunk-3I5QFT3N.js → chunk-IMSQR4WO.js} +6 -3
  63. package/node_modules/pi-lens/dist/{chunk-B3I2UUT4.js → chunk-IQZXOZ7S.js} +156 -32
  64. package/node_modules/pi-lens/dist/{chunk-RIISMHKN.js → chunk-IR6XFA5P.js} +14 -13
  65. package/node_modules/pi-lens/dist/{chunk-LNAKEO63.js → chunk-IUKPRZER.js} +4 -4
  66. package/node_modules/pi-lens/dist/{chunk-RUOG5D2C.js → chunk-IUR76K6A.js} +5 -5
  67. package/node_modules/pi-lens/dist/{chunk-TO6WL3GM.js → chunk-J3FZR3YY.js} +12 -2
  68. package/node_modules/pi-lens/dist/{chunk-Y4T27COV.js → chunk-J6DFZDFA.js} +4 -4
  69. package/node_modules/pi-lens/dist/{chunk-E4MAEDPM.js → chunk-J7WJZ6W7.js} +11 -11
  70. package/node_modules/pi-lens/dist/{chunk-52H5B5TC.js → chunk-JONGANYH.js} +30 -30
  71. package/node_modules/pi-lens/dist/{chunk-TGPXLY2J.js → chunk-KJCWXUUS.js} +35 -1
  72. package/node_modules/pi-lens/dist/{chunk-I3R7GKDR.js → chunk-KJN4IOEJ.js} +1 -1
  73. package/node_modules/pi-lens/dist/{chunk-RPD4ZSB7.js → chunk-KMGPUKFD.js} +12 -12
  74. package/node_modules/pi-lens/dist/{chunk-OQGFCZJ4.js → chunk-LD7WFTRX.js} +13 -13
  75. package/node_modules/pi-lens/dist/{chunk-DIULIWKU.js → chunk-LNOMA3MP.js} +3 -3
  76. package/node_modules/pi-lens/dist/{chunk-HHYAELLJ.js → chunk-MGIWSROG.js} +5 -5
  77. package/node_modules/pi-lens/dist/{chunk-YLF3PPT5.js → chunk-MQA2YBAH.js} +3 -3
  78. package/node_modules/pi-lens/dist/{chunk-TVN5N6GY.js → chunk-MTDRLSI7.js} +690 -186
  79. package/node_modules/pi-lens/dist/{chunk-DQ2NZ7C4.js → chunk-N2IRDBZI.js} +44 -6
  80. package/node_modules/pi-lens/dist/{chunk-AHDW3GPE.js → chunk-N77WFUL7.js} +22 -22
  81. package/node_modules/pi-lens/dist/{chunk-NXPS2L6U.js → chunk-N7YNJE5R.js} +7 -7
  82. package/node_modules/pi-lens/dist/{chunk-7FBF7NPR.js → chunk-NFXP47RV.js} +13 -12
  83. package/node_modules/pi-lens/dist/{chunk-UY752QSN.js → chunk-NJF2X5XF.js} +17 -17
  84. package/node_modules/pi-lens/dist/{chunk-WONERJTP.js → chunk-O7HZX7CA.js} +1 -1
  85. package/node_modules/pi-lens/dist/{chunk-AS44CFQ4.js → chunk-OC7LYAU5.js} +7 -7
  86. package/node_modules/pi-lens/dist/{chunk-4RERDEXR.js → chunk-OEX24ECI.js} +30 -30
  87. package/node_modules/pi-lens/dist/{chunk-6VCD4VKZ.js → chunk-OYOB3ZFG.js} +2 -2
  88. package/node_modules/pi-lens/dist/{chunk-IIXOAGHR.js → chunk-OYTMZXRF.js} +18 -15
  89. package/node_modules/pi-lens/dist/{chunk-ARFCXG7S.js → chunk-OZJINN4O.js} +2 -2
  90. package/node_modules/pi-lens/dist/{chunk-34U7PLGE.js → chunk-PCHDGUKT.js} +11 -11
  91. package/node_modules/pi-lens/dist/{chunk-VCSRSYLF.js → chunk-RJFED73B.js} +34 -36
  92. package/node_modules/pi-lens/dist/chunk-RTQNRM5X.js +27 -0
  93. package/node_modules/pi-lens/dist/{chunk-PAK6IDME.js → chunk-S6AMWKPC.js} +2 -2
  94. package/node_modules/pi-lens/dist/{chunk-U3VGR4VU.js → chunk-T4QZ6FEH.js} +4 -4
  95. package/node_modules/pi-lens/dist/{chunk-VN2AXLEX.js → chunk-T54VJRAD.js} +54 -12
  96. package/node_modules/pi-lens/dist/{chunk-ZMOL6RQC.js → chunk-TA5L5KWQ.js} +2 -2
  97. package/node_modules/pi-lens/dist/{chunk-JOLITGCC.js → chunk-TQFBZVCG.js} +1 -1
  98. package/node_modules/pi-lens/dist/{chunk-VDBPVIKD.js → chunk-U52SAGRM.js} +1 -1
  99. package/node_modules/pi-lens/dist/{chunk-LW6XKDZQ.js → chunk-UEAHAMEI.js} +284 -35
  100. package/node_modules/pi-lens/dist/{chunk-NMABWBZN.js → chunk-UGSMCQ4D.js} +1 -1
  101. package/node_modules/pi-lens/dist/{chunk-6QIUX4EP.js → chunk-USHG4DLH.js} +7 -7
  102. package/node_modules/pi-lens/dist/{chunk-LSMJ6KBE.js → chunk-V5MEBST3.js} +16 -16
  103. package/node_modules/pi-lens/dist/chunk-VGEVL5EQ.js +29 -0
  104. package/node_modules/pi-lens/dist/{chunk-47D2BO4S.js → chunk-VPWKF3GN.js} +10 -10
  105. package/node_modules/pi-lens/dist/{chunk-UK3CMEAL.js → chunk-VSMJK3ZJ.js} +1 -1
  106. package/node_modules/pi-lens/dist/{chunk-22AVIGXS.js → chunk-VYKKMYVT.js} +7 -7
  107. package/node_modules/pi-lens/dist/{chunk-OS32RNR2.js → chunk-VZHJS6DR.js} +15 -15
  108. package/node_modules/pi-lens/dist/{chunk-E2WFBRHM.js → chunk-WATC3IQR.js} +3 -3
  109. package/node_modules/pi-lens/dist/chunk-WPE5FPGR.js +54 -0
  110. package/node_modules/pi-lens/dist/{chunk-V5PXFSZK.js → chunk-WSEWKCXU.js} +4 -4
  111. package/node_modules/pi-lens/dist/{chunk-NKOUFPQF.js → chunk-WW5BLB74.js} +2 -2
  112. package/node_modules/pi-lens/dist/{chunk-PWFHBTSF.js → chunk-XGUL4SLQ.js} +2 -2
  113. package/node_modules/pi-lens/dist/{chunk-F3P7VQ7H.js → chunk-XHSCVSOL.js} +3 -3
  114. package/node_modules/pi-lens/dist/{chunk-DFVMIKMQ.js → chunk-YLN4K6WD.js} +45 -9
  115. package/node_modules/pi-lens/dist/{chunk-VNMT7C64.js → chunk-Z6BB4JLQ.js} +2 -2
  116. package/node_modules/pi-lens/dist/{chunk-NTHH2J74.js → chunk-Z7QQA2KT.js} +12 -12
  117. package/node_modules/pi-lens/dist/{chunk-F3AU2TMM.js → chunk-ZETYB3XG.js} +15 -15
  118. package/node_modules/pi-lens/dist/{chunk-XECLWQZN.js → chunk-ZMOMPX2Z.js} +12 -10
  119. package/node_modules/pi-lens/dist/{chunk-C2AUYXQH.js → chunk-ZOEYVXSV.js} +4 -4
  120. package/node_modules/pi-lens/dist/{chunk-TLGFBM3F.js → chunk-ZZUFZUQZ.js} +68 -64
  121. package/node_modules/pi-lens/dist/index.js +30113 -28398
  122. package/node_modules/pi-lens/dist/mcp/analyze-cli.js +8 -8
  123. package/node_modules/pi-lens/dist/mcp/cli.js +37 -37
  124. package/node_modules/pi-lens/dist/mcp/server.js +257 -158
  125. package/node_modules/pi-lens/dist/mcp/worker.js +55 -55
  126. package/node_modules/pi-lens/dist/probes/installer.js +19 -19
  127. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +2 -2
  128. package/node_modules/pi-lens/docs/configuration.md +9 -2
  129. package/node_modules/pi-lens/docs/custom-rules.md +25 -2
  130. package/node_modules/pi-lens/docs/environment-variables.md +34 -6
  131. package/node_modules/pi-lens/docs/features.md +37 -1
  132. package/node_modules/pi-lens/docs/globalconfig.md +1 -1
  133. package/node_modules/pi-lens/docs/lsp-capability-matrix.md +2 -1
  134. package/node_modules/pi-lens/docs/lsp-idle-eviction.md +1 -1
  135. package/node_modules/pi-lens/docs/pi-lens-fixer.md +9 -5
  136. package/node_modules/pi-lens/docs/pi-lens-merge-policy.md +43 -1
  137. package/node_modules/pi-lens/docs/pi-lens-monitor.md +3 -1
  138. package/node_modules/pi-lens/docs/pi-lens-reviewer.md +4 -3
  139. package/node_modules/pi-lens/docs/schema/pi-lens-config-v1.json +530 -0
  140. package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
  141. package/node_modules/pi-lens/docs/word-index.md +6 -0
  142. package/node_modules/pi-lens/package.json +1 -1
  143. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  144. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  145. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  146. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  147. package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  148. package/node_modules/pi-lens/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  149. package/node_modules/pi-provider-qoder/README.md +140 -0
  150. package/node_modules/pi-provider-qoder/dist/index.js +10249 -0
  151. package/node_modules/pi-provider-qoder/package.json +57 -0
  152. package/node_modules/pi-web-access/CHANGELOG.md +28 -0
  153. package/node_modules/pi-web-access/README.md +10 -6
  154. package/node_modules/pi-web-access/ceramic.ts +219 -0
  155. package/node_modules/pi-web-access/curator-page.ts +3 -1
  156. package/node_modules/pi-web-access/curator-server.ts +1 -0
  157. package/node_modules/pi-web-access/dist/index.js +846 -588
  158. package/node_modules/pi-web-access/dist/mcp-cli.js +725 -516
  159. package/node_modules/pi-web-access/gemini-search.ts +8 -4
  160. package/node_modules/pi-web-access/github-extract.ts +34 -2
  161. package/node_modules/pi-web-access/index.ts +72 -30
  162. package/node_modules/pi-web-access/openai-search.ts +3 -3
  163. package/node_modules/pi-web-access/package.json +2 -2
  164. package/node_modules/pi-web-access/page-query.ts +6 -9
  165. package/node_modules/pi-web-access/parallel-mcp.ts +2 -0
  166. package/node_modules/pi-web-access/query-rewrite.ts +2 -2
  167. package/node_modules/pi-web-access/storage.ts +49 -0
  168. package/node_modules/pi-web-access/summary-review.ts +7 -6
  169. package/node_modules/pi-web-access/utils.ts +21 -6
  170. package/node_modules/pi-web-access/web-tool-core.ts +1 -0
  171. package/package.json +10 -12
  172. package/node_modules/pi-lens/dist/chunk-54B42YRX.js +0 -27
  173. package/node_modules/pi-lens/dist/chunk-CGGAIP7J.js +0 -29
  174. package/node_modules/pi-lens/dist/chunk-HMFXILPV.js +0 -83
  175. package/node_modules/pi-lens/dist/chunk-T6D4Q4AQ.js +0 -54
  176. package/node_modules/pi-web-access/opencode-session-headers.ts +0 -24
  177. package/node_modules/remote-pi/LICENSE +0 -21
  178. package/node_modules/remote-pi/README.md +0 -675
  179. package/node_modules/remote-pi/dist/actions/handlers.d.ts +0 -122
  180. package/node_modules/remote-pi/dist/actions/handlers.js +0 -160
  181. package/node_modules/remote-pi/dist/actions/handlers.js.map +0 -1
  182. package/node_modules/remote-pi/dist/actions/registry.d.ts +0 -39
  183. package/node_modules/remote-pi/dist/actions/registry.js +0 -58
  184. package/node_modules/remote-pi/dist/actions/registry.js.map +0 -1
  185. package/node_modules/remote-pi/dist/bin/supervisord.d.ts +0 -2
  186. package/node_modules/remote-pi/dist/bin/supervisord.js +0 -86
  187. package/node_modules/remote-pi/dist/bin/supervisord.js.map +0 -1
  188. package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +0 -58
  189. package/node_modules/remote-pi/dist/commands/builtin_mirror.js +0 -71
  190. package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +0 -1
  191. package/node_modules/remote-pi/dist/commands/list_commands.d.ts +0 -60
  192. package/node_modules/remote-pi/dist/commands/list_commands.js +0 -73
  193. package/node_modules/remote-pi/dist/commands/list_commands.js.map +0 -1
  194. package/node_modules/remote-pi/dist/config.d.ts +0 -62
  195. package/node_modules/remote-pi/dist/config.js +0 -115
  196. package/node_modules/remote-pi/dist/config.js.map +0 -1
  197. package/node_modules/remote-pi/dist/daemon/client.d.ts +0 -20
  198. package/node_modules/remote-pi/dist/daemon/client.js +0 -131
  199. package/node_modules/remote-pi/dist/daemon/client.js.map +0 -1
  200. package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +0 -176
  201. package/node_modules/remote-pi/dist/daemon/control_protocol.js +0 -63
  202. package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +0 -1
  203. package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +0 -45
  204. package/node_modules/remote-pi/dist/daemon/cron_log.js +0 -72
  205. package/node_modules/remote-pi/dist/daemon/cron_log.js.map +0 -1
  206. package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +0 -80
  207. package/node_modules/remote-pi/dist/daemon/cron_registry.js +0 -194
  208. package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +0 -1
  209. package/node_modules/remote-pi/dist/daemon/id.d.ts +0 -24
  210. package/node_modules/remote-pi/dist/daemon/id.js +0 -36
  211. package/node_modules/remote-pi/dist/daemon/id.js.map +0 -1
  212. package/node_modules/remote-pi/dist/daemon/install.d.ts +0 -170
  213. package/node_modules/remote-pi/dist/daemon/install.js +0 -547
  214. package/node_modules/remote-pi/dist/daemon/install.js.map +0 -1
  215. package/node_modules/remote-pi/dist/daemon/registry.d.ts +0 -63
  216. package/node_modules/remote-pi/dist/daemon/registry.js +0 -153
  217. package/node_modules/remote-pi/dist/daemon/registry.js.map +0 -1
  218. package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +0 -194
  219. package/node_modules/remote-pi/dist/daemon/rpc_child.js +0 -389
  220. package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +0 -1
  221. package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +0 -93
  222. package/node_modules/remote-pi/dist/daemon/supervisor.js +0 -596
  223. package/node_modules/remote-pi/dist/daemon/supervisor.js.map +0 -1
  224. package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +0 -26
  225. package/node_modules/remote-pi/dist/extension_ui_bridge.js +0 -341
  226. package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +0 -1
  227. package/node_modules/remote-pi/dist/index.d.ts +0 -213
  228. package/node_modules/remote-pi/dist/index.js +0 -4996
  229. package/node_modules/remote-pi/dist/index.js.map +0 -1
  230. package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +0 -10
  231. package/node_modules/remote-pi/dist/mcp/mesh_result.js +0 -42
  232. package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +0 -1
  233. package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +0 -16
  234. package/node_modules/remote-pi/dist/mcp/mesh_server.js +0 -327
  235. package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +0 -1
  236. package/node_modules/remote-pi/dist/mesh/canonical.d.ts +0 -30
  237. package/node_modules/remote-pi/dist/mesh/canonical.js +0 -61
  238. package/node_modules/remote-pi/dist/mesh/canonical.js.map +0 -1
  239. package/node_modules/remote-pi/dist/mesh/client.d.ts +0 -18
  240. package/node_modules/remote-pi/dist/mesh/client.js +0 -125
  241. package/node_modules/remote-pi/dist/mesh/client.js.map +0 -1
  242. package/node_modules/remote-pi/dist/mesh/encoding.d.ts +0 -38
  243. package/node_modules/remote-pi/dist/mesh/encoding.js +0 -216
  244. package/node_modules/remote-pi/dist/mesh/encoding.js.map +0 -1
  245. package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +0 -73
  246. package/node_modules/remote-pi/dist/mesh/self_revoke.js +0 -401
  247. package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +0 -1
  248. package/node_modules/remote-pi/dist/mesh/siblings.d.ts +0 -49
  249. package/node_modules/remote-pi/dist/mesh/siblings.js +0 -159
  250. package/node_modules/remote-pi/dist/mesh/siblings.js.map +0 -1
  251. package/node_modules/remote-pi/dist/mesh/types.d.ts +0 -34
  252. package/node_modules/remote-pi/dist/mesh/types.js +0 -11
  253. package/node_modules/remote-pi/dist/mesh/types.js.map +0 -1
  254. package/node_modules/remote-pi/dist/mesh/verify.d.ts +0 -17
  255. package/node_modules/remote-pi/dist/mesh/verify.js +0 -86
  256. package/node_modules/remote-pi/dist/mesh/verify.js.map +0 -1
  257. package/node_modules/remote-pi/dist/pairing/crypto.d.ts +0 -8
  258. package/node_modules/remote-pi/dist/pairing/crypto.js +0 -22
  259. package/node_modules/remote-pi/dist/pairing/crypto.js.map +0 -1
  260. package/node_modules/remote-pi/dist/pairing/handshake.d.ts +0 -28
  261. package/node_modules/remote-pi/dist/pairing/handshake.js +0 -113
  262. package/node_modules/remote-pi/dist/pairing/handshake.js.map +0 -1
  263. package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +0 -16
  264. package/node_modules/remote-pi/dist/pairing/noise-sha256.js +0 -103
  265. package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +0 -1
  266. package/node_modules/remote-pi/dist/pairing/qr.d.ts +0 -59
  267. package/node_modules/remote-pi/dist/pairing/qr.js +0 -125
  268. package/node_modules/remote-pi/dist/pairing/qr.js.map +0 -1
  269. package/node_modules/remote-pi/dist/pairing/storage.d.ts +0 -120
  270. package/node_modules/remote-pi/dist/pairing/storage.js +0 -604
  271. package/node_modules/remote-pi/dist/pairing/storage.js.map +0 -1
  272. package/node_modules/remote-pi/dist/protocol/codec.d.ts +0 -7
  273. package/node_modules/remote-pi/dist/protocol/codec.js +0 -49
  274. package/node_modules/remote-pi/dist/protocol/codec.js.map +0 -1
  275. package/node_modules/remote-pi/dist/protocol/types.d.ts +0 -393
  276. package/node_modules/remote-pi/dist/protocol/types.js +0 -2
  277. package/node_modules/remote-pi/dist/protocol/types.js.map +0 -1
  278. package/node_modules/remote-pi/dist/rooms.d.ts +0 -29
  279. package/node_modules/remote-pi/dist/rooms.js +0 -57
  280. package/node_modules/remote-pi/dist/rooms.js.map +0 -1
  281. package/node_modules/remote-pi/dist/session/address.d.ts +0 -49
  282. package/node_modules/remote-pi/dist/session/address.js +0 -58
  283. package/node_modules/remote-pi/dist/session/address.js.map +0 -1
  284. package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +0 -55
  285. package/node_modules/remote-pi/dist/session/agent_bridge.js +0 -146
  286. package/node_modules/remote-pi/dist/session/agent_bridge.js.map +0 -1
  287. package/node_modules/remote-pi/dist/session/bridge.d.ts +0 -37
  288. package/node_modules/remote-pi/dist/session/bridge.js +0 -130
  289. package/node_modules/remote-pi/dist/session/bridge.js.map +0 -1
  290. package/node_modules/remote-pi/dist/session/broker.d.ts +0 -189
  291. package/node_modules/remote-pi/dist/session/broker.js +0 -507
  292. package/node_modules/remote-pi/dist/session/broker.js.map +0 -1
  293. package/node_modules/remote-pi/dist/session/broker_remote.d.ts +0 -74
  294. package/node_modules/remote-pi/dist/session/broker_remote.js +0 -583
  295. package/node_modules/remote-pi/dist/session/broker_remote.js.map +0 -1
  296. package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +0 -33
  297. package/node_modules/remote-pi/dist/session/cwd_lock.js +0 -126
  298. package/node_modules/remote-pi/dist/session/cwd_lock.js.map +0 -1
  299. package/node_modules/remote-pi/dist/session/envelope.d.ts +0 -33
  300. package/node_modules/remote-pi/dist/session/envelope.js +0 -117
  301. package/node_modules/remote-pi/dist/session/envelope.js.map +0 -1
  302. package/node_modules/remote-pi/dist/session/global_config.d.ts +0 -33
  303. package/node_modules/remote-pi/dist/session/global_config.js +0 -73
  304. package/node_modules/remote-pi/dist/session/global_config.js.map +0 -1
  305. package/node_modules/remote-pi/dist/session/ipc.d.ts +0 -27
  306. package/node_modules/remote-pi/dist/session/ipc.js +0 -22
  307. package/node_modules/remote-pi/dist/session/ipc.js.map +0 -1
  308. package/node_modules/remote-pi/dist/session/leader_election.d.ts +0 -32
  309. package/node_modules/remote-pi/dist/session/leader_election.js +0 -106
  310. package/node_modules/remote-pi/dist/session/leader_election.js.map +0 -1
  311. package/node_modules/remote-pi/dist/session/local_config.d.ts +0 -55
  312. package/node_modules/remote-pi/dist/session/local_config.js +0 -157
  313. package/node_modules/remote-pi/dist/session/local_config.js.map +0 -1
  314. package/node_modules/remote-pi/dist/session/mesh_message.d.ts +0 -20
  315. package/node_modules/remote-pi/dist/session/mesh_message.js +0 -28
  316. package/node_modules/remote-pi/dist/session/mesh_message.js.map +0 -1
  317. package/node_modules/remote-pi/dist/session/mesh_node.d.ts +0 -116
  318. package/node_modules/remote-pi/dist/session/mesh_node.js +0 -573
  319. package/node_modules/remote-pi/dist/session/mesh_node.js.map +0 -1
  320. package/node_modules/remote-pi/dist/session/peer.d.ts +0 -139
  321. package/node_modules/remote-pi/dist/session/peer.js +0 -451
  322. package/node_modules/remote-pi/dist/session/peer.js.map +0 -1
  323. package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +0 -13
  324. package/node_modules/remote-pi/dist/session/peer_inventory.js +0 -48
  325. package/node_modules/remote-pi/dist/session/peer_inventory.js.map +0 -1
  326. package/node_modules/remote-pi/dist/session/peer_limits.d.ts +0 -9
  327. package/node_modules/remote-pi/dist/session/peer_limits.js +0 -21
  328. package/node_modules/remote-pi/dist/session/peer_limits.js.map +0 -1
  329. package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +0 -39
  330. package/node_modules/remote-pi/dist/session/setup_wizard.js +0 -63
  331. package/node_modules/remote-pi/dist/session/setup_wizard.js.map +0 -1
  332. package/node_modules/remote-pi/dist/session/tool_gate.d.ts +0 -5
  333. package/node_modules/remote-pi/dist/session/tool_gate.js +0 -11
  334. package/node_modules/remote-pi/dist/session/tool_gate.js.map +0 -1
  335. package/node_modules/remote-pi/dist/session/tools.d.ts +0 -24
  336. package/node_modules/remote-pi/dist/session/tools.js +0 -252
  337. package/node_modules/remote-pi/dist/session/tools.js.map +0 -1
  338. package/node_modules/remote-pi/dist/session/wizard.d.ts +0 -13
  339. package/node_modules/remote-pi/dist/session/wizard.js +0 -20
  340. package/node_modules/remote-pi/dist/session/wizard.js.map +0 -1
  341. package/node_modules/remote-pi/dist/settings.d.ts +0 -15
  342. package/node_modules/remote-pi/dist/settings.js +0 -52
  343. package/node_modules/remote-pi/dist/settings.js.map +0 -1
  344. package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +0 -37
  345. package/node_modules/remote-pi/dist/transport/peer_channel.js +0 -98
  346. package/node_modules/remote-pi/dist/transport/peer_channel.js.map +0 -1
  347. package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +0 -29
  348. package/node_modules/remote-pi/dist/transport/pi_forward_client.js +0 -62
  349. package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +0 -1
  350. package/node_modules/remote-pi/dist/transport/relay_client.d.ts +0 -91
  351. package/node_modules/remote-pi/dist/transport/relay_client.js +0 -206
  352. package/node_modules/remote-pi/dist/transport/relay_client.js.map +0 -1
  353. package/node_modules/remote-pi/dist/ui/footer.d.ts +0 -32
  354. package/node_modules/remote-pi/dist/ui/footer.js +0 -34
  355. package/node_modules/remote-pi/dist/ui/footer.js.map +0 -1
  356. package/node_modules/remote-pi/docs/daemon.md +0 -289
  357. package/node_modules/remote-pi/package.json +0 -92
  358. package/node_modules/remote-pi/service-templates/launchd.plist.template +0 -35
  359. package/node_modules/remote-pi/service-templates/systemd.service.template +0 -19
  360. package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +0 -10
  361. package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +0 -38
  362. package/node_modules/remote-pi/skills/agent-network/SKILL.md +0 -310
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/caffeinate.ts", "../src/dbus-inhibit.ts", "../src/inhibitor-process.ts", "../src/inhibitors.ts", "../src/settings.ts"],
4
- "sourcesContent": ["import type { ChildProcess } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n type DbusScreenSaverClient,\n type DbusScreenSaverFactory,\n defaultDbusScreenSaverFactory,\n INHIBIT_REASON,\n SCREENSAVER_BUS_NAME,\n} from \"./dbus-inhibit.js\";\nimport { startInhibitorProcess, stopInhibitorProcess } from \"./inhibitor-process.js\";\nimport { formatMode, getInhibitorCommand, type InhibitorCommand } from \"./inhibitors.js\";\nimport {\n type CaffeinateMode,\n type CaffeinateSettings,\n loadSettings,\n saveSettings,\n settingsFilePath,\n} from \"./settings.js\";\n\nconst STATUS_KEY = \"caffeinate\";\nconst DISABLED_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\nconst DEFAULT_MODE = \"display\" satisfies CaffeinateMode;\nconst COMMAND_COMPLETIONS = [\n { value: \"display\", label: \"display\", description: \"Keep system and display awake\" },\n { value: \"sleep\", label: \"sleep\", description: \"Keep system awake; allow display sleep\" },\n { value: \"status\", label: \"status\", description: \"Show current status\" },\n { value: \"mode\", label: \"mode\", description: \"Choose keep-awake mode\" },\n { value: \"stop\", label: \"stop\", description: \"Release inhibitor for now\" },\n { value: \"help\", label: \"help\", description: \"Show command help\" },\n];\nconst MENU_OPTIONS = {\n display: \"Keep system and display awake\",\n sleep: \"Keep system awake; allow display sleep\",\n status: \"Show current status\",\n stop: \"Release inhibitor for now\",\n help: \"Show command help\",\n} as const;\nconst MODE_OPTIONS = {\n display: \"Keep system and display awake\",\n sleep: \"Keep system awake; allow display sleep\",\n} as const;\n\ntype CommandAction = \"menu\" | \"help\" | \"status\" | \"mode\" | \"sleep\" | \"display\" | \"stop\";\ntype CommandContext = ExtensionCommandContext;\n\ninterface CaffeinateOptions {\n dbusFactory?: DbusScreenSaverFactory;\n}\n\ninterface PendingDbusStart {\n token: number;\n controller: AbortController;\n client?: DbusScreenSaverClient;\n}\n\ninterface CaffeinateState {\n process?: ChildProcess;\n dbus?: DbusScreenSaverClient;\n currentSession?: { generation: number; ctx: ExtensionContext };\n dbusCleanup?: Promise<void>;\n pendingDbus?: PendingDbusStart;\n startedAt?: number;\n command?: InhibitorCommand;\n lastError?: string;\n inhibitWarning?: string;\n inhibitorStarting: boolean;\n activeTurns: number;\n available: boolean;\n disabled: boolean;\n mode: CaffeinateMode;\n quiet: boolean;\n settingsLoaded: boolean;\n settingsError?: string;\n settingsNotice?: string;\n iconWarningShown: boolean;\n sessionGeneration: number;\n menuController: AbortController;\n}\n\nconst state: CaffeinateState = {\n activeTurns: 0,\n available: true,\n inhibitorStarting: false,\n disabled: isDisabled(),\n mode: DEFAULT_MODE,\n quiet: false,\n settingsLoaded: false,\n iconWarningShown: false,\n sessionGeneration: 0,\n menuController: new AbortController(),\n};\n\nlet dbusFactory = defaultDbusScreenSaverFactory;\nlet inhibitSequence = 0;\n\nexport default function caffeinate(pi: ExtensionAPI, options: CaffeinateOptions = {}) {\n dbusFactory = options.dbusFactory ?? defaultDbusScreenSaverFactory;\n pi.on(\"session_start\", async (_event, ctx) => {\n const generation = ++state.sessionGeneration;\n state.currentSession = { generation, ctx };\n replaceMenuController(\"Caffeinate session replaced\");\n state.iconWarningShown = false;\n state.settingsNotice = undefined;\n warnDeprecatedIcon(ctx);\n await loadSettingsIntoState(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n updateStatus(ctx);\n });\n\n pi.on(\"agent_start\", async (_event, ctx) => {\n const generation = state.sessionGeneration;\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n state.activeTurns += 1;\n await startInhibitor(ctx, generation, { notify: !state.quiet });\n });\n\n pi.on(\"agent_end\", async (_event, ctx) => {\n const generation = state.sessionGeneration;\n state.activeTurns = Math.max(0, state.activeTurns - 1);\n if (state.activeTurns === 0) {\n await stopInhibitor(ctx, \"agent finished\", { notify: !state.quiet });\n }\n if (generation !== state.sessionGeneration) return;\n updateStatus(ctx);\n });\n\n pi.on(\"session_shutdown\", async (_event, ctx) => {\n const generation = ++state.sessionGeneration;\n state.currentSession = undefined;\n state.menuController.abort(new DOMException(\"Caffeinate session shut down\", \"AbortError\"));\n state.activeTurns = 0;\n await stopInhibitor(ctx, \"session shutdown\", { notify: false });\n await modeOperationQueue;\n if (generation !== state.sessionGeneration) return;\n ctx.ui.setStatus(STATUS_KEY, undefined);\n });\n\n pi.registerCommand(\"caffeinate\", {\n description: \"Open pi-caffeinate keep-awake controls\",\n getArgumentCompletions: (prefix) => commandCompletions(prefix),\n handler: async (args, ctx) => {\n const generation = state.sessionGeneration;\n const command = parseCommand(args);\n if (command === \"sleep\" || command === \"display\") {\n await setModeAfterSettingsLoad(ctx, command, generation);\n return;\n }\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n await handleCaffeinateCommand(args, ctx, generation);\n },\n });\n}\n\nasync function handleCaffeinateCommand(args: string, ctx: CommandContext, generation: number) {\n const command = parseCommand(args);\n switch (command) {\n case \"menu\":\n await showMenu(ctx, generation);\n return;\n case \"help\":\n ctx.ui.notify(buildCommandGuide(), \"info\");\n return;\n case \"status\":\n showStatus(ctx);\n return;\n case \"mode\":\n await showModeSelector(ctx, generation);\n return;\n case \"sleep\":\n await setMode(ctx, \"sleep\", generation);\n return;\n case \"display\":\n await setMode(ctx, \"display\", generation);\n return;\n case \"stop\":\n await stopCaffeinate(ctx, \"manual stop\", generation);\n return;\n }\n\n ctx.ui.notify(`Unknown /caffeinate command: ${args.trim()}\\n\\n${buildCommandGuide()}`, \"warning\");\n}\n\nasync function showMenu(ctx: CommandContext, generation: number) {\n await runCaffeinateMenu(ctx, generation, \"main\");\n}\n\nasync function showModeSelector(ctx: CommandContext, generation: number) {\n await runCaffeinateMenu(ctx, generation, \"mode\");\n}\n\nasync function runCaffeinateMenu(ctx: CommandContext, generation: number, start: \"main\" | \"mode\") {\n if (!ctx.hasUI) {\n throw new Error(\n start === \"mode\"\n ? \"Mode selection requires TUI or RPC mode. Use /caffeinate sleep or /caffeinate display.\"\n : `The pi-caffeinate menu requires TUI or RPC mode.\\n\\n${buildCommandGuide()}\\n\\n${describeState()}`,\n );\n }\n const menuSignal = state.menuController.signal;\n const isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (!isCurrent()) return;\n type Screen = \"main\" | \"mode\";\n type Action = \"display\" | \"sleep\" | \"status\" | \"stop\" | \"help\";\n const menu = defineMenu<undefined, Screen, Action>({\n start,\n screens: {\n main: () => ({\n kind: \"actions\",\n title: \"pi-caffeinate controls\",\n lines: describeState().split(\"\\n\"),\n items: Object.entries(MENU_OPTIONS).map(([id, label]) => ({\n id,\n label,\n action: id as Action,\n })),\n hint: \"close\",\n }),\n mode: () => ({\n kind: \"actions\",\n title: `pi-caffeinate mode (current: ${formatMode(state.mode)})`,\n items: Object.entries(MODE_OPTIONS).map(([id, label]) => ({\n id,\n label,\n action: id as Action,\n })),\n hint: \"close\",\n }),\n },\n actions: {\n display: async () => {\n await setMode(ctx, \"display\", generation);\n return { kind: \"close\" };\n },\n sleep: async () => {\n await setMode(ctx, \"sleep\", generation);\n return { kind: \"close\" };\n },\n status: async () => {\n showStatus(ctx);\n return { kind: \"close\" };\n },\n stop: async () => {\n await stopCaffeinate(ctx, \"manual stop\", generation);\n return { kind: \"close\" };\n },\n help: async () => {\n ctx.ui.notify(buildCommandGuide(), \"info\");\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: menuSignal,\n isCurrent,\n });\n}\n\nfunction replaceMenuController(reason: string) {\n state.menuController.abort(new DOMException(reason, \"AbortError\"));\n state.menuController = new AbortController();\n}\n\nlet modeOperationQueue = Promise.resolve();\n\nfunction setModeAfterSettingsLoad(ctx: ExtensionContext, mode: CaffeinateMode, generation: number): Promise<void> {\n return enqueueModeOperation(async () => {\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n await setModeNow(ctx, mode, generation);\n });\n}\n\nfunction setMode(ctx: ExtensionContext, mode: CaffeinateMode, generation: number): Promise<void> {\n return enqueueModeOperation(() => setModeNow(ctx, mode, generation));\n}\n\nfunction enqueueModeOperation(operation: () => Promise<void>): Promise<void> {\n const queued = modeOperationQueue.then(operation);\n modeOperationQueue = queued.catch(() => undefined);\n return queued;\n}\n\nasync function setModeNow(ctx: ExtensionContext, mode: CaffeinateMode, generation: number) {\n if (generation !== state.sessionGeneration) return;\n const previousMode = state.mode;\n const previousQuiet = state.quiet;\n const restartRequired = Boolean(hasActiveInhibitor() && previousMode !== mode && !state.command?.custom);\n state.settingsError = undefined;\n\n if (restartRequired) {\n state.mode = mode;\n await stopInhibitor(ctx, \"mode changed\", { notify: false });\n if (generation !== state.sessionGeneration) return;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n if (!hasActiveInhibitor()) {\n const applicationError = state.lastError ?? \"the inhibitor could not be restarted\";\n state.mode = previousMode;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n const rollbackError = hasActiveInhibitor()\n ? undefined\n : (state.lastError ?? \"the previous inhibitor could not be restored\");\n state.settingsError = rollbackError\n ? `mode application failed (${applicationError}); runtime rollback failed: ${rollbackError}`\n : `mode application failed and was rolled back: ${applicationError}`;\n ctx.ui.notify(`pi-caffeinate ${state.settingsError}`, \"warning\");\n updateStatus(ctx);\n return;\n }\n }\n\n let savedSettings: CaffeinateSettings;\n try {\n savedSettings = await saveSettings({ mode, updatedAt: Date.now() });\n } catch (error) {\n if (generation !== state.sessionGeneration) return;\n let rollbackError: string | undefined;\n if (restartRequired) {\n state.mode = previousMode;\n state.quiet = previousQuiet;\n await stopInhibitor(ctx, \"settings save failed\", { notify: false });\n if (generation !== state.sessionGeneration) return;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n if (!hasActiveInhibitor()) {\n rollbackError = state.lastError ?? \"the prior inhibitor was not restored\";\n }\n }\n state.settingsError = rollbackError\n ? `settings save failed (${formatError(error)}); runtime rollback failed: ${rollbackError}`\n : `settings save failed: ${formatError(error)}`;\n ctx.ui.notify(\n `pi-caffeinate mode remains ${formatMode(previousMode)}; settings were not saved: ${state.settingsError}`,\n \"warning\",\n );\n updateStatus(ctx);\n return;\n }\n\n if (generation !== state.sessionGeneration) return;\n state.mode = mode;\n state.quiet = savedSettings.quiet;\n ctx.ui.notify(`pi-caffeinate mode set to ${formatMode(mode)} and saved.`, \"info\");\n updateStatus(ctx);\n}\n\nfunction showStatus(ctx: ExtensionContext) {\n ctx.ui.notify(describeState(), statusLevel());\n updateStatus(ctx);\n}\n\nasync function stopCaffeinate(ctx: ExtensionContext, reason: string, sessionGeneration: number) {\n state.activeTurns = 0;\n await stopInhibitor(ctx, reason);\n if (sessionGeneration !== state.sessionGeneration) return;\n updateStatus(ctx);\n}\n\nexport function parseCommand(args: string): CommandAction | \"unknown\" {\n const command = args.trim().toLowerCase();\n if (!command) return \"menu\";\n if (command === \"help\") return \"help\";\n if (command === \"status\") return \"status\";\n if (command === \"mode\" || command === \"config\" || command === \"settings\") return \"mode\";\n if (command === \"sleep\" || command === \"system\") return \"sleep\";\n if (command === \"display\" || command === \"screen\") return \"display\";\n if (command === \"stop\" || command === \"off\") return \"stop\";\n return \"unknown\";\n}\n\nexport function commandCompletions(prefix: string) {\n const normalized = prefix.trimStart().toLowerCase();\n if (/\\s/.test(normalized)) return null;\n\n const matches = COMMAND_COMPLETIONS.filter((completion) => completion.value.startsWith(normalized));\n return matches.length > 0 ? matches : null;\n}\n\nfunction buildCommandGuide() {\n return [\n \"pi-caffeinate commands:\",\n \"/caffeinate \u2014 open keep-awake controls\",\n \"/caffeinate display \u2014 keep the system and display awake\",\n \"/caffeinate sleep \u2014 keep the system awake while allowing display sleep\",\n \"/caffeinate status \u2014 show current mode, settings, and inhibitor state\",\n \"/caffeinate mode \u2014 choose a keep-awake mode\",\n \"/caffeinate stop \u2014 release the active inhibitor until the next agent run\",\n ].join(\"\\n\");\n}\n\nasync function startInhibitor(ctx: ExtensionContext, sessionGeneration: number, options: { notify?: boolean } = {}) {\n if (state.disabled || hasActiveInhibitor() || state.inhibitorStarting) {\n updateStatus(ctx);\n return;\n }\n\n const token = ++inhibitSequence;\n const command = getInhibitorCommand(state.mode);\n const wantsDbus =\n !command?.custom &&\n state.mode === \"display\" &&\n process.platform === \"linux\" &&\n (command === undefined || command.addDbusIdleInhibit === true);\n if (!command && !wantsDbus) {\n state.available = false;\n state.lastError = `No supported sleep inhibitor found for ${process.platform}.`;\n ctx.ui.notify(state.lastError, \"warning\");\n updateStatus(ctx);\n return;\n }\n\n state.inhibitorStarting = true;\n state.inhibitWarning = undefined;\n let child: ChildProcess | undefined;\n let childError =\n !command && wantsDbus\n ? \"No supported system sleep inhibitor is available; direct system suspend may remain possible.\"\n : undefined;\n let assembling = true;\n const handleChildFailure = (message: string) => {\n if (!child || token !== inhibitSequence || state.process !== child) return;\n state.process = undefined;\n state.command = undefined;\n if (assembling) {\n childError = message;\n return;\n }\n applyChildFailure(message);\n };\n\n if (command) {\n try {\n child = startInhibitorProcess(\n command,\n (error) => handleChildFailure(`${command.description} failed: ${error.message}`),\n (exit) => handleChildFailure(`${command.description} exited unexpectedly (${exit}).`),\n );\n state.process = child;\n state.command = command;\n state.startedAt = Date.now();\n } catch (error) {\n childError = `${command.description}: ${formatError(error)}`;\n }\n }\n\n let dbus: DbusScreenSaverClient | undefined;\n let dbusError: string | undefined;\n if (wantsDbus) {\n const pending: PendingDbusStart = { token, controller: new AbortController() };\n state.pendingDbus = pending;\n try {\n const client = await dbusFactory();\n if (!pendingStartIsCurrent(pending, sessionGeneration)) {\n await client.close().catch(() => undefined);\n await cancelPendingStart(token, child, command);\n return;\n }\n pending.client = client;\n await client.inhibit(INHIBIT_REASON, pending.controller.signal);\n if (!pendingStartIsCurrent(pending, sessionGeneration)) {\n await cancelPendingStart(token, child, command);\n return;\n }\n pending.client = undefined;\n state.pendingDbus = undefined;\n dbus = client;\n } catch (error) {\n const stale = !pendingStartIsCurrent(pending, sessionGeneration) || pending.controller.signal.aborted;\n const pendingClient = takePendingDbusClient(pending);\n await pendingClient?.close().catch(() => undefined);\n if (stale) {\n await cancelPendingStart(token, child, command);\n return;\n }\n dbusError = `D-Bus idle inhibit (${SCREENSAVER_BUS_NAME}): ${formatError(error)}`;\n }\n }\n\n assembling = false;\n if (startIsStale(token, sessionGeneration)) {\n await cancelPendingStart(token, child, command);\n await dbus?.close().catch(() => undefined);\n return;\n }\n\n state.inhibitorStarting = false;\n state.dbus = dbus;\n if (dbus) {\n dbus.setFailureHandler((error) => applyDbusFailure(token, dbus, error));\n if (state.dbus !== dbus) return;\n }\n const failures = [childError, dbusError].filter((failure): failure is string => Boolean(failure));\n if (!hasActiveInhibitor()) {\n state.startedAt = undefined;\n state.command = undefined;\n state.available = false;\n state.lastError = failures.join(\"; \") || `No supported sleep inhibitor found for ${process.platform}.`;\n ctx.ui.notify(state.lastError, \"warning\");\n updateStatus(ctx);\n return;\n }\n\n state.startedAt ??= Date.now();\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = failures.length > 0 ? failures.join(\"; \") : undefined;\n if (state.inhibitWarning) {\n ctx.ui.notify(`pi-caffeinate is partially active: ${state.inhibitWarning}`, \"warning\");\n } else if (options.notify !== false) {\n ctx.ui.notify(`Keeping computer awake (${statusModeLabel()}).`, \"info\");\n }\n updateStatus(ctx);\n}\n\nasync function stopInhibitor(ctx: ExtensionContext, reason: string, options: { notify?: boolean } = {}) {\n inhibitSequence += 1;\n const child = state.process;\n const dbus = state.dbus;\n const dbusCleanup = state.dbusCleanup;\n const pending = state.pendingDbus;\n const command = state.command;\n const wasStarting = state.inhibitorStarting;\n state.process = undefined;\n state.dbus = undefined;\n state.dbusCleanup = undefined;\n state.pendingDbus = undefined;\n state.command = undefined;\n state.startedAt = undefined;\n state.inhibitWarning = undefined;\n state.inhibitorStarting = false;\n dbus?.setFailureHandler(undefined);\n pending?.controller.abort(new DOMException(`Caffeinate stopped: ${reason}`, \"AbortError\"));\n const pendingClient = pending ? takePendingDbusClient(pending) : undefined;\n if (child) stopInhibitorProcess(child, command);\n if (!child && !dbus && !pendingClient && !wasStarting) {\n await dbusCleanup;\n return;\n }\n if (options.notify !== false) ctx.ui.notify(`Released pi-caffeinate (${reason}).`, \"info\");\n await Promise.all([dbusCleanup, pendingClient?.close().catch(() => undefined)]);\n if (!dbus) return;\n try {\n await dbus.uninhibit();\n } catch {\n // Closing the session-bus connection also releases its inhibition cookie.\n }\n await dbus.close().catch(() => undefined);\n}\n\nfunction applyChildFailure(message: string) {\n if (state.dbus) {\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = message;\n } else {\n state.startedAt = undefined;\n state.available = false;\n state.lastError = message;\n state.inhibitWarning = undefined;\n }\n const ctx = currentSessionContext();\n if (!ctx) return;\n ctx.ui.notify(message, \"warning\");\n updateStatus(ctx);\n}\n\nfunction applyDbusFailure(token: number, client: DbusScreenSaverClient, error: Error) {\n if (token !== inhibitSequence || state.dbus !== client) return;\n client.setFailureHandler(undefined);\n state.dbus = undefined;\n const message = `D-Bus idle inhibit (${SCREENSAVER_BUS_NAME}) failed: ${formatError(error)}`;\n const notification = state.process ? `pi-caffeinate is partially active: ${message}` : message;\n if (state.process) {\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = message;\n } else {\n state.startedAt = undefined;\n state.command = undefined;\n state.available = false;\n state.lastError = [state.inhibitWarning, message].filter(Boolean).join(\"; \");\n state.inhibitWarning = undefined;\n }\n const cleanup = client.close().catch(() => undefined);\n state.dbusCleanup = cleanup;\n void cleanup.then(() => {\n if (state.dbusCleanup === cleanup) state.dbusCleanup = undefined;\n });\n const ctx = currentSessionContext();\n if (!ctx) return;\n ctx.ui.notify(notification, \"warning\");\n updateStatus(ctx);\n}\n\nfunction currentSessionContext() {\n const session = state.currentSession;\n return session?.generation === state.sessionGeneration ? session.ctx : undefined;\n}\n\nfunction hasActiveInhibitor() {\n return Boolean(state.process || state.dbus);\n}\n\nfunction startIsStale(token: number, sessionGeneration: number) {\n return token !== inhibitSequence || sessionGeneration !== state.sessionGeneration;\n}\n\nfunction pendingStartIsCurrent(pending: PendingDbusStart, sessionGeneration: number) {\n return (\n state.pendingDbus === pending &&\n !pending.controller.signal.aborted &&\n !startIsStale(pending.token, sessionGeneration)\n );\n}\n\nfunction takePendingDbusClient(pending: PendingDbusStart) {\n if (state.pendingDbus === pending) state.pendingDbus = undefined;\n const client = pending.client;\n pending.client = undefined;\n return client;\n}\n\nasync function cancelPendingStart(\n token: number,\n child: ChildProcess | undefined,\n command: InhibitorCommand | undefined,\n) {\n if (token !== inhibitSequence) return;\n inhibitSequence += 1;\n state.inhibitorStarting = false;\n const pending = state.pendingDbus?.token === token ? state.pendingDbus : undefined;\n state.pendingDbus = undefined;\n pending?.controller.abort(new DOMException(\"Caffeinate start cancelled\", \"AbortError\"));\n const pendingClient = pending ? takePendingDbusClient(pending) : undefined;\n if (child && state.process === child) {\n state.process = undefined;\n state.command = undefined;\n state.startedAt = undefined;\n stopInhibitorProcess(child, command);\n }\n await pendingClient?.close().catch(() => undefined);\n}\n\nfunction updateStatus(ctx: ExtensionContext) {\n if (state.disabled || state.quiet) {\n ctx.ui.setStatus(STATUS_KEY, undefined);\n return;\n }\n\n if (hasActiveInhibitor()) {\n ctx.ui.setStatus(STATUS_KEY, withDeprecatedIcon(statusModeLabel()));\n return;\n }\n\n if (!state.available) {\n ctx.ui.setStatus(STATUS_KEY, withDeprecatedIcon(\"unavailable\"));\n return;\n }\n\n ctx.ui.setStatus(STATUS_KEY, undefined);\n}\n\nfunction describeState() {\n const customCommand = hasCustomCommand();\n const lines = [\n `Mode: ${formatMode(state.mode)}${customCommand ? \" (overridden by custom command)\" : \"\"}`,\n `Quiet mode: ${state.quiet ? \"enabled\" : \"disabled\"}`,\n `Settings: ${settingsFilePath()}`,\n ];\n\n if (customCommand) lines.push(\"Custom command: PI_CAFFEINATE_COMMAND overrides the saved mode.\");\n if (state.settingsNotice) lines.push(`Settings note: ${state.settingsNotice}`);\n if (state.settingsError) lines.push(`Settings warning: ${state.settingsError}`);\n if (state.disabled) {\n lines.unshift(\"pi-caffeinate is disabled by PI_CAFFEINATE_DISABLED.\");\n return lines.join(\"\\n\");\n }\n\n if (hasActiveInhibitor()) {\n const seconds = state.startedAt ? Math.round((Date.now() - state.startedAt) / 1000) : 0;\n const activeParts: string[] = [];\n if (state.dbus) activeParts.push(`D-Bus idle inhibit (${SCREENSAVER_BUS_NAME})`);\n if (state.process && state.command) activeParts.push(state.command.description);\n lines.unshift(`pi-caffeinate is active using ${activeParts.join(\" + \") || \"an inhibitor\"} for ${seconds}s.`);\n if (state.inhibitWarning) lines.push(`Inhibitor warning: ${state.inhibitWarning}`);\n return lines.join(\"\\n\");\n }\n\n if (!state.available) {\n lines.unshift(`pi-caffeinate is unavailable: ${state.lastError ?? \"unknown reason\"}`);\n return lines.join(\"\\n\");\n }\n\n lines.unshift(\"pi-caffeinate is idle and will keep the computer awake during the next agent run.\");\n return lines.join(\"\\n\");\n}\n\nfunction statusLevel() {\n return state.available && !state.settingsError && !state.inhibitWarning ? \"info\" : \"warning\";\n}\n\nfunction statusModeLabel() {\n if (state.command?.custom) return \"custom\";\n return formatMode(state.mode);\n}\n\nasync function ensureSettingsLoaded(ctx: ExtensionContext, generation: number) {\n if (state.disabled || state.settingsLoaded) return;\n await loadSettingsIntoState(ctx, generation);\n}\n\nasync function loadSettingsIntoState(ctx: ExtensionContext, generation: number) {\n if (state.disabled) {\n state.settingsLoaded = true;\n state.settingsError = undefined;\n state.quiet = false;\n return;\n }\n\n const settings = await loadSettings();\n if (generation !== state.sessionGeneration) return;\n state.settingsLoaded = true;\n state.settingsError = undefined;\n if (settings.notice) {\n state.settingsNotice = settings.notice;\n ctx.ui.notify(settings.notice, \"warning\");\n }\n\n if (settings.kind === \"loaded\") {\n state.mode = settings.settings.mode;\n state.quiet = settings.settings.quiet;\n return;\n }\n\n state.mode = DEFAULT_MODE;\n state.quiet = false;\n if (settings.kind === \"invalid\") {\n state.settingsError = settings.reason;\n ctx.ui.notify(\n `pi-caffeinate settings ignored: ${settings.reason}; using ${formatMode(DEFAULT_MODE)} mode.`,\n \"warning\",\n );\n }\n}\n\nfunction formatError(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isDisabled() {\n const value = process.env.PI_CAFFEINATE_DISABLED?.trim().toLowerCase();\n return value ? DISABLED_VALUES.has(value) : false;\n}\n\nfunction hasCustomCommand() {\n return Boolean(process.env.PI_CAFFEINATE_COMMAND?.trim());\n}\n\nfunction withDeprecatedIcon(text: string) {\n const icon = process.env.PI_CAFFEINATE_ICON?.trim();\n return icon ? `${icon} ${text}` : text;\n}\n\nfunction warnDeprecatedIcon(ctx: ExtensionContext) {\n if (state.iconWarningShown || !process.env.PI_CAFFEINATE_ICON?.trim()) return;\n state.iconWarningShown = true;\n ctx.ui.notify(\n \"PI_CAFFEINATE_ICON is deprecated but still works for now. If you use @narumitw/pi-statusline, move it to pi-statusline.json (extensionStatusIcons.caffeinate).\",\n \"warning\",\n );\n}\n\nexport {\n formatMode,\n getInhibitorCommand,\n splitCommand,\n windowsInhibitorScript,\n} from \"./inhibitors.js\";\nexport { normalizeCaffeinateSettings } from \"./settings.js\";\n", "import type { Message, MessageBus } from \"dbus-native\";\n\nexport const SCREENSAVER_BUS_NAME = \"org.freedesktop.ScreenSaver\";\nexport const SCREENSAVER_INTERFACE = \"org.freedesktop.ScreenSaver\";\nexport const INHIBIT_REASON = \"Pi agent is running\";\n\nconst INHIBIT_APPLICATION_NAME = \"pi-caffeinate\";\nconst SCREENSAVER_OBJECT_PATHS = [\"/org/freedesktop/ScreenSaver\", \"/ScreenSaver\"];\nconst DBUS_CALL_TIMEOUT_MS = 2_000;\n\ntype DbusFailureHandler = (error: Error) => void;\n\nexport interface DbusScreenSaverClient {\n setFailureHandler(handler: DbusFailureHandler | undefined): void;\n inhibit(reason: string, signal?: AbortSignal): Promise<void>;\n uninhibit(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport type DbusScreenSaverFactory = () => Promise<DbusScreenSaverClient>;\n\nexport async function defaultDbusScreenSaverFactory(): Promise<DbusScreenSaverClient> {\n const { sessionBus } = await import(\"dbus-native\");\n return new NativeScreenSaverClient(sessionBus());\n}\n\nclass NativeScreenSaverClient implements DbusScreenSaverClient {\n private cookie?: number;\n private objectPath?: string;\n private failureHandler?: DbusFailureHandler;\n private pendingFailure?: Error;\n private lastConnectionError?: Error;\n private closing = false;\n\n private readonly handleConnectionError = (error: unknown) => {\n this.lastConnectionError = toError(error, \"D-Bus session connection failed\");\n if (this.cookie !== undefined) this.reportFailure(this.lastConnectionError);\n };\n\n private readonly handleConnectionClose = (error?: unknown) => {\n if (this.closing || this.cookie === undefined) return;\n this.reportFailure(toError(error, this.lastConnectionError?.message ?? \"D-Bus session connection closed\"));\n };\n\n constructor(private readonly bus: MessageBus) {\n this.bus.connection.on(\"error\", this.handleConnectionError);\n this.bus.connection.on(\"close\", this.handleConnectionClose);\n }\n\n setFailureHandler(handler: DbusFailureHandler | undefined): void {\n this.failureHandler = handler;\n if (!handler || !this.pendingFailure) return;\n const failure = this.pendingFailure;\n this.pendingFailure = undefined;\n handler(failure);\n }\n\n async inhibit(reason: string, signal?: AbortSignal): Promise<void> {\n let lastError: unknown;\n for (const objectPath of SCREENSAVER_OBJECT_PATHS) {\n if (signal?.aborted) throw abortReason(signal);\n try {\n this.cookie = await invoke<number>(\n this.bus,\n {\n destination: SCREENSAVER_BUS_NAME,\n path: objectPath,\n interface: SCREENSAVER_INTERFACE,\n member: \"Inhibit\",\n signature: \"ss\",\n body: [INHIBIT_APPLICATION_NAME, reason],\n },\n signal,\n );\n this.objectPath = objectPath;\n return;\n } catch (error) {\n if (signal?.aborted) throw abortReason(signal);\n lastError = error;\n }\n }\n throw new Error(`D-Bus idle inhibit failed: ${formatError(lastError)}`, {\n cause: lastError,\n });\n }\n\n async uninhibit(): Promise<void> {\n if (this.cookie === undefined || !this.objectPath) return;\n const cookie = this.cookie;\n this.cookie = undefined;\n const objectPath = this.objectPath;\n this.objectPath = undefined;\n await invoke<void>(this.bus, {\n destination: SCREENSAVER_BUS_NAME,\n path: objectPath,\n interface: SCREENSAVER_INTERFACE,\n member: \"UnInhibit\",\n signature: \"u\",\n body: [cookie],\n });\n }\n\n async close(): Promise<void> {\n this.closing = true;\n this.cookie = undefined;\n this.objectPath = undefined;\n this.failureHandler = undefined;\n try {\n await this.bus.close();\n } finally {\n this.bus.connection.off(\"error\", this.handleConnectionError);\n this.bus.connection.off(\"close\", this.handleConnectionClose);\n }\n }\n\n private reportFailure(error: Error): void {\n if (this.cookie === undefined) return;\n this.cookie = undefined;\n this.objectPath = undefined;\n if (this.failureHandler) this.failureHandler(error);\n else this.pendingFailure = error;\n }\n}\n\nfunction invoke<TResult>(bus: MessageBus, message: Message, signal?: AbortSignal): Promise<TResult> {\n return new Promise<TResult>((resolve, reject) => {\n bus.invoke(message, { signal, timeout: DBUS_CALL_TIMEOUT_MS }, (error, ...values) => {\n if (error) reject(error);\n else resolve(values[0] as TResult);\n });\n });\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException(\"D-Bus idle inhibit cancelled\", \"AbortError\");\n}\n\nfunction toError(error: unknown, fallback: string): Error {\n return error instanceof Error ? error : new Error(fallback);\n}\n\nfunction formatError(error: unknown) {\n if (error instanceof Error) {\n return error.name === \"Error\" ? error.message : `${error.name}: ${error.message}`;\n }\n return String(error);\n}\n", "import { type ChildProcess, spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { InhibitorCommand } from \"./inhibitors.js\";\n\nexport function startInhibitorProcess(\n command: InhibitorCommand,\n onError: (error: Error) => void,\n onUnexpectedExit: (description: string) => void,\n): ChildProcess {\n const child = spawn(command.command, command.args, {\n detached: false,\n stdio: [command.releaseOnStdinClose ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n });\n child.once(\"error\", onError);\n child.once(\"exit\", (code, signal) => onUnexpectedExit(formatExit(code, signal)));\n return child;\n}\n\nexport function stopInhibitorProcess(child: ChildProcess, command: InhibitorCommand | undefined) {\n child.removeAllListeners(\"exit\");\n child.removeAllListeners(\"error\");\n if (child.killed) return;\n\n if (command?.releaseOnStdinClose && child.stdin && !child.stdin.destroyed) {\n child.stdin.end();\n if (child.exitCode === null && child.signalCode === null) {\n const killTimer = setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null && !child.killed) child.kill();\n }, 2000);\n killTimer.unref();\n child.once(\"exit\", () => clearTimeout(killTimer));\n }\n } else if (process.platform === \"win32\") {\n child.kill();\n } else {\n child.kill(\"SIGTERM\");\n }\n}\n\nfunction formatExit(code: number | null, signal: NodeJS.Signals | null) {\n if (signal) return `signal ${signal}`;\n return `code ${code ?? \"unknown\"}`;\n}\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport type { CaffeinateMode } from \"./settings.js\";\n\nexport interface InhibitorCommand {\n command: string;\n args: string[];\n description: string;\n releaseOnStdinClose?: boolean;\n custom?: boolean;\n /** Display mode also needs D-Bus because logind idle inhibition misses some compositors. */\n addDbusIdleInhibit?: boolean;\n}\n\nexport function getInhibitorCommand(mode: CaffeinateMode): InhibitorCommand | undefined {\n const customCommand = process.env.PI_CAFFEINATE_COMMAND?.trim();\n if (customCommand) {\n const [command, ...args] = splitCommand(customCommand);\n if (command) return { command, args, description: `custom command (${command})`, custom: true };\n }\n if (process.platform === \"darwin\") {\n return parentBoundUnixCommand(\"caffeinate\", macCaffeinateArgs(mode), caffeinateDescription(mode));\n }\n if (process.platform === \"linux\") {\n if (isWsl() && commandExists(\"powershell.exe\")) {\n return windowsPowerInhibitorCommand(\"powershell.exe\", mode);\n }\n if (commandExists(\"systemd-inhibit\")) {\n const what = mode === \"display\" ? \"idle:sleep\" : \"sleep\";\n return parentBoundUnixCommand(\n \"systemd-inhibit\",\n [`--what=${what}`, \"--who=pi-caffeinate\", \"--why=Pi agent is running\", \"--mode=block\", \"sleep\", \"infinity\"],\n `systemd-inhibit (${formatMode(mode)})`,\n mode === \"display\",\n );\n }\n if (commandExists(\"caffeinate\")) {\n return parentBoundUnixCommand(\n \"caffeinate\",\n macCaffeinateArgs(mode),\n caffeinateDescription(mode),\n mode === \"display\",\n );\n }\n }\n if (process.platform === \"win32\") return windowsPowerInhibitorCommand(\"powershell.exe\", mode);\n return undefined;\n}\n\nfunction macCaffeinateArgs(mode: CaffeinateMode) {\n return mode === \"sleep\" ? [\"-ims\"] : [\"-dimsu\"];\n}\n\nfunction caffeinateDescription(mode: CaffeinateMode) {\n return `caffeinate (${formatMode(mode)})`;\n}\n\nfunction parentBoundUnixCommand(\n command: string,\n args: string[],\n description: string,\n addDbusIdleInhibit = false,\n): InhibitorCommand {\n return {\n command: \"sh\",\n args: [\"-c\", unixParentBoundScript(), \"pi-caffeinate-watch\", String(process.pid), command, ...args],\n description,\n ...(addDbusIdleInhibit ? { addDbusIdleInhibit: true } : {}),\n };\n}\n\nfunction unixParentBoundScript() {\n return `parent=$1; shift; \"$@\" & child=$!; ( while kill -0 \"$parent\" 2>/dev/null; do sleep 5; done; kill \"$child\" 2>/dev/null ) & watcher=$!; cleanup() { kill \"$watcher\" 2>/dev/null; kill \"$child\" 2>/dev/null; wait \"$child\" 2>/dev/null; }; trap 'cleanup; exit 0' INT TERM HUP EXIT; wait \"$child\"; status=$?; kill \"$watcher\" 2>/dev/null; trap - EXIT; exit \"$status\"`;\n}\n\nfunction commandExists(command: string) {\n const searchPath = process.env.PATH ?? \"\";\n const extensions = process.platform === \"win32\" ? [\"\", \".exe\", \".cmd\", \".bat\"] : [\"\"];\n for (const directory of searchPath.split(process.platform === \"win32\" ? \";\" : \":\")) {\n if (!directory) continue;\n for (const extension of extensions) {\n if (existsSync(path.join(directory, `${command}${extension}`))) return true;\n }\n }\n return false;\n}\n\nexport function splitCommand(input: string) {\n const parts: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | undefined;\n let escaping = false;\n for (const char of input) {\n if (escaping) {\n current += char;\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n continue;\n }\n if ((char === '\"' || char === \"'\") && !quote) {\n quote = char;\n continue;\n }\n if (char === quote) {\n quote = undefined;\n continue;\n }\n if (/\\s/.test(char) && !quote) {\n if (current) {\n parts.push(current);\n current = \"\";\n }\n continue;\n }\n current += char;\n }\n if (current) parts.push(current);\n return parts;\n}\n\nfunction windowsPowerInhibitorCommand(command: string, mode: CaffeinateMode): InhibitorCommand {\n return {\n command,\n args: [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-Command\", windowsInhibitorScript(mode)],\n description: `PowerShell SetThreadExecutionState (${formatMode(mode)})`,\n releaseOnStdinClose: true,\n };\n}\n\nexport function windowsInhibitorScript(mode: CaffeinateMode) {\n const flags = mode === \"sleep\" ? \"0x80000001\" : \"0x80000003\";\n return `$ErrorActionPreference = 'Stop'; Add-Type -Namespace Native -Name Power -MemberDefinition '[DllImport(\"kernel32.dll\")] public static extern uint SetThreadExecutionState(uint esFlags);'; $flags = [uint32]'${flags}'; $release = [uint32]'0x80000000'; $stdin = [Console]::OpenStandardInput(); $buffer = New-Object byte[] 1; $readTask = $stdin.ReadAsync($buffer, 0, 1); try { while ($true) { [Native.Power]::SetThreadExecutionState($flags) | Out-Null; if ($readTask.Wait(30000)) { break } } } finally { [Native.Power]::SetThreadExecutionState($release) | Out-Null }`;\n}\n\nfunction isWsl() {\n try {\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\");\n } catch {\n return false;\n }\n}\n\nexport function formatMode(mode: CaffeinateMode) {\n return mode === \"sleep\" ? \"system-awake\" : \"display-awake\";\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, lstat, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nconst NEW_SETTINGS_FILE = \"pi-caffeinate.json\";\nconst LEGACY_SETTINGS_FILE = \"pi-caffeinate-settings.json\";\n\nexport type CaffeinateMode = \"sleep\" | \"display\";\n\nexport interface CaffeinateSettings {\n mode: CaffeinateMode;\n quiet: boolean;\n updatedAt: number;\n}\n\nexport interface SettingsFileOperations {\n write(path: string, data: string): Promise<void>;\n rename(source: string, destination: string): Promise<void>;\n}\n\nconst DEFAULT_FILE_OPERATIONS: SettingsFileOperations = {\n write: (path, data) => writeFile(path, data, \"utf8\").then(() => undefined),\n rename,\n};\n\nexport type SettingsLoadResult =\n | { kind: \"missing\"; notice?: string }\n | { kind: \"invalid\"; reason: string; notice?: string }\n | { kind: \"loaded\"; settings: CaffeinateSettings; notice?: string };\n\nexport async function loadSettings(): Promise<SettingsLoadResult> {\n await settingsSaveQueue;\n const newPath = settingsFilePath();\n const newSettings = await readSettingsFile(newPath);\n if (newSettings.kind !== \"missing\") return withLegacyIgnoredNotice(newSettings);\n\n const legacyPath = legacySettingsFilePath();\n const legacySettings = await readSettingsFile(legacyPath);\n const concurrentlyCreatedSettings = await readSettingsFile(newPath);\n if (concurrentlyCreatedSettings.kind !== \"missing\") {\n return withLegacyIgnoredNotice(concurrentlyCreatedSettings);\n }\n if (legacySettings.kind === \"missing\") return { kind: \"missing\" };\n if (legacySettings.kind === \"invalid\") return legacySettings;\n\n return {\n ...legacySettings,\n notice: `Using legacy ${LEGACY_SETTINGS_FILE}; rename it to ${NEW_SETTINGS_FILE}. Future saves write ${NEW_SETTINGS_FILE} without modifying the legacy file.`,\n };\n}\n\ninterface SettingsDocumentResult {\n result: SettingsLoadResult;\n document?: Record<string, unknown>;\n}\n\nasync function readSettingsDocument(filePath: string): Promise<SettingsDocumentResult> {\n let text: string;\n try {\n text = await readFile(filePath, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return { result: { kind: \"missing\" } };\n return { result: { kind: \"invalid\", reason: `${filePath}: ${formatError(error)}` } };\n }\n try {\n const document = JSON.parse(text) as unknown;\n const settings = normalizeCaffeinateSettings(document);\n if (settings) {\n return {\n result: { kind: \"loaded\", settings },\n document: { ...(document as Record<string, unknown>) },\n };\n }\n return {\n result: {\n kind: \"invalid\",\n reason: `${filePath}: expected { \"mode\": \"sleep\" | \"display\", optional \"quiet\": boolean }`,\n },\n };\n } catch (error) {\n return { result: { kind: \"invalid\", reason: `${filePath}: ${formatError(error)}` } };\n }\n}\n\nasync function readSettingsFile(filePath: string): Promise<SettingsLoadResult> {\n return (await readSettingsDocument(filePath)).result;\n}\n\nasync function withLegacyIgnoredNotice(settings: SettingsLoadResult): Promise<SettingsLoadResult> {\n if (!(await fileExists(legacySettingsFilePath()))) return settings;\n return {\n ...settings,\n notice: `pi-caffeinate legacy settings ignored: ${legacySettingsFilePath()} exists, but ${settingsFilePath()} takes precedence. Delete ${LEGACY_SETTINGS_FILE} after confirming your settings.`,\n };\n}\n\nasync function fileExists(filePath: string) {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function pathEntryExists(filePath: string) {\n try {\n await lstat(filePath);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nexport function normalizeCaffeinateSettings(value: unknown): CaffeinateSettings | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const settings = value as { mode?: unknown; quiet?: unknown; updatedAt?: unknown };\n if (!isCaffeinateMode(settings.mode)) return undefined;\n if (settings.quiet !== undefined && typeof settings.quiet !== \"boolean\") return undefined;\n if (settings.updatedAt !== undefined && typeof settings.updatedAt !== \"number\") return undefined;\n return {\n mode: settings.mode,\n quiet: settings.quiet ?? false,\n updatedAt: settings.updatedAt ?? 0,\n };\n}\n\nfunction isCaffeinateMode(value: unknown): value is CaffeinateMode {\n return value === \"sleep\" || value === \"display\";\n}\n\nlet settingsSaveQueue: Promise<unknown> = Promise.resolve();\n\nexport function saveSettings(\n settings: Omit<CaffeinateSettings, \"quiet\"> & { quiet?: boolean },\n operations: Partial<SettingsFileOperations> = {},\n): Promise<CaffeinateSettings> {\n const operation = settingsSaveQueue.then(() => saveSettingsNow(settings, operations));\n settingsSaveQueue = operation.catch(() => undefined);\n return operation;\n}\n\nasync function saveSettingsNow(\n settings: Omit<CaffeinateSettings, \"quiet\"> & { quiet?: boolean },\n operations: Partial<SettingsFileOperations>,\n): Promise<CaffeinateSettings> {\n const filePath = settingsFilePath();\n let current = await readSettingsDocument(filePath);\n const replaceCanonical = current.result.kind !== \"missing\";\n if (!replaceCanonical) current = await readSettingsDocument(legacySettingsFilePath());\n if (current.result.kind === \"invalid\") {\n throw new Error(`Cannot save pi-caffeinate settings until you repair ${current.result.reason}`);\n }\n const document = current.document ?? {};\n const quiet = settings.quiet ?? (current.result.kind === \"loaded\" ? current.result.settings.quiet : false);\n const nextSettings = { mode: settings.mode, quiet, updatedAt: settings.updatedAt };\n const nextDocument = {\n ...document,\n ...nextSettings,\n };\n await mkdir(dirname(filePath), { recursive: true });\n const tempFile = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await (operations.write ?? DEFAULT_FILE_OPERATIONS.write)(tempFile, `${JSON.stringify(nextDocument, null, 2)}\\n`);\n if (!replaceCanonical && (await pathEntryExists(filePath))) {\n throw new Error(`${NEW_SETTINGS_FILE} was created concurrently; reopen settings and retry.`);\n }\n await (operations.rename ?? DEFAULT_FILE_OPERATIONS.rename)(tempFile, filePath);\n return nextSettings;\n } catch (error) {\n await rm(tempFile, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function settingsFilePath() {\n return join(agentDir(), NEW_SETTINGS_FILE);\n}\n\nfunction legacySettingsFilePath() {\n return join(agentDir(), LEGACY_SETTINGS_FILE);\n}\n\nfunction agentDir() {\n return getAgentDir();\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { ChildProcess } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n type DbusScreenSaverClient,\n type DbusScreenSaverFactory,\n defaultDbusScreenSaverFactory,\n INHIBIT_REASON,\n SCREENSAVER_BUS_NAME,\n} from \"./dbus-inhibit.js\";\nimport { startInhibitorProcess, stopInhibitorProcess } from \"./inhibitor-process.js\";\nimport { formatMode, getInhibitorCommand, type InhibitorCommand } from \"./inhibitors.js\";\nimport {\n type CaffeinateMode,\n type CaffeinateSettings,\n loadSettings,\n saveSettings,\n settingsFilePath,\n} from \"./settings.js\";\n\nconst STATUS_KEY = \"caffeinate\";\nconst DISABLED_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\nconst DEFAULT_MODE = \"display\" satisfies CaffeinateMode;\nconst COMMAND_COMPLETIONS = [\n { value: \"display\", label: \"display\", description: \"Keep system and display awake\" },\n { value: \"sleep\", label: \"sleep\", description: \"Keep system awake; allow display sleep\" },\n { value: \"status\", label: \"status\", description: \"Show current status\" },\n { value: \"mode\", label: \"mode\", description: \"Choose keep-awake mode\" },\n { value: \"stop\", label: \"stop\", description: \"Release inhibitor for now\" },\n { value: \"help\", label: \"help\", description: \"Show command help\" },\n];\nconst MENU_OPTIONS = {\n display: \"Keep system and display awake\",\n sleep: \"Keep system awake; allow display sleep\",\n status: \"Show current status\",\n stop: \"Release inhibitor for now\",\n help: \"Show command help\",\n} as const;\nconst MODE_OPTIONS = {\n display: \"Keep system and display awake\",\n sleep: \"Keep system awake; allow display sleep\",\n} as const;\n\ntype CommandAction = \"menu\" | \"help\" | \"status\" | \"mode\" | \"sleep\" | \"display\" | \"stop\";\ntype CommandContext = ExtensionCommandContext;\n\ninterface CaffeinateOptions {\n dbusFactory?: DbusScreenSaverFactory;\n}\n\ninterface PendingDbusStart {\n token: number;\n controller: AbortController;\n client?: DbusScreenSaverClient;\n}\n\ninterface CaffeinateState {\n process?: ChildProcess;\n dbus?: DbusScreenSaverClient;\n currentSession?: { generation: number; ctx: ExtensionContext };\n dbusCleanup?: Promise<void>;\n pendingDbus?: PendingDbusStart;\n startedAt?: number;\n command?: InhibitorCommand;\n lastError?: string;\n inhibitWarning?: string;\n inhibitorStarting: boolean;\n activeTurns: number;\n available: boolean;\n disabled: boolean;\n mode: CaffeinateMode;\n quiet: boolean;\n settingsLoaded: boolean;\n settingsError?: string;\n settingsNotice?: string;\n iconWarningShown: boolean;\n sessionGeneration: number;\n menuController: AbortController;\n}\n\nconst state: CaffeinateState = {\n activeTurns: 0,\n available: true,\n inhibitorStarting: false,\n disabled: isDisabled(),\n mode: DEFAULT_MODE,\n quiet: false,\n settingsLoaded: false,\n iconWarningShown: false,\n sessionGeneration: 0,\n menuController: new AbortController(),\n};\n\nlet dbusFactory = defaultDbusScreenSaverFactory;\nlet inhibitSequence = 0;\n\nexport default function caffeinate(pi: ExtensionAPI, options: CaffeinateOptions = {}) {\n dbusFactory = options.dbusFactory ?? defaultDbusScreenSaverFactory;\n pi.on(\"session_start\", async (_event, ctx) => {\n const generation = ++state.sessionGeneration;\n state.currentSession = { generation, ctx };\n replaceMenuController(\"Caffeinate session replaced\");\n state.iconWarningShown = false;\n state.settingsNotice = undefined;\n warnDeprecatedIcon(ctx);\n await loadSettingsIntoState(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n updateStatus(ctx);\n });\n\n pi.on(\"agent_start\", async (_event, ctx) => {\n const generation = state.sessionGeneration;\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n state.activeTurns += 1;\n await startInhibitor(ctx, generation, { notify: !state.quiet });\n });\n\n pi.on(\"agent_end\", async (_event, ctx) => {\n const generation = state.sessionGeneration;\n state.activeTurns = Math.max(0, state.activeTurns - 1);\n if (state.activeTurns === 0) {\n await stopInhibitor(ctx, \"agent finished\", { notify: !state.quiet });\n }\n if (generation !== state.sessionGeneration) return;\n updateStatus(ctx);\n });\n\n pi.on(\"session_shutdown\", async (_event, ctx) => {\n const generation = ++state.sessionGeneration;\n state.currentSession = undefined;\n state.menuController.abort(new DOMException(\"Caffeinate session shut down\", \"AbortError\"));\n state.activeTurns = 0;\n await stopInhibitor(ctx, \"session shutdown\", { notify: false });\n await modeOperationQueue;\n if (generation !== state.sessionGeneration) return;\n ctx.ui.setStatus(STATUS_KEY, undefined);\n });\n\n pi.registerCommand(\"caffeinate\", {\n description: \"Open pi-caffeinate keep-awake controls\",\n getArgumentCompletions: (prefix) => commandCompletions(prefix),\n handler: async (args, ctx) => {\n const generation = state.sessionGeneration;\n const command = parseCommand(args);\n if (command === \"sleep\" || command === \"display\") {\n await setModeAfterSettingsLoad(ctx, command, generation);\n return;\n }\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n await handleCaffeinateCommand(args, ctx, generation);\n },\n });\n}\n\nasync function handleCaffeinateCommand(args: string, ctx: CommandContext, generation: number) {\n const command = parseCommand(args);\n switch (command) {\n case \"menu\":\n await showMenu(ctx, generation);\n return;\n case \"help\":\n ctx.ui.notify(buildCommandGuide(), \"info\");\n return;\n case \"status\":\n showStatus(ctx);\n return;\n case \"mode\":\n await showModeSelector(ctx, generation);\n return;\n case \"sleep\":\n await setMode(ctx, \"sleep\", generation);\n return;\n case \"display\":\n await setMode(ctx, \"display\", generation);\n return;\n case \"stop\":\n await stopCaffeinate(ctx, \"manual stop\", generation);\n return;\n }\n\n ctx.ui.notify(`Unknown /caffeinate command: ${args.trim()}\\n\\n${buildCommandGuide()}`, \"warning\");\n}\n\nasync function showMenu(ctx: CommandContext, generation: number) {\n await runCaffeinateMenu(ctx, generation, \"main\");\n}\n\nasync function showModeSelector(ctx: CommandContext, generation: number) {\n await runCaffeinateMenu(ctx, generation, \"mode\");\n}\n\nasync function runCaffeinateMenu(ctx: CommandContext, generation: number, start: \"main\" | \"mode\") {\n if (!ctx.hasUI) {\n throw new Error(\n start === \"mode\"\n ? \"Mode selection requires TUI or RPC mode. Use /caffeinate sleep or /caffeinate display.\"\n : `The pi-caffeinate menu requires TUI or RPC mode.\\n\\n${buildCommandGuide()}\\n\\n${describeState()}`,\n );\n }\n const menuSignal = state.menuController.signal;\n const isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (!isCurrent()) return;\n type Screen = \"main\" | \"mode\";\n type Action = \"display\" | \"sleep\" | \"status\" | \"stop\" | \"help\";\n const menu = defineMenu<undefined, Screen, Action>({\n start,\n screens: {\n main: () => ({\n kind: \"actions\",\n title: \"pi-caffeinate controls\",\n lines: describeState().split(\"\\n\"),\n items: Object.entries(MENU_OPTIONS).map(([id, label]) => ({\n id,\n label,\n action: id as Action,\n })),\n hint: \"close\",\n }),\n mode: () => ({\n kind: \"actions\",\n title: `pi-caffeinate mode (current: ${formatMode(state.mode)})`,\n items: Object.entries(MODE_OPTIONS).map(([id, label]) => ({\n id,\n label,\n action: id as Action,\n })),\n hint: \"close\",\n }),\n },\n actions: {\n display: async () => {\n await setMode(ctx, \"display\", generation);\n return { kind: \"close\" };\n },\n sleep: async () => {\n await setMode(ctx, \"sleep\", generation);\n return { kind: \"close\" };\n },\n status: async () => {\n showStatus(ctx);\n return { kind: \"close\" };\n },\n stop: async () => {\n await stopCaffeinate(ctx, \"manual stop\", generation);\n return { kind: \"close\" };\n },\n help: async () => {\n ctx.ui.notify(buildCommandGuide(), \"info\");\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: menuSignal,\n isCurrent,\n });\n}\n\nfunction replaceMenuController(reason: string) {\n state.menuController.abort(new DOMException(reason, \"AbortError\"));\n state.menuController = new AbortController();\n}\n\nlet modeOperationQueue = Promise.resolve();\n\nfunction setModeAfterSettingsLoad(ctx: ExtensionContext, mode: CaffeinateMode, generation: number): Promise<void> {\n return enqueueModeOperation(async () => {\n await ensureSettingsLoaded(ctx, generation);\n if (generation !== state.sessionGeneration) return;\n await setModeNow(ctx, mode, generation);\n });\n}\n\nfunction setMode(ctx: ExtensionContext, mode: CaffeinateMode, generation: number): Promise<void> {\n return enqueueModeOperation(() => setModeNow(ctx, mode, generation));\n}\n\nfunction enqueueModeOperation(operation: () => Promise<void>): Promise<void> {\n const queued = modeOperationQueue.then(operation);\n modeOperationQueue = queued.catch(() => undefined);\n return queued;\n}\n\nasync function setModeNow(ctx: ExtensionContext, mode: CaffeinateMode, generation: number) {\n if (generation !== state.sessionGeneration) return;\n const previousMode = state.mode;\n const previousQuiet = state.quiet;\n const restartRequired = Boolean(hasActiveInhibitor() && previousMode !== mode && !state.command?.custom);\n state.settingsError = undefined;\n\n if (restartRequired) {\n state.mode = mode;\n await stopInhibitor(ctx, \"mode changed\", { notify: false });\n if (generation !== state.sessionGeneration) return;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n if (!hasActiveInhibitor()) {\n const applicationError = state.lastError ?? \"the inhibitor could not be restarted\";\n state.mode = previousMode;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n const rollbackError = hasActiveInhibitor()\n ? undefined\n : (state.lastError ?? \"the previous inhibitor could not be restored\");\n state.settingsError = rollbackError\n ? `mode application failed (${applicationError}); runtime rollback failed: ${rollbackError}`\n : `mode application failed and was rolled back: ${applicationError}`;\n ctx.ui.notify(`pi-caffeinate ${state.settingsError}`, \"warning\");\n updateStatus(ctx);\n return;\n }\n }\n\n let savedSettings: CaffeinateSettings;\n try {\n savedSettings = await saveSettings({ mode, updatedAt: Date.now() });\n } catch (error) {\n if (generation !== state.sessionGeneration) return;\n let rollbackError: string | undefined;\n if (restartRequired) {\n state.mode = previousMode;\n state.quiet = previousQuiet;\n await stopInhibitor(ctx, \"settings save failed\", { notify: false });\n if (generation !== state.sessionGeneration) return;\n await startInhibitor(ctx, generation, { notify: false });\n if (generation !== state.sessionGeneration) return;\n if (!hasActiveInhibitor()) {\n rollbackError = state.lastError ?? \"the prior inhibitor was not restored\";\n }\n }\n state.settingsError = rollbackError\n ? `settings save failed (${formatError(error)}); runtime rollback failed: ${rollbackError}`\n : `settings save failed: ${formatError(error)}`;\n ctx.ui.notify(\n `pi-caffeinate mode remains ${formatMode(previousMode)}; settings were not saved: ${state.settingsError}`,\n \"warning\",\n );\n updateStatus(ctx);\n return;\n }\n\n if (generation !== state.sessionGeneration) return;\n state.mode = mode;\n state.quiet = savedSettings.quiet;\n ctx.ui.notify(`pi-caffeinate mode set to ${formatMode(mode)} and saved.`, \"info\");\n updateStatus(ctx);\n}\n\nfunction showStatus(ctx: ExtensionContext) {\n ctx.ui.notify(describeState(), statusLevel());\n updateStatus(ctx);\n}\n\nasync function stopCaffeinate(ctx: ExtensionContext, reason: string, sessionGeneration: number) {\n state.activeTurns = 0;\n await stopInhibitor(ctx, reason);\n if (sessionGeneration !== state.sessionGeneration) return;\n updateStatus(ctx);\n}\n\nexport function parseCommand(args: string): CommandAction | \"unknown\" {\n const command = args.trim().toLowerCase();\n if (!command) return \"menu\";\n if (command === \"help\") return \"help\";\n if (command === \"status\") return \"status\";\n if (command === \"mode\" || command === \"config\" || command === \"settings\") return \"mode\";\n if (command === \"sleep\" || command === \"system\") return \"sleep\";\n if (command === \"display\" || command === \"screen\") return \"display\";\n if (command === \"stop\" || command === \"off\") return \"stop\";\n return \"unknown\";\n}\n\nexport function commandCompletions(prefix: string) {\n const normalized = prefix.trimStart().toLowerCase();\n if (/\\s/.test(normalized)) return null;\n\n const matches = COMMAND_COMPLETIONS.filter((completion) => completion.value.startsWith(normalized));\n return matches.length > 0 ? matches : null;\n}\n\nfunction buildCommandGuide() {\n return [\n \"pi-caffeinate commands:\",\n \"/caffeinate \u2014 open keep-awake controls\",\n \"/caffeinate display \u2014 keep the system and display awake\",\n \"/caffeinate sleep \u2014 keep the system awake while allowing display sleep\",\n \"/caffeinate status \u2014 show current mode, settings, and inhibitor state\",\n \"/caffeinate mode \u2014 choose a keep-awake mode\",\n \"/caffeinate stop \u2014 release the active inhibitor until the next agent run\",\n ].join(\"\\n\");\n}\n\nasync function startInhibitor(ctx: ExtensionContext, sessionGeneration: number, options: { notify?: boolean } = {}) {\n if (state.disabled || hasActiveInhibitor() || state.inhibitorStarting) {\n updateStatus(ctx);\n return;\n }\n\n const token = ++inhibitSequence;\n const command = getInhibitorCommand(state.mode);\n const wantsDbus =\n !command?.custom &&\n state.mode === \"display\" &&\n process.platform === \"linux\" &&\n (command === undefined || command.addDbusIdleInhibit === true);\n if (!command && !wantsDbus) {\n state.available = false;\n state.lastError = `No supported sleep inhibitor found for ${process.platform}.`;\n ctx.ui.notify(state.lastError, \"warning\");\n updateStatus(ctx);\n return;\n }\n\n state.inhibitorStarting = true;\n state.inhibitWarning = undefined;\n let child: ChildProcess | undefined;\n let childError =\n !command && wantsDbus\n ? \"No supported system sleep inhibitor is available; direct system suspend may remain possible.\"\n : undefined;\n let assembling = true;\n const handleChildFailure = (message: string) => {\n if (!child || token !== inhibitSequence || state.process !== child) return;\n state.process = undefined;\n state.command = undefined;\n if (assembling) {\n childError = message;\n return;\n }\n applyChildFailure(message);\n };\n\n if (command) {\n try {\n child = startInhibitorProcess(\n command,\n (error) => handleChildFailure(`${command.description} failed: ${error.message}`),\n (exit) => handleChildFailure(`${command.description} exited unexpectedly (${exit}).`),\n );\n state.process = child;\n state.command = command;\n state.startedAt = Date.now();\n } catch (error) {\n childError = `${command.description}: ${formatError(error)}`;\n }\n }\n\n let dbus: DbusScreenSaverClient | undefined;\n let dbusError: string | undefined;\n if (wantsDbus) {\n const pending: PendingDbusStart = { token, controller: new AbortController() };\n state.pendingDbus = pending;\n try {\n const client = await dbusFactory();\n if (!pendingStartIsCurrent(pending, sessionGeneration)) {\n await client.close().catch(() => undefined);\n await cancelPendingStart(token, child, command);\n return;\n }\n pending.client = client;\n await client.inhibit(INHIBIT_REASON, pending.controller.signal);\n if (!pendingStartIsCurrent(pending, sessionGeneration)) {\n await cancelPendingStart(token, child, command);\n return;\n }\n pending.client = undefined;\n state.pendingDbus = undefined;\n dbus = client;\n } catch (error) {\n const stale = !pendingStartIsCurrent(pending, sessionGeneration) || pending.controller.signal.aborted;\n const pendingClient = takePendingDbusClient(pending);\n await pendingClient?.close().catch(() => undefined);\n if (stale) {\n await cancelPendingStart(token, child, command);\n return;\n }\n dbusError = `D-Bus idle inhibit (${SCREENSAVER_BUS_NAME}): ${formatError(error)}`;\n }\n }\n\n assembling = false;\n if (startIsStale(token, sessionGeneration)) {\n await cancelPendingStart(token, child, command);\n await dbus?.close().catch(() => undefined);\n return;\n }\n\n state.inhibitorStarting = false;\n state.dbus = dbus;\n if (dbus) {\n dbus.setFailureHandler((error) => applyDbusFailure(token, dbus, error));\n if (state.dbus !== dbus) return;\n }\n const failures = [childError, dbusError].filter((failure): failure is string => Boolean(failure));\n if (!hasActiveInhibitor()) {\n state.startedAt = undefined;\n state.command = undefined;\n state.available = false;\n state.lastError = failures.join(\"; \") || `No supported sleep inhibitor found for ${process.platform}.`;\n ctx.ui.notify(state.lastError, \"warning\");\n updateStatus(ctx);\n return;\n }\n\n state.startedAt ??= Date.now();\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = failures.length > 0 ? failures.join(\"; \") : undefined;\n if (state.inhibitWarning) {\n ctx.ui.notify(`pi-caffeinate is partially active: ${state.inhibitWarning}`, \"warning\");\n } else if (options.notify !== false) {\n ctx.ui.notify(`Keeping computer awake (${statusModeLabel()}).`, \"info\");\n }\n updateStatus(ctx);\n}\n\nasync function stopInhibitor(ctx: ExtensionContext, reason: string, options: { notify?: boolean } = {}) {\n inhibitSequence += 1;\n const child = state.process;\n const dbus = state.dbus;\n const dbusCleanup = state.dbusCleanup;\n const pending = state.pendingDbus;\n const command = state.command;\n const wasStarting = state.inhibitorStarting;\n state.process = undefined;\n state.dbus = undefined;\n state.dbusCleanup = undefined;\n state.pendingDbus = undefined;\n state.command = undefined;\n state.startedAt = undefined;\n state.inhibitWarning = undefined;\n state.inhibitorStarting = false;\n dbus?.setFailureHandler(undefined);\n pending?.controller.abort(new DOMException(`Caffeinate stopped: ${reason}`, \"AbortError\"));\n const pendingClient = pending ? takePendingDbusClient(pending) : undefined;\n if (child) stopInhibitorProcess(child, command);\n if (!child && !dbus && !pendingClient && !wasStarting) {\n await dbusCleanup;\n return;\n }\n if (options.notify !== false) ctx.ui.notify(`Released pi-caffeinate (${reason}).`, \"info\");\n await Promise.all([dbusCleanup, pendingClient?.close().catch(() => undefined)]);\n if (!dbus) return;\n try {\n await dbus.uninhibit();\n } catch {\n // Closing the session-bus connection also releases its inhibition cookie.\n }\n await dbus.close().catch(() => undefined);\n}\n\nfunction applyChildFailure(message: string) {\n if (state.dbus) {\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = message;\n } else {\n state.startedAt = undefined;\n state.available = false;\n state.lastError = message;\n state.inhibitWarning = undefined;\n }\n const ctx = currentSessionContext();\n if (!ctx) return;\n ctx.ui.notify(message, \"warning\");\n updateStatus(ctx);\n}\n\nfunction applyDbusFailure(token: number, client: DbusScreenSaverClient, error: Error) {\n if (token !== inhibitSequence || state.dbus !== client) return;\n client.setFailureHandler(undefined);\n state.dbus = undefined;\n const message = `D-Bus idle inhibit (${SCREENSAVER_BUS_NAME}) failed: ${formatError(error)}`;\n const notification = state.process ? `pi-caffeinate is partially active: ${message}` : message;\n if (state.process) {\n state.available = true;\n state.lastError = undefined;\n state.inhibitWarning = message;\n } else {\n state.startedAt = undefined;\n state.command = undefined;\n state.available = false;\n state.lastError = [state.inhibitWarning, message].filter(Boolean).join(\"; \");\n state.inhibitWarning = undefined;\n }\n const cleanup = client.close().catch(() => undefined);\n state.dbusCleanup = cleanup;\n void cleanup.then(() => {\n if (state.dbusCleanup === cleanup) state.dbusCleanup = undefined;\n });\n const ctx = currentSessionContext();\n if (!ctx) return;\n ctx.ui.notify(notification, \"warning\");\n updateStatus(ctx);\n}\n\nfunction currentSessionContext() {\n const session = state.currentSession;\n return session?.generation === state.sessionGeneration ? session.ctx : undefined;\n}\n\nfunction hasActiveInhibitor() {\n return Boolean(state.process || state.dbus);\n}\n\nfunction startIsStale(token: number, sessionGeneration: number) {\n return token !== inhibitSequence || sessionGeneration !== state.sessionGeneration;\n}\n\nfunction pendingStartIsCurrent(pending: PendingDbusStart, sessionGeneration: number) {\n return (\n state.pendingDbus === pending &&\n !pending.controller.signal.aborted &&\n !startIsStale(pending.token, sessionGeneration)\n );\n}\n\nfunction takePendingDbusClient(pending: PendingDbusStart) {\n if (state.pendingDbus === pending) state.pendingDbus = undefined;\n const client = pending.client;\n pending.client = undefined;\n return client;\n}\n\nasync function cancelPendingStart(\n token: number,\n child: ChildProcess | undefined,\n command: InhibitorCommand | undefined,\n) {\n if (token !== inhibitSequence) return;\n inhibitSequence += 1;\n state.inhibitorStarting = false;\n const pending = state.pendingDbus?.token === token ? state.pendingDbus : undefined;\n state.pendingDbus = undefined;\n pending?.controller.abort(new DOMException(\"Caffeinate start cancelled\", \"AbortError\"));\n const pendingClient = pending ? takePendingDbusClient(pending) : undefined;\n if (child && state.process === child) {\n state.process = undefined;\n state.command = undefined;\n state.startedAt = undefined;\n stopInhibitorProcess(child, command);\n }\n await pendingClient?.close().catch(() => undefined);\n}\n\nfunction updateStatus(ctx: ExtensionContext) {\n if (state.disabled || state.quiet) {\n ctx.ui.setStatus(STATUS_KEY, undefined);\n return;\n }\n\n if (hasActiveInhibitor()) {\n ctx.ui.setStatus(STATUS_KEY, withDeprecatedIcon(statusModeLabel()));\n return;\n }\n\n if (!state.available) {\n ctx.ui.setStatus(STATUS_KEY, withDeprecatedIcon(\"unavailable\"));\n return;\n }\n\n ctx.ui.setStatus(STATUS_KEY, undefined);\n}\n\nfunction describeState() {\n const customCommand = hasCustomCommand();\n const lines = [\n `Mode: ${formatMode(state.mode)}${customCommand ? \" (overridden by custom command)\" : \"\"}`,\n `Quiet mode: ${state.quiet ? \"enabled\" : \"disabled\"}`,\n `Settings: ${settingsFilePath()}`,\n ];\n\n if (customCommand) lines.push(\"Custom command: PI_CAFFEINATE_COMMAND overrides the saved mode.\");\n if (state.settingsNotice) lines.push(`Settings note: ${state.settingsNotice}`);\n if (state.settingsError) lines.push(`Settings warning: ${state.settingsError}`);\n if (state.disabled) {\n lines.unshift(\"pi-caffeinate is disabled by PI_CAFFEINATE_DISABLED.\");\n return lines.join(\"\\n\");\n }\n\n if (hasActiveInhibitor()) {\n const seconds = state.startedAt ? Math.round((Date.now() - state.startedAt) / 1000) : 0;\n const activeParts: string[] = [];\n if (state.dbus) activeParts.push(`D-Bus idle inhibit (${SCREENSAVER_BUS_NAME})`);\n if (state.process && state.command) activeParts.push(state.command.description);\n lines.unshift(`pi-caffeinate is active using ${activeParts.join(\" + \") || \"an inhibitor\"} for ${seconds}s.`);\n if (state.inhibitWarning) lines.push(`Inhibitor warning: ${state.inhibitWarning}`);\n return lines.join(\"\\n\");\n }\n\n if (!state.available) {\n lines.unshift(`pi-caffeinate is unavailable: ${state.lastError ?? \"unknown reason\"}`);\n return lines.join(\"\\n\");\n }\n\n lines.unshift(\"pi-caffeinate is idle and will keep the computer awake during the next agent run.\");\n return lines.join(\"\\n\");\n}\n\nfunction statusLevel() {\n return state.available && !state.settingsError && !state.inhibitWarning ? \"info\" : \"warning\";\n}\n\nfunction statusModeLabel() {\n if (state.command?.custom) return \"custom\";\n return formatMode(state.mode);\n}\n\nasync function ensureSettingsLoaded(ctx: ExtensionContext, generation: number) {\n if (state.disabled || state.settingsLoaded) return;\n await loadSettingsIntoState(ctx, generation);\n}\n\nasync function loadSettingsIntoState(ctx: ExtensionContext, generation: number) {\n if (state.disabled) {\n state.settingsLoaded = true;\n state.settingsError = undefined;\n state.quiet = false;\n return;\n }\n\n const settings = await loadSettings();\n if (generation !== state.sessionGeneration) return;\n state.settingsLoaded = true;\n state.settingsError = undefined;\n if (settings.notice) {\n state.settingsNotice = settings.notice;\n ctx.ui.notify(settings.notice, \"warning\");\n }\n\n if (settings.kind === \"loaded\") {\n state.mode = settings.settings.mode;\n state.quiet = settings.settings.quiet;\n return;\n }\n\n state.mode = DEFAULT_MODE;\n state.quiet = false;\n if (settings.kind === \"invalid\") {\n state.settingsError = settings.reason;\n ctx.ui.notify(\n `pi-caffeinate settings ignored: ${settings.reason}; using ${formatMode(DEFAULT_MODE)} mode.`,\n \"warning\",\n );\n }\n}\n\nfunction formatError(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isDisabled() {\n const value = process.env.PI_CAFFEINATE_DISABLED?.trim().toLowerCase();\n return value ? DISABLED_VALUES.has(value) : false;\n}\n\nfunction hasCustomCommand() {\n return Boolean(process.env.PI_CAFFEINATE_COMMAND?.trim());\n}\n\nfunction withDeprecatedIcon(text: string) {\n const icon = process.env.PI_CAFFEINATE_ICON?.trim();\n return icon ? `${icon} ${text}` : text;\n}\n\nfunction warnDeprecatedIcon(ctx: ExtensionContext) {\n if (state.iconWarningShown || !process.env.PI_CAFFEINATE_ICON?.trim()) return;\n state.iconWarningShown = true;\n ctx.ui.notify(\n \"PI_CAFFEINATE_ICON is deprecated but still works for now. If you use @narumitw/pi-statusline, move it to pi-statusline.json (extensionStatusIcons.caffeinate).\",\n \"warning\",\n );\n}\n\nexport {\n formatMode,\n getInhibitorCommand,\n splitCommand,\n windowsInhibitorScript,\n} from \"./inhibitors.js\";\nexport { normalizeCaffeinateSettings } from \"./settings.js\";\n", "import type { Message, MessageBus } from \"dbus-native\";\n\nexport const SCREENSAVER_BUS_NAME = \"org.freedesktop.ScreenSaver\";\nexport const SCREENSAVER_INTERFACE = \"org.freedesktop.ScreenSaver\";\nexport const INHIBIT_REASON = \"Pi agent is running\";\n\nconst INHIBIT_APPLICATION_NAME = \"pi-caffeinate\";\nconst SCREENSAVER_OBJECT_PATHS = [\"/org/freedesktop/ScreenSaver\", \"/ScreenSaver\"];\nconst DBUS_CALL_TIMEOUT_MS = 2_000;\n\ntype DbusFailureHandler = (error: Error) => void;\n\nexport interface DbusScreenSaverClient {\n setFailureHandler(handler: DbusFailureHandler | undefined): void;\n inhibit(reason: string, signal?: AbortSignal): Promise<void>;\n uninhibit(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport type DbusScreenSaverFactory = () => Promise<DbusScreenSaverClient>;\n\ntype DbusNativeModule = {\n sessionBus?: () => MessageBus;\n default?: {\n sessionBus?: () => MessageBus;\n };\n};\n\nexport async function defaultDbusScreenSaverFactory(): Promise<DbusScreenSaverClient> {\n const dbus = (await import(\"dbus-native\")) as DbusNativeModule;\n const namespaceSessionBus = \"sessionBus\" in dbus ? dbus.sessionBus : undefined;\n const sessionBus = typeof namespaceSessionBus === \"function\" ? namespaceSessionBus : dbus.default?.sessionBus;\n if (typeof sessionBus !== \"function\") {\n throw new Error(\"dbus-native did not export sessionBus\");\n }\n return new NativeScreenSaverClient(sessionBus());\n}\n\nclass NativeScreenSaverClient implements DbusScreenSaverClient {\n private cookie?: number;\n private objectPath?: string;\n private failureHandler?: DbusFailureHandler;\n private pendingFailure?: Error;\n private lastConnectionError?: Error;\n private closing = false;\n\n private readonly handleConnectionError = (error: unknown) => {\n this.lastConnectionError = toError(error, \"D-Bus session connection failed\");\n if (this.cookie !== undefined) this.reportFailure(this.lastConnectionError);\n };\n\n private readonly handleConnectionClose = (error?: unknown) => {\n if (this.closing || this.cookie === undefined) return;\n this.reportFailure(toError(error, this.lastConnectionError?.message ?? \"D-Bus session connection closed\"));\n };\n\n constructor(private readonly bus: MessageBus) {\n this.bus.connection.on(\"error\", this.handleConnectionError);\n this.bus.connection.on(\"close\", this.handleConnectionClose);\n }\n\n setFailureHandler(handler: DbusFailureHandler | undefined): void {\n this.failureHandler = handler;\n if (!handler || !this.pendingFailure) return;\n const failure = this.pendingFailure;\n this.pendingFailure = undefined;\n handler(failure);\n }\n\n async inhibit(reason: string, signal?: AbortSignal): Promise<void> {\n let lastError: unknown;\n for (const objectPath of SCREENSAVER_OBJECT_PATHS) {\n if (signal?.aborted) throw abortReason(signal);\n try {\n this.cookie = await invoke<number>(\n this.bus,\n {\n destination: SCREENSAVER_BUS_NAME,\n path: objectPath,\n interface: SCREENSAVER_INTERFACE,\n member: \"Inhibit\",\n signature: \"ss\",\n body: [INHIBIT_APPLICATION_NAME, reason],\n },\n signal,\n );\n this.objectPath = objectPath;\n return;\n } catch (error) {\n if (signal?.aborted) throw abortReason(signal);\n lastError = error;\n }\n }\n throw new Error(`D-Bus idle inhibit failed: ${formatError(lastError)}`, {\n cause: lastError,\n });\n }\n\n async uninhibit(): Promise<void> {\n if (this.cookie === undefined || !this.objectPath) return;\n const cookie = this.cookie;\n this.cookie = undefined;\n const objectPath = this.objectPath;\n this.objectPath = undefined;\n await invoke<void>(this.bus, {\n destination: SCREENSAVER_BUS_NAME,\n path: objectPath,\n interface: SCREENSAVER_INTERFACE,\n member: \"UnInhibit\",\n signature: \"u\",\n body: [cookie],\n });\n }\n\n async close(): Promise<void> {\n this.closing = true;\n this.cookie = undefined;\n this.objectPath = undefined;\n this.failureHandler = undefined;\n try {\n await this.bus.close();\n } finally {\n this.bus.connection.off(\"error\", this.handleConnectionError);\n this.bus.connection.off(\"close\", this.handleConnectionClose);\n }\n }\n\n private reportFailure(error: Error): void {\n if (this.cookie === undefined) return;\n this.cookie = undefined;\n this.objectPath = undefined;\n if (this.failureHandler) this.failureHandler(error);\n else this.pendingFailure = error;\n }\n}\n\nfunction invoke<TResult>(bus: MessageBus, message: Message, signal?: AbortSignal): Promise<TResult> {\n return new Promise<TResult>((resolve, reject) => {\n bus.invoke(message, { signal, timeout: DBUS_CALL_TIMEOUT_MS }, (error, ...values) => {\n if (error) reject(error);\n else resolve(values[0] as TResult);\n });\n });\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException(\"D-Bus idle inhibit cancelled\", \"AbortError\");\n}\n\nfunction toError(error: unknown, fallback: string): Error {\n return error instanceof Error ? error : new Error(fallback);\n}\n\nfunction formatError(error: unknown) {\n if (error instanceof Error) {\n return error.name === \"Error\" ? error.message : `${error.name}: ${error.message}`;\n }\n return String(error);\n}\n", "import { type ChildProcess, spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport type { InhibitorCommand } from \"./inhibitors.js\";\n\nexport function startInhibitorProcess(\n command: InhibitorCommand,\n onError: (error: Error) => void,\n onUnexpectedExit: (description: string) => void,\n): ChildProcess {\n const child = spawn(command.command, command.args, {\n detached: false,\n stdio: [command.releaseOnStdinClose ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n });\n child.once(\"error\", onError);\n child.once(\"exit\", (code, signal) => onUnexpectedExit(formatExit(code, signal)));\n return child;\n}\n\nexport function stopInhibitorProcess(child: ChildProcess, command: InhibitorCommand | undefined) {\n child.removeAllListeners(\"exit\");\n child.removeAllListeners(\"error\");\n if (child.killed) return;\n\n if (command?.releaseOnStdinClose && child.stdin && !child.stdin.destroyed) {\n child.stdin.end();\n if (child.exitCode === null && child.signalCode === null) {\n const killTimer = setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null && !child.killed) child.kill();\n }, 2000);\n killTimer.unref();\n child.once(\"exit\", () => clearTimeout(killTimer));\n }\n } else if (process.platform === \"win32\") {\n child.kill();\n } else {\n child.kill(\"SIGTERM\");\n }\n}\n\nfunction formatExit(code: number | null, signal: NodeJS.Signals | null) {\n if (signal) return `signal ${signal}`;\n return `code ${code ?? \"unknown\"}`;\n}\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport type { CaffeinateMode } from \"./settings.js\";\n\nexport interface InhibitorCommand {\n command: string;\n args: string[];\n description: string;\n releaseOnStdinClose?: boolean;\n custom?: boolean;\n /** Display mode also needs D-Bus because logind idle inhibition misses some compositors. */\n addDbusIdleInhibit?: boolean;\n}\n\nexport function getInhibitorCommand(mode: CaffeinateMode): InhibitorCommand | undefined {\n const customCommand = process.env.PI_CAFFEINATE_COMMAND?.trim();\n if (customCommand) {\n const [command, ...args] = splitCommand(customCommand);\n if (command) return { command, args, description: `custom command (${command})`, custom: true };\n }\n if (process.platform === \"darwin\") {\n return parentBoundUnixCommand(\"caffeinate\", macCaffeinateArgs(mode), caffeinateDescription(mode));\n }\n if (process.platform === \"linux\") {\n if (isWsl() && commandExists(\"powershell.exe\")) {\n return windowsPowerInhibitorCommand(\"powershell.exe\", mode);\n }\n if (commandExists(\"systemd-inhibit\")) {\n const what = mode === \"display\" ? \"idle:sleep\" : \"sleep\";\n return parentBoundUnixCommand(\n \"systemd-inhibit\",\n [`--what=${what}`, \"--who=pi-caffeinate\", \"--why=Pi agent is running\", \"--mode=block\", \"sleep\", \"infinity\"],\n `systemd-inhibit (${formatMode(mode)})`,\n mode === \"display\",\n );\n }\n if (commandExists(\"caffeinate\")) {\n return parentBoundUnixCommand(\n \"caffeinate\",\n macCaffeinateArgs(mode),\n caffeinateDescription(mode),\n mode === \"display\",\n );\n }\n }\n if (process.platform === \"win32\") return windowsPowerInhibitorCommand(\"powershell.exe\", mode);\n return undefined;\n}\n\nfunction macCaffeinateArgs(mode: CaffeinateMode) {\n return mode === \"sleep\" ? [\"-ims\"] : [\"-dimsu\"];\n}\n\nfunction caffeinateDescription(mode: CaffeinateMode) {\n return `caffeinate (${formatMode(mode)})`;\n}\n\nfunction parentBoundUnixCommand(\n command: string,\n args: string[],\n description: string,\n addDbusIdleInhibit = false,\n): InhibitorCommand {\n return {\n command: \"sh\",\n args: [\"-c\", unixParentBoundScript(), \"pi-caffeinate-watch\", String(process.pid), command, ...args],\n description,\n ...(addDbusIdleInhibit ? { addDbusIdleInhibit: true } : {}),\n };\n}\n\nfunction unixParentBoundScript() {\n return `parent=$1; shift; \"$@\" & child=$!; ( while kill -0 \"$parent\" 2>/dev/null; do sleep 5; done; kill \"$child\" 2>/dev/null ) & watcher=$!; cleanup() { kill \"$watcher\" 2>/dev/null; kill \"$child\" 2>/dev/null; wait \"$child\" 2>/dev/null; }; trap 'cleanup; exit 0' INT TERM HUP EXIT; wait \"$child\"; status=$?; kill \"$watcher\" 2>/dev/null; trap - EXIT; exit \"$status\"`;\n}\n\nfunction commandExists(command: string) {\n const searchPath = process.env.PATH ?? \"\";\n const extensions = process.platform === \"win32\" ? [\"\", \".exe\", \".cmd\", \".bat\"] : [\"\"];\n for (const directory of searchPath.split(process.platform === \"win32\" ? \";\" : \":\")) {\n if (!directory) continue;\n for (const extension of extensions) {\n if (existsSync(path.join(directory, `${command}${extension}`))) return true;\n }\n }\n return false;\n}\n\nexport function splitCommand(input: string) {\n const parts: string[] = [];\n let current = \"\";\n let quote: '\"' | \"'\" | undefined;\n let escaping = false;\n for (const char of input) {\n if (escaping) {\n current += char;\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n continue;\n }\n if ((char === '\"' || char === \"'\") && !quote) {\n quote = char;\n continue;\n }\n if (char === quote) {\n quote = undefined;\n continue;\n }\n if (/\\s/.test(char) && !quote) {\n if (current) {\n parts.push(current);\n current = \"\";\n }\n continue;\n }\n current += char;\n }\n if (current) parts.push(current);\n return parts;\n}\n\nfunction windowsPowerInhibitorCommand(command: string, mode: CaffeinateMode): InhibitorCommand {\n return {\n command,\n args: [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-Command\", windowsInhibitorScript(mode)],\n description: `PowerShell SetThreadExecutionState (${formatMode(mode)})`,\n releaseOnStdinClose: true,\n };\n}\n\nexport function windowsInhibitorScript(mode: CaffeinateMode) {\n const flags = mode === \"sleep\" ? \"0x80000001\" : \"0x80000003\";\n return `$ErrorActionPreference = 'Stop'; Add-Type -Namespace Native -Name Power -MemberDefinition '[DllImport(\"kernel32.dll\")] public static extern uint SetThreadExecutionState(uint esFlags);'; $flags = [uint32]'${flags}'; $release = [uint32]'0x80000000'; $stdin = [Console]::OpenStandardInput(); $buffer = New-Object byte[] 1; $readTask = $stdin.ReadAsync($buffer, 0, 1); try { while ($true) { [Native.Power]::SetThreadExecutionState($flags) | Out-Null; if ($readTask.Wait(30000)) { break } } } finally { [Native.Power]::SetThreadExecutionState($release) | Out-Null }`;\n}\n\nfunction isWsl() {\n try {\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\");\n } catch {\n return false;\n }\n}\n\nexport function formatMode(mode: CaffeinateMode) {\n return mode === \"sleep\" ? \"system-awake\" : \"display-awake\";\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, lstat, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nconst NEW_SETTINGS_FILE = \"pi-caffeinate.json\";\nconst LEGACY_SETTINGS_FILE = \"pi-caffeinate-settings.json\";\n\nexport type CaffeinateMode = \"sleep\" | \"display\";\n\nexport interface CaffeinateSettings {\n mode: CaffeinateMode;\n quiet: boolean;\n updatedAt: number;\n}\n\nexport interface SettingsFileOperations {\n write(path: string, data: string): Promise<void>;\n rename(source: string, destination: string): Promise<void>;\n}\n\nconst DEFAULT_FILE_OPERATIONS: SettingsFileOperations = {\n write: (path, data) => writeFile(path, data, \"utf8\").then(() => undefined),\n rename,\n};\n\nexport type SettingsLoadResult =\n | { kind: \"missing\"; notice?: string }\n | { kind: \"invalid\"; reason: string; notice?: string }\n | { kind: \"loaded\"; settings: CaffeinateSettings; notice?: string };\n\nexport async function loadSettings(): Promise<SettingsLoadResult> {\n await settingsSaveQueue;\n const newPath = settingsFilePath();\n const newSettings = await readSettingsFile(newPath);\n if (newSettings.kind !== \"missing\") return withLegacyIgnoredNotice(newSettings);\n\n const legacyPath = legacySettingsFilePath();\n const legacySettings = await readSettingsFile(legacyPath);\n const concurrentlyCreatedSettings = await readSettingsFile(newPath);\n if (concurrentlyCreatedSettings.kind !== \"missing\") {\n return withLegacyIgnoredNotice(concurrentlyCreatedSettings);\n }\n if (legacySettings.kind === \"missing\") return { kind: \"missing\" };\n if (legacySettings.kind === \"invalid\") return legacySettings;\n\n return {\n ...legacySettings,\n notice: `Using legacy ${LEGACY_SETTINGS_FILE}; rename it to ${NEW_SETTINGS_FILE}. Future saves write ${NEW_SETTINGS_FILE} without modifying the legacy file.`,\n };\n}\n\ninterface SettingsDocumentResult {\n result: SettingsLoadResult;\n document?: Record<string, unknown>;\n}\n\nasync function readSettingsDocument(filePath: string): Promise<SettingsDocumentResult> {\n let text: string;\n try {\n text = await readFile(filePath, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return { result: { kind: \"missing\" } };\n return { result: { kind: \"invalid\", reason: `${filePath}: ${formatError(error)}` } };\n }\n try {\n const document = JSON.parse(text) as unknown;\n const settings = normalizeCaffeinateSettings(document);\n if (settings) {\n return {\n result: { kind: \"loaded\", settings },\n document: { ...(document as Record<string, unknown>) },\n };\n }\n return {\n result: {\n kind: \"invalid\",\n reason: `${filePath}: expected { \"mode\": \"sleep\" | \"display\", optional \"quiet\": boolean }`,\n },\n };\n } catch (error) {\n return { result: { kind: \"invalid\", reason: `${filePath}: ${formatError(error)}` } };\n }\n}\n\nasync function readSettingsFile(filePath: string): Promise<SettingsLoadResult> {\n return (await readSettingsDocument(filePath)).result;\n}\n\nasync function withLegacyIgnoredNotice(settings: SettingsLoadResult): Promise<SettingsLoadResult> {\n if (!(await fileExists(legacySettingsFilePath()))) return settings;\n return {\n ...settings,\n notice: `pi-caffeinate legacy settings ignored: ${legacySettingsFilePath()} exists, but ${settingsFilePath()} takes precedence. Delete ${LEGACY_SETTINGS_FILE} after confirming your settings.`,\n };\n}\n\nasync function fileExists(filePath: string) {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function pathEntryExists(filePath: string) {\n try {\n await lstat(filePath);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nexport function normalizeCaffeinateSettings(value: unknown): CaffeinateSettings | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const settings = value as { mode?: unknown; quiet?: unknown; updatedAt?: unknown };\n if (!isCaffeinateMode(settings.mode)) return undefined;\n if (settings.quiet !== undefined && typeof settings.quiet !== \"boolean\") return undefined;\n if (settings.updatedAt !== undefined && typeof settings.updatedAt !== \"number\") return undefined;\n return {\n mode: settings.mode,\n quiet: settings.quiet ?? false,\n updatedAt: settings.updatedAt ?? 0,\n };\n}\n\nfunction isCaffeinateMode(value: unknown): value is CaffeinateMode {\n return value === \"sleep\" || value === \"display\";\n}\n\nlet settingsSaveQueue: Promise<unknown> = Promise.resolve();\n\nexport function saveSettings(\n settings: Omit<CaffeinateSettings, \"quiet\"> & { quiet?: boolean },\n operations: Partial<SettingsFileOperations> = {},\n): Promise<CaffeinateSettings> {\n const operation = settingsSaveQueue.then(() => saveSettingsNow(settings, operations));\n settingsSaveQueue = operation.catch(() => undefined);\n return operation;\n}\n\nasync function saveSettingsNow(\n settings: Omit<CaffeinateSettings, \"quiet\"> & { quiet?: boolean },\n operations: Partial<SettingsFileOperations>,\n): Promise<CaffeinateSettings> {\n const filePath = settingsFilePath();\n let current = await readSettingsDocument(filePath);\n const replaceCanonical = current.result.kind !== \"missing\";\n if (!replaceCanonical) current = await readSettingsDocument(legacySettingsFilePath());\n if (current.result.kind === \"invalid\") {\n throw new Error(`Cannot save pi-caffeinate settings until you repair ${current.result.reason}`);\n }\n const document = current.document ?? {};\n const quiet = settings.quiet ?? (current.result.kind === \"loaded\" ? current.result.settings.quiet : false);\n const nextSettings = { mode: settings.mode, quiet, updatedAt: settings.updatedAt };\n const nextDocument = {\n ...document,\n ...nextSettings,\n };\n await mkdir(dirname(filePath), { recursive: true });\n const tempFile = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await (operations.write ?? DEFAULT_FILE_OPERATIONS.write)(tempFile, `${JSON.stringify(nextDocument, null, 2)}\\n`);\n if (!replaceCanonical && (await pathEntryExists(filePath))) {\n throw new Error(`${NEW_SETTINGS_FILE} was created concurrently; reopen settings and retry.`);\n }\n await (operations.rename ?? DEFAULT_FILE_OPERATIONS.rename)(tempFile, filePath);\n return nextSettings;\n } catch (error) {\n await rm(tempFile, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function settingsFilePath() {\n return join(agentDir(), NEW_SETTINGS_FILE);\n}\n\nfunction legacySettingsFilePath() {\n return join(agentDir(), LEGACY_SETTINGS_FILE);\n}\n\nfunction agentDir() {\n return getAgentDir();\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["process", "process", "process", "path", "formatError", "formatError", "process"]
7
7
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narumitw/pi-caffeinate",
3
- "version": "0.49.10",
3
+ "version": "0.49.11",
4
4
  "description": "Pi extension that keeps the computer awake while the agent is running.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -19,8 +19,20 @@ export interface DbusScreenSaverClient {
19
19
 
20
20
  export type DbusScreenSaverFactory = () => Promise<DbusScreenSaverClient>;
21
21
 
22
+ type DbusNativeModule = {
23
+ sessionBus?: () => MessageBus;
24
+ default?: {
25
+ sessionBus?: () => MessageBus;
26
+ };
27
+ };
28
+
22
29
  export async function defaultDbusScreenSaverFactory(): Promise<DbusScreenSaverClient> {
23
- const { sessionBus } = await import("dbus-native");
30
+ const dbus = (await import("dbus-native")) as DbusNativeModule;
31
+ const namespaceSessionBus = "sessionBus" in dbus ? dbus.sessionBus : undefined;
32
+ const sessionBus = typeof namespaceSessionBus === "function" ? namespaceSessionBus : dbus.default?.sessionBus;
33
+ if (typeof sessionBus !== "function") {
34
+ throw new Error("dbus-native did not export sessionBus");
35
+ }
24
36
  return new NativeScreenSaverClient(sessionBus());
25
37
  }
26
38
 
@@ -16,6 +16,101 @@ All notable changes to pi-lens will be documented in this file.
16
16
 
17
17
  ### Security
18
18
 
19
+ ## [4.4.1] - 2026-10-09
20
+
21
+ ### Added
22
+
23
+ - **Public LSP config schema and compatibility normalization** (closes #2416): canonical argv-shaped server entries and legacy string-command files now share a validated, provenance-aware model without changing runtime launch behavior.
24
+
25
+ - **Shared custom rules are now loaded from a user-level directory.** Thanks to @Antrakos; project rules take precedence over user rules, which take precedence over bundled rules.
26
+
27
+ - **The official Docker Language Server is now verified in nightly LSP smoke tests.** Its pinned v0.20.1 binary is measured through the real pi-lens client, with the preferred legacy server retained as the fallback. Thanks @qiyangfan for reporting #3939.
28
+
29
+ - **Deferred formatting now announces settled completion with ownership identity** (refs #673; thanks @marioSoftmedic), including an empty path list when no bytes changed; late formatter writes delay completion until resync.
30
+
31
+ ### Changed
32
+
33
+ - Idle eviction is now enabled for `docker`, `json`, and `python-jedi` after consecutive safe measurements (refs #3989).
34
+
35
+ ### Fixed
36
+
37
+ - **Report fixer restore loss.** Agent edits that a whole-package fixer erased are now reported when their calls overlap the restore, or when a later edit landed on the fixer's bytes; newer bytes are retained when the restore can prove they are newer. One case stays unreported and is named as a residual: a fixer write that lands between an edit's tool call and the host applying that edit (#3830).
38
+
39
+ - **Batched scans keep their compiled query across a heal.** A rule healed during an in-flight compile no longer stays missing from later batched scans, scans sharing that compile no longer report zero findings when a heal races its publication, and a compile that is refused publication frees its native query instead of leaking it. (#3834)
40
+
41
+ - **A grammar that traps on two distinct files is retired, not retried until the heap aborts.** The runner reports the language unavailable instead of clean and other languages keep the remaining trap budget; a file that traps once and then parses cleanly does not count (refs #4010, #3996).
42
+
43
+ - **The word index no longer holds its serialized copy while idle.** It is released when the agent run settles (once per run), kept while a run edits so per-edit saves stay incremental, and released after 10 minutes without a save for a stalled run (`PI_LENS_WORD_INDEX_MEMO_BACKSTOP_MS`).
44
+
45
+ - **Startup warm caches now cover up to 2,500 measured source files safely.** Larger projects still see the once-per-session reason and the bound to raise.
46
+
47
+ - **The read guard keeps authorship through pi-lens-owned rewrites.** A file the agent wrote stays editable without a re-read when `ast_grep_replace`, `lens_diagnostic_mark`, or an LSP operation rewrites the file that call named and no foreign writer intervened. A file the tool wrote without naming it (a rename's importers, a folder-wide or project-wide apply), a server-initiated `workspace/applyEdit`, or a foreign byte change ends authorship instead, so the next edit asks for one read, and third-party bridge records remain fail-closed (#4131). Authorship survives `/tree`, `/fork` and resume when the branch still shows the write (#3603). Process-bridge writes, observed tool writes and partial bridge reads no longer mark the whole file as freshly read (#3865).
48
+
49
+ - **`throw Error(x)` style findings are now warnings, not blockers.** The `throw-new-error` rules still encourage explicit construction while recognizing that `Error(x)` is spec-equivalent to `new Error(x)`.
50
+
51
+ - **Shared secondary worktree roots now remain visible until every session holding them leaves.** Each session's registry record lists only the roots it registered, so a session ending after a primary reload or a cap eviction can no longer drop a root another live session still serves (#3849).
52
+
53
+ - **Lint fallback no longer hides missing type coverage.** Type-bearing files keep the existing incomplete-coverage notice when their primary analysis was skipped, unavailable, or failed; type-capable fallbacks such as mypy can still complete coverage.
54
+
55
+ - **Keep source-build tools aligned with the lockfile (#4066).** Both esbuild bundles and the TypeScript fallback use the exact locked versions while retaining isolated npm exec resolution and exact lifecycle-script approval.
56
+
57
+ - **Scanners now avoid linked worktree duplicates.** Gitleaks, trivy and opengrep discover linked checkouts nested under the project root instead of relying only on known directory names; paths that a scanner cannot represent safely are reported as bounded scan degradations (fixes #4132).
58
+
59
+ - Prevented pi-lens's read-only registry-tool operations from being mistaken for learned edits after another operation mutates a file.
60
+
61
+ - **Ast-grep rule validation no longer stalls on blank-heavy YAML (#4148)** — A rule with tens of thousands of blank lines no longer blocks the host while its language is detected.
62
+
63
+ - **Pytest and go.mod parsing no longer stall on blank-heavy input (#4148)** — Reading a pytest failure traceback and the `module` line of a `go.mod` now takes linear time, so a run with tens of thousands of blank lines or one very long `_` rule no longer blocks the host for seconds (13 s and 4 s at 100K lines before).
64
+
65
+ - **Refresh TypeScript clients across package roots (closes #4156)** — Changed files are announced to live sibling-root language-server clients, preventing stale importer diagnostics. Credit: Don-Yin.
66
+
67
+ - **A project's data directory stays stable for the whole process** (#4199): it is settled when the process first resolves the root, so an ephemeral checkout no longer moves its data when a `.pi-lens` directory appears mid-process, and a `.pi-lens` created by hand in a real project takes effect at the next process start.
68
+
69
+ - **Read-guard authorship now stays within bytes each writer actually changed.**
70
+
71
+ - **Outside-root edits now explain skipped analysis** (#4218) — pi-lens tells you to start pi in the file's directory or add it to the workspace.
72
+
73
+ - **Answered LSP findings are preserved when another server times out** — typos diagnostics now remain visible when Marksman is inconclusive for the same edit. (closes [#4219](https://github.com/apmantza/pi-lens/issues/4219))
74
+
75
+ - **Identity checks against `True`/`False` are no longer flagged** — the rule now preserves correct Python singleton checks while continuing to catch non-singleton literal comparisons. Thanks @rastarr for the report. (closes [#4225](https://github.com/apmantza/pi-lens/issues/4225))
76
+
77
+ - **Release summaries keep wrapped changelog entries intact** — release notes now join an entry's wrapped lines before shortening it, so plain entries no longer end mid-sentence and bold gist text keeps continuation-line issue references.
78
+
79
+ - **Read evidence now survives relative paths, nested codemode calls and conversation moves**: relative-path reads, nested reads and pi-lens rewrites (including the structural `ast_grep_replace` apply) keep their read-guard and mutation bookkeeping across `/clone`, `/fork`, `/tree` and `/reload`; a read that errored (even if another extension rewrites its result to success), or that another extension blocked, no longer licenses an edit later in the same run, and a read never blocks a whole-package fixer's restore of an agent edit.
80
+
81
+ ### Internal
82
+
83
+ <details>
84
+ <summary>13 internal changes: tests, CI, tooling, and refactors</summary>
85
+
86
+ - The TLA+ hook-anchor scan escapes every regex metacharacter in a handler name, not only `$`.
87
+
88
+ - Changelog fragment validation now constrains new user-facing leads.
89
+
90
+ - **Idle-eviction measurements cover temporary checkouts (refs #3989)** — The nightly probe now arms the short idle window used by ephemeral LSP roots as well as the generic window, so eligible servers are measured instead of reported as not evicted.
91
+
92
+ - **release-qa reads the pi version from `pi --version` only (closes #4176)** — The codemode row no longer takes an x.y.z from the pi binary's install path, so a version-shaped directory cannot make it run or skip on the wrong pi.
93
+
94
+ - Keep config-declared LSP roles reserved and inert in the loader; the catalog remains the owner of auxiliary selection.
95
+
96
+ - Make the workflow Git-push detector regex linear for quoted options.
97
+
98
+ - One LSP server-role vocabulary and a declared trait table (refs #1488, refs #1756): `LSPServerInfo.role` is now non-optional, 44 inlined `role === "auxiliary"` / `role !== "auxiliary"` predicates fold onto `isAuxiliary()`, `PromiseDescriptor.role` retires its duplicate `"primary"` spelling, the auxiliary wait policy moves to `clients/lsp/auxiliary-lifecycle.ts`, and the `notifyInflightLimit` / `replyOrdering` traits are declared on the server definition. No behaviour change.
99
+
100
+ - **Merge-policy mistake table: 2026-10-07 and 2026-10-08 retrospective** — new internal rows on delivery wording, shared records, worker handoffs, CI and advisory classification, release producers, probe witnesses, test doubles, and round routing.
101
+
102
+ - Failed handler-verdict tests when `handleToolCall` threw and production swallowed it: `runHandlerExpectingNoThrow` (`tests/support/handler-verdict.ts`) wraps every direct call and the pi mock's `tool_call` hooks, and a governance sweep rejects an unchecked call (#3518, recurrence #4182).
103
+
104
+ - **TLA+ session models cover marker expiry, the per-evaluation LSP generation, the widget token and the late coordinator stores (refs #3803)**: #3668's successor-pending marker expires (`MarkerExpire`, no clock), #3755's per-evaluation generation is caught by an owner-live invariant the generation clause could not see, the widget's `>=` tie and fork carry are pinned in both directions (`SessionLifecycleF1`), the receipt, `fixedThisTurn`, analysed-state latch and runner writers are fenced by their captured scope (#3824), and `session-straddle` retires the generation at shutdown (#3611), each with a violating pre-fix or mutant config and a passing merged one.
105
+
106
+ - **TLA+ session-lifecycle models the S3 writers and the subagent turn_end (refs #3803)**: the deferral queue's two-hop credit (#3705), the turn-state, turn-summary and git-guard late writers with the debounce re-entry (#3759), the mutation bridge's producer with and without a lineage (#3763), the park map of cut advisories (#4112), and a turn_end composer on a shared coordinator, each with a violating pre-fix or mutant config and a passing merged one; the coverage map names the bridge producers and the turn summary.
107
+
108
+ - Map the unmapped lifecycle files in `formal/coverage-map.json` and gate `index.ts` per lifecycle hook handler instead of per file (refs #3803).
109
+
110
+ - Vitest no longer collects test files from a stray worktree inside `.probe-home/` on a path-filtered run.
111
+
112
+ </details>
113
+
19
114
  ## [4.4.0] - 2026-10-08
20
115
 
21
116
  ### Added
@@ -482,6 +482,7 @@ Thanks goes to these wonderful people:
482
482
  <tr>
483
483
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/pandas9"><img src="https://avatars.githubusercontent.com/u/81386636?v=4" width="100px;" alt=""/><br /><sub><b>pandas9</b></sub></a><br /><a href="#bug-pandas9" title="Bug reports">🐛</a></td>
484
484
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/renzooliveira"><img src="https://avatars.githubusercontent.com/u/10881850?v=4" width="100px;" alt=""/><br /><sub><b>Renzo Oliveira</b></sub></a><br /><a href="#ideas-renzooliveira" title="Ideas & Planning">🤔</a></td>
485
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/rastarr"><img src="https://avatars.githubusercontent.com/u/2160922?v=4" width="100px;" alt=""/><br /><sub><b>Martin</b></sub></a><br /><a href="#bug-rastarr" title="Bug reports">🐛</a> <a href="#ideas-rastarr" title="Ideas & Planning">🤔</a></td>
485
486
  </tr>
486
487
  </tbody>
487
488
  </table>
@@ -0,0 +1,83 @@
1
+ import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
+ import {
3
+ _getWarmWordIndexCacheStateForTests,
4
+ _resetWarmWordIndexCacheForTests,
5
+ acquireWarmWordIndex,
6
+ analyzeFile,
7
+ summarizeWarningTiers
8
+ } from "./chunk-ZZUFZUQZ.js";
9
+ import "./chunk-ZOEYVXSV.js";
10
+ import "./chunk-KJN4IOEJ.js";
11
+ import "./chunk-FC4RP4I2.js";
12
+ import "./chunk-YLN4K6WD.js";
13
+ import "./chunk-J3FZR3YY.js";
14
+ import "./chunk-5JHXUETW.js";
15
+ import "./chunk-3MRXIJ6I.js";
16
+ import "./chunk-TA5L5KWQ.js";
17
+ import "./chunk-FGALODG3.js";
18
+ import "./chunk-OC7LYAU5.js";
19
+ import "./chunk-NFXP47RV.js";
20
+ import "./chunk-MGIWSROG.js";
21
+ import "./chunk-WSEWKCXU.js";
22
+ import "./chunk-MQA2YBAH.js";
23
+ import "./chunk-TQFBZVCG.js";
24
+ import "./chunk-WATC3IQR.js";
25
+ import "./chunk-OYOB3ZFG.js";
26
+ import "./chunk-XHSCVSOL.js";
27
+ import "./chunk-V5MEBST3.js";
28
+ import "./chunk-3MED75HT.js";
29
+ import "./chunk-IMSQR4WO.js";
30
+ import "./chunk-MTDRLSI7.js";
31
+ import "./chunk-OZJINN4O.js";
32
+ import "./chunk-3JSEWUWI.js";
33
+ import "./chunk-XIMYZ3JA.js";
34
+ import "./chunk-IQZXOZ7S.js";
35
+ import "./chunk-LNOMA3MP.js";
36
+ import "./chunk-U52SAGRM.js";
37
+ import "./chunk-5W3R6LFT.js";
38
+ import "./chunk-UEAHAMEI.js";
39
+ import "./chunk-Z54ZSOBZ.js";
40
+ import "./chunk-KJCWXUUS.js";
41
+ import "./chunk-QOZXJ4NA.js";
42
+ import "./chunk-6XX5HCLK.js";
43
+ import "./chunk-S6AMWKPC.js";
44
+ import "./chunk-F5VLZHUW.js";
45
+ import "./chunk-AXKPQ6ZI.js";
46
+ import "./chunk-7BX5DWSA.js";
47
+ import "./chunk-IUKPRZER.js";
48
+ import "./chunk-Z3CCVDUB.js";
49
+ import "./chunk-XGUL4SLQ.js";
50
+ import "./chunk-2BEMIWEW.js";
51
+ import "./chunk-LD7WFTRX.js";
52
+ import "./chunk-IUR76K6A.js";
53
+ import "./chunk-T4QZ6FEH.js";
54
+ import "./chunk-D6YF5HKX.js";
55
+ import "./chunk-CMU4RMJB.js";
56
+ import "./chunk-O7HZX7CA.js";
57
+ import "./chunk-VYKKMYVT.js";
58
+ import "./chunk-BNKLYOOO.js";
59
+ import "./chunk-USHG4DLH.js";
60
+ import "./chunk-H5EV3VMF.js";
61
+ import "./chunk-T54VJRAD.js";
62
+ import "./chunk-BW5KFIQC.js";
63
+ import "./chunk-QYF5S6P6.js";
64
+ import "./chunk-64LU2OVH.js";
65
+ import "./chunk-N2IRDBZI.js";
66
+ import "./chunk-Z6BB4JLQ.js";
67
+ import "./chunk-2EECBNC5.js";
68
+ import "./chunk-7ELY2CSM.js";
69
+ import "./chunk-34OCDWOS.js";
70
+ import "./chunk-3PNFWVHT.js";
71
+ import "./chunk-VSMJK3ZJ.js";
72
+ import "./chunk-LJDODBBZ.js";
73
+ import "./chunk-UGSMCQ4D.js";
74
+ import "./chunk-ABBOA7UD.js";
75
+ import "./chunk-G3RLJYA2.js";
76
+ import "./chunk-NXL4FFQQ.js";
77
+ export {
78
+ _getWarmWordIndexCacheStateForTests,
79
+ _resetWarmWordIndexCacheForTests,
80
+ acquireWarmWordIndex,
81
+ analyzeFile,
82
+ summarizeWarningTiers
83
+ };
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
2
2
  import {
3
3
  isMutatingToolName
4
- } from "./chunk-OAXNDZJ7.js";
4
+ } from "./chunk-3JSEWUWI.js";
5
5
  import {
6
6
  normalizeMapKey
7
- } from "./chunk-Q5U6FMDI.js";
7
+ } from "./chunk-G3RLJYA2.js";
8
8
 
9
9
  // dist/clients/agent-behavior-client.js
10
10
  var READ_OPS = /* @__PURE__ */ new Set(["read", "bash", "grep", "glob", "find", "rg"]);