very-happy-cli 0.2.166 → 0.2.167
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-20VHOXwb.cjs → AcpBackend-D1IKJGz_.cjs} +3 -3
- package/dist/{AcpBackend-tRWk7yi7.mjs → AcpBackend-kFZlee5E.mjs} +3 -3
- package/dist/{BasePermissionHandler-COKc4pmt.cjs → BasePermissionHandler-DHxYAK5L.cjs} +1 -1
- package/dist/{BasePermissionHandler-CDCLIrZJ.mjs → BasePermissionHandler-DS0kRTNI.mjs} +1 -1
- package/dist/{BaseReasoningProcessor-BDVKvooR.mjs → BaseReasoningProcessor-BRtCCt7q.mjs} +1 -1
- package/dist/{BaseReasoningProcessor-DAGQdkNp.cjs → BaseReasoningProcessor-CsjVdt_H.cjs} +1 -1
- package/dist/{agentHome-2IbIjKCa.mjs → agentHome-Ct-VXFeG.mjs} +4 -4
- package/dist/{agentHome-KVWj6nCl.cjs → agentHome-DeAWzhSe.cjs} +4 -4
- package/dist/{api-DnNL5fLw.cjs → api-BZYLRDM9.cjs} +88 -10
- package/dist/{api-Cmz3XS4P.mjs → api-CReZazeT.mjs} +88 -10
- package/dist/{apiMachine-DeoQ8QbZ.cjs → apiMachine-BgMxGPsR.cjs} +50 -15
- package/dist/{apiMachine-B6ySCFe0.mjs → apiMachine-CWndf1Vn.mjs} +50 -15
- package/dist/{attachmentContent-DPWxHgX4.cjs → attachmentContent-HcJqFQW8.cjs} +2 -2
- package/dist/{attachmentContent-CTXapi-_.mjs → attachmentContent-j875mwU7.mjs} +2 -2
- package/dist/{attachmentLimits-BfgKV5iE.cjs → attachmentLimits-BEYEEBm8.cjs} +13 -1
- package/dist/{attachmentLimits-C1PCCM79.mjs → attachmentLimits-CxG3T18E.mjs} +13 -1
- package/dist/{auth-BMaBjRAj.mjs → auth-BIHuc7vY.mjs} +10 -10
- package/dist/{auth-pzWIFdOD.mjs → auth-CFS9Lfgv.mjs} +5 -5
- package/dist/{auth-D4-eQz85.cjs → auth-Myr2Q42x.cjs} +10 -10
- package/dist/{auth-ietHtvwu.cjs → auth-VzWpbo5P.cjs} +5 -5
- package/dist/{auto-DOWTQDPa.cjs → auto-Bf6Dr7_o.cjs} +14 -14
- package/dist/{auto-DL75Dx3I.mjs → auto-Df9-zmuN.mjs} +14 -14
- package/dist/{bootstrap-XE8A7Ut2.mjs → bootstrap-BSOxYpaP.mjs} +2 -2
- package/dist/{bootstrap-BpXIc2wn.cjs → bootstrap-Dj8WBiR2.cjs} +2 -2
- package/dist/{browser-DDFi1T8C.mjs → browser-BCFIHOvo.mjs} +1 -1
- package/dist/{browser-CcG8GLRV.cjs → browser-BoCV40yC.cjs} +1 -1
- package/dist/{claudeLocal-DXBXwIOG.cjs → claudeLocal-CGsq7Kul.cjs} +5 -5
- package/dist/{claudeLocal-DmM5Oyhv.mjs → claudeLocal-D5-eA9SC.mjs} +5 -5
- package/dist/{claudeLocalLauncher-Cs4eUC3P.mjs → claudeLocalLauncher-C9Cc438l.mjs} +10 -10
- package/dist/{claudeLocalLauncher-C41Y6Kp4.cjs → claudeLocalLauncher-Cf9QeYDT.cjs} +10 -10
- package/dist/{claudeSessionFork-Cs0I3eGI.cjs → claudeSessionFork-Byd8zD1U.cjs} +1 -1
- package/dist/{claudeSessionFork-BdLnc2Hv.mjs → claudeSessionFork-CMzAva8G.mjs} +1 -1
- package/dist/{client-JISJx2f-.cjs → client-BKnKRLSt.cjs} +3 -3
- package/dist/{client-GjTnsq6F.mjs → client-C7FYMer0.mjs} +2 -2
- package/dist/{client-DJ0kX_8M.cjs → client-D0T5-6Ds.cjs} +2 -2
- package/dist/{client-CbK33y_s.mjs → client-Dsfy_SAb.mjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +14 -14
- package/dist/codex/happyMcpStdioBridge.mjs +14 -14
- package/dist/{codexAppServerClient-CldXEojt.mjs → codexAppServerClient-Dd_4TxHv.mjs} +4 -4
- package/dist/{codexAppServerClient-BTjn2ZCZ.cjs → codexAppServerClient-TiW9OBk4.cjs} +4 -4
- package/dist/{codexCommand-DjMU-Ijf.mjs → codexCommand-BZSr4MKI.mjs} +137 -56
- package/dist/{codexCommand-BpD0N1F7.cjs → codexCommand-Bxryqh90.cjs} +137 -56
- package/dist/{config-DjSJKatx.mjs → config-C_Pj7yxV.mjs} +3 -3
- package/dist/{config-DuLL0Ppe.cjs → config-DXPash-r.cjs} +3 -3
- package/dist/{configuration-B0cb3xA3.cjs → configuration-C3piBtxY.cjs} +1 -1
- package/dist/{configuration-D2v3puap.mjs → configuration-WspKd2C2.mjs} +2 -2
- package/dist/{connect-B7JWEzyg.cjs → connect-BN-IBElA.cjs} +13 -13
- package/dist/{connect-CnNNyM9I.mjs → connect-DGPZs5px.mjs} +13 -13
- package/dist/{context-DjfqLWzE.mjs → context-Cr6a3NTg.mjs} +1 -1
- package/dist/{context-BFUpYT39.cjs → context-Jrq4-eCZ.cjs} +1 -1
- package/dist/{controlClient-CmnHGcyl.cjs → controlClient-BI6Fw3fQ.cjs} +18 -3
- package/dist/{controlClient-BMUJfUeF.mjs → controlClient-DTheOlvC.mjs} +18 -4
- package/dist/{createSessionMetadata-DU0bCg2m.mjs → createSessionMetadata-BEZ4DIDA.mjs} +57 -5
- package/dist/{createSessionMetadata-DbfRBhRu.cjs → createSessionMetadata-zQSz3hgk.cjs} +56 -3
- package/dist/defaultPermissionMode-Cif_RHGb.mjs +191 -0
- package/dist/defaultPermissionMode-DNKNzk7l.cjs +197 -0
- package/dist/{deterministicJson-D-WPUrZb.mjs → deterministicJson-BMMifViN.mjs} +8 -8
- package/dist/{deterministicJson-Dp3TVyap.cjs → deterministicJson-C7O2ulKY.cjs} +8 -8
- package/dist/{doctor-CkJmdPbi.cjs → doctor-BykBaMTr.cjs} +6 -6
- package/dist/{doctor-BlXXyQ1L.mjs → doctor-D1KKyPzB.mjs} +6 -6
- package/dist/{downloadTarget-CiQqRIc-.cjs → downloadTarget-CWTb2-EM.cjs} +6 -6
- package/dist/{downloadTarget-DjSwMHun.mjs → downloadTarget-Cp48jrIP.mjs} +6 -6
- package/dist/{ensureDaemonRunning-CAQag1zE.mjs → ensureDaemonRunning-Ba5fYoxb.mjs} +5 -5
- package/dist/{ensureDaemonRunning-C_aIOhgG.cjs → ensureDaemonRunning-CCxX7MoP.cjs} +5 -5
- package/dist/{handleResumeCommand-Ci7wacT-.mjs → handleResumeCommand-BTUGlNjB.mjs} +5 -5
- package/dist/{handleResumeCommand-6KzBGDnl.cjs → handleResumeCommand-yPdDQHqz.cjs} +5 -5
- package/dist/{index-CaFCAlX8.cjs → index-BjhKqDa0.cjs} +3 -3
- package/dist/{index-HQsigW_J.mjs → index-C3_83bqS.mjs} +3 -3
- package/dist/{index-WGCT6SSV.mjs → index-CE2GgPbr.mjs} +34 -34
- package/dist/{index-DQplgo0W.mjs → index-D8m8Ripb.mjs} +4 -4
- package/dist/{index-DBmNwMX9.cjs → index-DifM62wX.cjs} +33 -33
- package/dist/{index-DEKIgZUo.cjs → index-PNMQPKhz.cjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-oJUvsFu9.mjs → install-C0-QFn9s.mjs} +3 -3
- package/dist/{install-CejEiRGW.cjs → install-CqZVeze8.cjs} +3 -3
- package/dist/lib.cjs +11 -11
- package/dist/lib.d.cts +61 -0
- package/dist/lib.d.mts +61 -0
- package/dist/lib.mjs +11 -11
- package/dist/{lidState-BfximpjX.mjs → lidState-B2ZxdREe.mjs} +1 -1
- package/dist/{lidState-D8BmnJV1.cjs → lidState-Bc2K9H9l.cjs} +1 -1
- package/dist/{localHappyAgentAuth-Ct1aXwqd.mjs → localHappyAgentAuth-B5XPEMwk.mjs} +1 -1
- package/dist/{localHappyAgentAuth-d7B6S_o7.cjs → localHappyAgentAuth-T5GOvRha.cjs} +1 -1
- package/dist/{logger-JTcJU-uL.cjs → logger-B_MWPbZz.cjs} +2 -2
- package/dist/{logger-BpQcwNnt.mjs → logger-CbBv3q_b.mjs} +2 -2
- package/dist/{machineMetadata-BBg_Njw3.cjs → machineMetadata-BafS4JY8.cjs} +4 -3
- package/dist/{machineMetadata-CBdxABeI.mjs → machineMetadata-DHg238U4.mjs} +4 -3
- package/dist/{main-C16fOGgn.cjs → main-DNrA0qBy.cjs} +45 -45
- package/dist/{main-B5b1gA3K.mjs → main-DXAK0n7x.mjs} +45 -45
- package/dist/{manager-BQ4flvQZ.mjs → manager-BEsI4qt3.mjs} +9 -3
- package/dist/{manager-Cly8xVIR.cjs → manager-HrEj442o.cjs} +8 -2
- package/dist/{mcp-BnNiBBax.cjs → mcp-AvPOhDXy.cjs} +14 -14
- package/dist/{mcp-DGNWgVdv.mjs → mcp-BotAjCdD.mjs} +14 -14
- package/dist/mirrorProtocol-BdcN6QlN.cjs +1270 -0
- package/dist/mirrorProtocol-BwHm8odn.mjs +1247 -0
- package/dist/{package-C1XvUQFy.cjs → package-C9ZP9bpX.cjs} +7 -7
- package/dist/{package-BqwrPxL0.mjs → package-DU1DxhH9.mjs} +7 -7
- package/dist/{peerTools-DPvbcs8V.cjs → peerTools-Dkbu7gag.cjs} +4 -4
- package/dist/{peerTools-CeCe-3lk.mjs → peerTools-os2DVjA0.mjs} +4 -4
- package/dist/{persistence-2Xp_o6x6.cjs → persistence-BYGl0QYw.cjs} +147 -25
- package/dist/{persistence-B9LmhAE2.mjs → persistence-ON0zpHfb.mjs} +123 -12
- package/dist/{piRunnerArgs-7FaTyNOq.mjs → piRunnerArgs-CYsnT9sV.mjs} +1 -1
- package/dist/{piRunnerArgs-DI29dDNo.cjs → piRunnerArgs-DpbvstUX.cjs} +1 -1
- package/dist/{piRuntime-R8XVChxK.cjs → piRuntime-CDnILlCd.cjs} +1 -1
- package/dist/{piRuntime-0qEK5AqE.mjs → piRuntime-CmEid-wu.mjs} +1 -1
- package/dist/{piTerminal-zcQKc8Sp.mjs → piTerminal-0eNlXSlL.mjs} +16 -16
- package/dist/{piTerminal-Ccj0KNPr.cjs → piTerminal-B57TgMON.cjs} +16 -16
- package/dist/{rateLimitWindows-C2Jk3Ih7.cjs → rateLimitWindows-CusGIqlq.cjs} +1 -1
- package/dist/{rateLimitWindows-Dhfhbtqu.mjs → rateLimitWindows-vZ9Bo7aT.mjs} +1 -1
- package/dist/{registerCommonHandlers-DdfGsFbM.mjs → registerCommonHandlers-B0PVff2U.mjs} +2 -2
- package/dist/{registerCommonHandlers-Aha_KfM3.cjs → registerCommonHandlers-DVYB3iVn.cjs} +2 -2
- package/dist/{registerKillSessionHandler-DboQlGcH.mjs → registerKillSessionHandler-BJMHJHXe.mjs} +14 -9
- package/dist/{registerKillSessionHandler-CjitOpUA.cjs → registerKillSessionHandler-BwXGKtg_.cjs} +14 -9
- package/dist/{remoteSessionClient-B2DtWuNP.mjs → remoteSessionClient-BzPXSC21.mjs} +5 -5
- package/dist/{remoteSessionClient-BwI8rpQw.cjs → remoteSessionClient-PyUAIhwK.cjs} +5 -5
- package/dist/{reportProgressTool-DnAD8wOa.mjs → reportProgressTool-BvB13EwC.mjs} +1 -1
- package/dist/{reportProgressTool-B-Rcy0s3.cjs → reportProgressTool-D4KB_4cP.cjs} +1 -1
- package/dist/{run-Bh66Xs40.cjs → run-BC8jzq_h.cjs} +323 -37
- package/dist/{run-DPEwJpQR.mjs → run-O2M8LsWf.mjs} +322 -36
- package/dist/{runClaude-C-lJdAKD.cjs → runClaude-C7jPa8VP.cjs} +87 -25
- package/dist/{runClaude-DLr_nBzw.mjs → runClaude-DGkr5E7s.mjs} +87 -25
- package/dist/{runClaudeDeps-vWWLod7J.cjs → runClaudeDeps-5kzncqME.cjs} +100 -31
- package/dist/{runClaudeDeps-C7JV7nXG.mjs → runClaudeDeps-CX_TxS78.mjs} +105 -36
- package/dist/{runGemini-o-CUSayc.cjs → runGemini-BfYA4Uqc.cjs} +32 -32
- package/dist/{runGemini-tH6sLw-G.mjs → runGemini-CwmGBH3L.mjs} +32 -32
- package/dist/{runOpenClaw-C5DZvVhn.mjs → runOpenClaw-BYAPYFyL.mjs} +16 -16
- package/dist/{runOpenClaw-D24f35l0.cjs → runOpenClaw-C72jut7v.cjs} +16 -16
- package/dist/{sandbox-TJZJ6ngw.cjs → sandbox-Bqkp8IT7.cjs} +4 -4
- package/dist/{sandbox-BaL1aslA.mjs → sandbox-DlVnK1Vi.mjs} +4 -4
- package/dist/{selfCheck-Dugi0Nk_.cjs → selfCheck-B4lLZplk.cjs} +34 -34
- package/dist/selfCheck-DYTGBdIO.mjs +84 -0
- package/dist/{send-DDcJ3ayi.mjs → send-B5bWW9Tl.mjs} +8 -8
- package/dist/{send-CkWOSYmU.cjs → send-BCwS6n_s.cjs} +8 -8
- package/dist/{server-CUjRvQSd.mjs → server-CEJfRQfj.mjs} +4 -4
- package/dist/{server-7qFQ8J2u.cjs → server-CFWZehnC.cjs} +6 -6
- package/dist/{sessionLock-DqVyHFAQ.mjs → sessionLock-AwOYsKT7.mjs} +12 -4
- package/dist/{sessionLock-DfhNICyS.cjs → sessionLock-LBWNjpHf.cjs} +12 -3
- package/dist/{sessionModeFile-CIznKD7O.cjs → sessionModeFile-CyPuZRIU.cjs} +1 -1
- package/dist/{sessionModeFile-M4OpiyrF.mjs → sessionModeFile-fvFn1JVG.mjs} +1 -1
- package/dist/{sessionOps-BnaEaOKs.mjs → sessionOps-DZRH4-hV.mjs} +4 -4
- package/dist/{sessionOps-DOyy4gkY.cjs → sessionOps-DzbZI3Eq.cjs} +4 -4
- package/dist/{sessionScanner-CcuOn9uU.mjs → sessionScanner-Q_Ei2flB.mjs} +3 -3
- package/dist/{sessionScanner-Cu1yKlj4.cjs → sessionScanner-i-cgwFVw.cjs} +3 -3
- package/dist/{sessions-C9O91rL1.mjs → sessions-DAmjMAZN.mjs} +9 -9
- package/dist/{sessions-BQgk5Kw8.cjs → sessions-DYK5hD4T.cjs} +9 -9
- package/dist/{setupOfflineReconnection-Byy8aeKT.mjs → setupOfflineReconnection-BfDBxNdo.mjs} +2 -2
- package/dist/{setupOfflineReconnection-DFmQ8s6I.cjs → setupOfflineReconnection-C2LO3hSP.cjs} +2 -2
- package/dist/{spawn-EZ2yrtWd.mjs → spawn-BmjG5j5Y.mjs} +13 -13
- package/dist/{spawn-BS7LPmSm.cjs → spawn-GK_sXE8h.cjs} +13 -13
- package/dist/{spawnHappyCLI-BAa49m0q.mjs → spawnHappyCLI-B2h0P4b5.mjs} +1 -1
- package/dist/{spawnHappyCLI-DyaldIe5.cjs → spawnHappyCLI-J4iEhfyZ.cjs} +1 -1
- package/dist/{specialCommands-CCWtwIGZ.mjs → specialCommands-DisVxagO.mjs} +3 -3
- package/dist/{specialCommands-DouFaJ_0.cjs → specialCommands-DmJMKspE.cjs} +3 -3
- package/dist/{startFileWatcher-Dfs4whzr.mjs → startFileWatcher-CeK1k5gt.mjs} +1 -1
- package/dist/{startFileWatcher-DQbbypJv.cjs → startFileWatcher-xKo8AoYl.cjs} +1 -1
- package/dist/{sync-x_lI_3j_.cjs → sync-Bvc-vh6C.cjs} +1 -1
- package/dist/{sync-BLpH13Kb.mjs → sync-CCwYpJMS.mjs} +1 -1
- package/dist/{systemPrompt-BanyDihy.mjs → systemPrompt-BNIkP3tR.mjs} +1 -1
- package/dist/{systemPrompt-4erwILTB.cjs → systemPrompt-DwOddbuG.cjs} +1 -1
- package/dist/{teams-D6BOT3lR.mjs → teams-DRrLBcys.mjs} +6 -6
- package/dist/{teams-DzetlGWC.cjs → teams-GHMCRZOw.cjs} +6 -6
- package/dist/{time-T0YmeOhS.cjs → time-BXvtjhe9.cjs} +1 -1
- package/dist/{time-CfDKj6Bx.mjs → time-PG5Dfwdv.mjs} +1 -1
- package/dist/{titleGenerator-CoMxqKfP.cjs → titleGenerator-B07bZA0V.cjs} +2 -2
- package/dist/{titleGenerator-ChImQ4q-.mjs → titleGenerator-CIzfpfZW.mjs} +1 -1
- package/dist/{todo-CZZebKZg.cjs → todo-B0aeoNu3.cjs} +5 -5
- package/dist/{todo-SVtYxGON.mjs → todo-CfL7SBFc.mjs} +5 -5
- package/dist/{tools-3X2z3YDe.mjs → tools-D91mq5Ib.mjs} +1 -1
- package/dist/{tools-IJ0TAcJs.cjs → tools-DJIANHSh.cjs} +1 -1
- package/dist/{uninstall-CypD-kr1.mjs → uninstall-5xz3Xvhf.mjs} +3 -3
- package/dist/{uninstall-CqqCWj7w.cjs → uninstall-AtzOfdrj.cjs} +3 -3
- package/package.json +7 -7
- package/dist/defaultPermissionMode-BnxJPVHT.mjs +0 -4
- package/dist/defaultPermissionMode-CxmTXUQR.cjs +0 -7
- package/dist/mirrorProtocol-BEGk2--0.cjs +0 -266
- package/dist/mirrorProtocol-h5WHpdhh.mjs +0 -248
- package/dist/selfCheck-DPi4lqme.mjs +0 -84
|
@@ -1,8 +1,58 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
|
-
import { resolve } from 'node:path';
|
|
3
|
-
import { c as configuration } from './configuration-
|
|
2
|
+
import { resolve, isAbsolute, dirname } from 'node:path';
|
|
3
|
+
import { c as configuration } from './configuration-WspKd2C2.mjs';
|
|
4
4
|
import { p as projectPath } from './projectPath-BTBIMB57.mjs';
|
|
5
|
-
import { p as packageJson } from './package-
|
|
5
|
+
import { p as packageJson } from './package-DU1DxhH9.mjs';
|
|
6
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
7
|
+
|
|
8
|
+
const realFs = {
|
|
9
|
+
existsSync,
|
|
10
|
+
isDirectory: (path) => {
|
|
11
|
+
try {
|
|
12
|
+
return statSync(path).isDirectory();
|
|
13
|
+
} catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
readFileSync: (path) => readFileSync(path, "utf8")
|
|
18
|
+
};
|
|
19
|
+
function resolveSessionWorktree(cwd, fs = realFs) {
|
|
20
|
+
let dir = resolve(cwd);
|
|
21
|
+
for (let depth = 0; depth < 64; depth++) {
|
|
22
|
+
const dotGit = resolve(dir, ".git");
|
|
23
|
+
try {
|
|
24
|
+
if (fs.existsSync(dotGit)) {
|
|
25
|
+
if (fs.isDirectory(dotGit)) return null;
|
|
26
|
+
const gitdir = fs.readFileSync(dotGit).match(/^gitdir:\s*(.+?)\s*$/m)?.[1];
|
|
27
|
+
if (!gitdir) return null;
|
|
28
|
+
const absolute = isAbsolute(gitdir) ? gitdir : resolve(dir, gitdir);
|
|
29
|
+
if (!/[\\/]\.git[\\/]worktrees[\\/][^\\/]+[\\/]?$/.test(absolute)) return null;
|
|
30
|
+
let branch = null;
|
|
31
|
+
try {
|
|
32
|
+
const head = fs.readFileSync(resolve(absolute, "HEAD")).trim();
|
|
33
|
+
const ref = head.match(/^ref:\s*refs\/heads\/(.+)$/)?.[1];
|
|
34
|
+
branch = ref ?? null;
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
return { branch, root: dir };
|
|
38
|
+
}
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const parent = dirname(dir);
|
|
43
|
+
if (parent === dir) break;
|
|
44
|
+
dir = parent;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
function sessionWorktreeMetadata(cwd) {
|
|
49
|
+
try {
|
|
50
|
+
const worktree = resolveSessionWorktree(cwd);
|
|
51
|
+
return worktree ? { worktree } : {};
|
|
52
|
+
} catch {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
6
56
|
|
|
7
57
|
const SPAWN_ORIGIN_TAG_MAX = 24;
|
|
8
58
|
function spawnOriginTags(env = process.env, flavor = void 0) {
|
|
@@ -46,9 +96,11 @@ function createSessionMetadata(opts) {
|
|
|
46
96
|
// B-091/B-303: dispatched sessions carry their spawn origin as a tag
|
|
47
97
|
// from birth (see spawnOriginTags) — applies to every flavor the daemon
|
|
48
98
|
// can spawn, since HAPPY_SPAWNED_BY is exported flavor-independently.
|
|
49
|
-
...originTags ? { tags: originTags } : {}
|
|
99
|
+
...originTags ? { tags: originTags } : {},
|
|
100
|
+
// B-586: linked git worktree → branch shown in the session list.
|
|
101
|
+
...sessionWorktreeMetadata(process.cwd())
|
|
50
102
|
};
|
|
51
103
|
return { state, metadata };
|
|
52
104
|
}
|
|
53
105
|
|
|
54
|
-
export { createSessionMetadata as c, isValidSpawnOrigin as i, spawnOriginTags as s };
|
|
106
|
+
export { sessionWorktreeMetadata as a, createSessionMetadata as c, isValidSpawnOrigin as i, spawnOriginTags as s };
|
|
@@ -2,9 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
var os = require('node:os');
|
|
4
4
|
var path = require('node:path');
|
|
5
|
-
var configuration = require('./configuration-
|
|
5
|
+
var configuration = require('./configuration-C3piBtxY.cjs');
|
|
6
6
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
7
|
-
var _package = require('./package-
|
|
7
|
+
var _package = require('./package-C9ZP9bpX.cjs');
|
|
8
|
+
var node_fs = require('node:fs');
|
|
9
|
+
|
|
10
|
+
const realFs = {
|
|
11
|
+
existsSync: node_fs.existsSync,
|
|
12
|
+
isDirectory: (path) => {
|
|
13
|
+
try {
|
|
14
|
+
return node_fs.statSync(path).isDirectory();
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
readFileSync: (path) => node_fs.readFileSync(path, "utf8")
|
|
20
|
+
};
|
|
21
|
+
function resolveSessionWorktree(cwd, fs = realFs) {
|
|
22
|
+
let dir = path.resolve(cwd);
|
|
23
|
+
for (let depth = 0; depth < 64; depth++) {
|
|
24
|
+
const dotGit = path.resolve(dir, ".git");
|
|
25
|
+
try {
|
|
26
|
+
if (fs.existsSync(dotGit)) {
|
|
27
|
+
if (fs.isDirectory(dotGit)) return null;
|
|
28
|
+
const gitdir = fs.readFileSync(dotGit).match(/^gitdir:\s*(.+?)\s*$/m)?.[1];
|
|
29
|
+
if (!gitdir) return null;
|
|
30
|
+
const absolute = path.isAbsolute(gitdir) ? gitdir : path.resolve(dir, gitdir);
|
|
31
|
+
if (!/[\\/]\.git[\\/]worktrees[\\/][^\\/]+[\\/]?$/.test(absolute)) return null;
|
|
32
|
+
let branch = null;
|
|
33
|
+
try {
|
|
34
|
+
const head = fs.readFileSync(path.resolve(absolute, "HEAD")).trim();
|
|
35
|
+
const ref = head.match(/^ref:\s*refs\/heads\/(.+)$/)?.[1];
|
|
36
|
+
branch = ref ?? null;
|
|
37
|
+
} catch {
|
|
38
|
+
}
|
|
39
|
+
return { branch, root: dir };
|
|
40
|
+
}
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const parent = path.dirname(dir);
|
|
45
|
+
if (parent === dir) break;
|
|
46
|
+
dir = parent;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function sessionWorktreeMetadata(cwd) {
|
|
51
|
+
try {
|
|
52
|
+
const worktree = resolveSessionWorktree(cwd);
|
|
53
|
+
return worktree ? { worktree } : {};
|
|
54
|
+
} catch {
|
|
55
|
+
return {};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
8
58
|
|
|
9
59
|
const SPAWN_ORIGIN_TAG_MAX = 24;
|
|
10
60
|
function spawnOriginTags(env = process.env, flavor = void 0) {
|
|
@@ -48,11 +98,14 @@ function createSessionMetadata(opts) {
|
|
|
48
98
|
// B-091/B-303: dispatched sessions carry their spawn origin as a tag
|
|
49
99
|
// from birth (see spawnOriginTags) — applies to every flavor the daemon
|
|
50
100
|
// can spawn, since HAPPY_SPAWNED_BY is exported flavor-independently.
|
|
51
|
-
...originTags ? { tags: originTags } : {}
|
|
101
|
+
...originTags ? { tags: originTags } : {},
|
|
102
|
+
// B-586: linked git worktree → branch shown in the session list.
|
|
103
|
+
...sessionWorktreeMetadata(process.cwd())
|
|
52
104
|
};
|
|
53
105
|
return { state, metadata };
|
|
54
106
|
}
|
|
55
107
|
|
|
56
108
|
exports.createSessionMetadata = createSessionMetadata;
|
|
57
109
|
exports.isValidSpawnOrigin = isValidSpawnOrigin;
|
|
110
|
+
exports.sessionWorktreeMetadata = sessionWorktreeMetadata;
|
|
58
111
|
exports.spawnOriginTags = spawnOriginTags;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { l as logger } from './logger-CbBv3q_b.mjs';
|
|
2
|
+
import { e as evaluateWrapperIdle, j as HIBERNATION_UNSUPPORTED_BACKOFF_MS } from './persistence-ON0zpHfb.mjs';
|
|
3
|
+
|
|
4
|
+
const PRESENCE_SETTLE_MS = 6e3;
|
|
5
|
+
async function commitHibernation(deps) {
|
|
6
|
+
const log = deps.log ?? ((message) => logger.debug(message));
|
|
7
|
+
if (!deps.claimExit()) {
|
|
8
|
+
log("[hibernate] exit already claimed for another reason; not hibernating");
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const { client } = deps;
|
|
12
|
+
const now = deps.now ?? Date.now;
|
|
13
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
14
|
+
let frozen = false;
|
|
15
|
+
let stamped = false;
|
|
16
|
+
const waitOrExit = async (work, fallback) => {
|
|
17
|
+
let settled = false;
|
|
18
|
+
const watched = work.finally(() => {
|
|
19
|
+
settled = true;
|
|
20
|
+
});
|
|
21
|
+
const exitWatch = (async () => {
|
|
22
|
+
while (!settled && !deps.exitRequested()) await sleep(EXIT_POLL_MS);
|
|
23
|
+
return settled ? watched : fallback;
|
|
24
|
+
})();
|
|
25
|
+
return Promise.race([watched, exitWatch]);
|
|
26
|
+
};
|
|
27
|
+
const abort = async (why2) => {
|
|
28
|
+
log(`[hibernate] aborted at commit: ${why2}`);
|
|
29
|
+
if (stamped) {
|
|
30
|
+
const clear = (metadata) => {
|
|
31
|
+
const next = { ...metadata };
|
|
32
|
+
delete next.hibernation;
|
|
33
|
+
return next;
|
|
34
|
+
};
|
|
35
|
+
const cleared = await client.updateMetadataAndWait(clear, deps.exitRequested() ? EXIT_CLEAR_TIMEOUT_MS : void 0).catch(() => false);
|
|
36
|
+
if (!cleared) log("[hibernate] stamp clear not confirmed (it keeps retrying in the background)");
|
|
37
|
+
}
|
|
38
|
+
if (frozen) {
|
|
39
|
+
client.unmuteHeartbeats();
|
|
40
|
+
client.unfreezeInbound();
|
|
41
|
+
}
|
|
42
|
+
deps.releaseExit();
|
|
43
|
+
return false;
|
|
44
|
+
};
|
|
45
|
+
const moved = () => {
|
|
46
|
+
if (deps.exitRequested()) return "exit requested";
|
|
47
|
+
if (client.inboundRoutedSinceCommit()) return "inbound message";
|
|
48
|
+
const verdict = deps.recheck();
|
|
49
|
+
return verdict.ok ? null : verdict.reason;
|
|
50
|
+
};
|
|
51
|
+
client.beginHibernationCommit();
|
|
52
|
+
try {
|
|
53
|
+
await client.flush();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
return abort(`flush failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
56
|
+
}
|
|
57
|
+
let why = moved();
|
|
58
|
+
if (why) return abort(why);
|
|
59
|
+
client.freezeInbound();
|
|
60
|
+
client.muteHeartbeats();
|
|
61
|
+
frozen = true;
|
|
62
|
+
const stamp = { at: now(), seq: client.messageCursor, idleMs: deps.idleMs, v: 1 };
|
|
63
|
+
stamped = true;
|
|
64
|
+
const landed = await waitOrExit(client.updateMetadataAndWait((metadata) => ({ ...metadata, hibernation: stamp })).catch(() => false), false);
|
|
65
|
+
if (deps.exitRequested()) return abort("exit requested");
|
|
66
|
+
if (!landed) return abort("stamp not confirmed");
|
|
67
|
+
const settle = Math.max(0, client.lastHeartbeatAt + (deps.presenceSettleMs ?? PRESENCE_SETTLE_MS) - now());
|
|
68
|
+
if (settle > 0) await waitOrExit(sleep(settle), void 0);
|
|
69
|
+
why = moved();
|
|
70
|
+
if (why) return abort(why);
|
|
71
|
+
deps.markCommitted();
|
|
72
|
+
log(`[hibernate] committing: seq=${stamp.seq} idleMs=${stamp.idleMs}`);
|
|
73
|
+
await deps.finish(stamp);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
const EXIT_POLL_MS = 100;
|
|
77
|
+
const EXIT_CLEAR_TIMEOUT_MS = 1e3;
|
|
78
|
+
class HibernationProbe {
|
|
79
|
+
constructor(deps) {
|
|
80
|
+
this.deps = deps;
|
|
81
|
+
}
|
|
82
|
+
timer = null;
|
|
83
|
+
stopped = false;
|
|
84
|
+
running = false;
|
|
85
|
+
start() {
|
|
86
|
+
this.schedule(this.deps.checkMs);
|
|
87
|
+
}
|
|
88
|
+
stop() {
|
|
89
|
+
this.stopped = true;
|
|
90
|
+
if (this.timer !== null) (this.deps.clearTimer ?? ((h) => clearTimeout(h)))(this.timer);
|
|
91
|
+
this.timer = null;
|
|
92
|
+
}
|
|
93
|
+
schedule(ms) {
|
|
94
|
+
if (this.stopped) return;
|
|
95
|
+
const set = this.deps.setTimer ?? ((fn, delay) => {
|
|
96
|
+
const handle = setTimeout(fn, delay);
|
|
97
|
+
handle.unref?.();
|
|
98
|
+
return handle;
|
|
99
|
+
});
|
|
100
|
+
this.timer = set(() => {
|
|
101
|
+
void this.tick();
|
|
102
|
+
}, Math.max(1e3, ms));
|
|
103
|
+
}
|
|
104
|
+
/** One sample; returns the delay it scheduled (or null when it hibernated / stopped). */
|
|
105
|
+
async tick() {
|
|
106
|
+
if (this.stopped || this.running) return null;
|
|
107
|
+
this.running = true;
|
|
108
|
+
const log = this.deps.log ?? ((message) => logger.debug(message));
|
|
109
|
+
try {
|
|
110
|
+
const now = (this.deps.now ?? Date.now)();
|
|
111
|
+
const snapshot = this.deps.snapshot();
|
|
112
|
+
const local = evaluateWrapperIdle(snapshot, 1, now);
|
|
113
|
+
if (!local.ok && local.reason !== "keep-awake") {
|
|
114
|
+
this.schedule(this.deps.checkMs);
|
|
115
|
+
return this.deps.checkMs;
|
|
116
|
+
}
|
|
117
|
+
const answer = await this.deps.ask(snapshot);
|
|
118
|
+
if (answer === "unsupported") {
|
|
119
|
+
this.schedule(HIBERNATION_UNSUPPORTED_BACKOFF_MS);
|
|
120
|
+
return HIBERNATION_UNSUPPORTED_BACKOFF_MS;
|
|
121
|
+
}
|
|
122
|
+
if (answer === "error") {
|
|
123
|
+
this.schedule(this.deps.checkMs);
|
|
124
|
+
return this.deps.checkMs;
|
|
125
|
+
}
|
|
126
|
+
if (answer.keepAwake === true) this.deps.onKeepAwakeLatched?.();
|
|
127
|
+
if (local.ok && answer.hibernate && typeof answer.idleMs === "number" && answer.idleMs > 0) {
|
|
128
|
+
const done = await this.deps.commit(answer.idleMs);
|
|
129
|
+
if (done) {
|
|
130
|
+
this.stopped = true;
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
this.schedule(this.deps.checkMs);
|
|
134
|
+
return this.deps.checkMs;
|
|
135
|
+
}
|
|
136
|
+
const next = typeof answer.nextCheckMs === "number" && answer.nextCheckMs > 0 ? answer.nextCheckMs : this.deps.checkMs;
|
|
137
|
+
if (answer.reason) log(`[hibernate] daemon says stay awake (${answer.reason}); next check in ${Math.round(next / 1e3)}s`);
|
|
138
|
+
this.schedule(next);
|
|
139
|
+
return next;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
log(`[hibernate] probe failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
142
|
+
this.schedule(this.deps.checkMs);
|
|
143
|
+
return this.deps.checkMs;
|
|
144
|
+
} finally {
|
|
145
|
+
this.running = false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
class HibernationExitLatch {
|
|
150
|
+
constructor(outranks) {
|
|
151
|
+
this.outranks = outranks;
|
|
152
|
+
}
|
|
153
|
+
active = false;
|
|
154
|
+
committed = false;
|
|
155
|
+
deferredIntent = null;
|
|
156
|
+
begin() {
|
|
157
|
+
if (this.active) return false;
|
|
158
|
+
this.active = true;
|
|
159
|
+
this.committed = false;
|
|
160
|
+
this.deferredIntent = null;
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
get hibernating() {
|
|
164
|
+
return this.active;
|
|
165
|
+
}
|
|
166
|
+
/** true = the caller must NOT run this exit now (deferred, or the process is already leaving). */
|
|
167
|
+
intercept(intent) {
|
|
168
|
+
if (!this.active) return false;
|
|
169
|
+
if (!this.committed && (this.deferredIntent === null || this.outranks(intent, this.deferredIntent))) this.deferredIntent = intent;
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
get exitRequested() {
|
|
173
|
+
return this.deferredIntent !== null;
|
|
174
|
+
}
|
|
175
|
+
commit() {
|
|
176
|
+
if (this.active) this.committed = true;
|
|
177
|
+
}
|
|
178
|
+
/** Abort: returns the deferred exit to run now (or null). No-op once committed. */
|
|
179
|
+
release() {
|
|
180
|
+
if (!this.active || this.committed) return null;
|
|
181
|
+
this.active = false;
|
|
182
|
+
const deferred = this.deferredIntent;
|
|
183
|
+
this.deferredIntent = null;
|
|
184
|
+
return deferred;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const DEFAULT_CLAUDE_PERMISSION_MODE = "default";
|
|
189
|
+
const DEFAULT_CODEX_PERMISSION_MODE = "default";
|
|
190
|
+
|
|
191
|
+
export { DEFAULT_CLAUDE_PERMISSION_MODE as D, HibernationProbe as H, HibernationExitLatch as a, DEFAULT_CODEX_PERMISSION_MODE as b, commitHibernation as c };
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var logger = require('./logger-B_MWPbZz.cjs');
|
|
4
|
+
var persistence = require('./persistence-BYGl0QYw.cjs');
|
|
5
|
+
|
|
6
|
+
const PRESENCE_SETTLE_MS = 6e3;
|
|
7
|
+
async function commitHibernation(deps) {
|
|
8
|
+
const log = deps.log ?? ((message) => logger.logger.debug(message));
|
|
9
|
+
if (!deps.claimExit()) {
|
|
10
|
+
log("[hibernate] exit already claimed for another reason; not hibernating");
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const { client } = deps;
|
|
14
|
+
const now = deps.now ?? Date.now;
|
|
15
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
16
|
+
let frozen = false;
|
|
17
|
+
let stamped = false;
|
|
18
|
+
const waitOrExit = async (work, fallback) => {
|
|
19
|
+
let settled = false;
|
|
20
|
+
const watched = work.finally(() => {
|
|
21
|
+
settled = true;
|
|
22
|
+
});
|
|
23
|
+
const exitWatch = (async () => {
|
|
24
|
+
while (!settled && !deps.exitRequested()) await sleep(EXIT_POLL_MS);
|
|
25
|
+
return settled ? watched : fallback;
|
|
26
|
+
})();
|
|
27
|
+
return Promise.race([watched, exitWatch]);
|
|
28
|
+
};
|
|
29
|
+
const abort = async (why2) => {
|
|
30
|
+
log(`[hibernate] aborted at commit: ${why2}`);
|
|
31
|
+
if (stamped) {
|
|
32
|
+
const clear = (metadata) => {
|
|
33
|
+
const next = { ...metadata };
|
|
34
|
+
delete next.hibernation;
|
|
35
|
+
return next;
|
|
36
|
+
};
|
|
37
|
+
const cleared = await client.updateMetadataAndWait(clear, deps.exitRequested() ? EXIT_CLEAR_TIMEOUT_MS : void 0).catch(() => false);
|
|
38
|
+
if (!cleared) log("[hibernate] stamp clear not confirmed (it keeps retrying in the background)");
|
|
39
|
+
}
|
|
40
|
+
if (frozen) {
|
|
41
|
+
client.unmuteHeartbeats();
|
|
42
|
+
client.unfreezeInbound();
|
|
43
|
+
}
|
|
44
|
+
deps.releaseExit();
|
|
45
|
+
return false;
|
|
46
|
+
};
|
|
47
|
+
const moved = () => {
|
|
48
|
+
if (deps.exitRequested()) return "exit requested";
|
|
49
|
+
if (client.inboundRoutedSinceCommit()) return "inbound message";
|
|
50
|
+
const verdict = deps.recheck();
|
|
51
|
+
return verdict.ok ? null : verdict.reason;
|
|
52
|
+
};
|
|
53
|
+
client.beginHibernationCommit();
|
|
54
|
+
try {
|
|
55
|
+
await client.flush();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
return abort(`flush failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
let why = moved();
|
|
60
|
+
if (why) return abort(why);
|
|
61
|
+
client.freezeInbound();
|
|
62
|
+
client.muteHeartbeats();
|
|
63
|
+
frozen = true;
|
|
64
|
+
const stamp = { at: now(), seq: client.messageCursor, idleMs: deps.idleMs, v: 1 };
|
|
65
|
+
stamped = true;
|
|
66
|
+
const landed = await waitOrExit(client.updateMetadataAndWait((metadata) => ({ ...metadata, hibernation: stamp })).catch(() => false), false);
|
|
67
|
+
if (deps.exitRequested()) return abort("exit requested");
|
|
68
|
+
if (!landed) return abort("stamp not confirmed");
|
|
69
|
+
const settle = Math.max(0, client.lastHeartbeatAt + (deps.presenceSettleMs ?? PRESENCE_SETTLE_MS) - now());
|
|
70
|
+
if (settle > 0) await waitOrExit(sleep(settle), void 0);
|
|
71
|
+
why = moved();
|
|
72
|
+
if (why) return abort(why);
|
|
73
|
+
deps.markCommitted();
|
|
74
|
+
log(`[hibernate] committing: seq=${stamp.seq} idleMs=${stamp.idleMs}`);
|
|
75
|
+
await deps.finish(stamp);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const EXIT_POLL_MS = 100;
|
|
79
|
+
const EXIT_CLEAR_TIMEOUT_MS = 1e3;
|
|
80
|
+
class HibernationProbe {
|
|
81
|
+
constructor(deps) {
|
|
82
|
+
this.deps = deps;
|
|
83
|
+
}
|
|
84
|
+
timer = null;
|
|
85
|
+
stopped = false;
|
|
86
|
+
running = false;
|
|
87
|
+
start() {
|
|
88
|
+
this.schedule(this.deps.checkMs);
|
|
89
|
+
}
|
|
90
|
+
stop() {
|
|
91
|
+
this.stopped = true;
|
|
92
|
+
if (this.timer !== null) (this.deps.clearTimer ?? ((h) => clearTimeout(h)))(this.timer);
|
|
93
|
+
this.timer = null;
|
|
94
|
+
}
|
|
95
|
+
schedule(ms) {
|
|
96
|
+
if (this.stopped) return;
|
|
97
|
+
const set = this.deps.setTimer ?? ((fn, delay) => {
|
|
98
|
+
const handle = setTimeout(fn, delay);
|
|
99
|
+
handle.unref?.();
|
|
100
|
+
return handle;
|
|
101
|
+
});
|
|
102
|
+
this.timer = set(() => {
|
|
103
|
+
void this.tick();
|
|
104
|
+
}, Math.max(1e3, ms));
|
|
105
|
+
}
|
|
106
|
+
/** One sample; returns the delay it scheduled (or null when it hibernated / stopped). */
|
|
107
|
+
async tick() {
|
|
108
|
+
if (this.stopped || this.running) return null;
|
|
109
|
+
this.running = true;
|
|
110
|
+
const log = this.deps.log ?? ((message) => logger.logger.debug(message));
|
|
111
|
+
try {
|
|
112
|
+
const now = (this.deps.now ?? Date.now)();
|
|
113
|
+
const snapshot = this.deps.snapshot();
|
|
114
|
+
const local = persistence.evaluateWrapperIdle(snapshot, 1, now);
|
|
115
|
+
if (!local.ok && local.reason !== "keep-awake") {
|
|
116
|
+
this.schedule(this.deps.checkMs);
|
|
117
|
+
return this.deps.checkMs;
|
|
118
|
+
}
|
|
119
|
+
const answer = await this.deps.ask(snapshot);
|
|
120
|
+
if (answer === "unsupported") {
|
|
121
|
+
this.schedule(persistence.HIBERNATION_UNSUPPORTED_BACKOFF_MS);
|
|
122
|
+
return persistence.HIBERNATION_UNSUPPORTED_BACKOFF_MS;
|
|
123
|
+
}
|
|
124
|
+
if (answer === "error") {
|
|
125
|
+
this.schedule(this.deps.checkMs);
|
|
126
|
+
return this.deps.checkMs;
|
|
127
|
+
}
|
|
128
|
+
if (answer.keepAwake === true) this.deps.onKeepAwakeLatched?.();
|
|
129
|
+
if (local.ok && answer.hibernate && typeof answer.idleMs === "number" && answer.idleMs > 0) {
|
|
130
|
+
const done = await this.deps.commit(answer.idleMs);
|
|
131
|
+
if (done) {
|
|
132
|
+
this.stopped = true;
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
this.schedule(this.deps.checkMs);
|
|
136
|
+
return this.deps.checkMs;
|
|
137
|
+
}
|
|
138
|
+
const next = typeof answer.nextCheckMs === "number" && answer.nextCheckMs > 0 ? answer.nextCheckMs : this.deps.checkMs;
|
|
139
|
+
if (answer.reason) log(`[hibernate] daemon says stay awake (${answer.reason}); next check in ${Math.round(next / 1e3)}s`);
|
|
140
|
+
this.schedule(next);
|
|
141
|
+
return next;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
log(`[hibernate] probe failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
144
|
+
this.schedule(this.deps.checkMs);
|
|
145
|
+
return this.deps.checkMs;
|
|
146
|
+
} finally {
|
|
147
|
+
this.running = false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
class HibernationExitLatch {
|
|
152
|
+
constructor(outranks) {
|
|
153
|
+
this.outranks = outranks;
|
|
154
|
+
}
|
|
155
|
+
active = false;
|
|
156
|
+
committed = false;
|
|
157
|
+
deferredIntent = null;
|
|
158
|
+
begin() {
|
|
159
|
+
if (this.active) return false;
|
|
160
|
+
this.active = true;
|
|
161
|
+
this.committed = false;
|
|
162
|
+
this.deferredIntent = null;
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
get hibernating() {
|
|
166
|
+
return this.active;
|
|
167
|
+
}
|
|
168
|
+
/** true = the caller must NOT run this exit now (deferred, or the process is already leaving). */
|
|
169
|
+
intercept(intent) {
|
|
170
|
+
if (!this.active) return false;
|
|
171
|
+
if (!this.committed && (this.deferredIntent === null || this.outranks(intent, this.deferredIntent))) this.deferredIntent = intent;
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
get exitRequested() {
|
|
175
|
+
return this.deferredIntent !== null;
|
|
176
|
+
}
|
|
177
|
+
commit() {
|
|
178
|
+
if (this.active) this.committed = true;
|
|
179
|
+
}
|
|
180
|
+
/** Abort: returns the deferred exit to run now (or null). No-op once committed. */
|
|
181
|
+
release() {
|
|
182
|
+
if (!this.active || this.committed) return null;
|
|
183
|
+
this.active = false;
|
|
184
|
+
const deferred = this.deferredIntent;
|
|
185
|
+
this.deferredIntent = null;
|
|
186
|
+
return deferred;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const DEFAULT_CLAUDE_PERMISSION_MODE = "default";
|
|
191
|
+
const DEFAULT_CODEX_PERMISSION_MODE = "default";
|
|
192
|
+
|
|
193
|
+
exports.DEFAULT_CLAUDE_PERMISSION_MODE = DEFAULT_CLAUDE_PERMISSION_MODE;
|
|
194
|
+
exports.DEFAULT_CODEX_PERMISSION_MODE = DEFAULT_CODEX_PERMISSION_MODE;
|
|
195
|
+
exports.HibernationExitLatch = HibernationExitLatch;
|
|
196
|
+
exports.HibernationProbe = HibernationProbe;
|
|
197
|
+
exports.commitHibernation = commitHibernation;
|
|
@@ -4,19 +4,19 @@ import { randomUUID } from 'node:crypto';
|
|
|
4
4
|
import { constants } from 'node:fs';
|
|
5
5
|
import { dirname } from 'node:path';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
-
import { T as TeamConnectionPreflightError, c as createTeamsClient } from './client-
|
|
8
|
-
import { t as teamScopePath } from './context-
|
|
9
|
-
import { g as waitForSessionKey, e as sendUserMessage } from './sessionOps-
|
|
7
|
+
import { T as TeamConnectionPreflightError, c as createTeamsClient } from './client-Dsfy_SAb.mjs';
|
|
8
|
+
import { t as teamScopePath } from './context-Cr6a3NTg.mjs';
|
|
9
|
+
import { g as waitForSessionKey, e as sendUserMessage } from './sessionOps-DZRH4-hV.mjs';
|
|
10
10
|
import { T as TEAM_SKILL } from './resources-BdFBQi8r.mjs';
|
|
11
|
-
import { T as TEAM_TOOL_NAMES, r as registerTeamsTools } from './tools-
|
|
12
|
-
import { c as createSelfReportState, A as AUTOMATION_TOOL_NAMES, r as registerAutomationTools, a as registerReportProgressTool, n as normalizeAttention, b as normalizePhase, d as normalizeProgress, s as shouldAcceptSelfReport } from './reportProgressTool-
|
|
13
|
-
import { S as SESSION_PEER_TOOL_NAMES, r as registerSessionPeerTools, a as createSessionPeerToolExecutor } from './peerTools-
|
|
11
|
+
import { T as TEAM_TOOL_NAMES, r as registerTeamsTools } from './tools-D91mq5Ib.mjs';
|
|
12
|
+
import { c as createSelfReportState, A as AUTOMATION_TOOL_NAMES, r as registerAutomationTools, a as registerReportProgressTool, n as normalizeAttention, b as normalizePhase, d as normalizeProgress, s as shouldAcceptSelfReport } from './reportProgressTool-BvB13EwC.mjs';
|
|
13
|
+
import { S as SESSION_PEER_TOOL_NAMES, r as registerSessionPeerTools, a as createSessionPeerToolExecutor } from './peerTools-os2DVjA0.mjs';
|
|
14
14
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
15
|
import { createServer } from 'node:http';
|
|
16
16
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
17
|
-
import { l as logger } from './logger-
|
|
17
|
+
import { l as logger } from './logger-CbBv3q_b.mjs';
|
|
18
18
|
import { C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, c as CLIPBOARD_MAX_BYTES } from './limits-DIo7rEBR.mjs';
|
|
19
|
-
import { A as ASSISTANT_TOOL_NAMES, a as registerAssistantTools, c as checkDownloadTarget } from './downloadTarget-
|
|
19
|
+
import { A as ASSISTANT_TOOL_NAMES, a as registerAssistantTools, c as checkDownloadTarget } from './downloadTarget-Cp48jrIP.mjs';
|
|
20
20
|
import { P as PREVIEW_TOOL_NAME, R as REPORT_PROGRESS_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, c as PREVIEW_DOWNLOAD_PARAM_DESCRIPTION } from './agentGuidance-BDYt2Qy2.mjs';
|
|
21
21
|
import { c as checkPreviewPath } from './previewPath-CXN4Vag0.mjs';
|
|
22
22
|
import { createHash } from 'crypto';
|
|
@@ -6,19 +6,19 @@ var node_crypto = require('node:crypto');
|
|
|
6
6
|
var node_fs = require('node:fs');
|
|
7
7
|
var path = require('node:path');
|
|
8
8
|
var z = require('zod');
|
|
9
|
-
var client = require('./client-
|
|
10
|
-
var context = require('./context-
|
|
11
|
-
var sessionOps = require('./sessionOps-
|
|
9
|
+
var client = require('./client-BKnKRLSt.cjs');
|
|
10
|
+
var context = require('./context-Jrq4-eCZ.cjs');
|
|
11
|
+
var sessionOps = require('./sessionOps-DzbZI3Eq.cjs');
|
|
12
12
|
var resources = require('./resources-JDPugcDq.cjs');
|
|
13
|
-
var tools = require('./tools-
|
|
14
|
-
var reportProgressTool = require('./reportProgressTool-
|
|
15
|
-
var peerTools = require('./peerTools-
|
|
13
|
+
var tools = require('./tools-DJIANHSh.cjs');
|
|
14
|
+
var reportProgressTool = require('./reportProgressTool-D4KB_4cP.cjs');
|
|
15
|
+
var peerTools = require('./peerTools-Dkbu7gag.cjs');
|
|
16
16
|
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
17
17
|
var node_http = require('node:http');
|
|
18
18
|
var streamableHttp_js = require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
19
|
-
var logger = require('./logger-
|
|
19
|
+
var logger = require('./logger-B_MWPbZz.cjs');
|
|
20
20
|
var limits = require('./limits-C-a7gr04.cjs');
|
|
21
|
-
var downloadTarget = require('./downloadTarget-
|
|
21
|
+
var downloadTarget = require('./downloadTarget-CWTb2-EM.cjs');
|
|
22
22
|
var agentGuidance = require('./agentGuidance-BtBx2xxE.cjs');
|
|
23
23
|
var previewPath = require('./previewPath-B0rBdhy1.cjs');
|
|
24
24
|
var crypto = require('crypto');
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
|
-
var configuration = require('./configuration-
|
|
5
|
-
var persistence = require('./persistence-
|
|
6
|
-
var controlClient = require('./controlClient-
|
|
4
|
+
var configuration = require('./configuration-C3piBtxY.cjs');
|
|
5
|
+
var persistence = require('./persistence-BYGl0QYw.cjs');
|
|
6
|
+
var controlClient = require('./controlClient-BI6Fw3fQ.cjs');
|
|
7
7
|
var doctor$1 = require('./doctor-u46qYYKX.cjs');
|
|
8
8
|
var node_fs = require('node:fs');
|
|
9
9
|
var path = require('node:path');
|
|
10
10
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
11
|
-
var _package = require('./package-
|
|
11
|
+
var _package = require('./package-C9ZP9bpX.cjs');
|
|
12
12
|
var doctorReadiness = require('./doctorReadiness-BCZGcN0a.cjs');
|
|
13
13
|
var authRelay = require('./authRelay-BdYkC1Po.cjs');
|
|
14
14
|
var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
|
|
@@ -312,8 +312,8 @@ ${typeLabels[type] || type}:`));
|
|
|
312
312
|
}
|
|
313
313
|
console.log(chalk.gray(" An external claude command is only needed for native terminal/mirror use."));
|
|
314
314
|
try {
|
|
315
|
-
const { resolveAgentHomesForCli } = await Promise.resolve().then(function () { return require('./agentHome-
|
|
316
|
-
const { describeAgentHome } = await Promise.resolve().then(function () { return require('./index-
|
|
315
|
+
const { resolveAgentHomesForCli } = await Promise.resolve().then(function () { return require('./agentHome-DeAWzhSe.cjs'); });
|
|
316
|
+
const { describeAgentHome } = await Promise.resolve().then(function () { return require('./index-PNMQPKhz.cjs'); });
|
|
317
317
|
const homes = await resolveAgentHomesForCli();
|
|
318
318
|
console.log(chalk.green(`\u2713 Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}`));
|
|
319
319
|
console.log(chalk.green(`\u2713 Codex home: ${describeAgentHome(homes.codexHome)}`));
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import { c as configuration } from './configuration-
|
|
3
|
-
import { readSettings, readCredentials, readDaemonState } from './persistence-
|
|
4
|
-
import {
|
|
2
|
+
import { c as configuration } from './configuration-WspKd2C2.mjs';
|
|
3
|
+
import { r as readSettings, g as readCredentials, d as readDaemonState } from './persistence-ON0zpHfb.mjs';
|
|
4
|
+
import { a as checkIfDaemonRunningAndCleanupStaleState } from './controlClient-DTheOlvC.mjs';
|
|
5
5
|
import { findAllHappyProcesses } from './doctor-BPkYWSuq.mjs';
|
|
6
6
|
import { statSync, realpathSync, existsSync, readdirSync } from 'node:fs';
|
|
7
7
|
import { isAbsolute, resolve, dirname, basename, delimiter, join } from 'node:path';
|
|
8
8
|
import { p as projectPath } from './projectPath-BTBIMB57.mjs';
|
|
9
|
-
import { p as packageJson } from './package-
|
|
9
|
+
import { p as packageJson } from './package-DU1DxhH9.mjs';
|
|
10
10
|
import { s as shareableSettingsSummary, c as collectRuntimeReadiness, S as SUPPORTED_NODE_LABEL, r as resolveClaudeCredentialReadiness, a as toolProbeLabel, b as daemonReadiness, d as daemonEndpointsMatch } from './doctorReadiness-C208SMN9.mjs';
|
|
11
11
|
import { c as credentialRelayProblem } from './authRelay-DSAvg1uv.mjs';
|
|
12
12
|
import { d as deriveLocalCliUpdateSummary } from './cliUpdate-Y34VGe9Y.mjs';
|
|
@@ -310,8 +310,8 @@ ${typeLabels[type] || type}:`));
|
|
|
310
310
|
}
|
|
311
311
|
console.log(chalk.gray(" An external claude command is only needed for native terminal/mirror use."));
|
|
312
312
|
try {
|
|
313
|
-
const { resolveAgentHomesForCli } = await import('./agentHome-
|
|
314
|
-
const { describeAgentHome } = await import('./index-
|
|
313
|
+
const { resolveAgentHomesForCli } = await import('./agentHome-Ct-VXFeG.mjs');
|
|
314
|
+
const { describeAgentHome } = await import('./index-D8m8Ripb.mjs');
|
|
315
315
|
const homes = await resolveAgentHomesForCli();
|
|
316
316
|
console.log(chalk.green(`\u2713 Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}`));
|
|
317
317
|
console.log(chalk.green(`\u2713 Codex home: ${describeAgentHome(homes.codexHome)}`));
|