very-happy-cli 0.2.178 → 0.2.180
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-DCQXHRzT.mjs → AcpBackend-B8Zi30Zh.mjs} +135 -16
- package/dist/{AcpBackend-CDkAQXYf.cjs → AcpBackend-DfRDtMcG.cjs} +135 -16
- package/dist/{AcpSessionManager-DckmUZza.cjs → AcpSessionManager-CASKOnOj.cjs} +38 -4
- package/dist/{AcpSessionManager-BXrQcqwC.mjs → AcpSessionManager-i8Rab0xT.mjs} +38 -4
- package/dist/{BasePermissionHandler-BVlrEhIi.mjs → BasePermissionHandler-26fKbRCm.mjs} +5 -2
- package/dist/{BasePermissionHandler-DyLmKKtO.cjs → BasePermissionHandler-BlM_tfej.cjs} +5 -2
- package/dist/acpSessionResume-B9l54P-X.mjs +67 -0
- package/dist/acpSessionResume-CR5pmgVo.cjs +74 -0
- package/dist/{agentHome-CEp9RMyK.cjs → agentHome-C7Sb7-Tz.cjs} +4 -4
- package/dist/{agentHome-C1xi37as.mjs → agentHome-CmGy0NWv.mjs} +4 -4
- package/dist/{api-JANhFdZV.cjs → api-DM7b1OKj.cjs} +38 -262
- package/dist/{api-Dib0dmqC.mjs → api-Hov8p7CA.mjs} +32 -256
- package/dist/{apiMachine-DNTJidYH.mjs → apiMachine-CwGEhQDT.mjs} +62 -15
- package/dist/{apiMachine-QhK-sKcr.cjs → apiMachine-DkGRj-Ai.cjs} +64 -17
- package/dist/{attachmentContent-bpQTBJ0y.cjs → attachmentContent-CEm13_gF.cjs} +4 -4
- package/dist/{attachmentContent-DkkdpSSJ.mjs → attachmentContent-CIn4iPEk.mjs} +2 -2
- package/dist/{auth-BRjd2esb.mjs → auth-BG1DY0gj.mjs} +5 -5
- package/dist/{auth-DgIV0Cvt.cjs → auth-CBXnm-Mj.cjs} +5 -5
- package/dist/{auth-omWDtgR8.cjs → auth-Dawj7pP5.cjs} +8 -8
- package/dist/{auth-DNct7VUi.mjs → auth-rggxMpEE.mjs} +8 -8
- package/dist/{auto-DKGFOJBo.mjs → auto-CXXLXGeL.mjs} +19 -18
- package/dist/{auto-CI16FZmX.cjs → auto-CbYOfoPS.cjs} +19 -18
- package/dist/{backgroundTaskActivity-BVwJBl02.mjs → backgroundTaskActivity-8PdPxrvy.mjs} +1 -1
- package/dist/{bootstrap-DCQ87Aan.cjs → bootstrap-DoA7okld.cjs} +2 -2
- package/dist/{bootstrap-BUagGC_-.mjs → bootstrap-Dt5I1SOl.mjs} +2 -2
- package/dist/{browser-Dj_DYQEh.mjs → browser-DUNetFT4.mjs} +1 -1
- package/dist/{browser-CSKhc0Bl.cjs → browser-DZ6qRtfH.cjs} +1 -1
- package/dist/{claudeCliPath-U4HHmV4r.cjs → claudeCliPath-GaP3UUz1.cjs} +1 -1
- package/dist/{claudeLocal-CdIVnOZp.cjs → claudeLocal--DNyMOSv.cjs} +8 -7
- package/dist/{claudeLocal-CCCvAeMd.mjs → claudeLocal-OHWQigCl.mjs} +6 -5
- package/dist/{claudeLocalLauncher-BmrpaRYJ.mjs → claudeLocalLauncher-BStvfa7M.mjs} +11 -10
- package/dist/{claudeLocalLauncher-21-xh5gc.cjs → claudeLocalLauncher-BhvPbcyH.cjs} +13 -12
- package/dist/{claudeSessionFork-kYCP1IJB.cjs → claudeSessionFork-Be16vzGc.cjs} +1 -1
- package/dist/{claudeSessionFork-DvxMKAmY.mjs → claudeSessionFork-GAVWhiKG.mjs} +1 -1
- package/dist/{client-C4zKGjiJ.cjs → client-BWjaHKtj.cjs} +2 -2
- package/dist/client-Ca5Pcgy_.mjs +71 -0
- package/dist/{client-CnlkkrZO.mjs → client-CnB7kRCT.mjs} +2 -2
- package/dist/{client-BTX9hsbr.mjs → client-D4uPb1uu.mjs} +3 -3
- package/dist/client-DJplzPjD.cjs +76 -0
- package/dist/{client-Dnza1hgN.cjs → client-D_loZ9IK.cjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +24 -15
- package/dist/codex/happyMcpStdioBridge.mjs +25 -16
- package/dist/{codexAppServerClient-DvkpQgyv.mjs → codexAppServerClient-CO4G6OS4.mjs} +3 -3
- package/dist/{codexAppServerClient-CRlBWGn3.cjs → codexAppServerClient-PE-12AsW.cjs} +3 -3
- package/dist/{codexCommand-DzxIWXIT.cjs → codexCommand-BNoD1t1C.cjs} +127 -116
- package/dist/{codexCommand-BxjogBzU.mjs → codexCommand-B_xUH79E.mjs} +77 -66
- package/dist/{codexTermination-C28FzlLb.cjs → codexTermination-BmBbizFK.cjs} +7 -2
- package/dist/{codexTermination-ySDNMEhd.mjs → codexTermination-Dx48ma6e.mjs} +7 -2
- package/dist/{config-BFB5uJ4t.cjs → config-CtwEUxUP.cjs} +26 -26
- package/dist/{config-DwfEpFr3.mjs → config-DSu0Blos.mjs} +3 -3
- package/dist/{configuration-4TGMrjul.cjs → configuration-CYO-kPOS.cjs} +1 -1
- package/dist/{configuration-DVrb61aY.mjs → configuration-PxzEJumr.mjs} +1 -1
- package/dist/{connect-C7FPY0PI.mjs → connect-BQrg3TB6.mjs} +15 -15
- package/dist/{connect-QH2VJGBG.cjs → connect-Dq7wndzR.cjs} +28 -28
- package/dist/{context-JoKu0V54.cjs → context-6TP-iz_c.cjs} +1 -1
- package/dist/{context-B3XPVJlj.mjs → context-CJGRRGWW.mjs} +1 -1
- package/dist/{controlClient-BTaZlbC6.cjs → controlClient-Bqv5v5OM.cjs} +3 -3
- package/dist/{controlClient-BYKyGyxj.mjs → controlClient-DoeYovwP.mjs} +4 -4
- package/dist/{createSessionMetadata-8Fuj2-IV.mjs → createSessionMetadata-DDIChCx8.mjs} +2 -2
- package/dist/{createSessionMetadata-B2NynaWZ.cjs → createSessionMetadata-xz767pcG.cjs} +3 -3
- package/dist/{defaultPermissionMode-BEWCqJU-.cjs → defaultPermissionMode-PkZGsQDk.cjs} +2 -2
- package/dist/{defaultPermissionMode-B8kJG9uI.mjs → defaultPermissionMode-i5KzdK09.mjs} +2 -2
- package/dist/{detectCLI-DR9ZaN6B.cjs → detectCLI-BuYR_Qxe.cjs} +4 -4
- package/dist/{deterministicJson-C5ZwZ7hu.mjs → deterministicJson-CTEJDqtS.mjs} +217 -12
- package/dist/{deterministicJson-BjNQsAjO.cjs → deterministicJson-xqA6DaOm.cjs} +222 -16
- package/dist/{doctor-BshRnjLi.cjs → doctor-BrgSlfXn.cjs} +9 -9
- package/dist/{doctor-0BiGwJXk.mjs → doctor-IctjVh9T.mjs} +8 -8
- package/dist/{doctorReadiness-BCZGcN0a.cjs → doctorReadiness-Dl6yRQCy.cjs} +1 -1
- package/dist/{downloadTarget-BN5vZt3K.cjs → downloadTarget-CEb9che-.cjs} +6 -6
- package/dist/{downloadTarget-DJPwAZlu.mjs → downloadTarget-jbOz1egC.mjs} +6 -6
- package/dist/{ensureDaemonRunning-C5QfToCe.cjs → ensureDaemonRunning-D-HyjGIX.cjs} +6 -6
- package/dist/{ensureDaemonRunning-CSmb_mqt.mjs → ensureDaemonRunning-b1e8LCSM.mjs} +5 -5
- package/dist/{handleResumeCommand-BwnUZmbo.cjs → handleResumeCommand-BvWVuRwH.cjs} +23 -7
- package/dist/{handleResumeCommand-CgjpsdDe.mjs → handleResumeCommand-DpaZvm2c.mjs} +22 -6
- package/dist/{index-piJPsTsm.cjs → index-B2p2Mut7.cjs} +259 -53
- package/dist/{index-BehVbAsA.mjs → index-BUNnpGFF.mjs} +256 -50
- package/dist/{index-Bvldtdny.mjs → index-Bsvbgh9e.mjs} +4 -4
- package/dist/{index-BYOZ_8WZ.cjs → index-C64Ufj4D.cjs} +4 -4
- package/dist/{index-Clqlu17M.mjs → index-C6Vn5Eac.mjs} +155 -34
- package/dist/index-CMf5VbzG.mjs +18 -0
- package/dist/index-DmTlDRSL.cjs +24 -0
- package/dist/{index-_l1Sdmbi.cjs → index-Dv0Q48P3.cjs} +156 -33
- package/dist/{index-BRClDe07.cjs → index-F2UejqYs.cjs} +3 -3
- package/dist/{index-BYgfern_.mjs → index-wCbtF4BK.mjs} +3 -3
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
- package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
- package/dist/{install-TO4taKW7.cjs → install-C0ANcEAW.cjs} +7 -7
- package/dist/{install-fYWHrPcC.mjs → install-CdzSV7qO.mjs} +3 -3
- package/dist/{installPiTools-BKnXjrVu.cjs → installPiTools-CL_axh_6.cjs} +1 -1
- package/dist/{installTerminalHooks-BQZbvxsZ.cjs → installTerminalHooks-BETLKAtd.cjs} +3 -3
- package/dist/lib.cjs +14 -14
- package/dist/lib.d.cts +239 -2
- package/dist/lib.d.mts +239 -2
- package/dist/lib.mjs +14 -14
- package/dist/{lidState-BeOwj6eW.cjs → lidState-DWGnm2H4.cjs} +1 -1
- package/dist/{lidState-DNMlIhX0.mjs → lidState-bBrmaQd2.mjs} +1 -1
- package/dist/{localHappyAgentAuth-Br-mgogg.cjs → localHappyAgentAuth-DZHQnIW9.cjs} +1 -1
- package/dist/{localHappyAgentAuth-BezKSFDi.mjs → localHappyAgentAuth-Dn1jYDpt.mjs} +1 -1
- package/dist/{logger--vAVtXB_.mjs → logger-BUngm5Xg.mjs} +2 -2
- package/dist/{logger-DXTWlPzP.cjs → logger-CphW5nUE.cjs} +2 -2
- package/dist/machineMetadata-BQm9YTcI.cjs +79 -0
- package/dist/machineMetadata-BXN_bKU3.mjs +68 -0
- package/dist/{main-DoMFJ2Cl.cjs → main-B2UV51nK.cjs} +112 -132
- package/dist/{main-CshDb5-1.mjs → main-DGkdYfEq.mjs} +106 -126
- package/dist/{mcp-pNc1EbQf.cjs → mcp-BFvAEIRz.cjs} +15 -15
- package/dist/{mcp-DKT_lrvQ.mjs → mcp-CbTtbs0f.mjs} +15 -15
- package/dist/{mirrorProtocol-6IFGPpjJ.mjs → mirrorProtocol-BR4luBC0.mjs} +148 -7
- package/dist/{mirrorProtocol-qKflWTX_.cjs → mirrorProtocol-HKPivs5o.cjs} +150 -4
- package/dist/{package-B7B03ejW.mjs → package-7Ld1YMhh.mjs} +8 -7
- package/dist/{package-DY4zTbKS.cjs → package-KhLqBDX9.cjs} +8 -7
- package/dist/panels-C7IVqpJk.mjs +137 -0
- package/dist/panels-Njf6GelF.cjs +142 -0
- package/dist/{peerTools-3R9RUARX.mjs → peerTools-BOlDRyhi.mjs} +60 -10
- package/dist/{peerTools-iy3_6Yc5.cjs → peerTools-DQNlrcqM.cjs} +60 -9
- package/dist/{persistence-BfX72dne.cjs → persistence-9BMYspxG.cjs} +2 -2
- package/dist/{persistence-DTk4sNpd.mjs → persistence-BFUOHW5h.mjs} +3 -3
- package/dist/{piRunnerArgs-CRQVR9o-.cjs → piRunnerArgs-DGaq6VYM.cjs} +8 -2
- package/dist/{piRunnerArgs-AT8QJY7x.mjs → piRunnerArgs-H2pgpA5z.mjs} +7 -1
- package/dist/{piRuntime-BHRT5MKO.cjs → piRuntime-CT5xv_3h.cjs} +2 -2
- package/dist/{piRuntime-E44qTVQ4.mjs → piRuntime-CdN0JAsa.mjs} +2 -2
- package/dist/{piTerminal-hI4WFdWm.cjs → piTerminal-0FBtXTHK.cjs} +18 -18
- package/dist/{piTerminal-De8nbciM.mjs → piTerminal-C4m9YXAV.mjs} +18 -18
- package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
- package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
- package/dist/projectPath-C3ioB4Bu.cjs +13 -0
- package/dist/prompt-BOouDaTM.mjs +99 -0
- package/dist/prompt-lgF9IE82.cjs +105 -0
- package/dist/{attachmentLimits-UyFn8fkQ.mjs → pushNotifications-DCiBEVeC.mjs} +307 -3
- package/dist/{attachmentLimits-SqeAHrVC.cjs → pushNotifications-DI92havG.cjs} +308 -2
- package/dist/{index-DFPT4HOO.cjs → query-BETKBrnz.cjs} +25 -5
- package/dist/{index-CEjJnq05.mjs → query-ywZbQUzR.mjs} +26 -3
- package/dist/{rateLimitWindows-XrJiiBpU.mjs → rateLimitWindows-BkfuUB1a.mjs} +1 -1
- package/dist/{rateLimitWindows-Czb7_7cK.cjs → rateLimitWindows-YRIYVdo4.cjs} +1 -1
- package/dist/{registerCommonHandlers-C0_fyBQ0.cjs → registerCommonHandlers-C7a_dUWs.cjs} +30 -30
- package/dist/{registerCommonHandlers-CvIedVRf.mjs → registerCommonHandlers-CTkCvjxt.mjs} +2 -2
- package/dist/{registerKillSessionHandler-DYl7l4Ts.cjs → registerKillSessionHandler-CIsvBrVe.cjs} +6 -6
- package/dist/{registerKillSessionHandler-gwJ5lTf0.mjs → registerKillSessionHandler-CaqqRYq6.mjs} +6 -6
- package/dist/{remoteSessionClient-BRTIOX5b.cjs → remoteSessionClient-D843fkzL.cjs} +5 -5
- package/dist/{remoteSessionClient-DRb2Jr5s.mjs → remoteSessionClient-PP-mOKmw.mjs} +5 -5
- package/dist/{reportProgressTool-B9nCzbkL.cjs → reportProgressTool-14AXr959.cjs} +84 -2
- package/dist/{reportProgressTool-D5tEoXMW.mjs → reportProgressTool-ZOCNjWHr.mjs} +82 -3
- package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
- package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
- package/dist/{run-CKe_WeLW.cjs → run-CAOCYYfT.cjs} +2806 -110
- package/dist/{run-BQ_FGaOL.mjs → run-Dajw2E5j.mjs} +2787 -91
- package/dist/{runClaude-zrrNcQC_.mjs → runClaude-C6oxWYbp.mjs} +49 -47
- package/dist/{runClaude-MHI5IKM-.cjs → runClaude-CRRKt-tm.cjs} +50 -48
- package/dist/{runClaudeDeps-RRw-Nusc.cjs → runClaudeDeps-B1ysqTvx.cjs} +310 -237
- package/dist/{runClaudeDeps-CVBCokOS.mjs → runClaudeDeps-BcZ68cX3.mjs} +297 -226
- package/dist/{runGemini-kipag2ag.mjs → runGemini-D7yKc4wD.mjs} +61 -55
- package/dist/{runGemini-D7Lg9yCr.cjs → runGemini-DtKFXqf-.cjs} +89 -83
- package/dist/{runOpenClaw-C_lRY3Do.mjs → runOpenClaw-C8ilyLP9.mjs} +19 -19
- package/dist/{runOpenClaw-DCcQ0L2N.cjs → runOpenClaw-Cq29mryb.cjs} +20 -20
- package/dist/{sandbox-BSyXFVFp.mjs → sandbox-CbCutma4.mjs} +4 -4
- package/dist/{sandbox-dMwPTmjm.cjs → sandbox-gIj-EuF4.cjs} +4 -4
- package/dist/{selfCheck-DkzDDUsE.cjs → selfCheck-BTGBVthv.cjs} +39 -38
- package/dist/selfCheck-Smt-5Xiq.mjs +85 -0
- package/dist/{send-dxC0miIA.cjs → send-CZf5lLw_.cjs} +8 -8
- package/dist/{send-C-k9nsd3.mjs → send-YZRMQvMJ.mjs} +9 -9
- package/dist/{server-DxoTYNlw.mjs → server-BqwXRzFZ.mjs} +4 -4
- package/dist/{server-B-W6P7Qr.cjs → server-CknFq6xG.cjs} +6 -6
- package/dist/sessionExitLifecycle-CzkLIgNZ.mjs +142 -0
- package/dist/sessionExitLifecycle-DFltxXU8.cjs +148 -0
- package/dist/{sessionLock-DWX6BbiU.cjs → sessionLock-DRZUcKHT.cjs} +38 -5
- package/dist/{sessionLock-DBdtZGOL.mjs → sessionLock-nBXdJxJm.mjs} +36 -5
- package/dist/{sessionOps-BAnr7n8t.cjs → sessionOps-BrGiU9-s.cjs} +10 -5
- package/dist/{sessionOps-BVoXe12O.mjs → sessionOps-C58iDeD5.mjs} +11 -6
- package/dist/{sessionScanner-BtxoeluY.mjs → sessionScanner-Bm57LEXe.mjs} +3 -3
- package/dist/{sessionScanner-CDOYsEUD.cjs → sessionScanner-CaO8bLaG.cjs} +3 -3
- package/dist/{sessions-C3sZJkzI.mjs → sessions-BXyBHo8n.mjs} +40 -18
- package/dist/{sessions-hAitoN-m.cjs → sessions-uzqPCc37.cjs} +39 -16
- package/dist/{setupOfflineReconnection-_eD4cuUT.mjs → setupOfflineReconnection-1Qlek3wl.mjs} +2 -2
- package/dist/{setupOfflineReconnection-C2EeYTFH.cjs → setupOfflineReconnection-DvvVX3TB.cjs} +2 -2
- package/dist/{spawn-Bc9v7pIf.cjs → spawn-DBkodJEO.cjs} +49 -18
- package/dist/{spawn-qNrB2CD_.mjs → spawn-vn93PhYL.mjs} +49 -18
- package/dist/spawnAgents-CgPMWexP.mjs +79 -0
- package/dist/{spawnAgents-BVEaz35W.cjs → spawnAgents-DLNMlhWJ.cjs} +37 -1
- package/dist/{spawnHappyCLI-C2stUioM.mjs → spawnHappyCLI-BjFZc_7V.mjs} +1 -1
- package/dist/{spawnHappyCLI-fzUagkKV.cjs → spawnHappyCLI-DnUZv0X2.cjs} +2 -2
- package/dist/{specialCommands-BJ-nqY4s.cjs → specialCommands-BRufxlqe.cjs} +3 -3
- package/dist/{specialCommands-C6W-rVyh.mjs → specialCommands-D3ND9bdg.mjs} +3 -3
- package/dist/{startFileWatcher-Bqlqjt93.cjs → startFileWatcher-D9cYzZOq.cjs} +1 -1
- package/dist/{startFileWatcher-CR09Snmz.mjs → startFileWatcher-DXJ7yB5v.mjs} +1 -1
- package/dist/startupSessionCreate-kdr3m1uX.cjs +26 -0
- package/dist/startupSessionCreate-uZ6BM0ty.mjs +24 -0
- package/dist/{streamRelay-CJoMk_d2.mjs → streamRelay-DnMCMMfV.mjs} +1 -1
- package/dist/{streamRelay-9kBPpbvU.cjs → streamRelay-Dy6amlzx.cjs} +1 -1
- package/dist/{sync-Dhmtk66S.cjs → sync-Bn-idAoy.cjs} +1 -1
- package/dist/{sync-DbW07iQS.mjs → sync-BvVhDO40.mjs} +1 -1
- package/dist/{systemPrompt-CQcuUmVp.mjs → systemPrompt-CIZcJuJF.mjs} +4 -3
- package/dist/{systemPrompt-3PYi3EUY.cjs → systemPrompt-DlyEk35T.cjs} +4 -3
- package/dist/{teams-DpxLcUU_.cjs → teams-BLeRpDxv.cjs} +8 -8
- package/dist/{teams-CwF4Z2fA.mjs → teams-DLY3B5yi.mjs} +8 -8
- package/dist/{time-A6zR3Iy6.cjs → time-Cjv0zxQO.cjs} +1 -1
- package/dist/{time-BuGWTVP6.mjs → time-D3ETL7Jb.mjs} +1 -1
- package/dist/{titleGenerator-D26gvNaS.cjs → titleGenerator-Cgp5ihFb.cjs} +10 -9
- package/dist/{titleGenerator-BGEzNWC9.mjs → titleGenerator-Uzbd4utr.mjs} +9 -8
- package/dist/{todo-DrZc76H5.mjs → todo-C9Ga-oEM.mjs} +6 -6
- package/dist/{todo-73g3NCIO.cjs → todo-pOMcEECE.cjs} +6 -6
- package/dist/{tools-CxJp4T1T.cjs → tools-BL7Byl_x.cjs} +1 -1
- package/dist/{tools-BtsrQnNS.mjs → tools-Cho7iIWf.mjs} +1 -1
- package/dist/{uninstall-DWNYvewQ.cjs → uninstall-CbayEVoV.cjs} +6 -6
- package/dist/{uninstall-DOb2mTwV.mjs → uninstall-CvZHVY9C.mjs} +3 -3
- package/dist/webPanels-B2_C2-3g.mjs +49 -0
- package/dist/webPanels-FCgFKvVe.cjs +53 -0
- package/package.json +8 -7
- package/dist/machineMetadata-B1H9gNbN.mjs +0 -39
- package/dist/machineMetadata-DcUupMje.cjs +0 -42
- package/dist/messageBuffer-BWlGgR3A.mjs +0 -71
- package/dist/messageBuffer-fJMH6uY8.cjs +0 -73
- package/dist/projectPath-ChLhdOyt.cjs +0 -13
- package/dist/selfCheck-CF7XGJPb.mjs +0 -84
- package/dist/sessionModeFile-ByLbXTbg.mjs +0 -32
- package/dist/sessionModeFile-CLLdidiJ.cjs +0 -36
- package/dist/spawnAgents-Bw6j4tqz.mjs +0 -45
|
@@ -1,95 +1,99 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var logger = require('./logger-
|
|
4
|
-
var controlClient = require('./controlClient-
|
|
3
|
+
var logger = require('./logger-CphW5nUE.cjs');
|
|
4
|
+
var controlClient = require('./controlClient-Bqv5v5OM.cjs');
|
|
5
5
|
var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
6
|
+
var deterministicJson = require('./deterministicJson-xqA6DaOm.cjs');
|
|
7
|
+
var client = require('./client-DJplzPjD.cjs');
|
|
6
8
|
var node_crypto = require('node:crypto');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
+
var sessionExitLifecycle = require('./sessionExitLifecycle-DFltxXU8.cjs');
|
|
10
|
+
var query = require('./query-BETKBrnz.cjs');
|
|
9
11
|
var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
|
|
10
12
|
var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
|
|
11
|
-
var systemPrompt = require('./systemPrompt-
|
|
13
|
+
var systemPrompt = require('./systemPrompt-DlyEk35T.cjs');
|
|
12
14
|
var path$1 = require('node:path');
|
|
13
|
-
var specialCommands = require('./specialCommands-
|
|
15
|
+
var specialCommands = require('./specialCommands-BRufxlqe.cjs');
|
|
14
16
|
require('axios');
|
|
15
17
|
require('node:events');
|
|
16
18
|
require('socket.io-client');
|
|
17
|
-
var
|
|
19
|
+
var pushNotifications = require('./pushNotifications-DI92havG.cjs');
|
|
18
20
|
require('tweetnacl');
|
|
19
|
-
var configuration = require('./configuration-
|
|
20
|
-
require('./index-
|
|
21
|
-
require('./registerCommonHandlers-
|
|
21
|
+
var configuration = require('./configuration-CYO-kPOS.cjs');
|
|
22
|
+
require('./index-Dv0Q48P3.cjs');
|
|
23
|
+
require('./registerCommonHandlers-C7a_dUWs.cjs');
|
|
22
24
|
require('os');
|
|
23
25
|
require('child_process');
|
|
24
26
|
require('@paralleldrive/cuid2');
|
|
25
|
-
require('./persistence-
|
|
27
|
+
require('./persistence-9BMYspxG.cjs');
|
|
26
28
|
var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
27
29
|
require('chalk');
|
|
28
30
|
var types = require('./types-CRS-srZK.cjs');
|
|
29
31
|
var path = require('./path-B7zW-WwE.cjs');
|
|
30
32
|
var fs = require('fs/promises');
|
|
31
|
-
var time = require('./time-
|
|
33
|
+
var time = require('./time-Cjv0zxQO.cjs');
|
|
32
34
|
var node_fs = require('node:fs');
|
|
33
|
-
var
|
|
34
|
-
var sessionScanner = require('./sessionScanner-CDOYsEUD.cjs');
|
|
35
|
+
var sessionScanner = require('./sessionScanner-CaO8bLaG.cjs');
|
|
35
36
|
var node_child_process = require('node:child_process');
|
|
36
|
-
var streamRelay = require('./streamRelay-
|
|
37
|
-
var attachmentContent = require('./attachmentContent-
|
|
37
|
+
var streamRelay = require('./streamRelay-Dy6amlzx.cjs');
|
|
38
|
+
var attachmentContent = require('./attachmentContent-CEm13_gF.cjs');
|
|
38
39
|
var promises = require('node:fs/promises');
|
|
39
|
-
var claudeSessionFork = require('./claudeSessionFork-
|
|
40
|
-
var registerKillSessionHandler = require('./registerKillSessionHandler-
|
|
41
|
-
var doctor = require('./doctor-
|
|
40
|
+
var claudeSessionFork = require('./claudeSessionFork-Be16vzGc.cjs');
|
|
41
|
+
var registerKillSessionHandler = require('./registerKillSessionHandler-CIsvBrVe.cjs');
|
|
42
|
+
var doctor = require('./doctor-BrgSlfXn.cjs');
|
|
42
43
|
var node_http = require('node:http');
|
|
43
44
|
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
44
|
-
var projectPath = require('./projectPath-
|
|
45
|
-
var
|
|
45
|
+
var projectPath = require('./projectPath-C3ioB4Bu.cjs');
|
|
46
|
+
var processTreeSnapshot = require('./processTreeSnapshot-mDbnuojn.cjs');
|
|
47
|
+
var titleGenerator = require('./titleGenerator-Cgp5ihFb.cjs');
|
|
46
48
|
var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
|
|
47
|
-
var reportProgressTool = require('./reportProgressTool-
|
|
49
|
+
var reportProgressTool = require('./reportProgressTool-14AXr959.cjs');
|
|
48
50
|
require('node:util');
|
|
49
|
-
require('./
|
|
50
|
-
require('./trimIdent-4gvk9Wk6.cjs');
|
|
51
|
-
require('node:os');
|
|
52
|
-
require('./agentGuidance-BtBx2xxE.cjs');
|
|
53
|
-
require('./rateLimitWindows-Czb7_7cK.cjs');
|
|
51
|
+
require('./prompt-lgF9IE82.cjs');
|
|
54
52
|
require('zod');
|
|
55
|
-
require('./
|
|
56
|
-
require('
|
|
57
|
-
require('
|
|
58
|
-
require('path');
|
|
59
|
-
require('cross-spawn');
|
|
53
|
+
require('./client-D_loZ9IK.cjs');
|
|
54
|
+
require('./context-6TP-iz_c.cjs');
|
|
55
|
+
require('./sessionOps-BrGiU9-s.cjs');
|
|
60
56
|
require('./authRelay-Dy1qU9td.cjs');
|
|
61
|
-
require('./
|
|
62
|
-
require('./
|
|
63
|
-
require('./
|
|
64
|
-
require('
|
|
65
|
-
require('./tools-CxJp4T1T.cjs');
|
|
66
|
-
require('./peerTools-iy3_6Yc5.cjs');
|
|
57
|
+
require('./resources-CvIlkzpP.cjs');
|
|
58
|
+
require('./tools-BL7Byl_x.cjs');
|
|
59
|
+
require('./peerTools-DQNlrcqM.cjs');
|
|
60
|
+
require('node:os');
|
|
67
61
|
require('./ids-B6ZC0HGt.cjs');
|
|
68
|
-
require('./remoteSessionClient-
|
|
62
|
+
require('./remoteSessionClient-D843fkzL.cjs');
|
|
69
63
|
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
70
64
|
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
71
65
|
require('./limits-C-a7gr04.cjs');
|
|
72
|
-
require('./downloadTarget-
|
|
66
|
+
require('./downloadTarget-CEb9che-.cjs');
|
|
73
67
|
require('./terminals-B_bfC9c2.cjs');
|
|
74
68
|
require('./terminalTitleSuggest-DhvRFX3H.cjs');
|
|
75
69
|
require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
76
|
-
require('./bootstrap-
|
|
70
|
+
require('./bootstrap-DoA7okld.cjs');
|
|
71
|
+
require('./package-KhLqBDX9.cjs');
|
|
72
|
+
require('./agentGuidance-BtBx2xxE.cjs');
|
|
73
|
+
require('./trimIdent-4gvk9Wk6.cjs');
|
|
74
|
+
require('./webPanels-FCgFKvVe.cjs');
|
|
77
75
|
require('./previewPath-B0rBdhy1.cjs');
|
|
78
|
-
require('
|
|
76
|
+
require('crypto');
|
|
77
|
+
require('./smallFastModel-D_uxGMo3.cjs');
|
|
78
|
+
require('./rateLimitWindows-YRIYVdo4.cjs');
|
|
79
|
+
require('util');
|
|
80
|
+
require('path');
|
|
81
|
+
require('cross-spawn');
|
|
82
|
+
require('./sync-Bn-idAoy.cjs');
|
|
79
83
|
require('./transcriptCursor-DcXGLeSc.cjs');
|
|
80
|
-
require('./startFileWatcher-
|
|
84
|
+
require('./startFileWatcher-D9cYzZOq.cjs');
|
|
81
85
|
require('node:readline');
|
|
82
86
|
require('./doctor-u46qYYKX.cjs');
|
|
83
87
|
require('ps-list');
|
|
84
|
-
require('./doctorReadiness-
|
|
85
|
-
require('./detectCLI-
|
|
88
|
+
require('./doctorReadiness-Dl6yRQCy.cjs');
|
|
89
|
+
require('./detectCLI-BuYR_Qxe.cjs');
|
|
86
90
|
require('fs');
|
|
87
91
|
require('./cliUpdate-DsKXPFYp.cjs');
|
|
88
|
-
require('./piRunnerArgs-
|
|
89
|
-
require('./
|
|
92
|
+
require('./piRunnerArgs-DGaq6VYM.cjs');
|
|
93
|
+
require('./acpSessionResume-CR5pmgVo.cjs');
|
|
90
94
|
require('url');
|
|
91
95
|
require('node:module');
|
|
92
|
-
require('./client-
|
|
96
|
+
require('./client-BWjaHKtj.cjs');
|
|
93
97
|
require('./precheckCompat-CWOi5c9L.cjs');
|
|
94
98
|
|
|
95
99
|
const SCHEDULE_WAKEUP_GRACE_MS = 6e4;
|
|
@@ -127,6 +131,41 @@ function createScheduledWakeupTracker() {
|
|
|
127
131
|
return { observe, pending };
|
|
128
132
|
}
|
|
129
133
|
|
|
134
|
+
function modelTarget(model) {
|
|
135
|
+
return model == null || model === "" ? void 0 : model;
|
|
136
|
+
}
|
|
137
|
+
function needsModelSwitch(current, next) {
|
|
138
|
+
return modelTarget(current) !== modelTarget(next);
|
|
139
|
+
}
|
|
140
|
+
function modelSwitchFailureNotice(model, error) {
|
|
141
|
+
const name = modelTarget(model) ?? "default";
|
|
142
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
143
|
+
return `\u26A0\uFE0F Could not switch to model "${name}" \u2014 continuing with the previous model. ${detail}`;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const CLAUDE_MODEL_NOT_FOUND = "model_not_found";
|
|
147
|
+
function retiredModelFrom(message, runningModel) {
|
|
148
|
+
const m = message;
|
|
149
|
+
if (!m || m.type !== "assistant" || m.error !== CLAUDE_MODEL_NOT_FOUND) return null;
|
|
150
|
+
if ((m.parent_tool_use_id ?? null) !== null) return null;
|
|
151
|
+
return modelTarget(runningModel) ?? null;
|
|
152
|
+
}
|
|
153
|
+
function createRetiredModels() {
|
|
154
|
+
const retired = /* @__PURE__ */ new Set();
|
|
155
|
+
return {
|
|
156
|
+
retire(model) {
|
|
157
|
+
retired.add(model);
|
|
158
|
+
},
|
|
159
|
+
effective(model) {
|
|
160
|
+
const target = modelTarget(model);
|
|
161
|
+
return target !== void 0 && retired.has(target) ? void 0 : target;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function retiredModelNotice(model) {
|
|
166
|
+
return `\u26A0\uFE0F Model "${model}" is no longer available \u2014 switched this session to the default model. Pick another model to change it, then send your message again.`;
|
|
167
|
+
}
|
|
168
|
+
|
|
130
169
|
class Session {
|
|
131
170
|
path;
|
|
132
171
|
logPath;
|
|
@@ -155,6 +194,8 @@ class Session {
|
|
|
155
194
|
backgroundTasks = [];
|
|
156
195
|
/** B-587 review P3-4: CronCreate / ScheduleWakeup pending in this Claude process. */
|
|
157
196
|
scheduledWakeups = createScheduledWakeupTracker();
|
|
197
|
+
/** B-634 ③: model ids Claude Code reported as model_not_found — session-scoped, survives relaunches. */
|
|
198
|
+
retiredModels = createRetiredModels();
|
|
158
199
|
/**
|
|
159
200
|
* Window after a user-initiated abort during which stray promise rejections
|
|
160
201
|
* from tearing down the SDK query (MCP transports, in-flight tool calls,
|
|
@@ -208,6 +249,20 @@ class Session {
|
|
|
208
249
|
sessionFoundCallbacks = [];
|
|
209
250
|
/** Keep alive interval reference for cleanup */
|
|
210
251
|
keepAliveInterval;
|
|
252
|
+
/**
|
|
253
|
+
* B-645: project context rides in front of real user messages (never the
|
|
254
|
+
* system prompt), so it survives relaunches without touching the mode hash
|
|
255
|
+
* or prewarm key. One per session process; created on first use.
|
|
256
|
+
*/
|
|
257
|
+
_projectInjector = null;
|
|
258
|
+
get projectInjector() {
|
|
259
|
+
return this._projectInjector ??= deterministicJson.createProjectInjector({
|
|
260
|
+
client: client.sharedProjectsClient(),
|
|
261
|
+
sessionId: () => this.client.sessionId,
|
|
262
|
+
metadata: () => this.client.getMetadata?.() ?? null,
|
|
263
|
+
agent: "claude"
|
|
264
|
+
});
|
|
265
|
+
}
|
|
211
266
|
constructor(opts) {
|
|
212
267
|
this.path = opts.path;
|
|
213
268
|
this.api = opts.api;
|
|
@@ -594,6 +649,112 @@ function createRuntimeControls(isThinking) {
|
|
|
594
649
|
return { setQuery, observe, request, stopRunningTasks };
|
|
595
650
|
}
|
|
596
651
|
|
|
652
|
+
const CLAUDE_COMMAND_LIFECYCLE_STATES = ["queued", "started", "completed", "cancelled", "discarded", "refused"];
|
|
653
|
+
function readClaudeCommandLifecycle(frame) {
|
|
654
|
+
const m = frame;
|
|
655
|
+
if (!m) return null;
|
|
656
|
+
const isLifecycle = m.type === "command_lifecycle" || m.type === "system" && m.subtype === "command_lifecycle";
|
|
657
|
+
if (!isLifecycle || typeof m.command_uuid !== "string" || m.command_uuid.length === 0) return null;
|
|
658
|
+
const state = CLAUDE_COMMAND_LIFECYCLE_STATES.find((candidate) => candidate === m.state);
|
|
659
|
+
return state ? { uuid: m.command_uuid, state } : null;
|
|
660
|
+
}
|
|
661
|
+
const uuidList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.length > 0) : [];
|
|
662
|
+
const INTERRUPT_CANCEL_QUEUED_CAPABILITY = "interrupt_cancel_queued_v1";
|
|
663
|
+
const PENDING_MAX = 256;
|
|
664
|
+
const REPORTED_MAX = 512;
|
|
665
|
+
const MSG_LIFECYCLE_CAPABILITY = "msg_lifecycle_v1";
|
|
666
|
+
function createClaudeCommandTracker() {
|
|
667
|
+
const pending = /* @__PURE__ */ new Map();
|
|
668
|
+
const reported = /* @__PURE__ */ new Set();
|
|
669
|
+
const drop = (uuid) => {
|
|
670
|
+
pending.delete(uuid);
|
|
671
|
+
if (reported.has(uuid)) return null;
|
|
672
|
+
reported.add(uuid);
|
|
673
|
+
if (reported.size > REPORTED_MAX) reported.delete(reported.values().next().value);
|
|
674
|
+
return uuid;
|
|
675
|
+
};
|
|
676
|
+
return {
|
|
677
|
+
/** A uuid-stamped user message (prompt or steer) was handed to the Query. */
|
|
678
|
+
track(uuid, payload) {
|
|
679
|
+
if (!pending.has(uuid) && pending.size >= PENDING_MAX) pending.delete(pending.keys().next().value);
|
|
680
|
+
pending.set(uuid, { started: false, payload });
|
|
681
|
+
},
|
|
682
|
+
isTracked(uuid) {
|
|
683
|
+
return pending.has(uuid);
|
|
684
|
+
},
|
|
685
|
+
/** A lifecycle frame; returns the uuids now known to have never run. */
|
|
686
|
+
observe(lifecycle) {
|
|
687
|
+
const entry = pending.get(lifecycle.uuid);
|
|
688
|
+
if (!entry) return [];
|
|
689
|
+
switch (lifecycle.state) {
|
|
690
|
+
case "queued":
|
|
691
|
+
return [];
|
|
692
|
+
case "started":
|
|
693
|
+
entry.started = true;
|
|
694
|
+
return [];
|
|
695
|
+
case "completed":
|
|
696
|
+
pending.delete(lifecycle.uuid);
|
|
697
|
+
return [];
|
|
698
|
+
default: {
|
|
699
|
+
if (entry.started) {
|
|
700
|
+
pending.delete(lifecycle.uuid);
|
|
701
|
+
return [];
|
|
702
|
+
}
|
|
703
|
+
const dropped = drop(lifecycle.uuid);
|
|
704
|
+
return dropped ? [dropped] : [];
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
},
|
|
708
|
+
/**
|
|
709
|
+
* An interrupt's receipt: `cancelled` members we track never ran;
|
|
710
|
+
* `still_queued` members we track are returned for the per-uuid
|
|
711
|
+
* follow-up (`cancel_async_message`) a CLI without cancel_queued needs.
|
|
712
|
+
*/
|
|
713
|
+
onInterruptReceipt(receipt) {
|
|
714
|
+
const dropped = [];
|
|
715
|
+
for (const uuid of uuidList(receipt?.cancelled)) {
|
|
716
|
+
if (!pending.has(uuid)) continue;
|
|
717
|
+
const result = drop(uuid);
|
|
718
|
+
if (result) dropped.push(result);
|
|
719
|
+
}
|
|
720
|
+
const stillQueued = uuidList(receipt?.still_queued).filter((uuid) => pending.has(uuid));
|
|
721
|
+
return { dropped, stillQueued };
|
|
722
|
+
},
|
|
723
|
+
/** The answer to `cancel_async_message`: true = withdrawn before it ran; false = already dequeued, its lifecycle frames follow. */
|
|
724
|
+
onCancelResponse(uuid, cancelled) {
|
|
725
|
+
if (!cancelled || !pending.has(uuid)) return [];
|
|
726
|
+
const dropped = drop(uuid);
|
|
727
|
+
return dropped ? [dropped] : [];
|
|
728
|
+
},
|
|
729
|
+
/**
|
|
730
|
+
* B-634 ②: the Query is over — every tracked message that never
|
|
731
|
+
* `started` and was not already reported, in the order it was sent.
|
|
732
|
+
* Untracked afterwards; a later frame for one of them is ignored.
|
|
733
|
+
*/
|
|
734
|
+
takeUnconfirmed() {
|
|
735
|
+
const out = [];
|
|
736
|
+
for (const [uuid, entry] of pending) {
|
|
737
|
+
if (entry.started || entry.payload === void 0 || reported.has(uuid)) continue;
|
|
738
|
+
out.push({ uuid, payload: entry.payload });
|
|
739
|
+
}
|
|
740
|
+
for (const { uuid } of out) pending.delete(uuid);
|
|
741
|
+
return out;
|
|
742
|
+
},
|
|
743
|
+
clear() {
|
|
744
|
+
pending.clear();
|
|
745
|
+
}
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
function planUnconfirmedCommands(commands, context) {
|
|
749
|
+
if (context.aborted || !context.parkFree) return { redeliver: null, tombstone: commands.map((c) => c.uuid) };
|
|
750
|
+
const index = commands.findIndex((c) => !context.redelivered.has(c.uuid));
|
|
751
|
+
if (index < 0) return { redeliver: null, tombstone: commands.map((c) => c.uuid) };
|
|
752
|
+
return {
|
|
753
|
+
redeliver: commands[index],
|
|
754
|
+
tombstone: commands.filter((_, i) => i !== index).map((c) => c.uuid)
|
|
755
|
+
};
|
|
756
|
+
}
|
|
757
|
+
|
|
597
758
|
const AUTH_FAILURE_RESULT_TEXT = /Failed to authenticate|OAuth session expired/i;
|
|
598
759
|
const QUERY_RECYCLE_NOTICE = {
|
|
599
760
|
authentication_failed: "\u26A0\uFE0F Claude Code could not refresh its OAuth session. This agent process was ended so your next message starts a fresh one that re-reads the credentials on this machine; if it fails again, run `claude` on the machine to log in again."
|
|
@@ -747,18 +908,6 @@ async function awaitFileExist(file, timeout = 1e4) {
|
|
|
747
908
|
return false;
|
|
748
909
|
}
|
|
749
910
|
|
|
750
|
-
function modelTarget(model) {
|
|
751
|
-
return model == null || model === "" ? void 0 : model;
|
|
752
|
-
}
|
|
753
|
-
function needsModelSwitch(current, next) {
|
|
754
|
-
return modelTarget(current) !== modelTarget(next);
|
|
755
|
-
}
|
|
756
|
-
function modelSwitchFailureNotice(model, error) {
|
|
757
|
-
const name = modelTarget(model) ?? "default";
|
|
758
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
759
|
-
return `\u26A0\uFE0F Could not switch to model "${name}" \u2014 continuing with the previous model. ${detail}`;
|
|
760
|
-
}
|
|
761
|
-
|
|
762
911
|
const SDK_TIMING_FIELDS = ["ttft_ms", "time_to_request_ms", "time_to_request_from_spawn_ms"];
|
|
763
912
|
function delta(from, to) {
|
|
764
913
|
if (typeof from !== "number" || typeof to !== "number" || to < from) return "-";
|
|
@@ -1093,88 +1242,6 @@ function createClaudeTurnTracker() {
|
|
|
1093
1242
|
};
|
|
1094
1243
|
}
|
|
1095
1244
|
|
|
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
1245
|
const SET_MODEL_TIMEOUT_MS = 3e4;
|
|
1179
1246
|
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;
|
|
1180
1247
|
function promptUuid(uuid) {
|
|
@@ -1300,7 +1367,7 @@ async function claudeRemote(opts) {
|
|
|
1300
1367
|
const messages2 = new PushableAsyncIterable();
|
|
1301
1368
|
const startedAt = Date.now();
|
|
1302
1369
|
try {
|
|
1303
|
-
const response2 =
|
|
1370
|
+
const response2 = query.query({
|
|
1304
1371
|
prompt: messages2,
|
|
1305
1372
|
options: buildSdkOptions(lease.mode, { settingsPath: lease.hookSettingsPath, abort: abort.signal })
|
|
1306
1373
|
});
|
|
@@ -1348,9 +1415,14 @@ async function claudeRemote(opts) {
|
|
|
1348
1415
|
const discardWarm = (reason) => {
|
|
1349
1416
|
warm?.lease.discard(reason);
|
|
1350
1417
|
};
|
|
1418
|
+
const withoutRetiredModel = (next) => {
|
|
1419
|
+
if (!next || !opts.retiredModels) return next;
|
|
1420
|
+
const model = opts.retiredModels.effective(next.mode.model);
|
|
1421
|
+
return model === next.mode.model ? next : { ...next, mode: { ...next.mode, model } };
|
|
1422
|
+
};
|
|
1351
1423
|
let initial;
|
|
1352
1424
|
try {
|
|
1353
|
-
initial = await opts.nextMessage();
|
|
1425
|
+
initial = withoutRetiredModel(await opts.nextMessage());
|
|
1354
1426
|
} catch (error) {
|
|
1355
1427
|
discardWarm("error");
|
|
1356
1428
|
throw error;
|
|
@@ -1459,7 +1531,7 @@ async function claudeRemote(opts) {
|
|
|
1459
1531
|
messages = new PushableAsyncIterable();
|
|
1460
1532
|
messages.push(initialUserMessage);
|
|
1461
1533
|
timingMarks.spawnAt = Date.now();
|
|
1462
|
-
response =
|
|
1534
|
+
response = query.query({
|
|
1463
1535
|
prompt: messages,
|
|
1464
1536
|
options: buildSdkOptions(initial.mode, { settingsPath: opts.hookSettingsPath, abort: opts.signal })
|
|
1465
1537
|
});
|
|
@@ -1510,7 +1582,7 @@ async function claudeRemote(opts) {
|
|
|
1510
1582
|
steer: (message, nextMode, localKey) => {
|
|
1511
1583
|
mode = { ...nextMode, model: mode.model };
|
|
1512
1584
|
const uuid = promptUuid(localKey);
|
|
1513
|
-
if (uuid.uuid) commandTracker.track(uuid.uuid);
|
|
1585
|
+
if (uuid.uuid) commandTracker.track(uuid.uuid, { message, mode: nextMode });
|
|
1514
1586
|
messages.push({
|
|
1515
1587
|
type: "user",
|
|
1516
1588
|
parent_tool_use_id: null,
|
|
@@ -1524,7 +1596,7 @@ async function claudeRemote(opts) {
|
|
|
1524
1596
|
}
|
|
1525
1597
|
let lastAssistantError;
|
|
1526
1598
|
turn.pushed();
|
|
1527
|
-
if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid);
|
|
1599
|
+
if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid, { message: initial.message, mode: initial.mode });
|
|
1528
1600
|
let modelUnconfirmed = false;
|
|
1529
1601
|
let pullingNext = false;
|
|
1530
1602
|
const pullNextMessage = () => {
|
|
@@ -1533,8 +1605,10 @@ async function claudeRemote(opts) {
|
|
|
1533
1605
|
return;
|
|
1534
1606
|
}
|
|
1535
1607
|
pullingNext = true;
|
|
1536
|
-
opts.nextMessage().then(async (
|
|
1608
|
+
opts.nextMessage().then(async (pulled) => {
|
|
1609
|
+
let next = withoutRetiredModel(pulled);
|
|
1537
1610
|
if (!next) {
|
|
1611
|
+
pullingNext = false;
|
|
1538
1612
|
messages.end();
|
|
1539
1613
|
return;
|
|
1540
1614
|
}
|
|
@@ -1554,8 +1628,9 @@ async function claudeRemote(opts) {
|
|
|
1554
1628
|
updateThinking(true);
|
|
1555
1629
|
turn.pushed();
|
|
1556
1630
|
const uuid = promptUuid(next.uuid);
|
|
1557
|
-
if (uuid.uuid) commandTracker.track(uuid.uuid);
|
|
1631
|
+
if (uuid.uuid) commandTracker.track(uuid.uuid, { message: next.message, mode: next.mode });
|
|
1558
1632
|
timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
|
|
1633
|
+
pullingNext = false;
|
|
1559
1634
|
messages.push({
|
|
1560
1635
|
type: "user",
|
|
1561
1636
|
parent_tool_use_id: null,
|
|
@@ -1564,9 +1639,8 @@ async function claudeRemote(opts) {
|
|
|
1564
1639
|
message: { role: "user", content: next.message }
|
|
1565
1640
|
});
|
|
1566
1641
|
}).catch(() => {
|
|
1567
|
-
messages.end();
|
|
1568
|
-
}).finally(() => {
|
|
1569
1642
|
pullingNext = false;
|
|
1643
|
+
messages.end();
|
|
1570
1644
|
});
|
|
1571
1645
|
};
|
|
1572
1646
|
const recycleIfPoisoned = (result) => {
|
|
@@ -1605,6 +1679,17 @@ async function claudeRemote(opts) {
|
|
|
1605
1679
|
if (message.type === "assistant" && message.error) {
|
|
1606
1680
|
lastAssistantError = message.error;
|
|
1607
1681
|
}
|
|
1682
|
+
const retired = opts.retiredModels ? retiredModelFrom(message, mode.model) : null;
|
|
1683
|
+
if (retired) {
|
|
1684
|
+
opts.retiredModels.retire(retired);
|
|
1685
|
+
mode = { ...mode, model: void 0 };
|
|
1686
|
+
logger.logger.debug(`[claudeRemote] Model ${retired} reported model_not_found; moving the session to the default model`);
|
|
1687
|
+
opts.onCompletionEvent?.(retiredModelNotice(retired));
|
|
1688
|
+
void withTimeout(response.setModel(void 0), SET_MODEL_TIMEOUT_MS, "set_model").catch((e) => {
|
|
1689
|
+
logger.logger.debug(`[claudeRemote] setModel(default) after model_not_found failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
1690
|
+
modelUnconfirmed = true;
|
|
1691
|
+
});
|
|
1692
|
+
}
|
|
1608
1693
|
if (message.type === "assistant" && timingMarks.firstAssistantAt === void 0) {
|
|
1609
1694
|
timingMarks.firstAssistantAt = Date.now();
|
|
1610
1695
|
} else if (message.type === "system" && message.subtype === "init" && timingMarks.initAt === void 0) {
|
|
@@ -1718,6 +1803,13 @@ async function claudeRemote(opts) {
|
|
|
1718
1803
|
}
|
|
1719
1804
|
} finally {
|
|
1720
1805
|
updateThinking(false);
|
|
1806
|
+
if (cliCapabilities.has(MSG_LIFECYCLE_CAPABILITY)) {
|
|
1807
|
+
const unconfirmed = commandTracker.takeUnconfirmed();
|
|
1808
|
+
if (unconfirmed.length > 0) {
|
|
1809
|
+
logger.logger.debug(`[claudeRemote] Query ended with ${unconfirmed.length} user message(s) never started: ${unconfirmed.map((c) => c.uuid).join(", ")}`);
|
|
1810
|
+
opts.onCommandsUnconfirmed?.(unconfirmed, { aborted: opts.signal?.aborted === true });
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1721
1813
|
}
|
|
1722
1814
|
}
|
|
1723
1815
|
|
|
@@ -2688,7 +2780,7 @@ class OutgoingMessageQueue {
|
|
|
2688
2780
|
}
|
|
2689
2781
|
queue = [];
|
|
2690
2782
|
nextId = 1;
|
|
2691
|
-
lock = new
|
|
2783
|
+
lock = new pushNotifications.AsyncLock();
|
|
2692
2784
|
processTimer;
|
|
2693
2785
|
delayTimers = /* @__PURE__ */ new Map();
|
|
2694
2786
|
/**
|
|
@@ -3637,7 +3729,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3637
3729
|
logger.logger.debug("[claudeRemoteLauncher] Starting remote launcher");
|
|
3638
3730
|
const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
3639
3731
|
logger.logger.debug(`[claudeRemoteLauncher] TTY available: ${hasTTY}`);
|
|
3640
|
-
let messageBuffer
|
|
3732
|
+
let messageBuffer = new sessionExitLifecycle.MessageBuffer();
|
|
3641
3733
|
let inkInstance = null;
|
|
3642
3734
|
if (hasTTY) {
|
|
3643
3735
|
const [{ render }, { default: React }, { RemoteModeDisplay }] = await Promise.all([
|
|
@@ -3647,7 +3739,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3647
3739
|
]);
|
|
3648
3740
|
console.clear();
|
|
3649
3741
|
inkInstance = render(React.createElement(RemoteModeDisplay, {
|
|
3650
|
-
messageBuffer
|
|
3742
|
+
messageBuffer,
|
|
3651
3743
|
logPath: process.env.DEBUG ? session.logPath : void 0,
|
|
3652
3744
|
onExit: async () => {
|
|
3653
3745
|
logger.logger.debug("[remote]: Exiting client via Ctrl-C");
|
|
@@ -3821,14 +3913,14 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3821
3913
|
session.scheduledWakeups.observe(message);
|
|
3822
3914
|
if (message.type === "system" && message.subtype === "api_retry") {
|
|
3823
3915
|
const notice = describeClaudeApiRetry(message);
|
|
3824
|
-
messageBuffer
|
|
3916
|
+
messageBuffer.addMessage(notice, "status");
|
|
3825
3917
|
if (apiRetryGate.observe(message, Date.now())) {
|
|
3826
3918
|
session.client.sendSessionEvent({ type: "message", message: notice, kind: "claude-api-retry" });
|
|
3827
3919
|
}
|
|
3828
3920
|
} else if (message.type === "system" && message.subtype === "informational") {
|
|
3829
3921
|
const warning = describeClaudeInformational(message);
|
|
3830
3922
|
if (warning) {
|
|
3831
|
-
messageBuffer
|
|
3923
|
+
messageBuffer.addMessage(warning, "status");
|
|
3832
3924
|
session.client.sendSessionEvent({ type: "message", message: warning, kind: "claude-warning" });
|
|
3833
3925
|
}
|
|
3834
3926
|
} else if (message.type === "result") {
|
|
@@ -3839,7 +3931,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3839
3931
|
sdkToLogConverter.convert(message);
|
|
3840
3932
|
return;
|
|
3841
3933
|
}
|
|
3842
|
-
formatClaudeMessageForInk(message, messageBuffer
|
|
3934
|
+
formatClaudeMessageForInk(message, messageBuffer);
|
|
3843
3935
|
if (message.type === "assistant") {
|
|
3844
3936
|
let umessage = message;
|
|
3845
3937
|
if (umessage.message.content && Array.isArray(umessage.message.content)) {
|
|
@@ -3949,6 +4041,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3949
4041
|
}
|
|
3950
4042
|
try {
|
|
3951
4043
|
const modeGate = new LaunchModeGate(session.queue.modeHasher);
|
|
4044
|
+
const redeliveredCommands = /* @__PURE__ */ new Set();
|
|
3952
4045
|
let previousSessionId = null;
|
|
3953
4046
|
await Promise.race([
|
|
3954
4047
|
rewindReconciler.startup().catch((error) => logger.logger.debug("[rewind] startup reconcile failed", error)),
|
|
@@ -3956,15 +4049,15 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
3956
4049
|
]);
|
|
3957
4050
|
while (!exitReason) {
|
|
3958
4051
|
logger.logger.debug("[remote]: launch");
|
|
3959
|
-
messageBuffer
|
|
4052
|
+
messageBuffer.addMessage("\u2550".repeat(40), "status");
|
|
3960
4053
|
const isNewSession = session.sessionId !== previousSessionId;
|
|
3961
4054
|
if (isNewSession) {
|
|
3962
|
-
messageBuffer
|
|
4055
|
+
messageBuffer.addMessage("Starting new Claude session...", "status");
|
|
3963
4056
|
permissionHandler.reset();
|
|
3964
4057
|
sdkToLogConverter.resetParentChain();
|
|
3965
4058
|
logger.logger.debug(`[remote]: New session detected (previous: ${previousSessionId}, current: ${session.sessionId})`);
|
|
3966
4059
|
} else {
|
|
3967
|
-
messageBuffer
|
|
4060
|
+
messageBuffer.addMessage("Continuing Claude session...", "status");
|
|
3968
4061
|
logger.logger.debug(`[remote]: Continuing existing session: ${session.sessionId}`);
|
|
3969
4062
|
}
|
|
3970
4063
|
previousSessionId = session.sessionId;
|
|
@@ -4004,10 +4097,15 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
4004
4097
|
return permissionHandler.isAborted(toolCallId);
|
|
4005
4098
|
},
|
|
4006
4099
|
nextMessage: async () => {
|
|
4100
|
+
const finalize = async (text) => {
|
|
4101
|
+
const out = await session.projectInjector.decorate(text);
|
|
4102
|
+
onPromptFinalized?.(out);
|
|
4103
|
+
return out;
|
|
4104
|
+
};
|
|
4007
4105
|
const parked = modeGate.takeParked();
|
|
4008
4106
|
if (parked) {
|
|
4009
4107
|
permissionHandler.handleModeChange(parked.mode.permissionMode);
|
|
4010
|
-
if (typeof parked.message === "string")
|
|
4108
|
+
if (typeof parked.message === "string") return { ...parked, message: await finalize(parked.message) };
|
|
4011
4109
|
return parked;
|
|
4012
4110
|
}
|
|
4013
4111
|
await rewindReconciler.settled(controller.signal);
|
|
@@ -4036,8 +4134,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
4036
4134
|
sessionId: session.client.sessionId
|
|
4037
4135
|
});
|
|
4038
4136
|
logger.logger.debug(`[remote] Staged ${staged.length} attachment(s) for the coding agent`);
|
|
4039
|
-
const withAttachments = attachmentContent.appendStagedAttachmentsToPrompt(msg.message, staged);
|
|
4040
|
-
onPromptFinalized?.(withAttachments);
|
|
4137
|
+
const withAttachments = await finalize(attachmentContent.appendStagedAttachmentsToPrompt(msg.message, staged));
|
|
4041
4138
|
return {
|
|
4042
4139
|
message: withAttachments,
|
|
4043
4140
|
mode: msg.mode,
|
|
@@ -4045,9 +4142,9 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
4045
4142
|
uuid: promptUuidFor(msg.sourceIds)
|
|
4046
4143
|
};
|
|
4047
4144
|
}
|
|
4048
|
-
|
|
4145
|
+
const finalized = await finalize(msg.message);
|
|
4049
4146
|
return {
|
|
4050
|
-
message:
|
|
4147
|
+
message: finalized,
|
|
4051
4148
|
mode: msg.mode,
|
|
4052
4149
|
enqueuedAt: msg.enqueuedAt,
|
|
4053
4150
|
uuid: promptUuidFor(msg.sourceIds)
|
|
@@ -4121,6 +4218,25 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
4121
4218
|
// queued behind a pre-empting steer's turn) before the model
|
|
4122
4219
|
// read them — the same tombstone a destroyed queue item gets
|
|
4123
4220
|
// (B-332), so the web shows them as not delivered, not answered.
|
|
4221
|
+
retiredModels: session.retiredModels,
|
|
4222
|
+
// B-634 ②: messages the Query ended without Claude Code ever
|
|
4223
|
+
// starting them — sent once more, or tombstoned (B-332).
|
|
4224
|
+
onCommandsUnconfirmed: (commands, { aborted }) => {
|
|
4225
|
+
const plan = planUnconfirmedCommands(commands, {
|
|
4226
|
+
aborted: aborted || exitReason !== null,
|
|
4227
|
+
parkFree: !modeGate.hasParked,
|
|
4228
|
+
redelivered: redeliveredCommands
|
|
4229
|
+
});
|
|
4230
|
+
if (plan.redeliver) {
|
|
4231
|
+
redeliveredCommands.add(plan.redeliver.uuid);
|
|
4232
|
+
logger.logger.debug(`[remote]: re-sending unconfirmed user message ${plan.redeliver.uuid} into the next launch`);
|
|
4233
|
+
modeGate.park({ message: plan.redeliver.payload.message, mode: plan.redeliver.payload.mode, uuid: plan.redeliver.uuid });
|
|
4234
|
+
}
|
|
4235
|
+
if (plan.tombstone.length > 0) {
|
|
4236
|
+
logger.logger.debug(`[remote]: ${plan.tombstone.length} user message(s) never started before the query ended`);
|
|
4237
|
+
session.client.sendQueueCancelReason(plan.tombstone, "aborted");
|
|
4238
|
+
}
|
|
4239
|
+
},
|
|
4124
4240
|
onCommandsDropped: (uuids) => {
|
|
4125
4241
|
logger.logger.debug(`[remote]: ${uuids.length} user message(s) never read before the turn ended`);
|
|
4126
4242
|
session.client.sendQueueCancelReason(uuids, "aborted");
|
|
@@ -4229,7 +4345,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
|
|
|
4229
4345
|
}
|
|
4230
4346
|
});
|
|
4231
4347
|
logger.logger.debug(`[remote]: cleanup done +${Date.now() - t0}ms rawMode=${process.stdin.isRaw}`);
|
|
4232
|
-
messageBuffer
|
|
4348
|
+
messageBuffer.clear();
|
|
4233
4349
|
if (abortFuture) {
|
|
4234
4350
|
abortFuture.resolve(void 0);
|
|
4235
4351
|
}
|
|
@@ -4263,7 +4379,7 @@ async function loop(opts) {
|
|
|
4263
4379
|
logger.logger.debug(`[loop] Iteration with mode: ${mode}`);
|
|
4264
4380
|
switch (mode) {
|
|
4265
4381
|
case "local": {
|
|
4266
|
-
const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-
|
|
4382
|
+
const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-BhvPbcyH.cjs'); });
|
|
4267
4383
|
const result = await claudeLocalLauncher(session);
|
|
4268
4384
|
switch (result.type) {
|
|
4269
4385
|
case "switch":
|
|
@@ -4428,71 +4544,6 @@ function cleanupHookSettingsFile(filepath) {
|
|
|
4428
4544
|
}
|
|
4429
4545
|
}
|
|
4430
4546
|
|
|
4431
|
-
async function settleSessionOnExit(sessionId, intent, deps) {
|
|
4432
|
-
if (intent === "archive") {
|
|
4433
|
-
deps.updateMetadata((currentMetadata) => ({
|
|
4434
|
-
...currentMetadata,
|
|
4435
|
-
lifecycleState: "archived",
|
|
4436
|
-
lifecycleStateSince: Date.now(),
|
|
4437
|
-
archivedBy: "cli",
|
|
4438
|
-
archiveReason: "User terminated"
|
|
4439
|
-
}));
|
|
4440
|
-
}
|
|
4441
|
-
if (intent === "hibernate" && deps.hibernation) {
|
|
4442
|
-
const stamp = deps.hibernation;
|
|
4443
|
-
const handler = (currentMetadata) => ({ ...currentMetadata, hibernation: stamp });
|
|
4444
|
-
const landed = deps.updateMetadataAndWait ? await deps.updateMetadataAndWait(handler) : (deps.updateMetadata(handler), false);
|
|
4445
|
-
if (!landed) deps.log?.("[START] hibernation stamp not confirmed before going offline");
|
|
4446
|
-
}
|
|
4447
|
-
deps.sendSessionDeath();
|
|
4448
|
-
try {
|
|
4449
|
-
if (intent === "archive") await deps.archiveSession(sessionId);
|
|
4450
|
-
else await deps.deactivateSession(sessionId);
|
|
4451
|
-
} catch (error) {
|
|
4452
|
-
deps.log?.(`[START] ${intent === "archive" ? "archiveSession" : "deactivateSession"} during cleanup failed:`, error);
|
|
4453
|
-
}
|
|
4454
|
-
}
|
|
4455
|
-
class SessionExitGate {
|
|
4456
|
-
decided = null;
|
|
4457
|
-
hibernateCommitted = false;
|
|
4458
|
-
deferred = null;
|
|
4459
|
-
/** Returns the intent to act on, or null when cleanup already started. */
|
|
4460
|
-
claim(intent) {
|
|
4461
|
-
if (this.decided === "hibernate" && !this.hibernateCommitted && intent !== "hibernate") {
|
|
4462
|
-
if (this.deferred !== "archive") this.deferred = intent;
|
|
4463
|
-
return null;
|
|
4464
|
-
}
|
|
4465
|
-
if (this.decided !== null) return null;
|
|
4466
|
-
this.decided = intent;
|
|
4467
|
-
return intent;
|
|
4468
|
-
}
|
|
4469
|
-
get current() {
|
|
4470
|
-
return this.decided;
|
|
4471
|
-
}
|
|
4472
|
-
/** B-587: an exit was requested while the hibernation was deciding. */
|
|
4473
|
-
get exitRequested() {
|
|
4474
|
-
return this.deferred !== null;
|
|
4475
|
-
}
|
|
4476
|
-
/** B-587: the hibernation passed its last check — no more deferral. */
|
|
4477
|
-
commitHibernate() {
|
|
4478
|
-
if (this.decided === "hibernate") this.hibernateCommitted = true;
|
|
4479
|
-
}
|
|
4480
|
-
/**
|
|
4481
|
-
* B-587: a hibernation that aborted hands the exit back. Returns the exit
|
|
4482
|
-
* deferred meanwhile (the caller must run it now), or null.
|
|
4483
|
-
*/
|
|
4484
|
-
release(intent) {
|
|
4485
|
-
if (this.decided !== intent || intent === "hibernate" && this.hibernateCommitted) return null;
|
|
4486
|
-
this.decided = null;
|
|
4487
|
-
const deferred = this.deferred;
|
|
4488
|
-
this.deferred = null;
|
|
4489
|
-
return deferred;
|
|
4490
|
-
}
|
|
4491
|
-
}
|
|
4492
|
-
function exitIntentFromArchiveFlag(archive) {
|
|
4493
|
-
return archive ?? true ? "archive" : "offline";
|
|
4494
|
-
}
|
|
4495
|
-
|
|
4496
4547
|
function isUnsupportedSideQuestionError(error) {
|
|
4497
4548
|
const message = error instanceof Error ? error.message : String(error);
|
|
4498
4549
|
return /unknown|unsupported|not supported|unrecognized|invalid.*subtype/i.test(message);
|
|
@@ -4669,7 +4720,7 @@ function registerSideQuestionHandler(rpc, deps) {
|
|
|
4669
4720
|
const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
|
|
4670
4721
|
const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
|
|
4671
4722
|
const fork = deps.run ?? (async (input) => {
|
|
4672
|
-
const { query } = await Promise.resolve().then(function () { return require('./index-
|
|
4723
|
+
const { query } = await Promise.resolve().then(function () { return require('./index-DmTlDRSL.cjs'); });
|
|
4673
4724
|
return runSideQuestion(query, input);
|
|
4674
4725
|
});
|
|
4675
4726
|
const run = async (input, live) => {
|
|
@@ -4783,6 +4834,25 @@ function registerSideQuestionHandler(rpc, deps) {
|
|
|
4783
4834
|
};
|
|
4784
4835
|
}
|
|
4785
4836
|
|
|
4837
|
+
function replayClaudeForkJsonl(file, sink) {
|
|
4838
|
+
let replayed = 0;
|
|
4839
|
+
for (const line of file.split("\n")) {
|
|
4840
|
+
if (line.trim().length === 0) continue;
|
|
4841
|
+
let parsed;
|
|
4842
|
+
try {
|
|
4843
|
+
parsed = JSON.parse(line);
|
|
4844
|
+
} catch {
|
|
4845
|
+
continue;
|
|
4846
|
+
}
|
|
4847
|
+
const result = types.RawJSONLinesSchema.safeParse(parsed);
|
|
4848
|
+
if (!result.success) continue;
|
|
4849
|
+
sink.send(result.data);
|
|
4850
|
+
replayed += 1;
|
|
4851
|
+
}
|
|
4852
|
+
if (replayed > 0) sink.closeTurn();
|
|
4853
|
+
return replayed;
|
|
4854
|
+
}
|
|
4855
|
+
|
|
4786
4856
|
const ANALYZE_MIN_INTERVAL_MS = 5 * 60 * 1e3;
|
|
4787
4857
|
const HOURLY_LIMIT = 30;
|
|
4788
4858
|
const HOURLY_WINDOW_MS = 60 * 60 * 1e3;
|
|
@@ -5072,24 +5142,28 @@ function resolveMessageMode(current, meta, ctx) {
|
|
|
5072
5142
|
}
|
|
5073
5143
|
|
|
5074
5144
|
exports.reportSessionEditToDaemon = controlClient.reportSessionEditToDaemon;
|
|
5145
|
+
exports.startHappyServer = deterministicJson.startHappyServer;
|
|
5146
|
+
exports.SessionExitGate = sessionExitLifecycle.SessionExitGate;
|
|
5147
|
+
exports.exitIntentFromArchiveFlag = sessionExitLifecycle.exitIntentFromArchiveFlag;
|
|
5148
|
+
exports.settleSessionOnExit = sessionExitLifecycle.settleSessionOnExit;
|
|
5075
5149
|
exports.claudeCheckSession = systemPrompt.claudeCheckSession;
|
|
5076
5150
|
exports.parseSpecialCommand = specialCommands.parseSpecialCommand;
|
|
5077
5151
|
exports.contentLogMetadata = contentLogMetadata.contentLogMetadata;
|
|
5078
5152
|
exports.RawJSONLinesSchema = types.RawJSONLinesSchema;
|
|
5079
5153
|
exports.getProjectPath = path.getProjectPath;
|
|
5080
|
-
exports.startHappyServer = deterministicJson.startHappyServer;
|
|
5081
5154
|
exports.createSessionScanner = sessionScanner.createSessionScanner;
|
|
5082
5155
|
exports.MessageQueue2 = registerKillSessionHandler.MessageQueue2;
|
|
5083
5156
|
exports.registerKillSessionHandler = registerKillSessionHandler.registerKillSessionHandler;
|
|
5084
5157
|
exports.getEnvironmentInfo = doctor.getEnvironmentInfo;
|
|
5085
5158
|
exports.EditReportThrottle = editPaths.EditReportThrottle;
|
|
5086
5159
|
exports.extractClaudeEditPaths = editPaths.extractClaudeEditPaths;
|
|
5160
|
+
exports.snapshotTree = processTreeSnapshot.snapshotTree;
|
|
5161
|
+
exports.terminateSurvivors = processTreeSnapshot.terminateSurvivors;
|
|
5087
5162
|
exports.TitleGenerator = titleGenerator.TitleGenerator;
|
|
5088
5163
|
exports.createSelfReportState = reportProgressTool.createSelfReportState;
|
|
5089
5164
|
exports.BoardAnalyzer = BoardAnalyzer;
|
|
5090
5165
|
exports.FileRateLimiter = FileRateLimiter;
|
|
5091
5166
|
exports.PrewarmHookGate = PrewarmHookGate;
|
|
5092
|
-
exports.SessionExitGate = SessionExitGate;
|
|
5093
5167
|
exports.acquirePrewarmSlot = acquirePrewarmSlot;
|
|
5094
5168
|
exports.claudeModeHash = claudeModeHash;
|
|
5095
5169
|
exports.claudePrewarmEligibility = claudePrewarmEligibility;
|
|
@@ -5098,7 +5172,6 @@ exports.cleanupHookSettingsFile = cleanupHookSettingsFile;
|
|
|
5098
5172
|
exports.createClaudePrewarmLease = createClaudePrewarmLease;
|
|
5099
5173
|
exports.disposeAllClaudePrewarms = disposeAllClaudePrewarms;
|
|
5100
5174
|
exports.evaluatePrewarmPrediction = evaluatePrewarmPrediction;
|
|
5101
|
-
exports.exitIntentFromArchiveFlag = exitIntentFromArchiveFlag;
|
|
5102
5175
|
exports.formatPrewarmLine = formatPrewarmLine;
|
|
5103
5176
|
exports.generateHookSettingsFile = generateHookSettingsFile;
|
|
5104
5177
|
exports.loop = loop;
|
|
@@ -5107,8 +5180,8 @@ exports.prewarmPredictionMeta = prewarmPredictionMeta;
|
|
|
5107
5180
|
exports.prewarmSlotDir = prewarmSlotDir;
|
|
5108
5181
|
exports.readPrewarmCache = readPrewarmCache;
|
|
5109
5182
|
exports.registerSideQuestionHandler = registerSideQuestionHandler;
|
|
5183
|
+
exports.replayClaudeForkJsonl = replayClaudeForkJsonl;
|
|
5110
5184
|
exports.resolveMessageMode = resolveMessageMode;
|
|
5111
|
-
exports.settleSessionOnExit = settleSessionOnExit;
|
|
5112
5185
|
exports.startHookServer = startHookServer;
|
|
5113
5186
|
exports.withAssistantDenylist = withAssistantDenylist;
|
|
5114
5187
|
exports.writePrewarmCache = writePrewarmCache;
|