very-happy-cli 0.2.159 → 0.2.160

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 (258) hide show
  1. package/dist/{AcpBackend-DUYFlyfN.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
  2. package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
  3. package/dist/{AcpSessionManager-Bdv8LWXh.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
  4. package/dist/{AcpSessionManager-rYtVb0kN.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
  5. package/dist/BasePermissionHandler-CFHAxumV.cjs +157 -0
  6. package/dist/BasePermissionHandler-m3WVholL.mjs +155 -0
  7. package/dist/BaseReasoningProcessor-BFa9_rZA.cjs +200 -0
  8. package/dist/BaseReasoningProcessor-CYrKBXGm.mjs +198 -0
  9. package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
  10. package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
  11. package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
  12. package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
  13. package/dist/agentGuidance-B5NATuFa.cjs +28 -0
  14. package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
  15. package/dist/{agentHome-CHh4lmjM.cjs → agentHome-CboCeKWq.cjs} +14 -28
  16. package/dist/{agentHome-CvsJyeQB.mjs → agentHome-Dj1C43aJ.mjs} +8 -22
  17. package/dist/api-CLMUr-SX.mjs +3339 -0
  18. package/dist/api-CgundNNX.cjs +3346 -0
  19. package/dist/{types-Dh-s4Lqs.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16205
  20. package/dist/{types-BbvK1Tr_.cjs → apiMachine-Bn8482VM.cjs} +9104 -16247
  21. package/dist/assistantTools-BTqPnlFl.cjs +380 -0
  22. package/dist/assistantTools-D6tuc6o4.mjs +376 -0
  23. package/dist/attachmentContent-DpiTJZb4.cjs +88 -0
  24. package/dist/attachmentContent-_kxRznNf.mjs +82 -0
  25. package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
  26. package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
  27. package/dist/auth-BDOVh5h5.cjs +220 -0
  28. package/dist/auth-Cwutmdsa.mjs +225 -0
  29. package/dist/auth-PYHZQNPp.mjs +218 -0
  30. package/dist/auth-ba4WMYrN.cjs +227 -0
  31. package/dist/authRelay-BdYkC1Po.cjs +156 -0
  32. package/dist/authRelay-DSAvg1uv.mjs +143 -0
  33. package/dist/{auto-DKmEls8Z.cjs → auto-BOX_fgmR.cjs} +70 -79
  34. package/dist/{auto-nb8GhRRy.mjs → auto-BXu14yP_.mjs} +27 -36
  35. package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
  36. package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
  37. package/dist/bootstrap-B5G1TijC.cjs +116 -0
  38. package/dist/bootstrap-hxXPCFMx.mjs +112 -0
  39. package/dist/browser-Y6Bl8L_O.cjs +22 -0
  40. package/dist/browser-jh2P0UVZ.mjs +20 -0
  41. package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
  42. package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
  43. package/dist/claudeLocal-BaY4fZKi.mjs +339 -0
  44. package/dist/claudeLocal-CRGG4Pea.cjs +343 -0
  45. package/dist/claudeLocalLauncher-D4T7MTqd.mjs +152 -0
  46. package/dist/claudeLocalLauncher-DyEbVzUN.cjs +154 -0
  47. package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
  48. package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
  49. package/dist/client-3Ac-O4pw.cjs +104 -0
  50. package/dist/client-BPNbmtvO.cjs +119 -0
  51. package/dist/client-CeGKqqcJ.mjs +100 -0
  52. package/dist/client-ClR0K8zX.mjs +112 -0
  53. package/dist/codex/happyMcpStdioBridge.cjs +33 -14
  54. package/dist/codex/happyMcpStdioBridge.mjs +26 -7
  55. package/dist/codexAppServerClient-I3teiV-N.mjs +1088 -0
  56. package/dist/codexAppServerClient-q2FjnRcK.cjs +1090 -0
  57. package/dist/codexCommand-4zcccIoq.cjs +2088 -0
  58. package/dist/codexCommand-Cc9gcbdX.mjs +2086 -0
  59. package/dist/codexThreadFork-BH9IZPqD.cjs +350 -0
  60. package/dist/codexThreadFork-slzAseLx.mjs +338 -0
  61. package/dist/{config-ClLtM6F3.mjs → config-CTx_jb-C.mjs} +7 -40
  62. package/dist/{config-DLx-vW3I.cjs → config-Ci9Kpgwa.cjs} +26 -59
  63. package/dist/configuration-BSYpcPwE.cjs +181 -0
  64. package/dist/configuration-RfeNjFmd.mjs +170 -0
  65. package/dist/connect-BpOdzNbE.mjs +682 -0
  66. package/dist/connect-C2CiOUFs.cjs +684 -0
  67. package/dist/constants-BC4St0xd.mjs +11 -0
  68. package/dist/constants-VJ0N6WuG.cjs +17 -0
  69. package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
  70. package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
  71. package/dist/context-DsDr6E2t.cjs +69 -0
  72. package/dist/context-H0Bcb9S_.mjs +65 -0
  73. package/dist/controlClient-BGbDcgWS.mjs +260 -0
  74. package/dist/controlClient-Bcwv3D21.cjs +279 -0
  75. package/dist/createSessionMetadata-BJxEnM-o.cjs +58 -0
  76. package/dist/createSessionMetadata-CVVkGjxV.mjs +54 -0
  77. package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
  78. package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
  79. package/dist/detectCLI-CSGMlV51.mjs +58 -0
  80. package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
  81. package/dist/deterministicJson-C5CYTVpm.cjs +507 -0
  82. package/dist/deterministicJson-CzkFJWw1.mjs +502 -0
  83. package/dist/doctor-BPkYWSuq.mjs +75 -0
  84. package/dist/doctor-D2YJ-Yn2.cjs +395 -0
  85. package/dist/doctor-DOvByjbk.mjs +391 -0
  86. package/dist/doctor-u46qYYKX.cjs +79 -0
  87. package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
  88. package/dist/doctorReadiness-C208SMN9.mjs +142 -0
  89. package/dist/editPaths-BVfS_FFL.mjs +68 -0
  90. package/dist/editPaths-Bqp4OFPw.cjs +73 -0
  91. package/dist/ensureDaemonRunning-BCwNrMyv.cjs +64 -0
  92. package/dist/ensureDaemonRunning-Dqa2pOjY.mjs +61 -0
  93. package/dist/handleResumeCommand-BvXYf5El.mjs +240 -0
  94. package/dist/handleResumeCommand-C2cKchpX.cjs +245 -0
  95. package/dist/ids-B6ZC0HGt.cjs +13 -0
  96. package/dist/ids-DU6sLx4C.mjs +10 -0
  97. package/dist/index-B6UGRQ7h.mjs +102 -0
  98. package/dist/{index-BEOMECtE.cjs → index-B6pAdvJx.cjs} +121 -91
  99. package/dist/index-Bu5Zi_a9.cjs +182 -0
  100. package/dist/index-D3kI0hDR.cjs +107 -0
  101. package/dist/index-DA7yINuk.cjs +994 -0
  102. package/dist/index-DDeHXrIX.cjs +71 -0
  103. package/dist/index-DKLU_fD0.mjs +158 -0
  104. package/dist/{index-2mCaeKyf.mjs → index-DMZqWwsP.mjs} +68 -38
  105. package/dist/index-DVkMGPyS.mjs +68 -0
  106. package/dist/index-qdS1friN.mjs +949 -0
  107. package/dist/index.cjs +5 -46
  108. package/dist/index.mjs +5 -46
  109. package/dist/{install-BPhJppvd.mjs → install-BO_W7VhL.mjs} +37 -37
  110. package/dist/install-BgoC2e_2.cjs +88 -0
  111. package/dist/install-CFY3tYtJ.mjs +86 -0
  112. package/dist/{install-BOHrUaFM.cjs → install-Cs5qAPrB.cjs} +38 -38
  113. package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
  114. package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
  115. package/dist/{installTerminalHooks-Cou3WUf3.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
  116. package/dist/{installTerminalHooks-WeznjkuC.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
  117. package/dist/lib.cjs +28 -19
  118. package/dist/lib.d.cts +12 -2
  119. package/dist/lib.d.mts +12 -2
  120. package/dist/lib.mjs +23 -14
  121. package/dist/lidState-BeDfxxEX.cjs +305 -0
  122. package/dist/lidState-CeEt442o.mjs +297 -0
  123. package/dist/limits-C-a7gr04.cjs +43 -0
  124. package/dist/limits-DIo7rEBR.mjs +36 -0
  125. package/dist/localHappyAgentAuth-C-HQyiv6.mjs +82 -0
  126. package/dist/localHappyAgentAuth-D6rFhaoc.cjs +86 -0
  127. package/dist/logger-6HYUEXNk.mjs +271 -0
  128. package/dist/logger-CS0mw3fa.cjs +275 -0
  129. package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
  130. package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
  131. package/dist/machineMetadata-DyDbODYd.cjs +41 -0
  132. package/dist/machineMetadata-oOzBfDfs.mjs +38 -0
  133. package/dist/main-BkxJP6JQ.cjs +941 -0
  134. package/dist/main-BwNIAI1A.mjs +939 -0
  135. package/dist/manager-BQ4flvQZ.mjs +101 -0
  136. package/dist/manager-Cly8xVIR.cjs +105 -0
  137. package/dist/{mcp-Dy3f_K0h.mjs → mcp-B1A4I3TK.mjs} +27 -33
  138. package/dist/{mcp-CPYbtsYG.cjs → mcp-Hszd7qpS.cjs} +42 -48
  139. package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
  140. package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
  141. package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
  142. package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
  143. package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
  144. package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
  145. package/dist/package-BhaKlnxz.mjs +171 -0
  146. package/dist/package-BwMrPwqH.cjs +173 -0
  147. package/dist/path-B7zW-WwE.cjs +18 -0
  148. package/dist/path-D2wdaNSk.mjs +15 -0
  149. package/dist/peerTools-BTqw97Gb.mjs +272 -0
  150. package/dist/peerTools-BvKtHXj8.cjs +283 -0
  151. package/dist/permissionMode-Cr5JCbB7.mjs +80 -0
  152. package/dist/permissionMode-CrV-XuMs.cjs +87 -0
  153. package/dist/persistence-HGW_ZVs9.mjs +372 -0
  154. package/dist/persistence-yKTH3-5X.cjs +414 -0
  155. package/dist/piExtension.mjs +2 -1
  156. package/dist/piRunnerArgs-BNloJCCg.cjs +66 -0
  157. package/dist/piRunnerArgs-BuX1UFWy.mjs +59 -0
  158. package/dist/{piRuntime-kLZNpAAl.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
  159. package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
  160. package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
  161. package/dist/{piTerminal-9J0GAKzb.cjs → piTerminal-DNCZ6yTM.cjs} +32 -35
  162. package/dist/previewPath-B0rBdhy1.cjs +83 -0
  163. package/dist/previewPath-CXN4Vag0.mjs +81 -0
  164. package/dist/projectPath-BTBIMB57.mjs +10 -0
  165. package/dist/projectPath-ChLhdOyt.cjs +13 -0
  166. package/dist/registerCommonHandlers-Ccvsz7Ou.mjs +536 -0
  167. package/dist/registerCommonHandlers-DskirN-_.cjs +538 -0
  168. package/dist/registerKillSessionHandler-DZeLXWcB.cjs +361 -0
  169. package/dist/registerKillSessionHandler-GYvHdipX.mjs +358 -0
  170. package/dist/remoteSessionClient-B0LraSB9.cjs +634 -0
  171. package/dist/remoteSessionClient-CYnXRynE.mjs +612 -0
  172. package/dist/resources-BdFBQi8r.mjs +117 -0
  173. package/dist/resources-JDPugcDq.cjs +120 -0
  174. package/dist/run-CJzxoHVh.cjs +5762 -0
  175. package/dist/run-D3ifupU3.mjs +5739 -0
  176. package/dist/runClaude-Ba01qT-u.mjs +848 -0
  177. package/dist/runClaude-Da3RirzE.cjs +850 -0
  178. package/dist/runClaudeDeps-DOt79DjU.mjs +3624 -0
  179. package/dist/runClaudeDeps-DOzEBMls.cjs +3649 -0
  180. package/dist/{runGemini-DV6Ouadt.mjs → runGemini-BGeTz57m.mjs} +58 -31
  181. package/dist/{runGemini-F-mqx3_K.cjs → runGemini-DSr9LIxL.cjs} +202 -175
  182. package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
  183. package/dist/{runOpenClaw-D7MlPS5n.mjs → runOpenClaw-CogSedIc.mjs} +31 -32
  184. package/dist/sandbox-CG7IyDTU.cjs +187 -0
  185. package/dist/sandbox-DTe6d54R.mjs +180 -0
  186. package/dist/selfCheck-C9mVrQwf.mjs +84 -0
  187. package/dist/selfCheck-Dc-mNSLb.cjs +87 -0
  188. package/dist/{send-4qJTCAYW.cjs → send-B7J_eaG3.cjs} +16 -9
  189. package/dist/{send-CLhYXNgy.mjs → send-CBXJKc6O.mjs} +12 -5
  190. package/dist/server-CZTP_iOn.cjs +407 -0
  191. package/dist/server-DcVBv04l.mjs +404 -0
  192. package/dist/sessionLock-Bys1PNSo.cjs +205 -0
  193. package/dist/sessionLock-D-EG2CfG.mjs +197 -0
  194. package/dist/sessionModeFile-DMl3dw3r.mjs +32 -0
  195. package/dist/sessionModeFile-RSm0NQkH.cjs +36 -0
  196. package/dist/sessionOps-Dn8z85h_.cjs +783 -0
  197. package/dist/sessionOps-SuHW8Dfe.mjs +760 -0
  198. package/dist/sessionScanner-BOrGjMXL.cjs +209 -0
  199. package/dist/sessionScanner-CX3onqXh.mjs +206 -0
  200. package/dist/{sessions-CzIH2rGp.mjs → sessions-BEG_HTSi.mjs} +17 -8
  201. package/dist/{sessions-Bh1pyddi.cjs → sessions-D74aJbhL.cjs} +37 -28
  202. package/dist/setupOfflineReconnection-ByElY60m.cjs +74 -0
  203. package/dist/setupOfflineReconnection-DpvWTt69.mjs +72 -0
  204. package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
  205. package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
  206. package/dist/{spawn-CPIWlPOM.mjs → spawn-B7yro0b2.mjs} +26 -38
  207. package/dist/{spawn-CmFOSVdW.cjs → spawn-DgR0RKRs.cjs} +52 -64
  208. package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
  209. package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
  210. package/dist/spawnHappyCLI-B2H5s4B_.mjs +64 -0
  211. package/dist/spawnHappyCLI-DBhwZT7O.cjs +66 -0
  212. package/dist/specialCommands-BSqhYg5X.mjs +52 -0
  213. package/dist/specialCommands-DSsTeRej.cjs +54 -0
  214. package/dist/startFileWatcher-B4VsLgjD.cjs +71 -0
  215. package/dist/startFileWatcher-DErVWZE4.mjs +69 -0
  216. package/dist/startupPlan-BLMbfQIH.cjs +12 -0
  217. package/dist/startupPlan-DFMyNgAs.mjs +10 -0
  218. package/dist/streamRelay-BiKw59Cc.cjs +233 -0
  219. package/dist/streamRelay-FPVbHpbM.mjs +231 -0
  220. package/dist/sync-C8gyQFMc.mjs +69 -0
  221. package/dist/sync-DccIKZ5_.cjs +71 -0
  222. package/dist/systemPrompt-BwTPWfMu.cjs +97 -0
  223. package/dist/systemPrompt-DX521JJz.mjs +94 -0
  224. package/dist/{teams-CEahj4cm.mjs → teams-C32F1hqd.mjs} +9 -40
  225. package/dist/{teams-CB1R9-Z9.cjs → teams-Dl8g8kTI.cjs} +14 -45
  226. package/dist/template-BaHAmH2K.cjs +129 -0
  227. package/dist/template-CiOPa2rd.mjs +121 -0
  228. package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
  229. package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
  230. package/dist/terminals-B_bfC9c2.cjs +250 -0
  231. package/dist/terminals-Dlg0x3nY.mjs +235 -0
  232. package/dist/time-D0XyHOid.mjs +38 -0
  233. package/dist/time-DCuTyook.cjs +42 -0
  234. package/dist/titleGenerator-CQ8CoGhg.mjs +166 -0
  235. package/dist/titleGenerator-ChzMJsyg.cjs +172 -0
  236. package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
  237. package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
  238. package/dist/{todo-DqyRI4wP.cjs → todo-BvUOTa8G.cjs} +15 -12
  239. package/dist/{todo-Cknp5D4U.mjs → todo-CZ6cFrrn.mjs} +11 -8
  240. package/dist/tools-BZtHF_qQ.mjs +177 -0
  241. package/dist/tools-Be3AoAwu.cjs +63 -0
  242. package/dist/tools-DQj0AeLk.cjs +180 -0
  243. package/dist/tools-DkluDcG4.mjs +60 -0
  244. package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
  245. package/dist/trimIdent-BAjmv_TG.mjs +20 -0
  246. package/dist/types-CRS-srZK.cjs +66 -0
  247. package/dist/types-CkqAACXx.mjs +64 -0
  248. package/dist/uninstall-BkLzaJ6I.mjs +47 -0
  249. package/dist/uninstall-x-TUtf5H.cjs +49 -0
  250. package/package.json +7 -7
  251. package/dist/agentGuidance-BRDN1NoZ.cjs +0 -2217
  252. package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
  253. package/dist/index-BF6WfgV5.mjs +0 -19624
  254. package/dist/index-C-JazrMB.mjs +0 -52
  255. package/dist/index-blDSadUR.cjs +0 -58
  256. package/dist/index-rH3DrQ5B.cjs +0 -19688
  257. package/dist/limits-BH5CV5vR.cjs +0 -2683
  258. package/dist/limits-CjRj8IX5.mjs +0 -2558
@@ -0,0 +1,209 @@
1
+ 'use strict';
2
+
3
+ var sync = require('./sync-DccIKZ5_.cjs');
4
+ var types = require('./types-CRS-srZK.cjs');
5
+ var path$1 = require('node:path');
6
+ var promises = require('node:fs/promises');
7
+ var logger = require('./logger-CS0mw3fa.cjs');
8
+ var startFileWatcher = require('./startFileWatcher-B4VsLgjD.cjs');
9
+ var path = require('./path-B7zW-WwE.cjs');
10
+
11
+ class Future {
12
+ _resolve;
13
+ _reject;
14
+ _promise;
15
+ constructor() {
16
+ this._promise = new Promise((resolve, reject) => {
17
+ this._resolve = resolve;
18
+ this._reject = reject;
19
+ });
20
+ }
21
+ resolve(value) {
22
+ this._resolve(value);
23
+ }
24
+ reject(reason) {
25
+ this._reject(reason);
26
+ }
27
+ get promise() {
28
+ return this._promise;
29
+ }
30
+ }
31
+
32
+ const INTERNAL_CLAUDE_EVENT_TYPES = /* @__PURE__ */ new Set([
33
+ "file-history-snapshot",
34
+ "change",
35
+ "queue-operation"
36
+ ]);
37
+ async function createSessionScanner(opts) {
38
+ const projectDir = path.getProjectPath(opts.workingDirectory);
39
+ let finishedSessions = /* @__PURE__ */ new Set();
40
+ let pendingSessions = /* @__PURE__ */ new Set();
41
+ let currentSessionId = null;
42
+ let watchers = /* @__PURE__ */ new Map();
43
+ let processedMessageKeys = /* @__PURE__ */ new Set();
44
+ let deadSessions = /* @__PURE__ */ new Set();
45
+ if (opts.sessionId) {
46
+ let messages = await readSessionLog(projectDir, opts.sessionId);
47
+ logger.logger.debug(`[SESSION_SCANNER] Marking ${messages.length} existing messages as processed from session ${opts.sessionId}`);
48
+ for (let m of messages) {
49
+ processedMessageKeys.add(messageKey(m));
50
+ }
51
+ currentSessionId = opts.sessionId;
52
+ }
53
+ const sync$1 = new sync.InvalidateSync(async () => {
54
+ let sessions = [];
55
+ for (let p of pendingSessions) {
56
+ if (!deadSessions.has(p)) {
57
+ sessions.push(p);
58
+ }
59
+ }
60
+ if (currentSessionId && !pendingSessions.has(currentSessionId) && !deadSessions.has(currentSessionId)) {
61
+ sessions.push(currentSessionId);
62
+ }
63
+ for (let [sessionId] of watchers) {
64
+ if (!sessions.includes(sessionId) && !deadSessions.has(sessionId)) {
65
+ sessions.push(sessionId);
66
+ }
67
+ }
68
+ for (let session of sessions) {
69
+ const sessionMessages = await readSessionLog(projectDir, session);
70
+ let skipped = 0;
71
+ let sent = 0;
72
+ for (let file of sessionMessages) {
73
+ let key = messageKey(file);
74
+ if (processedMessageKeys.has(key)) {
75
+ skipped++;
76
+ continue;
77
+ }
78
+ processedMessageKeys.add(key);
79
+ logger.logger.debug(`[SESSION_SCANNER] Sending new message: type=${file.type}, uuid=${file.type === "summary" ? file.leafUuid : file.uuid}`);
80
+ opts.onMessage(file);
81
+ sent++;
82
+ }
83
+ if (sessionMessages.length > 0) {
84
+ logger.logger.debug(`[SESSION_SCANNER] Session ${session}: found=${sessionMessages.length}, skipped=${skipped}, sent=${sent}`);
85
+ }
86
+ }
87
+ for (let p of sessions) {
88
+ if (pendingSessions.has(p)) {
89
+ pendingSessions.delete(p);
90
+ finishedSessions.add(p);
91
+ }
92
+ }
93
+ for (let p of sessions) {
94
+ if (!watchers.has(p) && !deadSessions.has(p)) {
95
+ logger.logger.debug(`[SESSION_SCANNER] Starting watcher for session: ${p}`);
96
+ watchers.set(p, startFileWatcher.startFileWatcher(
97
+ path$1.join(projectDir, `${p}.jsonl`),
98
+ () => {
99
+ sync$1.invalidate();
100
+ },
101
+ {
102
+ missingFileTimeoutMs: opts.missingFileTimeoutMs,
103
+ onGaveUp: () => {
104
+ logger.logger.debug(`[SESSION_SCANNER] Session ${p} transcript never appeared \u2014 dropping it`);
105
+ watchers.get(p)?.();
106
+ watchers.delete(p);
107
+ deadSessions.add(p);
108
+ pendingSessions.delete(p);
109
+ }
110
+ }
111
+ ));
112
+ }
113
+ }
114
+ });
115
+ await sync$1.invalidateAndAwait();
116
+ const intervalId = setInterval(() => {
117
+ sync$1.invalidate();
118
+ }, 3e3);
119
+ return {
120
+ cleanup: async () => {
121
+ clearInterval(intervalId);
122
+ for (let w of watchers.values()) {
123
+ w();
124
+ }
125
+ watchers.clear();
126
+ await sync$1.invalidateAndAwait();
127
+ sync$1.stop();
128
+ },
129
+ onNewSession: async (sessionId, options) => {
130
+ if (currentSessionId === sessionId) {
131
+ logger.logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is the same as the current session, skipping`);
132
+ return;
133
+ }
134
+ if (deadSessions.delete(sessionId)) {
135
+ logger.logger.debug(`[SESSION_SCANNER] Reviving previously-dropped session: ${sessionId}`);
136
+ }
137
+ if (finishedSessions.has(sessionId)) {
138
+ logger.logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is already finished, skipping`);
139
+ return;
140
+ }
141
+ if (pendingSessions.has(sessionId)) {
142
+ logger.logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is already pending, skipping`);
143
+ return;
144
+ }
145
+ if (options?.treatExistingAsProcessed) {
146
+ const existing = await readSessionLog(projectDir, sessionId);
147
+ logger.logger.debug(`[SESSION_SCANNER] Pre-marking ${existing.length} existing messages as processed for new session ${sessionId}`);
148
+ for (const m of existing) {
149
+ processedMessageKeys.add(messageKey(m));
150
+ }
151
+ }
152
+ if (currentSessionId) {
153
+ pendingSessions.add(currentSessionId);
154
+ }
155
+ logger.logger.debug(`[SESSION_SCANNER] New session: ${sessionId}`);
156
+ currentSessionId = sessionId;
157
+ sync$1.invalidate();
158
+ }
159
+ };
160
+ }
161
+ function messageKey(message) {
162
+ if (message.type === "user") {
163
+ return message.uuid;
164
+ } else if (message.type === "assistant") {
165
+ return message.uuid;
166
+ } else if (message.type === "summary") {
167
+ return "summary: " + message.leafUuid + ": " + message.summary;
168
+ } else if (message.type === "system") {
169
+ return message.uuid;
170
+ } else {
171
+ throw Error();
172
+ }
173
+ }
174
+ async function readSessionLog(projectDir, sessionId) {
175
+ const expectedSessionFile = path$1.join(projectDir, `${sessionId}.jsonl`);
176
+ logger.logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
177
+ let file;
178
+ try {
179
+ file = await promises.readFile(expectedSessionFile, "utf-8");
180
+ } catch (error) {
181
+ logger.logger.debug(`[SESSION_SCANNER] Session file not found: ${expectedSessionFile}`);
182
+ return [];
183
+ }
184
+ let lines = file.split("\n");
185
+ let messages = [];
186
+ for (let l of lines) {
187
+ try {
188
+ if (l.trim() === "") {
189
+ continue;
190
+ }
191
+ let message = JSON.parse(l);
192
+ if (message.type && INTERNAL_CLAUDE_EVENT_TYPES.has(message.type)) {
193
+ continue;
194
+ }
195
+ let parsed = types.RawJSONLinesSchema.safeParse(message);
196
+ if (!parsed.success) {
197
+ continue;
198
+ }
199
+ messages.push(parsed.data);
200
+ } catch (e) {
201
+ logger.logger.debug(`[SESSION_SCANNER] Error processing message: ${e}`);
202
+ continue;
203
+ }
204
+ }
205
+ return messages;
206
+ }
207
+
208
+ exports.Future = Future;
209
+ exports.createSessionScanner = createSessionScanner;
@@ -0,0 +1,206 @@
1
+ import { I as InvalidateSync } from './sync-C8gyQFMc.mjs';
2
+ import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
3
+ import { join } from 'node:path';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { l as logger } from './logger-6HYUEXNk.mjs';
6
+ import { s as startFileWatcher } from './startFileWatcher-DErVWZE4.mjs';
7
+ import { g as getProjectPath } from './path-D2wdaNSk.mjs';
8
+
9
+ class Future {
10
+ _resolve;
11
+ _reject;
12
+ _promise;
13
+ constructor() {
14
+ this._promise = new Promise((resolve, reject) => {
15
+ this._resolve = resolve;
16
+ this._reject = reject;
17
+ });
18
+ }
19
+ resolve(value) {
20
+ this._resolve(value);
21
+ }
22
+ reject(reason) {
23
+ this._reject(reason);
24
+ }
25
+ get promise() {
26
+ return this._promise;
27
+ }
28
+ }
29
+
30
+ const INTERNAL_CLAUDE_EVENT_TYPES = /* @__PURE__ */ new Set([
31
+ "file-history-snapshot",
32
+ "change",
33
+ "queue-operation"
34
+ ]);
35
+ async function createSessionScanner(opts) {
36
+ const projectDir = getProjectPath(opts.workingDirectory);
37
+ let finishedSessions = /* @__PURE__ */ new Set();
38
+ let pendingSessions = /* @__PURE__ */ new Set();
39
+ let currentSessionId = null;
40
+ let watchers = /* @__PURE__ */ new Map();
41
+ let processedMessageKeys = /* @__PURE__ */ new Set();
42
+ let deadSessions = /* @__PURE__ */ new Set();
43
+ if (opts.sessionId) {
44
+ let messages = await readSessionLog(projectDir, opts.sessionId);
45
+ logger.debug(`[SESSION_SCANNER] Marking ${messages.length} existing messages as processed from session ${opts.sessionId}`);
46
+ for (let m of messages) {
47
+ processedMessageKeys.add(messageKey(m));
48
+ }
49
+ currentSessionId = opts.sessionId;
50
+ }
51
+ const sync = new InvalidateSync(async () => {
52
+ let sessions = [];
53
+ for (let p of pendingSessions) {
54
+ if (!deadSessions.has(p)) {
55
+ sessions.push(p);
56
+ }
57
+ }
58
+ if (currentSessionId && !pendingSessions.has(currentSessionId) && !deadSessions.has(currentSessionId)) {
59
+ sessions.push(currentSessionId);
60
+ }
61
+ for (let [sessionId] of watchers) {
62
+ if (!sessions.includes(sessionId) && !deadSessions.has(sessionId)) {
63
+ sessions.push(sessionId);
64
+ }
65
+ }
66
+ for (let session of sessions) {
67
+ const sessionMessages = await readSessionLog(projectDir, session);
68
+ let skipped = 0;
69
+ let sent = 0;
70
+ for (let file of sessionMessages) {
71
+ let key = messageKey(file);
72
+ if (processedMessageKeys.has(key)) {
73
+ skipped++;
74
+ continue;
75
+ }
76
+ processedMessageKeys.add(key);
77
+ logger.debug(`[SESSION_SCANNER] Sending new message: type=${file.type}, uuid=${file.type === "summary" ? file.leafUuid : file.uuid}`);
78
+ opts.onMessage(file);
79
+ sent++;
80
+ }
81
+ if (sessionMessages.length > 0) {
82
+ logger.debug(`[SESSION_SCANNER] Session ${session}: found=${sessionMessages.length}, skipped=${skipped}, sent=${sent}`);
83
+ }
84
+ }
85
+ for (let p of sessions) {
86
+ if (pendingSessions.has(p)) {
87
+ pendingSessions.delete(p);
88
+ finishedSessions.add(p);
89
+ }
90
+ }
91
+ for (let p of sessions) {
92
+ if (!watchers.has(p) && !deadSessions.has(p)) {
93
+ logger.debug(`[SESSION_SCANNER] Starting watcher for session: ${p}`);
94
+ watchers.set(p, startFileWatcher(
95
+ join(projectDir, `${p}.jsonl`),
96
+ () => {
97
+ sync.invalidate();
98
+ },
99
+ {
100
+ missingFileTimeoutMs: opts.missingFileTimeoutMs,
101
+ onGaveUp: () => {
102
+ logger.debug(`[SESSION_SCANNER] Session ${p} transcript never appeared \u2014 dropping it`);
103
+ watchers.get(p)?.();
104
+ watchers.delete(p);
105
+ deadSessions.add(p);
106
+ pendingSessions.delete(p);
107
+ }
108
+ }
109
+ ));
110
+ }
111
+ }
112
+ });
113
+ await sync.invalidateAndAwait();
114
+ const intervalId = setInterval(() => {
115
+ sync.invalidate();
116
+ }, 3e3);
117
+ return {
118
+ cleanup: async () => {
119
+ clearInterval(intervalId);
120
+ for (let w of watchers.values()) {
121
+ w();
122
+ }
123
+ watchers.clear();
124
+ await sync.invalidateAndAwait();
125
+ sync.stop();
126
+ },
127
+ onNewSession: async (sessionId, options) => {
128
+ if (currentSessionId === sessionId) {
129
+ logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is the same as the current session, skipping`);
130
+ return;
131
+ }
132
+ if (deadSessions.delete(sessionId)) {
133
+ logger.debug(`[SESSION_SCANNER] Reviving previously-dropped session: ${sessionId}`);
134
+ }
135
+ if (finishedSessions.has(sessionId)) {
136
+ logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is already finished, skipping`);
137
+ return;
138
+ }
139
+ if (pendingSessions.has(sessionId)) {
140
+ logger.debug(`[SESSION_SCANNER] New session: ${sessionId} is already pending, skipping`);
141
+ return;
142
+ }
143
+ if (options?.treatExistingAsProcessed) {
144
+ const existing = await readSessionLog(projectDir, sessionId);
145
+ logger.debug(`[SESSION_SCANNER] Pre-marking ${existing.length} existing messages as processed for new session ${sessionId}`);
146
+ for (const m of existing) {
147
+ processedMessageKeys.add(messageKey(m));
148
+ }
149
+ }
150
+ if (currentSessionId) {
151
+ pendingSessions.add(currentSessionId);
152
+ }
153
+ logger.debug(`[SESSION_SCANNER] New session: ${sessionId}`);
154
+ currentSessionId = sessionId;
155
+ sync.invalidate();
156
+ }
157
+ };
158
+ }
159
+ function messageKey(message) {
160
+ if (message.type === "user") {
161
+ return message.uuid;
162
+ } else if (message.type === "assistant") {
163
+ return message.uuid;
164
+ } else if (message.type === "summary") {
165
+ return "summary: " + message.leafUuid + ": " + message.summary;
166
+ } else if (message.type === "system") {
167
+ return message.uuid;
168
+ } else {
169
+ throw Error();
170
+ }
171
+ }
172
+ async function readSessionLog(projectDir, sessionId) {
173
+ const expectedSessionFile = join(projectDir, `${sessionId}.jsonl`);
174
+ logger.debug(`[SESSION_SCANNER] Reading session file: ${expectedSessionFile}`);
175
+ let file;
176
+ try {
177
+ file = await readFile(expectedSessionFile, "utf-8");
178
+ } catch (error) {
179
+ logger.debug(`[SESSION_SCANNER] Session file not found: ${expectedSessionFile}`);
180
+ return [];
181
+ }
182
+ let lines = file.split("\n");
183
+ let messages = [];
184
+ for (let l of lines) {
185
+ try {
186
+ if (l.trim() === "") {
187
+ continue;
188
+ }
189
+ let message = JSON.parse(l);
190
+ if (message.type && INTERNAL_CLAUDE_EVENT_TYPES.has(message.type)) {
191
+ continue;
192
+ }
193
+ let parsed = RawJSONLinesSchema.safeParse(message);
194
+ if (!parsed.success) {
195
+ continue;
196
+ }
197
+ messages.push(parsed.data);
198
+ } catch (e) {
199
+ logger.debug(`[SESSION_SCANNER] Error processing message: ${e}`);
200
+ continue;
201
+ }
202
+ }
203
+ return messages;
204
+ }
205
+
206
+ export { Future as F, createSessionScanner as c };
@@ -1,17 +1,26 @@
1
1
  import chalk from 'chalk';
2
- import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, f as fillForeignAccountRows, e as listRemoteSessions, g as listSessions, h as cliPeerSelf, i as listRemotePeers, j as listPeerSessions, s as sendPeerMessage, w as waitForTurnEnd, T as TurnWaitTimeoutError, k as readSessionTranscript, m as waitForRemoteTurnEnd, n as readRemoteTranscript, o as stopSession, p as resolvePermissionRequest, q as archiveSession, t as PEER_SCOPES } from './agentGuidance-KgvYuF3R.mjs';
3
- import { d as readPersistedSessions, i as isValidSessionId } from './limits-CjRj8IX5.mjs';
2
+ import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, a as listSessions, w as waitForTurnEnd, T as TurnWaitTimeoutError, r as readSessionTranscript, b as stopSession, c as resolvePermissionRequest, d as archiveSession } from './sessionOps-SuHW8Dfe.mjs';
3
+ import { i as isValidSessionId } from './ids-DU6sLx4C.mjs';
4
+ import { c as cliPeerSelf, l as listPeerSessions, s as sendPeerMessage, P as PEER_SCOPES } from './peerTools-BTqw97Gb.mjs';
5
+ import { readPersistedSessions } from './persistence-HGW_ZVs9.mjs';
4
6
  import { resolve } from 'node:path';
5
- import 'zod';
6
- import 'node:crypto';
7
- import 'node:fs/promises';
7
+ import { f as fillForeignAccountRows, l as listRemoteSessions, a as listRemotePeers, w as waitForRemoteTurnEnd, r as readRemoteTranscript } from './remoteSessionClient-CYnXRynE.mjs';
8
+ import 'axios';
9
+ import './configuration-RfeNjFmd.mjs';
8
10
  import 'node:fs';
9
11
  import 'node:os';
10
- import 'axios';
11
- import 'socket.io-client';
12
- import '@paralleldrive/cuid2';
12
+ import './package-BhaKlnxz.mjs';
13
+ import 'node:fs/promises';
14
+ import './authRelay-DSAvg1uv.mjs';
15
+ import 'node:crypto';
13
16
  import 'tweetnacl';
17
+ import './controlClient-BGbDcgWS.mjs';
18
+ import './logger-6HYUEXNk.mjs';
14
19
  import 'node:util';
20
+ import './time-D0XyHOid.mjs';
21
+ import 'socket.io-client';
22
+ import './backgroundTaskActivity-8PdPxrvy.mjs';
23
+ import 'zod';
15
24
 
16
25
  const MACHINE_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
17
26
  const ACTIONS = ["list", "read", "stop", "archive", "approve", "deny", "peers", "message"];
@@ -1,19 +1,28 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var agentGuidance = require('./agentGuidance-BRDN1NoZ.cjs');
5
- var persistence = require('./limits-BH5CV5vR.cjs');
4
+ var sessionOps = require('./sessionOps-Dn8z85h_.cjs');
5
+ var ids = require('./ids-B6ZC0HGt.cjs');
6
+ var peerTools = require('./peerTools-BvKtHXj8.cjs');
7
+ var persistence = require('./persistence-yKTH3-5X.cjs');
6
8
  var path = require('node:path');
7
- require('zod');
8
- require('node:crypto');
9
- require('node:fs/promises');
9
+ var remoteSessionClient = require('./remoteSessionClient-B0LraSB9.cjs');
10
+ require('axios');
11
+ require('./configuration-BSYpcPwE.cjs');
10
12
  require('node:fs');
11
13
  require('node:os');
12
- require('axios');
13
- require('socket.io-client');
14
- require('@paralleldrive/cuid2');
14
+ require('./package-BwMrPwqH.cjs');
15
+ require('node:fs/promises');
16
+ require('./authRelay-BdYkC1Po.cjs');
17
+ require('node:crypto');
15
18
  require('tweetnacl');
19
+ require('./controlClient-Bcwv3D21.cjs');
20
+ require('./logger-CS0mw3fa.cjs');
16
21
  require('node:util');
22
+ require('./time-DCuTyook.cjs');
23
+ require('socket.io-client');
24
+ require('./backgroundTaskActivity-CBvUdj39.cjs');
25
+ require('zod');
17
26
 
18
27
  const MACHINE_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
19
28
  const ACTIONS = ["list", "read", "stop", "archive", "approve", "deny", "peers", "message"];
@@ -58,7 +67,7 @@ function parseSessionsArgs(args) {
58
67
  } else if (arg === "--scope") {
59
68
  const value = args[++i];
60
69
  if (value === void 0) throw new Error("--scope requires a value");
61
- if (!agentGuidance.PEER_SCOPES.includes(value)) throw new Error(`--scope must be one of ${agentGuidance.PEER_SCOPES.join(", ")}`);
70
+ if (!peerTools.PEER_SCOPES.includes(value)) throw new Error(`--scope must be one of ${peerTools.PEER_SCOPES.join(", ")}`);
62
71
  options.scope = value;
63
72
  } else if (arg === "--cwd") {
64
73
  const value = args[++i];
@@ -102,7 +111,7 @@ function parseSessionsArgs(args) {
102
111
  if (ACTIONS_NEEDING_ID.has(options.action)) {
103
112
  const id = positionals[0];
104
113
  if (id === void 0) throw new Error(`${options.action} requires a session id`);
105
- if (!persistence.isValidSessionId(id)) throw new Error(`Invalid session id: ${id}`);
114
+ if (!ids.isValidSessionId(id)) throw new Error(`Invalid session id: ${id}`);
106
115
  options.sessionId = id;
107
116
  }
108
117
  if (options.action === "message") {
@@ -206,8 +215,8 @@ ${chalk.bold("Options:")}
206
215
  \`spawn --spawned-by\`). With --all only decryptable rows
207
216
  can match.
208
217
  --limit <n> list: how many NOT-running / not-attention sessions to
209
- include (default ${agentGuidance.DEFAULT_RECENT_LIMIT}; running and attention rows are
210
- never cut). read: how many messages (default 20, max ${agentGuidance.MAX_READ_LIMIT}).
218
+ include (default ${sessionOps.DEFAULT_RECENT_LIMIT}; running and attention rows are
219
+ never cut). read: how many messages (default 20, max ${sessionOps.MAX_READ_LIMIT}).
211
220
  --full read only: do not truncate entries (default caps each
212
221
  line at 500 chars).
213
222
  --answer read only: print just the agent's reply to the latest
@@ -309,13 +318,13 @@ async function handleSessionsCommand(args) {
309
318
  }
310
319
  try {
311
320
  if (options.action === "list" && options.all) {
312
- const listed = await agentGuidance.listAccountSessions({ recentLimit: options.tag ? 150 : options.limit, includeArchived: options.includeArchived });
313
- const fill = await agentGuidance.fillForeignAccountRows(listed);
321
+ const listed = await sessionOps.listAccountSessions({ recentLimit: options.tag ? 150 : options.limit, includeArchived: options.includeArchived });
322
+ const fill = await remoteSessionClient.fillForeignAccountRows(listed);
314
323
  let sessions = fill.rows;
315
324
  if (options.tag) {
316
325
  const wanted = options.tag;
317
326
  sessions = sessions.filter((summary) => summary.tags?.includes(wanted) === true);
318
- const recentLimit = Math.max(0, options.limit ?? agentGuidance.DEFAULT_RECENT_LIMIT);
327
+ const recentLimit = Math.max(0, options.limit ?? sessionOps.DEFAULT_RECENT_LIMIT);
319
328
  let idleKept = 0;
320
329
  sessions = sessions.filter((summary) => summary.attention || summary.live || idleKept++ < recentLimit);
321
330
  }
@@ -339,7 +348,7 @@ async function handleSessionsCommand(args) {
339
348
  process.exit(0);
340
349
  }
341
350
  if (options.action === "list" && options.machine) {
342
- const listing = await agentGuidance.listRemoteSessions(options.machine, { tag: options.tag, limit: options.limit });
351
+ const listing = await remoteSessionClient.listRemoteSessions(options.machine, { tag: options.tag, limit: options.limit });
343
352
  const sessions = listing.sessions;
344
353
  if (options.json) {
345
354
  console.log(JSON.stringify({ sessions, machine: { id: listing.machineId, host: listing.host } }));
@@ -352,7 +361,7 @@ async function handleSessionsCommand(args) {
352
361
  process.exit(0);
353
362
  }
354
363
  if (options.action === "list") {
355
- const sessions = await agentGuidance.listSessions({ tag: options.tag, recentLimit: options.limit });
364
+ const sessions = await sessionOps.listSessions({ tag: options.tag, recentLimit: options.limit });
356
365
  if (options.json) {
357
366
  console.log(JSON.stringify({ sessions }));
358
367
  } else if (sessions.length === 0) {
@@ -365,9 +374,9 @@ async function handleSessionsCommand(args) {
365
374
  if (options.action === "peers" || options.action === "message") {
366
375
  const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
367
376
  const persisted = persistence.readPersistedSessions();
368
- const context = { self: () => agentGuidance.cliPeerSelf(process.env, cwd, persisted), readPersisted: () => persisted };
377
+ const context = { self: () => peerTools.cliPeerSelf(process.env, cwd, persisted), readPersisted: () => persisted };
369
378
  if (options.action === "peers") {
370
- const listing = options.machine ? await agentGuidance.listRemotePeers(options.machine, { ...options.scope ? { scope: options.scope } : {}, ...options.cwd ? { cwd: options.cwd } : {} }) : await agentGuidance.listPeerSessions(context, options.scope ?? "repo");
379
+ const listing = options.machine ? await remoteSessionClient.listRemotePeers(options.machine, { ...options.scope ? { scope: options.scope } : {}, ...options.cwd ? { cwd: options.cwd } : {} }) : await peerTools.listPeerSessions(context, options.scope ?? "repo");
371
380
  if (options.json) {
372
381
  console.log(JSON.stringify(listing));
373
382
  } else if (listing.peers.length === 0) {
@@ -388,7 +397,7 @@ async function handleSessionsCommand(args) {
388
397
  }
389
398
  const target = options.sessionId;
390
399
  try {
391
- const result = await agentGuidance.sendPeerMessage(context, { to: target, body: options.text, replyTo: options.replyTo, ...options.machine ? { machineId: options.machine } : {} });
400
+ const result = await peerTools.sendPeerMessage(context, { to: target, body: options.text, replyTo: options.replyTo, ...options.machine ? { machineId: options.machine } : {} });
392
401
  if (options.json) console.log(JSON.stringify(result));
393
402
  else if (result.delivered) console.log(`Message ${result.messageId} delivered to ${target}${result.machine ? ` on ${result.machine.host}` : ""}
394
403
  ${result.url}`);
@@ -407,27 +416,27 @@ ${result.url}`);
407
416
  if (local) {
408
417
  if (options.wait) {
409
418
  try {
410
- await agentGuidance.waitForTurnEnd(sessionId, { timeoutMs: (options.timeoutSec ?? 600) * 1e3 });
419
+ await sessionOps.waitForTurnEnd(sessionId, { timeoutMs: (options.timeoutSec ?? 600) * 1e3 });
411
420
  } catch (error) {
412
- if (!(error instanceof agentGuidance.TurnWaitTimeoutError)) throw error;
421
+ if (!(error instanceof sessionOps.TurnWaitTimeoutError)) throw error;
413
422
  timedOut = true;
414
423
  console.error(chalk.yellow("Timeout:"), error.message);
415
424
  }
416
425
  }
417
- result = await agentGuidance.readSessionTranscript(sessionId, options.limit ?? 20, { full: options.full });
426
+ result = await sessionOps.readSessionTranscript(sessionId, options.limit ?? 20, { full: options.full });
418
427
  } else {
419
428
  const readOptions = { limit: options.limit ?? 20, full: options.full, ...options.machine ? { machineId: options.machine } : {} };
420
429
  let remote;
421
430
  if (options.wait) {
422
431
  const timeoutMs = (options.timeoutSec ?? 600) * 1e3;
423
- const waited = await agentGuidance.waitForRemoteTurnEnd(sessionId, { ...readOptions, timeoutMs });
432
+ const waited = await remoteSessionClient.waitForRemoteTurnEnd(sessionId, { ...readOptions, timeoutMs });
424
433
  remote = waited.read;
425
434
  if (waited.timedOut) {
426
435
  timedOut = true;
427
436
  console.error(chalk.yellow("Timeout:"), `Session ${sessionId} on ${remote.host}: the latest turn did not end within ${Math.round(timeoutMs / 1e3)}s`);
428
437
  }
429
438
  } else {
430
- remote = await agentGuidance.readRemoteTranscript(sessionId, readOptions);
439
+ remote = await remoteSessionClient.readRemoteTranscript(sessionId, readOptions);
431
440
  }
432
441
  const { machineId, host, ...rest } = remote;
433
442
  result = { ...rest, machine: { id: machineId, host } };
@@ -447,7 +456,7 @@ ${result.url}`);
447
456
  process.exit(timedOut ? 2 : 0);
448
457
  }
449
458
  if (options.action === "stop") {
450
- const stopped = await agentGuidance.stopSession(sessionId);
459
+ const stopped = await sessionOps.stopSession(sessionId);
451
460
  if (!stopped) {
452
461
  if (options.json) console.log(JSON.stringify({ sessionId, stopped: false }));
453
462
  console.error(chalk.red("Error:"), `Session ${sessionId} is not among the daemon's running sessions.`);
@@ -462,7 +471,7 @@ ${result.url}`);
462
471
  const verdict = options.action === "approve" ? { kind: "approve", forSession: options.forSession } : { kind: "deny", reason: options.reason };
463
472
  let result;
464
473
  try {
465
- result = await agentGuidance.resolvePermissionRequest(sessionId, requestId, verdict, {
474
+ result = await sessionOps.resolvePermissionRequest(sessionId, requestId, verdict, {
466
475
  // T-014: a rate refusal waits (bounded) before re-sending;
467
476
  // say so on stderr so the wait does not look like a hang.
468
477
  onRateLimited: ({ attempt, waitMs, serverError }) => {
@@ -487,7 +496,7 @@ ${result.url}`);
487
496
  }
488
497
  process.exit(0);
489
498
  }
490
- await agentGuidance.archiveSession(sessionId);
499
+ await sessionOps.archiveSession(sessionId);
491
500
  if (options.json) console.log(JSON.stringify({ sessionId, archived: true }));
492
501
  else console.log(`Archived ${sessionId}`);
493
502
  process.exit(0);