very-happy-cli 0.2.98 → 0.2.100
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-BXiGiFC7.mjs → AcpBackend-CGnE_dbe.mjs} +1 -1
- package/dist/{AcpBackend-DhR8ml8L.cjs → AcpBackend-oDDlCB78.cjs} +1 -1
- package/dist/{AcpSessionManager-Ckc0NFmf.cjs → AcpSessionManager-BTXK7Wn2.cjs} +1 -1
- package/dist/{AcpSessionManager-CDnrxAfQ.mjs → AcpSessionManager-XGnQqnaJ.mjs} +1 -1
- package/dist/{config-GJQc_kpD.cjs → config-CYGeJRgN.cjs} +2 -2
- package/dist/{config-B3pA9YsN.mjs → config-bUqA35dk.mjs} +2 -2
- package/dist/{index-CO1gNtuP.cjs → index-BFQ_XDUX.cjs} +245 -18
- package/dist/index-BXhSRb9N.cjs +57 -0
- package/dist/{index-CuUVSZnK.mjs → index-CPUJfdIJ.mjs} +241 -15
- package/dist/index-DlpWmQ1I.mjs +51 -0
- package/dist/{index-Bh5Rcy0s.mjs → index-j_bZV63O.mjs} +5 -5
- package/dist/{index-BBm2b34F.cjs → index-olwBiKj6.cjs} +4 -4
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{installTerminalHooks-Ru0dn_zF.mjs → installTerminalHooks-DmC0SrNo.mjs} +2 -2
- package/dist/{installTerminalHooks-Cp9JVxQ-.cjs → installTerminalHooks-ZNRl9Qcl.cjs} +2 -2
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +1 -0
- package/dist/lib.d.mts +1 -0
- package/dist/lib.mjs +1 -1
- package/dist/{mcp-B5HMF24K.cjs → mcp-7xQMC2Az.cjs} +2 -2
- package/dist/{mcp-CQoVN0u2.mjs → mcp-CryukOBj.mjs} +2 -2
- package/dist/{runGemini-BBzPVzuc.cjs → runGemini-12hI-_Ng.cjs} +4 -4
- package/dist/{runGemini-CwZXQsgu.mjs → runGemini-BbTfrych.mjs} +4 -4
- package/dist/{runOpenClaw-B4nC6XGL.cjs → runOpenClaw-CYrNNJ7P.cjs} +3 -3
- package/dist/{runOpenClaw-C-jz4rWr.mjs → runOpenClaw-Cr8boJJ9.mjs} +3 -3
- package/dist/{send-DN-nVBEI.mjs → send-DMuE8f-q.mjs} +2 -2
- package/dist/{send-CWgaINHC.cjs → send-DQjba9jZ.cjs} +2 -2
- package/dist/{spawn-CqcfbOnk.mjs → spawn-F6qqH4Vw.mjs} +2 -2
- package/dist/{spawn-C0NSP84Y.cjs → spawn-d7F98wtf.cjs} +2 -2
- package/dist/{types-BP-4phS_.cjs → types-DTVA1Hp-.cjs} +24 -13
- package/dist/{types-Cl4vWuDY.mjs → types-Dt0OQ0gL.mjs} +23 -12
- package/package.json +7 -7
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var persistence = require('./types-
|
|
7
|
-
var index = require('./index-
|
|
6
|
+
var persistence = require('./types-DTVA1Hp-.cjs');
|
|
7
|
+
var index = require('./index-BFQ_XDUX.cjs');
|
|
8
8
|
require('axios');
|
|
9
9
|
require('node:util');
|
|
10
10
|
require('node:os');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { readFileSync, statSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-
|
|
5
|
-
import { l as logger } from './types-
|
|
4
|
+
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-CPUJfdIJ.mjs';
|
|
5
|
+
import { l as logger } from './types-Dt0OQ0gL.mjs';
|
|
6
6
|
import 'node:os';
|
|
7
7
|
import 'node:crypto';
|
|
8
8
|
import 'cross-spawn';
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var persistence = require('./types-
|
|
6
|
+
var index = require('./index-BFQ_XDUX.cjs');
|
|
7
|
+
var persistence = require('./types-DTVA1Hp-.cjs');
|
|
8
8
|
require('node:os');
|
|
9
9
|
require('node:crypto');
|
|
10
10
|
require('cross-spawn');
|
|
@@ -51,7 +51,7 @@ var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
|
|
|
51
51
|
var pty__namespace = /*#__PURE__*/_interopNamespaceDefault(pty);
|
|
52
52
|
|
|
53
53
|
var name = "very-happy-cli";
|
|
54
|
-
var version = "0.2.
|
|
54
|
+
var version = "0.2.100";
|
|
55
55
|
var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
|
|
56
56
|
var author = "Kirill Dubovitskiy";
|
|
57
57
|
var contributors = [
|
|
@@ -164,12 +164,12 @@ var dependencies = {
|
|
|
164
164
|
zod: "^4.0.0"
|
|
165
165
|
};
|
|
166
166
|
var optionalDependencies = {
|
|
167
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
168
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
169
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
170
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
171
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
172
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
167
|
+
"very-happy-tools-arm64-darwin": "0.2.100",
|
|
168
|
+
"very-happy-tools-x64-darwin": "0.2.100",
|
|
169
|
+
"very-happy-tools-arm64-linux": "0.2.100",
|
|
170
|
+
"very-happy-tools-x64-linux": "0.2.100",
|
|
171
|
+
"very-happy-tools-arm64-win32": "0.2.100",
|
|
172
|
+
"very-happy-tools-x64-win32": "0.2.100"
|
|
173
173
|
};
|
|
174
174
|
var devDependencies = {
|
|
175
175
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -1123,7 +1123,9 @@ z.z.object({
|
|
|
1123
1123
|
*/
|
|
1124
1124
|
tmuxSessions: z.z.object({
|
|
1125
1125
|
rpcAvailable: z.z.boolean(),
|
|
1126
|
-
detectedAt: z.z.number()
|
|
1126
|
+
detectedAt: z.z.number(),
|
|
1127
|
+
/** B-282: `kill-terminal` honours `alsoAttached`. */
|
|
1128
|
+
killAttached: z.z.boolean().optional()
|
|
1127
1129
|
}).optional(),
|
|
1128
1130
|
/** Relay-owned CLI compatibility/update policy last checked by this daemon. */
|
|
1129
1131
|
cliUpdate: CliUpdateStateSchema.optional(),
|
|
@@ -1583,7 +1585,7 @@ class RpcHandlerManager {
|
|
|
1583
1585
|
}
|
|
1584
1586
|
}
|
|
1585
1587
|
|
|
1586
|
-
const __dirname$1 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-
|
|
1588
|
+
const __dirname$1 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-DTVA1Hp-.cjs', document.baseURI).href))));
|
|
1587
1589
|
function projectPath() {
|
|
1588
1590
|
const path = path$1.resolve(__dirname$1, "..");
|
|
1589
1591
|
return path;
|
|
@@ -11956,7 +11958,7 @@ class WebTerminalManager {
|
|
|
11956
11958
|
/** Permanently destroy the terminal: detach the pty AND kill the tmux
|
|
11957
11959
|
* session (so a local `tmux attach` won't find it either). Used when the
|
|
11958
11960
|
* user deletes the terminal from the sidebar. */
|
|
11959
|
-
killSession(terminalId) {
|
|
11961
|
+
killSession(terminalId, opts) {
|
|
11960
11962
|
const info = this.lastSeenInfo.get(terminalId) ?? this.listSessions().find((t) => t.id === terminalId);
|
|
11961
11963
|
const target = `=vh-${terminalId}:`;
|
|
11962
11964
|
const killed = node_child_process.spawnSync("tmux", tmuxArgs(["kill-session", "-t", target]), { stdio: "ignore", env: ptyEnv() });
|
|
@@ -11965,6 +11967,15 @@ class WebTerminalManager {
|
|
|
11965
11967
|
logger.debug(`[WEB TERMINAL] failed to verify tmux session removal ${target}`);
|
|
11966
11968
|
return false;
|
|
11967
11969
|
}
|
|
11970
|
+
if (opts?.alsoAttached && info?.attachTmux) {
|
|
11971
|
+
const matches = this.listUserTmuxSessions(Infinity).filter((s) => s.name === info.attachTmux);
|
|
11972
|
+
if (matches.length === 1) {
|
|
11973
|
+
node_child_process.spawnSync("tmux", tmuxArgs(["kill-session", "-t", matches[0].id]), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() });
|
|
11974
|
+
logger.info(`[WEB TERMINAL] killed attached user tmux session ${matches[0].id} (${info.attachTmux}) with ${terminalId}`);
|
|
11975
|
+
} else {
|
|
11976
|
+
logger.debug(`[WEB TERMINAL] alsoAttached: no unique session named ${info.attachTmux} (${matches.length} matches)`);
|
|
11977
|
+
}
|
|
11978
|
+
}
|
|
11968
11979
|
if (info) {
|
|
11969
11980
|
const mirror = pickMirrorForTerminal(readPersistedSessions(), terminalId);
|
|
11970
11981
|
this.recordClosed({
|
|
@@ -14220,11 +14231,11 @@ class ApiMachineClient {
|
|
|
14220
14231
|
return { type: "success" };
|
|
14221
14232
|
});
|
|
14222
14233
|
this.rpcHandlerManager.registerHandler("kill-terminal", async (params) => {
|
|
14223
|
-
const { terminalId } = params || {};
|
|
14234
|
+
const { terminalId, alsoAttached } = params || {};
|
|
14224
14235
|
if (typeof terminalId !== "string" || !terminalId) {
|
|
14225
14236
|
return { type: "error", errorMessage: "Terminal ID is required" };
|
|
14226
14237
|
}
|
|
14227
|
-
if (!this.webTerminal.killSession(terminalId)) {
|
|
14238
|
+
if (!this.webTerminal.killSession(terminalId, { alsoAttached: alsoAttached === true })) {
|
|
14228
14239
|
return { type: "error", errorMessage: "tmux session is still running" };
|
|
14229
14240
|
}
|
|
14230
14241
|
this.encTerminals.delete(terminalId);
|
|
@@ -14638,7 +14649,7 @@ class ApiMachineClient {
|
|
|
14638
14649
|
// web's `detectedAt >= startedAt` trust rule holds.
|
|
14639
14650
|
terminalRestore: { rpcAvailable: true, detectedAt: now },
|
|
14640
14651
|
// B-273 capability flag (same restamp discipline).
|
|
14641
|
-
tmuxSessions: { rpcAvailable: true, detectedAt: now },
|
|
14652
|
+
tmuxSessions: { rpcAvailable: true, detectedAt: now, killAttached: true },
|
|
14642
14653
|
// B-084: closed records survive daemon restarts (persisted
|
|
14643
14654
|
// in closed-terminals.json), so the connect snapshot ships
|
|
14644
14655
|
// them too — not just the incremental pushes.
|
|
@@ -29,7 +29,7 @@ import { SandboxManager } from '@anthropic-ai/sandbox-runtime';
|
|
|
29
29
|
import { Expo } from 'expo-server-sdk';
|
|
30
30
|
|
|
31
31
|
var name = "very-happy-cli";
|
|
32
|
-
var version = "0.2.
|
|
32
|
+
var version = "0.2.100";
|
|
33
33
|
var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
|
|
34
34
|
var author = "Kirill Dubovitskiy";
|
|
35
35
|
var contributors = [
|
|
@@ -142,12 +142,12 @@ var dependencies = {
|
|
|
142
142
|
zod: "^4.0.0"
|
|
143
143
|
};
|
|
144
144
|
var optionalDependencies = {
|
|
145
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
146
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
147
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
148
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
149
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
150
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
145
|
+
"very-happy-tools-arm64-darwin": "0.2.100",
|
|
146
|
+
"very-happy-tools-x64-darwin": "0.2.100",
|
|
147
|
+
"very-happy-tools-arm64-linux": "0.2.100",
|
|
148
|
+
"very-happy-tools-x64-linux": "0.2.100",
|
|
149
|
+
"very-happy-tools-arm64-win32": "0.2.100",
|
|
150
|
+
"very-happy-tools-x64-win32": "0.2.100"
|
|
151
151
|
};
|
|
152
152
|
var devDependencies = {
|
|
153
153
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -1101,7 +1101,9 @@ z$1.object({
|
|
|
1101
1101
|
*/
|
|
1102
1102
|
tmuxSessions: z$1.object({
|
|
1103
1103
|
rpcAvailable: z$1.boolean(),
|
|
1104
|
-
detectedAt: z$1.number()
|
|
1104
|
+
detectedAt: z$1.number(),
|
|
1105
|
+
/** B-282: `kill-terminal` honours `alsoAttached`. */
|
|
1106
|
+
killAttached: z$1.boolean().optional()
|
|
1105
1107
|
}).optional(),
|
|
1106
1108
|
/** Relay-owned CLI compatibility/update policy last checked by this daemon. */
|
|
1107
1109
|
cliUpdate: CliUpdateStateSchema.optional(),
|
|
@@ -11934,7 +11936,7 @@ class WebTerminalManager {
|
|
|
11934
11936
|
/** Permanently destroy the terminal: detach the pty AND kill the tmux
|
|
11935
11937
|
* session (so a local `tmux attach` won't find it either). Used when the
|
|
11936
11938
|
* user deletes the terminal from the sidebar. */
|
|
11937
|
-
killSession(terminalId) {
|
|
11939
|
+
killSession(terminalId, opts) {
|
|
11938
11940
|
const info = this.lastSeenInfo.get(terminalId) ?? this.listSessions().find((t) => t.id === terminalId);
|
|
11939
11941
|
const target = `=vh-${terminalId}:`;
|
|
11940
11942
|
const killed = spawnSync("tmux", tmuxArgs(["kill-session", "-t", target]), { stdio: "ignore", env: ptyEnv() });
|
|
@@ -11943,6 +11945,15 @@ class WebTerminalManager {
|
|
|
11943
11945
|
logger.debug(`[WEB TERMINAL] failed to verify tmux session removal ${target}`);
|
|
11944
11946
|
return false;
|
|
11945
11947
|
}
|
|
11948
|
+
if (opts?.alsoAttached && info?.attachTmux) {
|
|
11949
|
+
const matches = this.listUserTmuxSessions(Infinity).filter((s) => s.name === info.attachTmux);
|
|
11950
|
+
if (matches.length === 1) {
|
|
11951
|
+
spawnSync("tmux", tmuxArgs(["kill-session", "-t", matches[0].id]), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() });
|
|
11952
|
+
logger.info(`[WEB TERMINAL] killed attached user tmux session ${matches[0].id} (${info.attachTmux}) with ${terminalId}`);
|
|
11953
|
+
} else {
|
|
11954
|
+
logger.debug(`[WEB TERMINAL] alsoAttached: no unique session named ${info.attachTmux} (${matches.length} matches)`);
|
|
11955
|
+
}
|
|
11956
|
+
}
|
|
11946
11957
|
if (info) {
|
|
11947
11958
|
const mirror = pickMirrorForTerminal(readPersistedSessions(), terminalId);
|
|
11948
11959
|
this.recordClosed({
|
|
@@ -14198,11 +14209,11 @@ class ApiMachineClient {
|
|
|
14198
14209
|
return { type: "success" };
|
|
14199
14210
|
});
|
|
14200
14211
|
this.rpcHandlerManager.registerHandler("kill-terminal", async (params) => {
|
|
14201
|
-
const { terminalId } = params || {};
|
|
14212
|
+
const { terminalId, alsoAttached } = params || {};
|
|
14202
14213
|
if (typeof terminalId !== "string" || !terminalId) {
|
|
14203
14214
|
return { type: "error", errorMessage: "Terminal ID is required" };
|
|
14204
14215
|
}
|
|
14205
|
-
if (!this.webTerminal.killSession(terminalId)) {
|
|
14216
|
+
if (!this.webTerminal.killSession(terminalId, { alsoAttached: alsoAttached === true })) {
|
|
14206
14217
|
return { type: "error", errorMessage: "tmux session is still running" };
|
|
14207
14218
|
}
|
|
14208
14219
|
this.encTerminals.delete(terminalId);
|
|
@@ -14616,7 +14627,7 @@ class ApiMachineClient {
|
|
|
14616
14627
|
// web's `detectedAt >= startedAt` trust rule holds.
|
|
14617
14628
|
terminalRestore: { rpcAvailable: true, detectedAt: now },
|
|
14618
14629
|
// B-273 capability flag (same restamp discipline).
|
|
14619
|
-
tmuxSessions: { rpcAvailable: true, detectedAt: now },
|
|
14630
|
+
tmuxSessions: { rpcAvailable: true, detectedAt: now, killAttached: true },
|
|
14620
14631
|
// B-084: closed records survive daemon restarts (persisted
|
|
14621
14632
|
// in closed-terminals.json), so the connect snapshot ships
|
|
14622
14633
|
// them too — not just the incremental pushes.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "very-happy-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.100",
|
|
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": [
|
|
@@ -113,12 +113,12 @@
|
|
|
113
113
|
"zod": "^4.0.0"
|
|
114
114
|
},
|
|
115
115
|
"optionalDependencies": {
|
|
116
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
117
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
118
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
119
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
120
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
121
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
116
|
+
"very-happy-tools-arm64-darwin": "0.2.100",
|
|
117
|
+
"very-happy-tools-x64-darwin": "0.2.100",
|
|
118
|
+
"very-happy-tools-arm64-linux": "0.2.100",
|
|
119
|
+
"very-happy-tools-x64-linux": "0.2.100",
|
|
120
|
+
"very-happy-tools-arm64-win32": "0.2.100",
|
|
121
|
+
"very-happy-tools-x64-win32": "0.2.100"
|
|
122
122
|
},
|
|
123
123
|
"devDependencies": {
|
|
124
124
|
"@slopus/happy-wire": "workspace:*",
|