very-happy-cli 0.2.165 → 0.2.166
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/README.md +1 -1
- package/dist/{AcpBackend-DCfNt9bD.cjs → AcpBackend-20VHOXwb.cjs} +3 -3
- package/dist/{AcpBackend-C11FnVw5.mjs → AcpBackend-tRWk7yi7.mjs} +3 -3
- package/dist/{AcpSessionManager-BQnDJvct.mjs → AcpSessionManager-B7FIrsys.mjs} +1 -1
- package/dist/{AcpSessionManager-9yN2iH4b.cjs → AcpSessionManager-Zf00QnlL.cjs} +1 -1
- package/dist/{BasePermissionHandler-CwJ48yiB.mjs → BasePermissionHandler-CDCLIrZJ.mjs} +1 -1
- package/dist/{BasePermissionHandler-BwQHxl6M.cjs → BasePermissionHandler-COKc4pmt.cjs} +1 -1
- package/dist/{BaseReasoningProcessor-ClF2g1qz.mjs → BaseReasoningProcessor-BDVKvooR.mjs} +1 -1
- package/dist/{BaseReasoningProcessor-81lf_M8G.cjs → BaseReasoningProcessor-DAGQdkNp.cjs} +1 -1
- package/dist/{agentGuidance-CQuNlNx8.mjs → agentGuidance-BDYt2Qy2.mjs} +4 -2
- package/dist/{agentGuidance-B5NATuFa.cjs → agentGuidance-BtBx2xxE.cjs} +4 -1
- package/dist/{agentHome-DvR176E5.mjs → agentHome-2IbIjKCa.mjs} +4 -4
- package/dist/{agentHome-D3Nn82kI.cjs → agentHome-KVWj6nCl.cjs} +4 -4
- package/dist/{api-DTVPUE7g.mjs → api-Cmz3XS4P.mjs} +14 -12
- package/dist/{api-AzdzTKFs.cjs → api-DnNL5fLw.cjs} +14 -12
- package/dist/{apiMachine-BQ-b4Lu3.mjs → apiMachine-B6ySCFe0.mjs} +2137 -65
- package/dist/{apiMachine-B_cJldfa.cjs → apiMachine-DeoQ8QbZ.cjs} +2134 -62
- package/dist/{attachmentContent-dzIs-wis.mjs → attachmentContent-CTXapi-_.mjs} +2 -2
- package/dist/{attachmentContent-muDCe4Gy.cjs → attachmentContent-DPWxHgX4.cjs} +2 -2
- package/dist/{attachmentLimits-eJZ4ZBjF.cjs → attachmentLimits-BfgKV5iE.cjs} +28 -2
- package/dist/{attachmentLimits-B8nzhw-i.mjs → attachmentLimits-C1PCCM79.mjs} +28 -2
- package/dist/{auth-Jtmvh1w4.mjs → auth-BMaBjRAj.mjs} +8 -8
- package/dist/{auth-DtP-B4gf.cjs → auth-D4-eQz85.cjs} +8 -8
- package/dist/{auth-CfLd3phE.cjs → auth-ietHtvwu.cjs} +5 -5
- package/dist/{auth-BY5ujhGn.mjs → auth-pzWIFdOD.mjs} +5 -5
- package/dist/{auto-DjWfR1UB.mjs → auto-DL75Dx3I.mjs} +83 -21
- package/dist/{auto-ClNnbSoF.cjs → auto-DOWTQDPa.cjs} +84 -20
- package/dist/{bootstrap-B1dMZA-u.cjs → bootstrap-BpXIc2wn.cjs} +2 -2
- package/dist/{bootstrap-D_ExGrY2.mjs → bootstrap-XE8A7Ut2.mjs} +2 -2
- package/dist/{browser-_gV7tcPs.cjs → browser-CcG8GLRV.cjs} +1 -1
- package/dist/{browser-mwzpOmcw.mjs → browser-DDFi1T8C.mjs} +1 -1
- package/dist/{claudeLocal-G5UmJ81F.cjs → claudeLocal-DXBXwIOG.cjs} +6 -6
- package/dist/{claudeLocal-BeHToEK5.mjs → claudeLocal-DmM5Oyhv.mjs} +6 -6
- package/dist/{claudeLocalLauncher-B4y2BsmO.cjs → claudeLocalLauncher-C41Y6Kp4.cjs} +14 -11
- package/dist/{claudeLocalLauncher-Cq6bqAT4.mjs → claudeLocalLauncher-Cs4eUC3P.mjs} +14 -11
- package/dist/{claudeSessionFork-CokUhS4r.mjs → claudeSessionFork-BdLnc2Hv.mjs} +1 -1
- package/dist/{claudeSessionFork-CDJq_b9r.cjs → claudeSessionFork-Cs0I3eGI.cjs} +1 -1
- package/dist/{client-BwaWdlCm.mjs → client-CbK33y_s.mjs} +3 -3
- package/dist/{client-uN9d6Git.cjs → client-DJ0kX_8M.cjs} +2 -2
- package/dist/{client-CJZKBZCE.mjs → client-GjTnsq6F.mjs} +2 -2
- package/dist/{client-Do7cGPEq.cjs → client-JISJx2f-.cjs} +3 -3
- package/dist/codex/happyMcpStdioBridge.cjs +23 -18
- package/dist/codex/happyMcpStdioBridge.mjs +22 -17
- package/dist/{codexAppServerClient-BuSdeUxT.cjs → codexAppServerClient-BTjn2ZCZ.cjs} +46 -2
- package/dist/{codexAppServerClient-B0QaMQsC.mjs → codexAppServerClient-CldXEojt.mjs} +47 -3
- package/dist/{codexCommand-YdYmykAR.cjs → codexCommand-BpD0N1F7.cjs} +71 -51
- package/dist/{codexCommand-C3gdjMAw.mjs → codexCommand-DjMU-Ijf.mjs} +71 -51
- package/dist/{config-CGCIFRCN.mjs → config-DjSJKatx.mjs} +3 -3
- package/dist/{config-ChoHFnfO.cjs → config-DuLL0Ppe.cjs} +3 -3
- package/dist/{configuration-BE61XNsg.cjs → configuration-B0cb3xA3.cjs} +1 -1
- package/dist/{configuration-L1qcGTFM.mjs → configuration-D2v3puap.mjs} +1 -1
- package/dist/{connect-D5IKfcfd.cjs → connect-B7JWEzyg.cjs} +13 -13
- package/dist/{connect-CFD0Em6a.mjs → connect-CnNNyM9I.mjs} +13 -13
- package/dist/{context-3WVw8qPz.cjs → context-BFUpYT39.cjs} +1 -1
- package/dist/{context-DaCCB4cm.mjs → context-DjfqLWzE.mjs} +1 -1
- package/dist/{controlClient-Ci7HTMII.mjs → controlClient-BMUJfUeF.mjs} +13 -6
- package/dist/{controlClient-RWTlQA4_.cjs → controlClient-CmnHGcyl.cjs} +13 -5
- package/dist/{createSessionMetadata-CWR-AB2A.mjs → createSessionMetadata-DU0bCg2m.mjs} +2 -2
- package/dist/{createSessionMetadata-CPGTztXP.cjs → createSessionMetadata-DbfRBhRu.cjs} +2 -2
- package/dist/{deterministicJson-BBwG-Ase.mjs → deterministicJson-D-WPUrZb.mjs} +36 -52
- package/dist/{deterministicJson-C4Jo2RWy.cjs → deterministicJson-Dp3TVyap.cjs} +41 -59
- package/dist/{doctor-CAC6qY9Z.mjs → doctor-BlXXyQ1L.mjs} +6 -6
- package/dist/{doctor-ZOQLE5AH.cjs → doctor-CkJmdPbi.cjs} +6 -6
- package/dist/{assistantTools-BsrG3PD-.cjs → downloadTarget-CiQqRIc-.cjs} +44 -6
- package/dist/{assistantTools-DPGga5lM.mjs → downloadTarget-DjSwMHun.mjs} +45 -8
- package/dist/{ensureDaemonRunning-b1pvEFcS.mjs → ensureDaemonRunning-CAQag1zE.mjs} +5 -5
- package/dist/{ensureDaemonRunning-mIgX2vnc.cjs → ensureDaemonRunning-C_aIOhgG.cjs} +5 -5
- package/dist/{handleResumeCommand-DGNhbv-3.cjs → handleResumeCommand-6KzBGDnl.cjs} +5 -5
- package/dist/{handleResumeCommand-CTGbZkCL.mjs → handleResumeCommand-Ci7wacT-.mjs} +5 -5
- package/dist/{index-vVWpCoTr.mjs → index-B0HEEYGh.mjs} +22 -5
- package/dist/{index-DqlyNgt4.cjs → index-C9hI8a10.cjs} +26 -4
- package/dist/{index-BzIxE0Eu.cjs → index-CaFCAlX8.cjs} +3 -3
- package/dist/{index-DrSPR59N.cjs → index-DBmNwMX9.cjs} +39 -38
- package/dist/{index-DIodyAqF.cjs → index-DEKIgZUo.cjs} +4 -4
- package/dist/{index-Diu6HdWH.mjs → index-DQplgo0W.mjs} +4 -4
- package/dist/{index-BgzjPv07.mjs → index-HQsigW_J.mjs} +3 -3
- package/dist/{index-DjtBengz.mjs → index-WGCT6SSV.mjs} +40 -39
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{install-BO_W7VhL.mjs → install-BdvKiOQw.mjs} +2 -0
- package/dist/{install-DrUQk2DJ.cjs → install-CejEiRGW.cjs} +3 -3
- package/dist/{install-Cs5qAPrB.cjs → install-Cf6AFSWC.cjs} +2 -0
- package/dist/{install-Cp_aB-NQ.mjs → install-oJUvsFu9.mjs} +3 -3
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +55 -2
- package/dist/lib.d.mts +55 -2
- package/dist/lib.mjs +12 -12
- package/dist/{lidState-BLHLmhwd.mjs → lidState-BfximpjX.mjs} +1 -1
- package/dist/{lidState-z9ekRpZu.cjs → lidState-D8BmnJV1.cjs} +1 -1
- package/dist/{localHappyAgentAuth-BWvmc_Hg.mjs → localHappyAgentAuth-Ct1aXwqd.mjs} +1 -1
- package/dist/{localHappyAgentAuth-BCx0y1qW.cjs → localHappyAgentAuth-d7B6S_o7.cjs} +1 -1
- package/dist/{logger-CknSVkIe.mjs → logger-BpQcwNnt.mjs} +2 -2
- package/dist/{logger-D0hkk7Vo.cjs → logger-JTcJU-uL.cjs} +2 -2
- package/dist/{machineMetadata-BDCYOXQg.cjs → machineMetadata-BBg_Njw3.cjs} +3 -3
- package/dist/{machineMetadata-Cj1DoFot.mjs → machineMetadata-CBdxABeI.mjs} +3 -3
- package/dist/{main-CKUfkVG_.mjs → main-B5b1gA3K.mjs} +44 -44
- package/dist/{main-COAPGIso.cjs → main-C16fOGgn.cjs} +44 -44
- package/dist/{mcp-BILnw4si.cjs → mcp-BnNiBBax.cjs} +24 -19
- package/dist/{mcp-DeYUfpo8.mjs → mcp-DGNWgVdv.mjs} +23 -18
- package/dist/{mirrorProtocol-BUtmg1ws.cjs → mirrorProtocol-BEGk2--0.cjs} +80 -0
- package/dist/{mirrorProtocol-BNLtoWjO.mjs → mirrorProtocol-h5WHpdhh.mjs} +79 -1
- package/dist/{package-VIUXrYZ1.mjs → package-BqwrPxL0.mjs} +7 -7
- package/dist/{package-UkmvSFsg.cjs → package-C1XvUQFy.cjs} +7 -7
- package/dist/{peerTools-SWITnkqz.mjs → peerTools-CeCe-3lk.mjs} +4 -4
- package/dist/{peerTools-CttfOxti.cjs → peerTools-DPvbcs8V.cjs} +4 -4
- package/dist/{persistence-C6ztVW1W.cjs → persistence-2Xp_o6x6.cjs} +3 -3
- package/dist/{persistence-DujtUH94.mjs → persistence-B9LmhAE2.mjs} +3 -3
- package/dist/{piRunnerArgs-BVJHIjlk.mjs → piRunnerArgs-7FaTyNOq.mjs} +1 -1
- package/dist/{piRunnerArgs-tBQg6xDw.cjs → piRunnerArgs-DI29dDNo.cjs} +1 -1
- package/dist/{piRuntime-DKFA8u8t.mjs → piRuntime-0qEK5AqE.mjs} +1 -1
- package/dist/{piRuntime-DZzjF9It.cjs → piRuntime-R8XVChxK.cjs} +1 -1
- package/dist/{piTerminal-t5pQHCPT.cjs → piTerminal-Ccj0KNPr.cjs} +17 -17
- package/dist/{piTerminal-BTSaFlpV.mjs → piTerminal-zcQKc8Sp.mjs} +17 -17
- package/dist/precheckCompat-CWOi5c9L.cjs +29 -0
- package/dist/precheckCompat-DeEbilbr.mjs +26 -0
- package/dist/rateLimitWindows-C2Jk3Ih7.cjs +258 -0
- package/dist/rateLimitWindows-Dhfhbtqu.mjs +248 -0
- package/dist/{registerCommonHandlers--8ds2auE.cjs → registerCommonHandlers-Aha_KfM3.cjs} +2 -2
- package/dist/{registerCommonHandlers-BR0J4g64.mjs → registerCommonHandlers-DdfGsFbM.mjs} +2 -2
- package/dist/{registerKillSessionHandler-CI23l8aJ.cjs → registerKillSessionHandler-CjitOpUA.cjs} +6 -6
- package/dist/{registerKillSessionHandler-Czz0tdki.mjs → registerKillSessionHandler-DboQlGcH.mjs} +6 -6
- package/dist/{remoteSessionClient-DCAUHgPz.mjs → remoteSessionClient-B2DtWuNP.mjs} +5 -5
- package/dist/{remoteSessionClient-BAkIwM2S.cjs → remoteSessionClient-BwI8rpQw.cjs} +5 -5
- package/dist/{tools-mWqsE6ji.cjs → reportProgressTool-B-Rcy0s3.cjs} +73 -9
- package/dist/{tools-BVRoGcQH.mjs → reportProgressTool-DnAD8wOa.mjs} +67 -10
- package/dist/{run-CkKujjn8.cjs → run-Bh66Xs40.cjs} +268 -118
- package/dist/{run-B75qm2I6.mjs → run-DPEwJpQR.mjs} +266 -116
- package/dist/{runClaude-B1T9DLLi.cjs → runClaude-C-lJdAKD.cjs} +25 -20
- package/dist/{runClaude-aBfBweec.mjs → runClaude-DLr_nBzw.mjs} +25 -20
- package/dist/{runClaudeDeps-BOrPP4J1.mjs → runClaudeDeps-C7JV7nXG.mjs} +47 -37
- package/dist/{runClaudeDeps-BGjNGfuZ.cjs → runClaudeDeps-vWWLod7J.cjs} +44 -35
- package/dist/{runGemini-BuAA_OQb.cjs → runGemini-o-CUSayc.cjs} +42 -35
- package/dist/{runGemini-a-V7JE-J.mjs → runGemini-tH6sLw-G.mjs} +42 -35
- package/dist/{runOpenClaw-DUSwXg1A.mjs → runOpenClaw-C5DZvVhn.mjs} +18 -18
- package/dist/{runOpenClaw-BBVffIh9.cjs → runOpenClaw-D24f35l0.cjs} +18 -18
- package/dist/{sandbox-Brb_5wzc.mjs → sandbox-BaL1aslA.mjs} +4 -4
- package/dist/{sandbox-Fd2G5yaq.cjs → sandbox-TJZJ6ngw.cjs} +4 -4
- package/dist/selfCheck-DPi4lqme.mjs +84 -0
- package/dist/{selfCheck-NuJKMInJ.cjs → selfCheck-Dugi0Nk_.cjs} +34 -34
- package/dist/{send-4dgHKC3u.cjs → send-CkWOSYmU.cjs} +8 -8
- package/dist/{send-DEQJiq_x.mjs → send-DDcJ3ayi.mjs} +8 -8
- package/dist/{server-DWGcDmHG.cjs → server-7qFQ8J2u.cjs} +6 -6
- package/dist/{server-C6AlUFkw.mjs → server-CUjRvQSd.mjs} +4 -4
- package/dist/{sessionLock-B1GgaO1q.cjs → sessionLock-DfhNICyS.cjs} +2 -2
- package/dist/{sessionLock-Dm8QyGo4.mjs → sessionLock-DqVyHFAQ.mjs} +2 -2
- package/dist/{sessionModeFile-BvOEJ4Fl.cjs → sessionModeFile-CIznKD7O.cjs} +1 -1
- package/dist/{sessionModeFile-CuNAWCKL.mjs → sessionModeFile-M4OpiyrF.mjs} +1 -1
- package/dist/{sessionOps-DG5MMEp_.mjs → sessionOps-BnaEaOKs.mjs} +4 -4
- package/dist/{sessionOps-JP64uJmc.cjs → sessionOps-DOyy4gkY.cjs} +4 -4
- package/dist/{sessionScanner-DqSk5Ol_.mjs → sessionScanner-CcuOn9uU.mjs} +75 -19
- package/dist/{sessionScanner-BBPEgJ5S.cjs → sessionScanner-Cu1yKlj4.cjs} +75 -19
- package/dist/{sessions-DgJuw_i0.cjs → sessions-BQgk5Kw8.cjs} +9 -9
- package/dist/{sessions-4isbBAWi.mjs → sessions-C9O91rL1.mjs} +9 -9
- package/dist/{setupOfflineReconnection-_MoZtsro.mjs → setupOfflineReconnection-Byy8aeKT.mjs} +2 -2
- package/dist/{setupOfflineReconnection-CKJKVIUS.cjs → setupOfflineReconnection-DFmQ8s6I.cjs} +2 -2
- package/dist/{spawn-CshERWbY.cjs → spawn-BS7LPmSm.cjs} +13 -12
- package/dist/{spawn-BTOG4tTm.mjs → spawn-EZ2yrtWd.mjs} +13 -12
- package/dist/{spawnAgents-Czi2VDzj.mjs → spawnAgents-HDaE3C0-.mjs} +1 -1
- package/dist/{spawnAgents-McixdtV1.cjs → spawnAgents-vglexX9N.cjs} +1 -1
- package/dist/{spawnHappyCLI-Dc4xYm8P.mjs → spawnHappyCLI-BAa49m0q.mjs} +1 -1
- package/dist/{spawnHappyCLI-Dd5_8Vex.cjs → spawnHappyCLI-DyaldIe5.cjs} +1 -1
- package/dist/specialCommands-CCWtwIGZ.mjs +93 -0
- package/dist/specialCommands-DouFaJ_0.cjs +96 -0
- package/dist/{startFileWatcher-1LedLBY-.cjs → startFileWatcher-DQbbypJv.cjs} +1 -1
- package/dist/{startFileWatcher-B0VlG-Fn.mjs → startFileWatcher-Dfs4whzr.mjs} +1 -1
- package/dist/{streamRelay-C0AffuX6.cjs → streamRelay-Ce9sgcOV.cjs} +1 -1
- package/dist/{streamRelay-BzMEEvJU.mjs → streamRelay-Iogsh51a.mjs} +1 -1
- package/dist/{sync-Dfm6K2te.mjs → sync-BLpH13Kb.mjs} +1 -1
- package/dist/{sync-DwUUGGFz.cjs → sync-x_lI_3j_.cjs} +1 -1
- package/dist/{systemPrompt-CB1Ls0AE.cjs → systemPrompt-4erwILTB.cjs} +3 -3
- package/dist/{systemPrompt-D41Zw1a3.mjs → systemPrompt-BanyDihy.mjs} +3 -3
- package/dist/{teams-D8Ly3i6u.mjs → teams-D6BOT3lR.mjs} +7 -7
- package/dist/{teams-NWv2ji16.cjs → teams-DzetlGWC.cjs} +7 -7
- package/dist/{time-v1Y_qEJp.mjs → time-CfDKj6Bx.mjs} +1 -1
- package/dist/{time-BbzJ7PJQ.cjs → time-T0YmeOhS.cjs} +1 -1
- package/dist/{titleGenerator-BhoblAQY.mjs → titleGenerator-ChImQ4q-.mjs} +1 -1
- package/dist/{titleGenerator-cH6IkPRi.cjs → titleGenerator-CoMxqKfP.cjs} +2 -2
- package/dist/{todo-D1hgWV6d.cjs → todo-CZZebKZg.cjs} +6 -6
- package/dist/{todo-CuNct-fw.mjs → todo-SVtYxGON.mjs} +6 -6
- package/dist/{tools-jof0Bu54.mjs → tools-3X2z3YDe.mjs} +1 -1
- package/dist/{tools-c2fb0CF5.cjs → tools-IJ0TAcJs.cjs} +1 -1
- package/dist/transcriptCursor-B7T_gkQ0.mjs +102 -0
- package/dist/transcriptCursor-DcXGLeSc.cjs +106 -0
- package/dist/{uninstall-VPH5GfrA.cjs → uninstall-CqqCWj7w.cjs} +3 -3
- package/dist/{uninstall-BB7WYYAk.mjs → uninstall-CypD-kr1.mjs} +3 -3
- package/package.json +7 -7
- package/scripts/terminal_status_forwarder.cjs +89 -0
- package/dist/selfCheck-BgwJ3NGS.mjs +0 -84
- package/dist/specialCommands-BSqhYg5X.mjs +0 -52
- package/dist/specialCommands-DSsTeRej.cjs +0 -54
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var promises = require('node:fs/promises');
|
|
4
|
+
var path = require('node:path');
|
|
5
|
+
|
|
6
|
+
const TRANSCRIPT_BOUNDARY_BYTES = 64;
|
|
7
|
+
function planTranscriptRead(cursor, stat) {
|
|
8
|
+
if (!cursor) return { start: 0, reset: null, verifyAt: null };
|
|
9
|
+
if (cursor.dev !== stat.dev || cursor.ino !== stat.ino) return { start: 0, reset: "replaced", verifyAt: null };
|
|
10
|
+
if (stat.size < cursor.offset) return { start: 0, reset: "truncated", verifyAt: null };
|
|
11
|
+
if (cursor.boundary.length === 0) return { start: cursor.offset, reset: null, verifyAt: null };
|
|
12
|
+
return { start: cursor.offset, reset: null, verifyAt: cursor.offset - cursor.boundary.length };
|
|
13
|
+
}
|
|
14
|
+
function advanceTranscriptCursor(previous, stat, start, bytes) {
|
|
15
|
+
const lastNewline = bytes.lastIndexOf(10);
|
|
16
|
+
const consumed = lastNewline === -1 ? 0 : lastNewline + 1;
|
|
17
|
+
const lines = consumed === 0 ? [] : bytes.subarray(0, consumed).toString("utf-8").split("\n").filter((line) => line.trim().length > 0);
|
|
18
|
+
const carried = previous && start === previous.offset ? previous.boundary : Buffer.alloc(0);
|
|
19
|
+
const tail = Buffer.concat([carried, bytes.subarray(0, consumed)]);
|
|
20
|
+
return {
|
|
21
|
+
lines,
|
|
22
|
+
cursor: {
|
|
23
|
+
offset: start + consumed,
|
|
24
|
+
dev: stat.dev,
|
|
25
|
+
ino: stat.ino,
|
|
26
|
+
boundary: Buffer.from(tail.subarray(Math.max(0, tail.length - TRANSCRIPT_BOUNDARY_BYTES)))
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function readTranscriptIncrement(path, cursor, opts = {}) {
|
|
31
|
+
let handle;
|
|
32
|
+
try {
|
|
33
|
+
handle = await promises.open(path, "r");
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const st = await handle.stat();
|
|
39
|
+
const stat = { dev: st.dev, ino: st.ino, size: st.size };
|
|
40
|
+
let { start, reset, verifyAt } = planTranscriptRead(cursor, stat);
|
|
41
|
+
if (verifyAt !== null && cursor) {
|
|
42
|
+
const probe = Buffer.alloc(cursor.boundary.length);
|
|
43
|
+
const { bytesRead: bytesRead2 } = await handle.read(probe, 0, probe.length, verifyAt);
|
|
44
|
+
if (bytesRead2 !== probe.length || !probe.equals(cursor.boundary)) {
|
|
45
|
+
start = 0;
|
|
46
|
+
reset = "rewritten";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const base = reset ? null : cursor;
|
|
50
|
+
const end = opts.limit === void 0 ? stat.size : Math.min(stat.size, Math.max(0, opts.limit));
|
|
51
|
+
const length = Math.max(0, end - start);
|
|
52
|
+
if (length === 0) {
|
|
53
|
+
return { lines: [], cursor: base ? { ...base, dev: stat.dev, ino: stat.ino } : advanceTranscriptCursor(null, stat, 0, Buffer.alloc(0)).cursor, reset };
|
|
54
|
+
}
|
|
55
|
+
const buffer = Buffer.alloc(length);
|
|
56
|
+
const { bytesRead } = await handle.read(buffer, 0, length, start);
|
|
57
|
+
const { lines, cursor: next } = advanceTranscriptCursor(base, stat, start, buffer.subarray(0, bytesRead));
|
|
58
|
+
return { lines, cursor: next, reset };
|
|
59
|
+
} finally {
|
|
60
|
+
await handle.close().catch(() => void 0);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isValidTranscriptHint(sessionId, path$1) {
|
|
64
|
+
return typeof path$1 === "string" && path$1.length > 0 && path$1.length <= 4096 && path.isAbsolute(path$1) && path.basename(path$1) === `${sessionId}.jsonl`;
|
|
65
|
+
}
|
|
66
|
+
class TranscriptPathHints {
|
|
67
|
+
constructor(max = 64) {
|
|
68
|
+
this.max = max;
|
|
69
|
+
}
|
|
70
|
+
paths = /* @__PURE__ */ new Map();
|
|
71
|
+
listeners = /* @__PURE__ */ new Set();
|
|
72
|
+
/** Called synchronously whenever a session's hinted path is set/changed. */
|
|
73
|
+
subscribe(listener) {
|
|
74
|
+
this.listeners.add(listener);
|
|
75
|
+
return () => {
|
|
76
|
+
this.listeners.delete(listener);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
note(sessionId, path) {
|
|
80
|
+
if (!isValidTranscriptHint(sessionId, path)) return false;
|
|
81
|
+
const changed = this.paths.get(sessionId) !== path;
|
|
82
|
+
this.paths.delete(sessionId);
|
|
83
|
+
this.paths.set(sessionId, path);
|
|
84
|
+
if (changed) {
|
|
85
|
+
for (const listener of this.listeners) {
|
|
86
|
+
try {
|
|
87
|
+
listener(sessionId, path);
|
|
88
|
+
} catch {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
while (this.paths.size > this.max) {
|
|
93
|
+
const oldest = this.paths.keys().next().value;
|
|
94
|
+
if (oldest === void 0) break;
|
|
95
|
+
this.paths.delete(oldest);
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
get(sessionId) {
|
|
100
|
+
return this.paths.get(sessionId);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.TranscriptPathHints = TranscriptPathHints;
|
|
105
|
+
exports.isValidTranscriptHint = isValidTranscriptHint;
|
|
106
|
+
exports.readTranscriptIncrement = readTranscriptIncrement;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var logger = require('./logger-
|
|
3
|
+
var logger = require('./logger-JTcJU-uL.cjs');
|
|
4
4
|
var fs = require('fs');
|
|
5
5
|
var child_process = require('child_process');
|
|
6
6
|
require('chalk');
|
|
7
7
|
require('node:util');
|
|
8
|
-
require('./configuration-
|
|
8
|
+
require('./configuration-B0cb3xA3.cjs');
|
|
9
9
|
require('node:fs');
|
|
10
10
|
require('node:os');
|
|
11
11
|
require('node:path');
|
|
12
|
-
require('./package-
|
|
12
|
+
require('./package-C1XvUQFy.cjs');
|
|
13
13
|
require('node:fs/promises');
|
|
14
14
|
|
|
15
15
|
const PLIST_LABEL = "com.happy-cli.daemon";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { l as logger } from './logger-
|
|
1
|
+
import { l as logger } from './logger-BpQcwNnt.mjs';
|
|
2
2
|
import { existsSync, unlinkSync } from 'fs';
|
|
3
3
|
import { execSync } from 'child_process';
|
|
4
4
|
import 'chalk';
|
|
5
5
|
import 'node:util';
|
|
6
|
-
import './configuration-
|
|
6
|
+
import './configuration-D2v3puap.mjs';
|
|
7
7
|
import 'node:fs';
|
|
8
8
|
import 'node:os';
|
|
9
9
|
import 'node:path';
|
|
10
|
-
import './package-
|
|
10
|
+
import './package-BqwrPxL0.mjs';
|
|
11
11
|
import 'node:fs/promises';
|
|
12
12
|
|
|
13
13
|
const PLIST_LABEL = "com.happy-cli.daemon";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "very-happy-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.166",
|
|
4
4
|
"description": "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.",
|
|
5
5
|
"author": "Kirill Dubovitskiy",
|
|
6
6
|
"contributors": [
|
|
@@ -117,12 +117,12 @@
|
|
|
117
117
|
"zod": "^4.0.0"
|
|
118
118
|
},
|
|
119
119
|
"optionalDependencies": {
|
|
120
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
121
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
122
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
123
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
124
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
125
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
120
|
+
"very-happy-tools-arm64-darwin": "0.2.166",
|
|
121
|
+
"very-happy-tools-x64-darwin": "0.2.166",
|
|
122
|
+
"very-happy-tools-arm64-linux": "0.2.166",
|
|
123
|
+
"very-happy-tools-x64-linux": "0.2.166",
|
|
124
|
+
"very-happy-tools-arm64-win32": "0.2.166",
|
|
125
|
+
"very-happy-tools-x64-win32": "0.2.166"
|
|
126
126
|
},
|
|
127
127
|
"devDependencies": {
|
|
128
128
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Terminal Status Hook Forwarder (B-547)
|
|
4
|
+
*
|
|
5
|
+
* Wired ONLY through the per-terminal `--settings` file the daemon writes
|
|
6
|
+
* when it types a `claude …` command into a vh web terminal (never into the
|
|
7
|
+
* user's ~/.claude/settings.json). Usage, as built by terminalHookCommand():
|
|
8
|
+
*
|
|
9
|
+
* node terminal_status_forwarder.cjs <terminalId> <happyHome> <claudePid>
|
|
10
|
+
*
|
|
11
|
+
* Reads claude's hook JSON from stdin, keeps a small whitelist of fields
|
|
12
|
+
* (no prompt text, no tool input/output, no assistant text — the prompt is
|
|
13
|
+
* reduced to a short hash used only as a turn identity), and POSTs it to the
|
|
14
|
+
* daemon's /terminal-agent-hook with the control token from daemon.state.json.
|
|
15
|
+
*
|
|
16
|
+
* Contract with claude: write NOTHING to stdout (PermissionRequest /
|
|
17
|
+
* UserPromptSubmit treat stdout as a decision / extra context) and always
|
|
18
|
+
* exit 0. Every failure is silent.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const http = require('http');
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
const path = require('path');
|
|
24
|
+
const crypto = require('crypto');
|
|
25
|
+
|
|
26
|
+
const [terminalId, happyHome, claudePid] = process.argv.slice(2);
|
|
27
|
+
if (!terminalId || !/^[A-Za-z0-9_-]{1,64}$/.test(terminalId) || !happyHome) process.exit(0);
|
|
28
|
+
|
|
29
|
+
let port = null;
|
|
30
|
+
let controlToken = null;
|
|
31
|
+
try {
|
|
32
|
+
const state = JSON.parse(fs.readFileSync(path.join(happyHome, 'daemon.state.json'), 'utf-8'));
|
|
33
|
+
if (state && typeof state.httpPort === 'number') port = state.httpPort;
|
|
34
|
+
if (state && typeof state.controlToken === 'string') controlToken = state.controlToken;
|
|
35
|
+
} catch {
|
|
36
|
+
// no daemon → nothing to report to
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const FIELDS = [
|
|
40
|
+
'hook_event_name', 'session_id', 'transcript_path', 'cwd', 'prompt_id', 'agent_id',
|
|
41
|
+
'source', 'notification_type', 'trigger', 'reason', 'tool_name',
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
const chunks = [];
|
|
45
|
+
process.stdin.on('data', (chunk) => chunks.push(chunk));
|
|
46
|
+
process.stdin.on('end', () => {
|
|
47
|
+
if (!port) process.exit(0);
|
|
48
|
+
let input = {};
|
|
49
|
+
try {
|
|
50
|
+
input = JSON.parse(Buffer.concat(chunks).toString('utf-8'));
|
|
51
|
+
} catch {
|
|
52
|
+
process.exit(0);
|
|
53
|
+
}
|
|
54
|
+
if (!input || typeof input !== 'object') process.exit(0);
|
|
55
|
+
const payload = { terminalId };
|
|
56
|
+
for (const key of FIELDS) {
|
|
57
|
+
if (typeof input[key] === 'string' && input[key].length <= 4096) payload[key] = input[key];
|
|
58
|
+
}
|
|
59
|
+
if (claudePid && /^\d{1,10}$/.test(claudePid)) payload.claudePid = Number(claudePid);
|
|
60
|
+
if (typeof input.prompt === 'string') {
|
|
61
|
+
payload.promptHash = crypto.createHash('sha256').update(input.prompt).digest('hex').slice(0, 16);
|
|
62
|
+
}
|
|
63
|
+
// Older Claude Notification payloads carry no notification_type.
|
|
64
|
+
if (input.hook_event_name === 'Notification' && typeof input.notification_type !== 'string'
|
|
65
|
+
&& typeof input.message === 'string' && /permission/i.test(input.message)) {
|
|
66
|
+
payload.permissionHint = true;
|
|
67
|
+
}
|
|
68
|
+
const body = Buffer.from(JSON.stringify(payload));
|
|
69
|
+
const req = http.request({
|
|
70
|
+
host: '127.0.0.1',
|
|
71
|
+
port,
|
|
72
|
+
method: 'POST',
|
|
73
|
+
path: '/terminal-agent-hook',
|
|
74
|
+
timeout: 2000,
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
'Content-Length': body.length,
|
|
78
|
+
...(controlToken ? { Authorization: `Bearer ${controlToken}` } : {}),
|
|
79
|
+
},
|
|
80
|
+
}, (res) => {
|
|
81
|
+
res.resume();
|
|
82
|
+
res.on('end', () => process.exit(0));
|
|
83
|
+
});
|
|
84
|
+
req.on('timeout', () => req.destroy());
|
|
85
|
+
req.on('error', () => process.exit(0));
|
|
86
|
+
req.end(body);
|
|
87
|
+
});
|
|
88
|
+
process.stdin.on('error', () => process.exit(0));
|
|
89
|
+
process.stdin.resume();
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { p as packageJson } from './package-VIUXrYZ1.mjs';
|
|
2
|
-
|
|
3
|
-
const LAZY_MODULES = [
|
|
4
|
-
// Entry
|
|
5
|
-
["main", () => import('./main-CKUfkVG_.mjs')],
|
|
6
|
-
["selfCheck", () => Promise.resolve().then(function () { return selfCheck; })],
|
|
7
|
-
// Subcommands (main.ts)
|
|
8
|
-
["api/api", () => import('./api-DTVPUE7g.mjs').then(function (n) { return n.b; })],
|
|
9
|
-
["claude/claudeCliPath", () => import('./claudeCliPath-BqkaH2oR.mjs')],
|
|
10
|
-
["claude/runClaude", () => import('./runClaude-aBfBweec.mjs')],
|
|
11
|
-
["commands/agentHome", () => import('./agentHome-DvR176E5.mjs')],
|
|
12
|
-
["commands/auth", () => import('./auth-Jtmvh1w4.mjs')],
|
|
13
|
-
["commands/auto", () => import('./auto-DjWfR1UB.mjs')],
|
|
14
|
-
["commands/codexCommand", () => import('./codexCommand-C3gdjMAw.mjs')],
|
|
15
|
-
["commands/connect", () => import('./connect-CFD0Em6a.mjs')],
|
|
16
|
-
["commands/installPiTools", () => import('./installPiTools-B_CdM5_2.mjs')],
|
|
17
|
-
["commands/installTerminalHooks", () => import('./installTerminalHooks-By7gBMEF.mjs')],
|
|
18
|
-
["commands/mcp", () => import('./mcp-DeYUfpo8.mjs')],
|
|
19
|
-
["commands/piTerminal", () => import('./piTerminal-BTSaFlpV.mjs')],
|
|
20
|
-
["commands/sandbox", () => import('./sandbox-Brb_5wzc.mjs')],
|
|
21
|
-
["commands/send", () => import('./send-DEQJiq_x.mjs')],
|
|
22
|
-
["commands/server", () => import('./server-C6AlUFkw.mjs')],
|
|
23
|
-
["commands/sessions", () => import('./sessions-4isbBAWi.mjs')],
|
|
24
|
-
["commands/spawn", () => import('./spawn-BTOG4tTm.mjs')],
|
|
25
|
-
["commands/teams", () => import('./teams-D8Ly3i6u.mjs')],
|
|
26
|
-
["commands/todo", () => import('./todo-CuNct-fw.mjs')],
|
|
27
|
-
["daemon/doctor", () => import('./doctor-BPkYWSuq.mjs')],
|
|
28
|
-
["daemon/install", () => import('./install-Cp_aB-NQ.mjs')],
|
|
29
|
-
["daemon/run", () => import('./run-B75qm2I6.mjs')],
|
|
30
|
-
["daemon/uninstall", () => import('./uninstall-BB7WYYAk.mjs')],
|
|
31
|
-
["resume/handleResumeCommand", () => import('./handleResumeCommand-CTGbZkCL.mjs')],
|
|
32
|
-
["ui/doctor", () => import('./doctor-CAC6qY9Z.mjs').then(function (n) { return n.d; })],
|
|
33
|
-
["agent/acp", () => import('./index-DjtBengz.mjs')],
|
|
34
|
-
["gemini/runGemini", () => import('./runGemini-a-V7JE-J.mjs')],
|
|
35
|
-
["gemini/utils/config", () => import('./config-CGCIFRCN.mjs')],
|
|
36
|
-
["openclaw/runOpenClaw", () => import('./runOpenClaw-DUSwXg1A.mjs')],
|
|
37
|
-
["persistence", () => import('./persistence-DujtUH94.mjs')],
|
|
38
|
-
// Deferred halves of the runners and clients
|
|
39
|
-
["api/apiMachine", () => import('./apiMachine-BQ-b4Lu3.mjs')],
|
|
40
|
-
["claude/runClaudeDeps", () => import('./runClaudeDeps-BOrPP4J1.mjs')],
|
|
41
|
-
["claude/claudeLocal", () => import('./claudeLocal-BeHToEK5.mjs')],
|
|
42
|
-
["claude/claudeLocalLauncher", () => import('./claudeLocalLauncher-Cq6bqAT4.mjs')],
|
|
43
|
-
["claude/sdk", () => import('./index-B6UGRQ7h.mjs')],
|
|
44
|
-
["assistant/bootstrap", () => import('./bootstrap-D_ExGrY2.mjs')],
|
|
45
|
-
["agentHome", () => import('./index-Diu6HdWH.mjs')],
|
|
46
|
-
["ui/ink/RemoteModeDisplay", () => import('./RemoteModeDisplay-D-HewyXg.mjs')],
|
|
47
|
-
// External packages imported on demand
|
|
48
|
-
["expo-server-sdk", () => import('expo-server-sdk')],
|
|
49
|
-
["ink", () => import('ink')],
|
|
50
|
-
["react", () => import('react')]
|
|
51
|
-
];
|
|
52
|
-
|
|
53
|
-
async function runSelfCheck(modules = LAZY_MODULES) {
|
|
54
|
-
const failures = [];
|
|
55
|
-
for (const [name, load] of modules) {
|
|
56
|
-
try {
|
|
57
|
-
await load();
|
|
58
|
-
} catch (error) {
|
|
59
|
-
failures.push({ name, error: error instanceof Error ? error.message : String(error) });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return failures;
|
|
63
|
-
}
|
|
64
|
-
async function selfCheckMain(opts = {}) {
|
|
65
|
-
const started = Date.now();
|
|
66
|
-
const failures = await runSelfCheck();
|
|
67
|
-
if (failures.length > 0) {
|
|
68
|
-
for (const failure of failures) {
|
|
69
|
-
console.error(`very-happy: failed to load ${failure.name}: ${failure.error}`);
|
|
70
|
-
}
|
|
71
|
-
return 1;
|
|
72
|
-
}
|
|
73
|
-
if (opts.verbose) console.log(`self-check: ${LAZY_MODULES.length} modules loaded in ${Date.now() - started}ms`);
|
|
74
|
-
console.log(`very-happy version: ${packageJson.version}`);
|
|
75
|
-
return 0;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
var selfCheck = /*#__PURE__*/Object.freeze({
|
|
79
|
-
__proto__: null,
|
|
80
|
-
runSelfCheck: runSelfCheck,
|
|
81
|
-
selfCheckMain: selfCheckMain
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
export { runSelfCheck, selfCheckMain };
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
function parseCompact(message) {
|
|
2
|
-
const trimmed = message.trim();
|
|
3
|
-
if (trimmed === "/compact") {
|
|
4
|
-
return {
|
|
5
|
-
isCompact: true,
|
|
6
|
-
originalMessage: trimmed
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
if (trimmed.startsWith("/compact ")) {
|
|
10
|
-
return {
|
|
11
|
-
isCompact: true,
|
|
12
|
-
originalMessage: trimmed
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
return {
|
|
16
|
-
isCompact: false,
|
|
17
|
-
originalMessage: message
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
function parseClear(message) {
|
|
21
|
-
const trimmed = message.trim();
|
|
22
|
-
return {
|
|
23
|
-
isClear: trimmed === "/clear"
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function parseSpecialCommand(message) {
|
|
27
|
-
const compactResult = parseCompact(message);
|
|
28
|
-
if (compactResult.isCompact) {
|
|
29
|
-
return {
|
|
30
|
-
type: "compact",
|
|
31
|
-
originalMessage: compactResult.originalMessage
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
const clearResult = parseClear(message);
|
|
35
|
-
if (clearResult.isClear) {
|
|
36
|
-
return {
|
|
37
|
-
type: "clear"
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
const trimmed = message.trim().toLowerCase();
|
|
41
|
-
if (trimmed === "/mcp") {
|
|
42
|
-
return { type: "mcp" };
|
|
43
|
-
}
|
|
44
|
-
if (trimmed === "/skills") {
|
|
45
|
-
return { type: "skills" };
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
type: null
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export { parseSpecialCommand as p };
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function parseCompact(message) {
|
|
4
|
-
const trimmed = message.trim();
|
|
5
|
-
if (trimmed === "/compact") {
|
|
6
|
-
return {
|
|
7
|
-
isCompact: true,
|
|
8
|
-
originalMessage: trimmed
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
if (trimmed.startsWith("/compact ")) {
|
|
12
|
-
return {
|
|
13
|
-
isCompact: true,
|
|
14
|
-
originalMessage: trimmed
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
isCompact: false,
|
|
19
|
-
originalMessage: message
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function parseClear(message) {
|
|
23
|
-
const trimmed = message.trim();
|
|
24
|
-
return {
|
|
25
|
-
isClear: trimmed === "/clear"
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function parseSpecialCommand(message) {
|
|
29
|
-
const compactResult = parseCompact(message);
|
|
30
|
-
if (compactResult.isCompact) {
|
|
31
|
-
return {
|
|
32
|
-
type: "compact",
|
|
33
|
-
originalMessage: compactResult.originalMessage
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
const clearResult = parseClear(message);
|
|
37
|
-
if (clearResult.isClear) {
|
|
38
|
-
return {
|
|
39
|
-
type: "clear"
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
const trimmed = message.trim().toLowerCase();
|
|
43
|
-
if (trimmed === "/mcp") {
|
|
44
|
-
return { type: "mcp" };
|
|
45
|
-
}
|
|
46
|
-
if (trimmed === "/skills") {
|
|
47
|
-
return { type: "skills" };
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
type: null
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
exports.parseSpecialCommand = parseSpecialCommand;
|