very-happy-cli 0.2.175 → 0.2.177
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AcpBackend-Sb6N_HcB.cjs → AcpBackend-B-ny68XM.cjs} +188 -37
- package/dist/{AcpBackend-BZrLVcHb.mjs → AcpBackend-B0K0WrtW.mjs} +187 -38
- package/dist/{AcpSessionManager-C2MqOirs.cjs → AcpSessionManager-CjdJLofq.cjs} +1 -1
- package/dist/{AcpSessionManager-y1Iy1mzc.mjs → AcpSessionManager-DykjzBM4.mjs} +1 -1
- package/dist/{BasePermissionHandler-BbLYwd13.cjs → BasePermissionHandler-DR6nxuEn.cjs} +1 -1
- package/dist/{BasePermissionHandler-DriZLITp.mjs → BasePermissionHandler-hdY7kTqX.mjs} +1 -1
- package/dist/{agentHome-BoYfpemd.cjs → agentHome-BdTXEUPe.cjs} +4 -4
- package/dist/{agentHome-BtuRubHG.mjs → agentHome-GRN2VfHv.mjs} +4 -4
- package/dist/{api-KZmVqSKO.cjs → api-BWX10o97.cjs} +17 -10
- package/dist/{api-D08IEaWa.mjs → api-CKBViqI3.mjs} +18 -11
- package/dist/{apiMachine-Dct2GDAq.cjs → apiMachine-BYYFGgFs.cjs} +15 -14
- package/dist/{apiMachine-Cx9Zn-78.mjs → apiMachine-DttO4UFj.mjs} +15 -14
- package/dist/{attachmentContent-PrNJg8gG.mjs → attachmentContent-cPVF463_.mjs} +2 -2
- package/dist/{attachmentContent-4L9dO8E3.cjs → attachmentContent-kJKXpkMX.cjs} +2 -2
- package/dist/{attachmentLimits-BLbji11b.mjs → attachmentLimits-Di1Z93lN.mjs} +1 -1
- package/dist/{attachmentLimits-D6bT2jU1.cjs → attachmentLimits-DtFqqiwR.cjs} +1 -1
- package/dist/{auth-D1qHU-i_.mjs → auth-BmESeKuM.mjs} +5 -5
- package/dist/{auth-PY_HGlzz.mjs → auth-CKdXb9zp.mjs} +8 -8
- package/dist/{auth-BGmM3Vlm.cjs → auth-CTECt2Oz.cjs} +5 -5
- package/dist/{auth-BI0CsMcy.cjs → auth-DNxVmVbn.cjs} +8 -8
- package/dist/{auto-COMphIfD.mjs → auto-Ch3203qd.mjs} +17 -16
- package/dist/{auto-DM4_FeKb.cjs → auto-D1ypjjfx.cjs} +16 -15
- package/dist/{backgroundTaskActivity-8PdPxrvy.mjs → backgroundTaskActivity-BVwJBl02.mjs} +1 -1
- package/dist/{bootstrap-DTJ6-vYT.cjs → bootstrap-6OI698q9.cjs} +2 -2
- package/dist/{bootstrap-CWjpC5-J.mjs → bootstrap-C0s2bPFQ.mjs} +2 -2
- package/dist/{browser-xuW4fiHo.mjs → browser-BlLWZUMx.mjs} +1 -1
- package/dist/{browser-DmgVoopB.cjs → browser-DG6Uof5O.cjs} +1 -1
- package/dist/{claudeLocal-B0P-wVJJ.mjs → claudeLocal-CcWcKnoo.mjs} +5 -5
- package/dist/{claudeLocal-CtZVz3ee.cjs → claudeLocal-CemsIArT.cjs} +5 -5
- package/dist/{claudeLocalLauncher-D4vmjI3c.mjs → claudeLocalLauncher-7p6y88nj.mjs} +15 -18
- package/dist/{claudeLocalLauncher-Dnv4CH8r.cjs → claudeLocalLauncher-A4VuevIi.cjs} +15 -18
- package/dist/{claudeSessionFork-CxjOBoBh.mjs → claudeSessionFork-BtROOjqf.mjs} +1 -1
- package/dist/{claudeSessionFork-DQk5-dzR.cjs → claudeSessionFork-CbDfm8Fz.cjs} +1 -1
- package/dist/{client-eQjOvC55.mjs → client-BPMWutfs.mjs} +3 -3
- package/dist/{client-BhLhjj_x.cjs → client-COmgDDy0.cjs} +2 -2
- package/dist/{client-C4ddTzrD.mjs → client-DG5ndWLw.mjs} +2 -2
- package/dist/{client-BHZVyQwi.cjs → client-DyvBTYee.cjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +15 -15
- package/dist/codex/happyMcpStdioBridge.mjs +16 -16
- package/dist/{codexAppServerClient-CppPl_R6.mjs → codexAppServerClient-D-Z8qSfI.mjs} +233 -24
- package/dist/{codexAppServerClient-D-9z-lWP.cjs → codexAppServerClient-R24WZZfg.cjs} +233 -24
- package/dist/{codexCommand-AgVJYnFU.cjs → codexCommand-6hW19gsq.cjs} +159 -84
- package/dist/{codexCommand-BdrBNbZu.mjs → codexCommand-CVTkZJ1o.mjs} +158 -83
- package/dist/{BaseReasoningProcessor-_S1PbSvH.cjs → codexTermination-BBU7e92y.cjs} +25 -1
- package/dist/{BaseReasoningProcessor-DnykPlPo.mjs → codexTermination-CCIfwzcx.mjs} +25 -2
- package/dist/{config-Cr3VUzbE.mjs → config-CvsNChKX.mjs} +3 -3
- package/dist/{config-D89sE3wK.cjs → config-DhdrvOLV.cjs} +3 -3
- package/dist/{configuration-BNGPXg07.mjs → configuration-D55F0t16.mjs} +1 -1
- package/dist/{configuration-UV4EE5ui.cjs → configuration-DZPy0T9Z.cjs} +1 -1
- package/dist/{connect-C0iLkCiY.mjs → connect-CwCXMRmD.mjs} +14 -14
- package/dist/{connect-B35YXbdZ.cjs → connect-Wz-XZYXW.cjs} +13 -13
- package/dist/{context-BmH2BKip.cjs → context-BKbrZ55r.cjs} +1 -1
- package/dist/{context-Ptdnlcv6.mjs → context-CCRpVXFo.mjs} +1 -1
- package/dist/{controlClient-DqtC0pq1.mjs → controlClient-C4xB5J6O.mjs} +4 -4
- package/dist/{controlClient-CtsQMw--.cjs → controlClient-SX8gSza2.cjs} +3 -3
- package/dist/{createSessionMetadata-2IuH5nlA.cjs → createSessionMetadata-BCFmYlBo.cjs} +2 -2
- package/dist/{createSessionMetadata-CtNMvfth.mjs → createSessionMetadata-Bi-m0Y_O.mjs} +2 -2
- package/dist/{defaultPermissionMode-Bn4HcU8S.cjs → defaultPermissionMode-DMBEnXll.cjs} +2 -2
- package/dist/{defaultPermissionMode-DYihjV2g.mjs → defaultPermissionMode-wBcbBezm.mjs} +2 -2
- package/dist/{deterministicJson-DF4xv6MH.mjs → deterministicJson-BkQETt8_.mjs} +9 -9
- package/dist/{deterministicJson-je21npNx.cjs → deterministicJson-ChGfQEF6.cjs} +9 -9
- package/dist/{doctor-Ba92L7-b.mjs → doctor-B9c2C9dF.mjs} +8 -8
- package/dist/{doctor-BXKcYVGU.cjs → doctor-BsN3JZJn.cjs} +7 -7
- package/dist/{downloadTarget-CUJg8iJV.mjs → downloadTarget-ByXzbDK4.mjs} +6 -6
- package/dist/{downloadTarget-JC7FZl7W.cjs → downloadTarget-Dj3WoVJa.cjs} +6 -6
- package/dist/{ensureDaemonRunning-JPA9tHNE.mjs → ensureDaemonRunning--HYzs5Ce.mjs} +5 -5
- package/dist/{ensureDaemonRunning-bIp6-vgi.cjs → ensureDaemonRunning-7Wb8M7Lv.cjs} +5 -5
- package/dist/{handleResumeCommand-B6lE5DtU.mjs → handleResumeCommand-DHddBkNJ.mjs} +5 -5
- package/dist/{handleResumeCommand-B6b9kIYf.cjs → handleResumeCommand-OmuUGYjQ.cjs} +5 -5
- package/dist/{index-B2KL0aPc.cjs → index-BRJzH4sc.cjs} +141 -87
- package/dist/{index-CjE4kBKx.mjs → index-BzJNDsJq.mjs} +143 -89
- package/dist/{index-B6UGRQ7h.mjs → index-CEjJnq05.mjs} +3 -0
- package/dist/{index-CZLwo1FS.mjs → index-CEm0MYiS.mjs} +3 -3
- package/dist/{index-B1ABQRrB.cjs → index-CrR4JISa.cjs} +4 -4
- package/dist/{index-D759ViMU.cjs → index-D9NoYc5I.cjs} +3 -3
- package/dist/{index-D3kI0hDR.cjs → index-DFPT4HOO.cjs} +3 -0
- package/dist/{index-boE-d8CM.mjs → index-DMy3OCBe.mjs} +8 -1
- package/dist/{index-BZdhwBKa.cjs → index-De8L5lFK.cjs} +8 -0
- package/dist/{index-DW1ONaGc.mjs → index-Dhl6_bw7.mjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-KjIsK_EA.cjs → install-1qn-D9FS.cjs} +3 -3
- package/dist/{install-CmojqnLK.mjs → install-BDIUtPXi.mjs} +3 -3
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +7 -1
- package/dist/lib.d.mts +7 -1
- package/dist/lib.mjs +13 -13
- package/dist/{lidState-CL1NdKfQ.mjs → lidState-BqVsw7H1.mjs} +1 -1
- package/dist/{lidState-BmJp2pLt.cjs → lidState-DxbK0qfu.cjs} +1 -1
- package/dist/{localHappyAgentAuth-B7f4Ysn0.mjs → localHappyAgentAuth-Ce8kO2yc.mjs} +1 -1
- package/dist/{localHappyAgentAuth-9SP7hdiw.cjs → localHappyAgentAuth-D5tANdRD.cjs} +1 -1
- package/dist/{logger-D5EzMy30.mjs → logger-13cBr_ew.mjs} +2 -2
- package/dist/{logger-C7dRaCkE.cjs → logger-LvwVeATU.cjs} +2 -2
- package/dist/{machineMetadata-DYYuK_0c.cjs → machineMetadata-29h7vgf4.cjs} +3 -3
- package/dist/{machineMetadata-DqplCWue.mjs → machineMetadata-dMida2qq.mjs} +3 -3
- package/dist/{main-kgCQgknK.cjs → main-DpM5jaFH.cjs} +44 -44
- package/dist/{main-CnV62agu.mjs → main-x4nAhdH5.mjs} +44 -44
- package/dist/{mcp-bDPaj-tM.mjs → mcp-DMiFGYMT.mjs} +15 -15
- package/dist/{mcp-BV0vxHtz.cjs → mcp-DQv3caXs.cjs} +14 -14
- package/dist/{mirrorProtocol-BSHVZ8Nf.cjs → mirrorProtocol-BfrERW7Z.cjs} +3 -3
- package/dist/{mirrorProtocol-ClKhNXYe.mjs → mirrorProtocol-Bz8tEabR.mjs} +3 -3
- package/dist/{package-VqWv7EI5.cjs → package-Ch9WGDV_.cjs} +7 -7
- package/dist/{package-D0dxZ-W8.mjs → package-CjlsAaRe.mjs} +7 -7
- package/dist/{peerTools-B_eiNB3P.mjs → peerTools-CxmrKnfV.mjs} +4 -4
- package/dist/{peerTools-BktGmlpd.cjs → peerTools-DtGKWli5.cjs} +4 -4
- package/dist/{persistence-CIIhP0Uw.mjs → persistence-C_tYtOqK.mjs} +2 -2
- package/dist/{persistence-DweHi8xa.cjs → persistence-DXbKOHxl.cjs} +2 -2
- package/dist/{piRunnerArgs-BNzWTNRV.cjs → piRunnerArgs-BVRZe2AR.cjs} +1 -1
- package/dist/{piRunnerArgs-cQafsadv.mjs → piRunnerArgs-BpHc-JZl.mjs} +1 -1
- package/dist/{piRuntime-VZLSwW-4.cjs → piRuntime-D7eio8Ix.cjs} +1 -1
- package/dist/{piRuntime-Bel5lOLb.mjs → piRuntime-DOdGF395.mjs} +1 -1
- package/dist/{piTerminal-CS5SDi_H.mjs → piTerminal-dpxz4Q8D.mjs} +17 -17
- package/dist/{piTerminal-DkR8sPv-.cjs → piTerminal-y_PRo2NY.cjs} +16 -16
- package/dist/processTree-CMHWlVse.cjs +66 -0
- package/dist/processTree-CP5IvQ2Z.mjs +61 -0
- package/dist/{rateLimitWindows-Bp4T21RI.cjs → rateLimitWindows-DFnMU2Vt.cjs} +1 -1
- package/dist/{rateLimitWindows-Bo6XVnie.mjs → rateLimitWindows-DYHDGuzQ.mjs} +1 -1
- package/dist/{registerCommonHandlers-B7QZxkCL.cjs → registerCommonHandlers-60VuTkdg.cjs} +2 -2
- package/dist/{registerCommonHandlers-CR5jpiSx.mjs → registerCommonHandlers-D8OMpBbQ.mjs} +2 -2
- package/dist/{registerKillSessionHandler-DLiu24CQ.mjs → registerKillSessionHandler-Drhf7-Vz.mjs} +6 -6
- package/dist/{registerKillSessionHandler-CcX84g-T.cjs → registerKillSessionHandler-pqChBKwO.cjs} +6 -6
- package/dist/{remoteSessionClient-CL3akj0K.cjs → remoteSessionClient-B7NvjHD3.cjs} +5 -5
- package/dist/{remoteSessionClient-CUjw1COc.mjs → remoteSessionClient-D01Hso2-.mjs} +5 -5
- package/dist/{reportProgressTool-BLLwMQrN.mjs → reportProgressTool-B203EZCR.mjs} +2 -2
- package/dist/{reportProgressTool-DzMi4mvH.cjs → reportProgressTool-Du_zAK4h.cjs} +2 -2
- package/dist/{run-DGokR_6q.mjs → run-DX4Zs3Ug.mjs} +34 -34
- package/dist/{run-5pmOElaW.cjs → run-DZ5jU53c.cjs} +34 -34
- package/dist/{runClaude-BFlpZQds.mjs → runClaude-CgPHXP0L.mjs} +27 -23
- package/dist/{runClaude-EnYNvkV0.cjs → runClaude-ClRhHpwR.cjs} +26 -22
- package/dist/{runClaudeDeps-CUDebE9e.cjs → runClaudeDeps-D2v_WDSL.cjs} +387 -89
- package/dist/{runClaudeDeps-D1M1dzlZ.mjs → runClaudeDeps-Dz2iydq4.mjs} +393 -95
- package/dist/{runGemini-Bu69Zu1u.cjs → runGemini-BtZqGFkp.cjs} +208 -193
- package/dist/{runGemini-Bub8T5cM.mjs → runGemini-DBXxpoY8.mjs} +208 -193
- package/dist/{runOpenClaw-DVu73F_i.mjs → runOpenClaw-BOHpzCEU.mjs} +19 -19
- package/dist/{runOpenClaw-Cob5F3FC.cjs → runOpenClaw-D8q8G57u.cjs} +18 -18
- package/dist/{sandbox-9EKOFyQF.mjs → sandbox-C452Vrsc.mjs} +4 -4
- package/dist/{sandbox-GDqMagSF.cjs → sandbox-Cu9mMzjx.cjs} +4 -4
- package/dist/selfCheck-BAvqBwBR.mjs +84 -0
- package/dist/{selfCheck-DiNo34da.cjs → selfCheck-gKa3uVr1.cjs} +35 -35
- package/dist/{send-ThC80164.cjs → send-2Vb5eppI.cjs} +8 -8
- package/dist/{send-wgtHphq8.mjs → send-B8HARi7x.mjs} +9 -9
- package/dist/{server-Bb8v2fOj.mjs → server-BBWCIZyS.mjs} +4 -4
- package/dist/{server-bidHnstE.cjs → server-Db9Wuam3.cjs} +6 -6
- package/dist/{sessionLock-BWBcBZKh.cjs → sessionLock-6qL_N6Rn.cjs} +3 -3
- package/dist/{sessionLock-gb32sVPR.mjs → sessionLock-ZfvFVdUi.mjs} +3 -3
- package/dist/{sessionModeFile-C-fr1M1h.mjs → sessionModeFile-CWVq8AT9.mjs} +1 -1
- package/dist/{sessionModeFile-DhuTNcJr.cjs → sessionModeFile-CsLtn_PL.cjs} +1 -1
- package/dist/{sessionOps-ByZJbkMq.mjs → sessionOps-CdgbEJgf.mjs} +5 -5
- package/dist/{sessionOps-9MChM9Op.cjs → sessionOps-Dmt7WUUs.cjs} +4 -4
- package/dist/{sessionScanner-CxXPAVyS.mjs → sessionScanner-CNVaSNOn.mjs} +34 -4
- package/dist/{sessionScanner-BpegdnXK.cjs → sessionScanner-CQL_WSaC.cjs} +34 -3
- package/dist/{sessions-C1X4z_Lm.cjs → sessions-BJblG_Hx.cjs} +9 -9
- package/dist/{sessions-l-UgJGjV.mjs → sessions-DTomHfFg.mjs} +10 -10
- package/dist/{setupOfflineReconnection-CgtXlV74.mjs → setupOfflineReconnection-C5trsV-j.mjs} +2 -2
- package/dist/{setupOfflineReconnection-CS_8Da8R.cjs → setupOfflineReconnection-DVA0VpQL.cjs} +2 -2
- package/dist/{spawn-FyoHqYWo.mjs → spawn-CQJFgoOq.mjs} +15 -14
- package/dist/{spawn-D2BlNdZu.cjs → spawn-DRyNAqD8.cjs} +14 -13
- package/dist/{spawnAgents-BhsbJ253.mjs → spawnAgents-BjtmjBvP.mjs} +1 -1
- package/dist/{spawnAgents-CgMKuOhZ.cjs → spawnAgents-CCjJifAW.cjs} +1 -1
- package/dist/{spawnHappyCLI-DsC256j_.mjs → spawnHappyCLI-B_0RWxD4.mjs} +1 -1
- package/dist/{spawnHappyCLI-DByQcqEN.cjs → spawnHappyCLI-ChniczJ5.cjs} +1 -1
- package/dist/{specialCommands-DGUeZqdm.cjs → specialCommands-DbntVs0d.cjs} +3 -3
- package/dist/{specialCommands-DUUBqzvd.mjs → specialCommands-DkdFJi4N.mjs} +3 -3
- package/dist/{startFileWatcher-BtBaahTn.cjs → startFileWatcher-C292fhra.cjs} +1 -1
- package/dist/{startFileWatcher-CaYRObJu.mjs → startFileWatcher-UQyTSRAP.mjs} +1 -1
- package/dist/{streamRelay-DqPFsCgx.cjs → streamRelay-Cx01enfe.cjs} +1 -1
- package/dist/{streamRelay-C8zI7OnR.mjs → streamRelay-_qCd873P.mjs} +1 -1
- package/dist/{sync-D5YqUVjS.mjs → sync-C3p7-KLn.mjs} +1 -1
- package/dist/{sync-BK-IBkuB.cjs → sync-C7sxoUYG.cjs} +1 -1
- package/dist/{systemPrompt-e-qeag_h.mjs → systemPrompt-CdHOlyVW.mjs} +2 -2
- package/dist/{systemPrompt-DaTKLEb-.cjs → systemPrompt-DtibzbRU.cjs} +2 -2
- package/dist/{teams-D9xwa_d3.cjs → teams-D7O7TpVU.cjs} +6 -6
- package/dist/{teams-ClrppvKu.mjs → teams-ujXr3AFn.mjs} +6 -6
- package/dist/{time-0szhiPo4.cjs → time-Dg5tVB8S.cjs} +1 -1
- package/dist/{time-CvrpeD3S.mjs → time-yEL6wHUF.mjs} +1 -1
- package/dist/{titleGenerator-Dz5P7sE1.cjs → titleGenerator-BMEaDTwU.cjs} +2 -2
- package/dist/{titleGenerator-BZ5770wq.mjs → titleGenerator-Dr-BtjzO.mjs} +1 -1
- package/dist/{todo-CkmNJQey.cjs → todo-CUcFamGs.cjs} +6 -6
- package/dist/{todo-o-miKcN2.mjs → todo-CvJe4M2C.mjs} +6 -6
- package/dist/{tools-Cp0qJeBq.mjs → tools-BrM3bZW5.mjs} +1 -1
- package/dist/{tools-C77-Ssan.cjs → tools-DDKTB5aQ.cjs} +1 -1
- package/dist/{uninstall-DGUPERDX.cjs → uninstall-7oLuhYIu.cjs} +3 -3
- package/dist/{uninstall-jNJDCLD_.mjs → uninstall-CEcMMQGz.mjs} +3 -3
- package/package.json +7 -7
- package/dist/selfCheck-CNo4uzGB.mjs +0 -84
|
@@ -1,83 +1,83 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var logger = require('./logger-
|
|
4
|
-
var controlClient = require('./controlClient-
|
|
3
|
+
var logger = require('./logger-LvwVeATU.cjs');
|
|
4
|
+
var controlClient = require('./controlClient-SX8gSza2.cjs');
|
|
5
5
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
6
6
|
var node_crypto = require('node:crypto');
|
|
7
7
|
var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-DFPT4HOO.cjs');
|
|
9
9
|
var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
|
|
10
10
|
var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
|
|
11
|
-
var systemPrompt = require('./systemPrompt-
|
|
11
|
+
var systemPrompt = require('./systemPrompt-DtibzbRU.cjs');
|
|
12
12
|
var path$1 = require('node:path');
|
|
13
|
-
var specialCommands = require('./specialCommands-
|
|
13
|
+
var specialCommands = require('./specialCommands-DbntVs0d.cjs');
|
|
14
14
|
require('axios');
|
|
15
15
|
require('node:events');
|
|
16
16
|
require('socket.io-client');
|
|
17
|
-
var attachmentLimits = require('./attachmentLimits-
|
|
17
|
+
var attachmentLimits = require('./attachmentLimits-DtFqqiwR.cjs');
|
|
18
18
|
require('tweetnacl');
|
|
19
|
-
var configuration = require('./configuration-
|
|
20
|
-
require('./index-
|
|
21
|
-
require('./registerCommonHandlers-
|
|
19
|
+
var configuration = require('./configuration-DZPy0T9Z.cjs');
|
|
20
|
+
require('./index-De8L5lFK.cjs');
|
|
21
|
+
require('./registerCommonHandlers-60VuTkdg.cjs');
|
|
22
22
|
require('os');
|
|
23
23
|
require('child_process');
|
|
24
24
|
require('@paralleldrive/cuid2');
|
|
25
|
-
require('./persistence-
|
|
25
|
+
require('./persistence-DXbKOHxl.cjs');
|
|
26
26
|
var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
27
27
|
require('chalk');
|
|
28
28
|
var types = require('./types-CRS-srZK.cjs');
|
|
29
29
|
var path = require('./path-B7zW-WwE.cjs');
|
|
30
30
|
var fs = require('fs/promises');
|
|
31
|
-
var time = require('./time-
|
|
31
|
+
var time = require('./time-Dg5tVB8S.cjs');
|
|
32
32
|
var node_fs = require('node:fs');
|
|
33
|
-
var deterministicJson = require('./deterministicJson-
|
|
34
|
-
var sessionScanner = require('./sessionScanner-
|
|
33
|
+
var deterministicJson = require('./deterministicJson-ChGfQEF6.cjs');
|
|
34
|
+
var sessionScanner = require('./sessionScanner-CQL_WSaC.cjs');
|
|
35
35
|
var node_child_process = require('node:child_process');
|
|
36
|
-
var streamRelay = require('./streamRelay-
|
|
37
|
-
var attachmentContent = require('./attachmentContent-
|
|
36
|
+
var streamRelay = require('./streamRelay-Cx01enfe.cjs');
|
|
37
|
+
var attachmentContent = require('./attachmentContent-kJKXpkMX.cjs');
|
|
38
38
|
var promises = require('node:fs/promises');
|
|
39
|
-
var claudeSessionFork = require('./claudeSessionFork-
|
|
40
|
-
var registerKillSessionHandler = require('./registerKillSessionHandler-
|
|
41
|
-
var doctor = require('./doctor-
|
|
39
|
+
var claudeSessionFork = require('./claudeSessionFork-CbDfm8Fz.cjs');
|
|
40
|
+
var registerKillSessionHandler = require('./registerKillSessionHandler-pqChBKwO.cjs');
|
|
41
|
+
var doctor = require('./doctor-BsN3JZJn.cjs');
|
|
42
42
|
var node_http = require('node:http');
|
|
43
43
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
44
44
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
45
|
-
var titleGenerator = require('./titleGenerator-
|
|
45
|
+
var titleGenerator = require('./titleGenerator-BMEaDTwU.cjs');
|
|
46
46
|
var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
|
|
47
|
-
var reportProgressTool = require('./reportProgressTool-
|
|
47
|
+
var reportProgressTool = require('./reportProgressTool-Du_zAK4h.cjs');
|
|
48
48
|
require('node:util');
|
|
49
49
|
require('./smallFastModel-D_uxGMo3.cjs');
|
|
50
50
|
require('./trimIdent-4gvk9Wk6.cjs');
|
|
51
51
|
require('node:os');
|
|
52
52
|
require('./agentGuidance-BtBx2xxE.cjs');
|
|
53
|
-
require('./rateLimitWindows-
|
|
53
|
+
require('./rateLimitWindows-DFnMU2Vt.cjs');
|
|
54
54
|
require('zod');
|
|
55
|
-
require('./package-
|
|
55
|
+
require('./package-Ch9WGDV_.cjs');
|
|
56
56
|
require('util');
|
|
57
57
|
require('crypto');
|
|
58
58
|
require('path');
|
|
59
59
|
require('cross-spawn');
|
|
60
60
|
require('./authRelay-BdYkC1Po.cjs');
|
|
61
|
-
require('./client-
|
|
62
|
-
require('./context-
|
|
63
|
-
require('./sessionOps-
|
|
61
|
+
require('./client-DyvBTYee.cjs');
|
|
62
|
+
require('./context-BKbrZ55r.cjs');
|
|
63
|
+
require('./sessionOps-Dmt7WUUs.cjs');
|
|
64
64
|
require('./resources-JDPugcDq.cjs');
|
|
65
|
-
require('./tools-
|
|
66
|
-
require('./peerTools-
|
|
65
|
+
require('./tools-DDKTB5aQ.cjs');
|
|
66
|
+
require('./peerTools-DtGKWli5.cjs');
|
|
67
67
|
require('./ids-B6ZC0HGt.cjs');
|
|
68
|
-
require('./remoteSessionClient-
|
|
68
|
+
require('./remoteSessionClient-B7NvjHD3.cjs');
|
|
69
69
|
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
70
70
|
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
71
71
|
require('./limits-C-a7gr04.cjs');
|
|
72
|
-
require('./downloadTarget-
|
|
72
|
+
require('./downloadTarget-Dj3WoVJa.cjs');
|
|
73
73
|
require('./terminals-B_bfC9c2.cjs');
|
|
74
74
|
require('./terminalTitleSuggest-DhvRFX3H.cjs');
|
|
75
75
|
require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
76
|
-
require('./bootstrap-
|
|
76
|
+
require('./bootstrap-6OI698q9.cjs');
|
|
77
77
|
require('./previewPath-B0rBdhy1.cjs');
|
|
78
|
-
require('./sync-
|
|
78
|
+
require('./sync-C7sxoUYG.cjs');
|
|
79
79
|
require('./transcriptCursor-DcXGLeSc.cjs');
|
|
80
|
-
require('./startFileWatcher-
|
|
80
|
+
require('./startFileWatcher-C292fhra.cjs');
|
|
81
81
|
require('node:readline');
|
|
82
82
|
require('./doctor-u46qYYKX.cjs');
|
|
83
83
|
require('ps-list');
|
|
@@ -85,11 +85,11 @@ require('./doctorReadiness-BCZGcN0a.cjs');
|
|
|
85
85
|
require('./detectCLI-DR9ZaN6B.cjs');
|
|
86
86
|
require('fs');
|
|
87
87
|
require('./cliUpdate-DsKXPFYp.cjs');
|
|
88
|
-
require('./piRunnerArgs-
|
|
89
|
-
require('./sessionModeFile-
|
|
88
|
+
require('./piRunnerArgs-BVRZe2AR.cjs');
|
|
89
|
+
require('./sessionModeFile-CsLtn_PL.cjs');
|
|
90
90
|
require('url');
|
|
91
91
|
require('node:module');
|
|
92
|
-
require('./client-
|
|
92
|
+
require('./client-COmgDDy0.cjs');
|
|
93
93
|
require('./precheckCompat-CWOi5c9L.cjs');
|
|
94
94
|
|
|
95
95
|
const SCHEDULE_WAKEUP_GRACE_MS = 6e4;
|
|
@@ -1023,17 +1023,159 @@ function createClaudePrewarmLease(input) {
|
|
|
1023
1023
|
return lease;
|
|
1024
1024
|
}
|
|
1025
1025
|
|
|
1026
|
-
|
|
1026
|
+
class TimeoutError extends Error {
|
|
1027
|
+
constructor(message) {
|
|
1028
|
+
super(message);
|
|
1029
|
+
this.name = "TimeoutError";
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
function withTimeout(promise, ms, label) {
|
|
1027
1033
|
promise.catch(() => {
|
|
1028
1034
|
});
|
|
1029
1035
|
let timer;
|
|
1030
1036
|
const timeout = new Promise((_, reject) => {
|
|
1031
|
-
timer = setTimeout(() => reject(new
|
|
1037
|
+
timer = setTimeout(() => reject(new TimeoutError(`${label ? `${label} ` : ""}timed out after ${ms}ms`)), ms);
|
|
1032
1038
|
});
|
|
1033
1039
|
return Promise.race([promise, timeout]).finally(() => {
|
|
1034
1040
|
if (timer) clearTimeout(timer);
|
|
1035
1041
|
});
|
|
1036
1042
|
}
|
|
1043
|
+
|
|
1044
|
+
function readClaudeSessionState(message) {
|
|
1045
|
+
const m = message;
|
|
1046
|
+
if (!m || m.type !== "system" || m.subtype !== "session_state_changed") return null;
|
|
1047
|
+
return m.state === "idle" || m.state === "running" || m.state === "requires_action" ? m.state : null;
|
|
1048
|
+
}
|
|
1049
|
+
function createClaudeTurnTracker() {
|
|
1050
|
+
let pending = false;
|
|
1051
|
+
let open = false;
|
|
1052
|
+
let idleOwed = 0;
|
|
1053
|
+
return {
|
|
1054
|
+
get isOpen() {
|
|
1055
|
+
return open;
|
|
1056
|
+
},
|
|
1057
|
+
get isPending() {
|
|
1058
|
+
return pending;
|
|
1059
|
+
},
|
|
1060
|
+
/** A prompt was pushed into the Query. Not a turn yet: the CLI has to pick it up. */
|
|
1061
|
+
pushed() {
|
|
1062
|
+
pending = true;
|
|
1063
|
+
},
|
|
1064
|
+
/** The CLI reported `init` for a turn: it is running. Idempotent. */
|
|
1065
|
+
announced() {
|
|
1066
|
+
open = true;
|
|
1067
|
+
pending = false;
|
|
1068
|
+
},
|
|
1069
|
+
/** A `result` frame: true when it ends the turn (the caller runs its turn-end), false when the turn already ended. */
|
|
1070
|
+
onResult() {
|
|
1071
|
+
if (!open && !pending) return false;
|
|
1072
|
+
open = false;
|
|
1073
|
+
pending = false;
|
|
1074
|
+
idleOwed += 1;
|
|
1075
|
+
return true;
|
|
1076
|
+
},
|
|
1077
|
+
onSessionState(state) {
|
|
1078
|
+
if (state === "running") {
|
|
1079
|
+
idleOwed = 0;
|
|
1080
|
+
open = true;
|
|
1081
|
+
pending = false;
|
|
1082
|
+
return "ignore";
|
|
1083
|
+
}
|
|
1084
|
+
if (state !== "idle") return "ignore";
|
|
1085
|
+
if (idleOwed > 0) {
|
|
1086
|
+
idleOwed -= 1;
|
|
1087
|
+
return "duplicate";
|
|
1088
|
+
}
|
|
1089
|
+
if (!open) return "ignore";
|
|
1090
|
+
open = false;
|
|
1091
|
+
return "end";
|
|
1092
|
+
}
|
|
1093
|
+
};
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
const CLAUDE_COMMAND_LIFECYCLE_STATES = ["queued", "started", "completed", "cancelled", "discarded", "refused"];
|
|
1097
|
+
function readClaudeCommandLifecycle(frame) {
|
|
1098
|
+
const m = frame;
|
|
1099
|
+
if (!m) return null;
|
|
1100
|
+
const isLifecycle = m.type === "command_lifecycle" || m.type === "system" && m.subtype === "command_lifecycle";
|
|
1101
|
+
if (!isLifecycle || typeof m.command_uuid !== "string" || m.command_uuid.length === 0) return null;
|
|
1102
|
+
const state = CLAUDE_COMMAND_LIFECYCLE_STATES.find((candidate) => candidate === m.state);
|
|
1103
|
+
return state ? { uuid: m.command_uuid, state } : null;
|
|
1104
|
+
}
|
|
1105
|
+
const uuidList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.length > 0) : [];
|
|
1106
|
+
const INTERRUPT_CANCEL_QUEUED_CAPABILITY = "interrupt_cancel_queued_v1";
|
|
1107
|
+
const PENDING_MAX = 256;
|
|
1108
|
+
const REPORTED_MAX = 512;
|
|
1109
|
+
function createClaudeCommandTracker() {
|
|
1110
|
+
const pending = /* @__PURE__ */ new Map();
|
|
1111
|
+
const reported = /* @__PURE__ */ new Set();
|
|
1112
|
+
const drop = (uuid) => {
|
|
1113
|
+
pending.delete(uuid);
|
|
1114
|
+
if (reported.has(uuid)) return null;
|
|
1115
|
+
reported.add(uuid);
|
|
1116
|
+
if (reported.size > REPORTED_MAX) reported.delete(reported.values().next().value);
|
|
1117
|
+
return uuid;
|
|
1118
|
+
};
|
|
1119
|
+
return {
|
|
1120
|
+
/** A uuid-stamped user message (prompt or steer) was handed to the Query. */
|
|
1121
|
+
track(uuid) {
|
|
1122
|
+
if (!pending.has(uuid) && pending.size >= PENDING_MAX) pending.delete(pending.keys().next().value);
|
|
1123
|
+
pending.set(uuid, { started: false });
|
|
1124
|
+
},
|
|
1125
|
+
isTracked(uuid) {
|
|
1126
|
+
return pending.has(uuid);
|
|
1127
|
+
},
|
|
1128
|
+
/** A lifecycle frame; returns the uuids now known to have never run. */
|
|
1129
|
+
observe(lifecycle) {
|
|
1130
|
+
const entry = pending.get(lifecycle.uuid);
|
|
1131
|
+
if (!entry) return [];
|
|
1132
|
+
switch (lifecycle.state) {
|
|
1133
|
+
case "queued":
|
|
1134
|
+
return [];
|
|
1135
|
+
case "started":
|
|
1136
|
+
entry.started = true;
|
|
1137
|
+
return [];
|
|
1138
|
+
case "completed":
|
|
1139
|
+
pending.delete(lifecycle.uuid);
|
|
1140
|
+
return [];
|
|
1141
|
+
default: {
|
|
1142
|
+
if (entry.started) {
|
|
1143
|
+
pending.delete(lifecycle.uuid);
|
|
1144
|
+
return [];
|
|
1145
|
+
}
|
|
1146
|
+
const dropped = drop(lifecycle.uuid);
|
|
1147
|
+
return dropped ? [dropped] : [];
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
},
|
|
1151
|
+
/**
|
|
1152
|
+
* An interrupt's receipt: `cancelled` members we track never ran;
|
|
1153
|
+
* `still_queued` members we track are returned for the per-uuid
|
|
1154
|
+
* follow-up (`cancel_async_message`) a CLI without cancel_queued needs.
|
|
1155
|
+
*/
|
|
1156
|
+
onInterruptReceipt(receipt) {
|
|
1157
|
+
const dropped = [];
|
|
1158
|
+
for (const uuid of uuidList(receipt?.cancelled)) {
|
|
1159
|
+
if (!pending.has(uuid)) continue;
|
|
1160
|
+
const result = drop(uuid);
|
|
1161
|
+
if (result) dropped.push(result);
|
|
1162
|
+
}
|
|
1163
|
+
const stillQueued = uuidList(receipt?.still_queued).filter((uuid) => pending.has(uuid));
|
|
1164
|
+
return { dropped, stillQueued };
|
|
1165
|
+
},
|
|
1166
|
+
/** The answer to `cancel_async_message`: true = withdrawn before it ran; false = already dequeued, its lifecycle frames follow. */
|
|
1167
|
+
onCancelResponse(uuid, cancelled) {
|
|
1168
|
+
if (!cancelled || !pending.has(uuid)) return [];
|
|
1169
|
+
const dropped = drop(uuid);
|
|
1170
|
+
return dropped ? [dropped] : [];
|
|
1171
|
+
},
|
|
1172
|
+
clear() {
|
|
1173
|
+
pending.clear();
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
const SET_MODEL_TIMEOUT_MS = 3e4;
|
|
1037
1179
|
const PROMPT_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
1038
1180
|
function promptUuid(uuid) {
|
|
1039
1181
|
return uuid && PROMPT_UUID_RE.test(uuid) ? { uuid } : {};
|
|
@@ -1078,6 +1220,14 @@ async function claudeRemote(opts) {
|
|
|
1078
1220
|
}
|
|
1079
1221
|
}
|
|
1080
1222
|
};
|
|
1223
|
+
const turn = createClaudeTurnTracker();
|
|
1224
|
+
const commandTracker = createClaudeCommandTracker();
|
|
1225
|
+
let cliCapabilities = /* @__PURE__ */ new Set();
|
|
1226
|
+
const reportDroppedCommands = (uuids) => {
|
|
1227
|
+
if (uuids.length === 0) return;
|
|
1228
|
+
logger.logger.debug(`[claudeRemote] ${uuids.length} user message(s) were never read by Claude Code: ${uuids.join(", ")}`);
|
|
1229
|
+
opts.onCommandsDropped?.(uuids);
|
|
1230
|
+
};
|
|
1081
1231
|
let callbackDepth = 0;
|
|
1082
1232
|
const guardCallback = (callback) => (async (...args) => {
|
|
1083
1233
|
callbackDepth++;
|
|
@@ -1335,7 +1485,19 @@ async function claudeRemote(opts) {
|
|
|
1335
1485
|
setPermissionMode: (mode2) => response.setPermissionMode(mode2),
|
|
1336
1486
|
setModel: (model) => response.setModel(modelTarget(model)),
|
|
1337
1487
|
interrupt: async () => {
|
|
1338
|
-
|
|
1488
|
+
const cancelQueued = cliCapabilities.has(INTERRUPT_CANCEL_QUEUED_CAPABILITY);
|
|
1489
|
+
const receipt = await response.interrupt(cancelQueued ? { cancelQueued: true } : void 0);
|
|
1490
|
+
const { dropped, stillQueued } = commandTracker.onInterruptReceipt(receipt);
|
|
1491
|
+
if (!cancelQueued && stillQueued.length > 0) {
|
|
1492
|
+
const cancelAsyncMessage = response.cancelAsyncMessage;
|
|
1493
|
+
if (typeof cancelAsyncMessage === "function") {
|
|
1494
|
+
for (const uuid of stillQueued) {
|
|
1495
|
+
const cancelled = await cancelAsyncMessage.call(response, uuid).then((value) => value === true, () => false);
|
|
1496
|
+
dropped.push(...commandTracker.onCancelResponse(uuid, cancelled));
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
reportDroppedCommands(dropped);
|
|
1339
1501
|
},
|
|
1340
1502
|
// `request` is the SDK's generic control-request sender (every typed
|
|
1341
1503
|
// method wraps it); the public types omit `side_question`, the CLI
|
|
@@ -1345,19 +1507,90 @@ async function claudeRemote(opts) {
|
|
|
1345
1507
|
const body = raw?.response;
|
|
1346
1508
|
return body && typeof body === "object" ? body : { response: null };
|
|
1347
1509
|
},
|
|
1348
|
-
steer: (message, nextMode) => {
|
|
1510
|
+
steer: (message, nextMode, localKey) => {
|
|
1349
1511
|
mode = { ...nextMode, model: mode.model };
|
|
1512
|
+
const uuid = promptUuid(localKey);
|
|
1513
|
+
if (uuid.uuid) commandTracker.track(uuid.uuid);
|
|
1350
1514
|
messages.push({
|
|
1351
1515
|
type: "user",
|
|
1352
1516
|
parent_tool_use_id: null,
|
|
1353
1517
|
priority: "now",
|
|
1354
1518
|
origin: { kind: "human" },
|
|
1519
|
+
...uuid,
|
|
1355
1520
|
message: { role: "user", content: message }
|
|
1356
1521
|
});
|
|
1357
1522
|
}
|
|
1358
1523
|
});
|
|
1359
1524
|
}
|
|
1360
1525
|
let lastAssistantError;
|
|
1526
|
+
turn.pushed();
|
|
1527
|
+
if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid);
|
|
1528
|
+
let modelUnconfirmed = false;
|
|
1529
|
+
let pullingNext = false;
|
|
1530
|
+
const pullNextMessage = () => {
|
|
1531
|
+
if (pullingNext) {
|
|
1532
|
+
logger.logger.debug("[claudeRemote] Already waiting for the next message");
|
|
1533
|
+
return;
|
|
1534
|
+
}
|
|
1535
|
+
pullingNext = true;
|
|
1536
|
+
opts.nextMessage().then(async (next) => {
|
|
1537
|
+
if (!next) {
|
|
1538
|
+
messages.end();
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1541
|
+
if (modelUnconfirmed || needsModelSwitch(mode.model, next.mode.model)) {
|
|
1542
|
+
try {
|
|
1543
|
+
await withTimeout(response.setModel(modelTarget(next.mode.model)), SET_MODEL_TIMEOUT_MS, "set_model");
|
|
1544
|
+
modelUnconfirmed = false;
|
|
1545
|
+
logger.logger.debug(`[claudeRemote] Model switched to ${modelTarget(next.mode.model) ?? "default"}`);
|
|
1546
|
+
} catch (e) {
|
|
1547
|
+
logger.logger.debug(`[claudeRemote] setModel failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
1548
|
+
opts.onCompletionEvent?.(modelSwitchFailureNotice(next.mode.model, e));
|
|
1549
|
+
if (e instanceof TimeoutError) modelUnconfirmed = true;
|
|
1550
|
+
next = { ...next, mode: { ...next.mode, model: mode.model } };
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
mode = next.mode;
|
|
1554
|
+
updateThinking(true);
|
|
1555
|
+
turn.pushed();
|
|
1556
|
+
const uuid = promptUuid(next.uuid);
|
|
1557
|
+
if (uuid.uuid) commandTracker.track(uuid.uuid);
|
|
1558
|
+
timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
|
|
1559
|
+
messages.push({
|
|
1560
|
+
type: "user",
|
|
1561
|
+
parent_tool_use_id: null,
|
|
1562
|
+
origin: { kind: "human" },
|
|
1563
|
+
...uuid,
|
|
1564
|
+
message: { role: "user", content: next.message }
|
|
1565
|
+
});
|
|
1566
|
+
}).catch(() => {
|
|
1567
|
+
messages.end();
|
|
1568
|
+
}).finally(() => {
|
|
1569
|
+
pullingNext = false;
|
|
1570
|
+
});
|
|
1571
|
+
};
|
|
1572
|
+
const recycleIfPoisoned = (result) => {
|
|
1573
|
+
const recycleReason = queryRecycleReason(result ?? { }, lastAssistantError);
|
|
1574
|
+
lastAssistantError = void 0;
|
|
1575
|
+
if (!recycleReason) return false;
|
|
1576
|
+
logger.logger.warn(`[claudeRemote] Ending SDK query after ${recycleReason}; the next message starts a fresh Claude Code process`);
|
|
1577
|
+
opts.onCompletionEvent?.(QUERY_RECYCLE_NOTICE[recycleReason]);
|
|
1578
|
+
opts.onAuthFailure?.(recycleReason);
|
|
1579
|
+
messages.end();
|
|
1580
|
+
return true;
|
|
1581
|
+
};
|
|
1582
|
+
const endTurnWithoutResult = () => {
|
|
1583
|
+
updateThinking(false);
|
|
1584
|
+
logger.logger.debug(`[claudeRemote] Turn ${timingTurn} ended by session_state_changed idle without a result frame`);
|
|
1585
|
+
timingTurn++;
|
|
1586
|
+
timingMarks = {};
|
|
1587
|
+
if (isCompactCommand) {
|
|
1588
|
+
logger.logger.debug("[claudeRemote] /compact ended without a result; outcome unknown");
|
|
1589
|
+
isCompactCommand = false;
|
|
1590
|
+
}
|
|
1591
|
+
opts.onReady(void 0);
|
|
1592
|
+
if (!recycleIfPoisoned()) pullNextMessage();
|
|
1593
|
+
};
|
|
1361
1594
|
updateThinking(true);
|
|
1362
1595
|
try {
|
|
1363
1596
|
logger.logger.debug(`[claudeRemote] Starting to iterate over response`);
|
|
@@ -1389,9 +1622,22 @@ async function claudeRemote(opts) {
|
|
|
1389
1622
|
}
|
|
1390
1623
|
const outboundMessage = isCompactCommand && message.type === "assistant" ? { ...message, isCompactSummary: true } : message;
|
|
1391
1624
|
opts.onMessage(outboundMessage);
|
|
1625
|
+
const lifecycle = readClaudeCommandLifecycle(message);
|
|
1626
|
+
if (lifecycle) reportDroppedCommands(commandTracker.observe(lifecycle));
|
|
1627
|
+
const sessionState = readClaudeSessionState(message);
|
|
1628
|
+
if (sessionState) {
|
|
1629
|
+
const verdict = turn.onSessionState(sessionState);
|
|
1630
|
+
if (verdict === "end") {
|
|
1631
|
+
endTurnWithoutResult();
|
|
1632
|
+
} else {
|
|
1633
|
+
logger.logger.debug(`[claudeRemote] session_state_changed ${sessionState}: ${verdict}`);
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1392
1636
|
if (message.type === "system" && message.subtype === "init") {
|
|
1393
1637
|
updateThinking(true);
|
|
1638
|
+
turn.announced();
|
|
1394
1639
|
const systemInit = message;
|
|
1640
|
+
cliCapabilities = new Set(Array.isArray(systemInit.capabilities) ? systemInit.capabilities : []);
|
|
1395
1641
|
if (opts.onSDKMetadata) {
|
|
1396
1642
|
opts.onSDKMetadata({
|
|
1397
1643
|
models,
|
|
@@ -1424,8 +1670,9 @@ async function claudeRemote(opts) {
|
|
|
1424
1670
|
}
|
|
1425
1671
|
}
|
|
1426
1672
|
if (message.type === "result") {
|
|
1673
|
+
const endsTurn = turn.onResult();
|
|
1427
1674
|
updateThinking(false);
|
|
1428
|
-
logger.logger.debug("[claudeRemote] Result received");
|
|
1675
|
+
logger.logger.debug(endsTurn ? "[claudeRemote] Result received" : "[claudeRemote] Result received for a turn already ended by idle");
|
|
1429
1676
|
logger.logger.debug(formatClaudeTimingLine({
|
|
1430
1677
|
turn: timingTurn,
|
|
1431
1678
|
firstTurnOfProcess: timingTurn === 1,
|
|
@@ -1447,44 +1694,9 @@ async function claudeRemote(opts) {
|
|
|
1447
1694
|
}
|
|
1448
1695
|
isCompactCommand = false;
|
|
1449
1696
|
}
|
|
1450
|
-
opts.onReady(message);
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
if (recycleReason) {
|
|
1454
|
-
logger.logger.warn(`[claudeRemote] Ending SDK query after ${recycleReason}; the next message starts a fresh Claude Code process`);
|
|
1455
|
-
opts.onCompletionEvent?.(QUERY_RECYCLE_NOTICE[recycleReason]);
|
|
1456
|
-
opts.onAuthFailure?.(recycleReason);
|
|
1457
|
-
messages.end();
|
|
1458
|
-
continue;
|
|
1459
|
-
}
|
|
1460
|
-
opts.nextMessage().then(async (next) => {
|
|
1461
|
-
if (!next) {
|
|
1462
|
-
messages.end();
|
|
1463
|
-
return;
|
|
1464
|
-
}
|
|
1465
|
-
if (needsModelSwitch(mode.model, next.mode.model)) {
|
|
1466
|
-
try {
|
|
1467
|
-
await response.setModel(modelTarget(next.mode.model));
|
|
1468
|
-
logger.logger.debug(`[claudeRemote] Model switched to ${modelTarget(next.mode.model) ?? "default"}`);
|
|
1469
|
-
} catch (e) {
|
|
1470
|
-
logger.logger.debug(`[claudeRemote] setModel failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
1471
|
-
opts.onCompletionEvent?.(modelSwitchFailureNotice(next.mode.model, e));
|
|
1472
|
-
next = { ...next, mode: { ...next.mode, model: mode.model } };
|
|
1473
|
-
}
|
|
1474
|
-
}
|
|
1475
|
-
mode = next.mode;
|
|
1476
|
-
updateThinking(true);
|
|
1477
|
-
timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
|
|
1478
|
-
messages.push({
|
|
1479
|
-
type: "user",
|
|
1480
|
-
parent_tool_use_id: null,
|
|
1481
|
-
origin: { kind: "human" },
|
|
1482
|
-
...promptUuid(next.uuid),
|
|
1483
|
-
message: { role: "user", content: next.message }
|
|
1484
|
-
});
|
|
1485
|
-
}).catch(() => {
|
|
1486
|
-
messages.end();
|
|
1487
|
-
});
|
|
1697
|
+
if (endsTurn) opts.onReady(message);
|
|
1698
|
+
if (recycleIfPoisoned(message)) continue;
|
|
1699
|
+
if (endsTurn) pullNextMessage();
|
|
1488
1700
|
}
|
|
1489
1701
|
if (message.type === "user") {
|
|
1490
1702
|
const msg = message;
|
|
@@ -1522,6 +1734,7 @@ function getToolDescriptor(toolName) {
|
|
|
1522
1734
|
return { edit: false, exitPlan: false, dangerous: false };
|
|
1523
1735
|
}
|
|
1524
1736
|
|
|
1737
|
+
const LIVE_PERMISSION_MODE_TIMEOUT_MS = 15e3;
|
|
1525
1738
|
function elicitationContent(input) {
|
|
1526
1739
|
if (!input) return void 0;
|
|
1527
1740
|
const content = {};
|
|
@@ -1618,10 +1831,16 @@ class PermissionHandler {
|
|
|
1618
1831
|
return;
|
|
1619
1832
|
}
|
|
1620
1833
|
await new Promise((resolve) => setImmediate(resolve));
|
|
1621
|
-
await this.setPermissionModeCallback(mode);
|
|
1834
|
+
await withTimeout(this.setPermissionModeCallback(mode), LIVE_PERMISSION_MODE_TIMEOUT_MS, "set_permission_mode");
|
|
1622
1835
|
} catch (error) {
|
|
1623
1836
|
this.permissionMode = previousMode;
|
|
1624
1837
|
if (this.deferredPermissionMode === mode) this.deferredPermissionMode = void 0;
|
|
1838
|
+
if (error instanceof TimeoutError && this.setPermissionModeCallback) {
|
|
1839
|
+
this.setPermissionModeCallback(previousMode).then(
|
|
1840
|
+
() => logger.logger.debug(`[PermissionHandler] Re-asserted ${previousMode} after the switch to ${mode} timed out`),
|
|
1841
|
+
(reassertError) => logger.logger.debug("[PermissionHandler] Re-asserting the previous permission mode failed", reassertError)
|
|
1842
|
+
);
|
|
1843
|
+
}
|
|
1625
1844
|
throw error;
|
|
1626
1845
|
}
|
|
1627
1846
|
}
|
|
@@ -1632,7 +1851,7 @@ class PermissionHandler {
|
|
|
1632
1851
|
setImmediate(() => {
|
|
1633
1852
|
const task = this.modeChangeQueue.then(async () => {
|
|
1634
1853
|
if (!this.setPermissionModeCallback || this.permissionMode !== mode) return;
|
|
1635
|
-
await this.setPermissionModeCallback(mode);
|
|
1854
|
+
await withTimeout(this.setPermissionModeCallback(mode), LIVE_PERMISSION_MODE_TIMEOUT_MS, "set_permission_mode");
|
|
1636
1855
|
});
|
|
1637
1856
|
this.modeChangeQueue = task.catch((error) => {
|
|
1638
1857
|
logger.logger.debug("[PermissionHandler] Deferred SDK permission mode update failed", error);
|
|
@@ -2265,6 +2484,7 @@ class SDKToLogConverter {
|
|
|
2265
2484
|
timestamp
|
|
2266
2485
|
};
|
|
2267
2486
|
let logMessage = null;
|
|
2487
|
+
if (sdkMessage.type === "command_lifecycle") return null;
|
|
2268
2488
|
switch (sdkMessage.type) {
|
|
2269
2489
|
case "user": {
|
|
2270
2490
|
const userMsg = sdkMessage;
|
|
@@ -2704,10 +2924,13 @@ function applyClaudeSdkMetadata(current, update) {
|
|
|
2704
2924
|
};
|
|
2705
2925
|
}
|
|
2706
2926
|
|
|
2707
|
-
|
|
2927
|
+
const INTERRUPT_TIMEOUT_MS = 8e3;
|
|
2928
|
+
function createTurnSteeringController(opts = {}) {
|
|
2929
|
+
const interruptTimeoutMs = opts.interruptTimeoutMs ?? INTERRUPT_TIMEOUT_MS;
|
|
2708
2930
|
let interrupt = null;
|
|
2709
2931
|
let steering = false;
|
|
2710
2932
|
let interrupting = false;
|
|
2933
|
+
const boundedInterrupt = (run) => withTimeout(run(), interruptTimeoutMs, "interrupt");
|
|
2711
2934
|
return {
|
|
2712
2935
|
setInterrupt(next) {
|
|
2713
2936
|
interrupt = next;
|
|
@@ -2716,7 +2939,7 @@ function createTurnSteeringController() {
|
|
|
2716
2939
|
if (!interrupt) return false;
|
|
2717
2940
|
steering = true;
|
|
2718
2941
|
try {
|
|
2719
|
-
await interrupt
|
|
2942
|
+
await boundedInterrupt(interrupt);
|
|
2720
2943
|
return true;
|
|
2721
2944
|
} catch (error) {
|
|
2722
2945
|
steering = false;
|
|
@@ -2734,7 +2957,7 @@ function createTurnSteeringController() {
|
|
|
2734
2957
|
if (!interrupt) return false;
|
|
2735
2958
|
interrupting = true;
|
|
2736
2959
|
try {
|
|
2737
|
-
await interrupt
|
|
2960
|
+
await boundedInterrupt(interrupt);
|
|
2738
2961
|
return true;
|
|
2739
2962
|
} catch (error) {
|
|
2740
2963
|
interrupting = false;
|
|
@@ -3357,6 +3580,56 @@ async function persistRewindRecord(client, record, opts = {}) {
|
|
|
3357
3580
|
}
|
|
3358
3581
|
}
|
|
3359
3582
|
|
|
3583
|
+
const int = (value) => typeof value === "number" && Number.isFinite(value) ? Math.trunc(value) : null;
|
|
3584
|
+
function delayText(ms) {
|
|
3585
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
3586
|
+
const seconds = ms / 1e3;
|
|
3587
|
+
return `${Number.isInteger(seconds) ? seconds : seconds.toFixed(1)}s`;
|
|
3588
|
+
}
|
|
3589
|
+
function describeClaudeApiRetry(frame) {
|
|
3590
|
+
const status = int(frame.error_status);
|
|
3591
|
+
const kind = typeof frame.error === "string" && frame.error && frame.error !== "unknown" ? frame.error.replace(/_/g, " ") : "";
|
|
3592
|
+
const cause = status !== null ? `HTTP ${status}${kind ? ` ${kind}` : ""}` : "a connection error";
|
|
3593
|
+
const attempt = int(frame.attempt);
|
|
3594
|
+
const max = int(frame.max_retries);
|
|
3595
|
+
const delay = int(frame.retry_delay_ms);
|
|
3596
|
+
const details = [];
|
|
3597
|
+
if (attempt !== null) details.push(`attempt ${attempt}${max !== null ? `/${max}` : ""}`);
|
|
3598
|
+
if (delay !== null && delay >= 0) details.push(`next retry in ${delayText(delay)}`);
|
|
3599
|
+
return `Claude is retrying after ${cause}${details.length ? ` (${details.join(", ")})` : ""}`;
|
|
3600
|
+
}
|
|
3601
|
+
const API_RETRY_NOTICE_MIN_INTERVAL_MS = 6e4;
|
|
3602
|
+
function createClaudeApiRetryGate(opts = {}) {
|
|
3603
|
+
const minIntervalMs = opts.minIntervalMs ?? API_RETRY_NOTICE_MIN_INTERVAL_MS;
|
|
3604
|
+
let lastAttempt = null;
|
|
3605
|
+
let lastPersistedAt = null;
|
|
3606
|
+
return {
|
|
3607
|
+
/** True when this frame should be persisted. */
|
|
3608
|
+
observe(frame, now) {
|
|
3609
|
+
const attempt = int(frame.attempt);
|
|
3610
|
+
const newRun = attempt !== null && (lastAttempt === null || attempt <= lastAttempt);
|
|
3611
|
+
if (attempt !== null) lastAttempt = attempt;
|
|
3612
|
+
if (newRun || lastPersistedAt === null || now - lastPersistedAt >= minIntervalMs) {
|
|
3613
|
+
lastPersistedAt = now;
|
|
3614
|
+
return true;
|
|
3615
|
+
}
|
|
3616
|
+
return false;
|
|
3617
|
+
},
|
|
3618
|
+
/** The turn ended: the next retry is a new run. */
|
|
3619
|
+
reset() {
|
|
3620
|
+
lastAttempt = null;
|
|
3621
|
+
lastPersistedAt = null;
|
|
3622
|
+
}
|
|
3623
|
+
};
|
|
3624
|
+
}
|
|
3625
|
+
const INFORMATIONAL_MAX_CHARS = 500;
|
|
3626
|
+
function describeClaudeInformational(frame) {
|
|
3627
|
+
if (frame.level !== "warning" || typeof frame.content !== "string") return null;
|
|
3628
|
+
const text = frame.content.replace(/\s+/g, " ").trim();
|
|
3629
|
+
if (!text) return null;
|
|
3630
|
+
return text.length > INFORMATIONAL_MAX_CHARS ? `${text.slice(0, INFORMATIONAL_MAX_CHARS - 1)}\u2026` : text;
|
|
3631
|
+
}
|
|
3632
|
+
|
|
3360
3633
|
const ABORT_INTERRUPT_GRACE_MS = 4e3;
|
|
3361
3634
|
const REWIND_LOG_WINDOW = 500;
|
|
3362
3635
|
const REWIND_STARTUP_BUDGET_MS = 15e3;
|
|
@@ -3524,6 +3797,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3524
3797
|
const streamRelay$1 = new streamRelay.StreamRelay({
|
|
3525
3798
|
send: (frame) => session.client.sendStreamFrame(frame)
|
|
3526
3799
|
});
|
|
3800
|
+
const apiRetryGate = createClaudeApiRetryGate();
|
|
3527
3801
|
const messageQueue = new OutgoingMessageQueue(
|
|
3528
3802
|
(logMessage) => session.client.sendClaudeSessionMessage(logMessage)
|
|
3529
3803
|
);
|
|
@@ -3545,6 +3819,21 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3545
3819
|
backgroundTasks.observe(message);
|
|
3546
3820
|
session.setBackgroundTasks(backgroundTasks.list());
|
|
3547
3821
|
session.scheduledWakeups.observe(message);
|
|
3822
|
+
if (message.type === "system" && message.subtype === "api_retry") {
|
|
3823
|
+
const notice = describeClaudeApiRetry(message);
|
|
3824
|
+
messageBuffer$1.addMessage(notice, "status");
|
|
3825
|
+
if (apiRetryGate.observe(message, Date.now())) {
|
|
3826
|
+
session.client.sendSessionEvent({ type: "message", message: notice, kind: "claude-api-retry" });
|
|
3827
|
+
}
|
|
3828
|
+
} else if (message.type === "system" && message.subtype === "informational") {
|
|
3829
|
+
const warning = describeClaudeInformational(message);
|
|
3830
|
+
if (warning) {
|
|
3831
|
+
messageBuffer$1.addMessage(warning, "status");
|
|
3832
|
+
session.client.sendSessionEvent({ type: "message", message: warning, kind: "claude-warning" });
|
|
3833
|
+
}
|
|
3834
|
+
} else if (message.type === "result") {
|
|
3835
|
+
apiRetryGate.reset();
|
|
3836
|
+
}
|
|
3548
3837
|
if (isRuntimeCheckpointReplay(message)) return;
|
|
3549
3838
|
if (message.type === "user" && isClaudeInterruptSentinelContent(message.message.content)) {
|
|
3550
3839
|
sdkToLogConverter.convert(message);
|
|
@@ -3798,7 +4087,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3798
4087
|
}
|
|
3799
4088
|
if (!session.thinking || !modeGate.matches(input.mode)) return false;
|
|
3800
4089
|
if (typeof message === "string") onPromptFinalized?.(message);
|
|
3801
|
-
q.steer(message, input.mode);
|
|
4090
|
+
q.steer(message, input.mode, input.localKey);
|
|
3802
4091
|
return true;
|
|
3803
4092
|
});
|
|
3804
4093
|
permissionHandler.setPermissionModeUpdater(async (mode) => {
|
|
@@ -3828,6 +4117,14 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3828
4117
|
logger.logger.debug("[remote]: Session reset");
|
|
3829
4118
|
session.clearSessionId();
|
|
3830
4119
|
},
|
|
4120
|
+
// B-631: a Stop swept these user messages (steers, or prompts
|
|
4121
|
+
// queued behind a pre-empting steer's turn) before the model
|
|
4122
|
+
// read them — the same tombstone a destroyed queue item gets
|
|
4123
|
+
// (B-332), so the web shows them as not delivered, not answered.
|
|
4124
|
+
onCommandsDropped: (uuids) => {
|
|
4125
|
+
logger.logger.debug(`[remote]: ${uuids.length} user message(s) never read before the turn ended`);
|
|
4126
|
+
session.client.sendQueueCancelReason(uuids, "aborted");
|
|
4127
|
+
},
|
|
3831
4128
|
onReady: (result) => {
|
|
3832
4129
|
if (turnSteering.consumeReady()) {
|
|
3833
4130
|
session.client.closeClaudeSessionTurn("cancelled");
|
|
@@ -3873,9 +4170,10 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3873
4170
|
session.client.closeClaudeSessionTurn("cancelled");
|
|
3874
4171
|
continue;
|
|
3875
4172
|
}
|
|
3876
|
-
|
|
3877
|
-
session.client.
|
|
3878
|
-
session.
|
|
4173
|
+
const exit = sessionScanner.describeClaudeProcessExit(e);
|
|
4174
|
+
const closed = session.client.closeClaudeSessionTurn("failed", { error: exit });
|
|
4175
|
+
if (!closed) session.client.sendSessionEvent({ type: "message", message: exit, kind: "claude-process-exit" });
|
|
4176
|
+
session.onSessionError(exit);
|
|
3879
4177
|
continue;
|
|
3880
4178
|
}
|
|
3881
4179
|
} finally {
|
|
@@ -3965,7 +4263,7 @@ async function loop(opts) {
|
|
|
3965
4263
|
logger.logger.debug(`[loop] Iteration with mode: ${mode}`);
|
|
3966
4264
|
switch (mode) {
|
|
3967
4265
|
case "local": {
|
|
3968
|
-
const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-
|
|
4266
|
+
const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-A4VuevIi.cjs'); });
|
|
3969
4267
|
const result = await claudeLocalLauncher(session);
|
|
3970
4268
|
switch (result.type) {
|
|
3971
4269
|
case "switch":
|
|
@@ -4371,7 +4669,7 @@ function registerSideQuestionHandler(rpc, deps) {
|
|
|
4371
4669
|
const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
|
|
4372
4670
|
const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
|
|
4373
4671
|
const fork = deps.run ?? (async (input) => {
|
|
4374
|
-
const { query } = await Promise.resolve().then(function () { return require('./index-
|
|
4672
|
+
const { query } = await Promise.resolve().then(function () { return require('./index-DFPT4HOO.cjs'); });
|
|
4375
4673
|
return runSideQuestion(query, input);
|
|
4376
4674
|
});
|
|
4377
4675
|
const run = async (input, live) => {
|