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.
Files changed (33) hide show
  1. package/dist/{AcpBackend-BXiGiFC7.mjs → AcpBackend-CGnE_dbe.mjs} +1 -1
  2. package/dist/{AcpBackend-DhR8ml8L.cjs → AcpBackend-oDDlCB78.cjs} +1 -1
  3. package/dist/{AcpSessionManager-Ckc0NFmf.cjs → AcpSessionManager-BTXK7Wn2.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CDnrxAfQ.mjs → AcpSessionManager-XGnQqnaJ.mjs} +1 -1
  5. package/dist/{config-GJQc_kpD.cjs → config-CYGeJRgN.cjs} +2 -2
  6. package/dist/{config-B3pA9YsN.mjs → config-bUqA35dk.mjs} +2 -2
  7. package/dist/{index-CO1gNtuP.cjs → index-BFQ_XDUX.cjs} +245 -18
  8. package/dist/index-BXhSRb9N.cjs +57 -0
  9. package/dist/{index-CuUVSZnK.mjs → index-CPUJfdIJ.mjs} +241 -15
  10. package/dist/index-DlpWmQ1I.mjs +51 -0
  11. package/dist/{index-Bh5Rcy0s.mjs → index-j_bZV63O.mjs} +5 -5
  12. package/dist/{index-BBm2b34F.cjs → index-olwBiKj6.cjs} +4 -4
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.mjs +2 -2
  15. package/dist/{installTerminalHooks-Ru0dn_zF.mjs → installTerminalHooks-DmC0SrNo.mjs} +2 -2
  16. package/dist/{installTerminalHooks-Cp9JVxQ-.cjs → installTerminalHooks-ZNRl9Qcl.cjs} +2 -2
  17. package/dist/lib.cjs +1 -1
  18. package/dist/lib.d.cts +1 -0
  19. package/dist/lib.d.mts +1 -0
  20. package/dist/lib.mjs +1 -1
  21. package/dist/{mcp-B5HMF24K.cjs → mcp-7xQMC2Az.cjs} +2 -2
  22. package/dist/{mcp-CQoVN0u2.mjs → mcp-CryukOBj.mjs} +2 -2
  23. package/dist/{runGemini-BBzPVzuc.cjs → runGemini-12hI-_Ng.cjs} +4 -4
  24. package/dist/{runGemini-CwZXQsgu.mjs → runGemini-BbTfrych.mjs} +4 -4
  25. package/dist/{runOpenClaw-B4nC6XGL.cjs → runOpenClaw-CYrNNJ7P.cjs} +3 -3
  26. package/dist/{runOpenClaw-C-jz4rWr.mjs → runOpenClaw-Cr8boJJ9.mjs} +3 -3
  27. package/dist/{send-DN-nVBEI.mjs → send-DMuE8f-q.mjs} +2 -2
  28. package/dist/{send-CWgaINHC.cjs → send-DQjba9jZ.cjs} +2 -2
  29. package/dist/{spawn-CqcfbOnk.mjs → spawn-F6qqH4Vw.mjs} +2 -2
  30. package/dist/{spawn-C0NSP84Y.cjs → spawn-d7F98wtf.cjs} +2 -2
  31. package/dist/{types-BP-4phS_.cjs → types-DTVA1Hp-.cjs} +24 -13
  32. package/dist/{types-Cl4vWuDY.mjs → types-Dt0OQ0gL.mjs} +23 -12
  33. 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-BP-4phS_.cjs');
7
- var index = require('./index-CO1gNtuP.cjs');
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-CuUVSZnK.mjs';
5
- import { l as logger } from './types-Cl4vWuDY.mjs';
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-CO1gNtuP.cjs');
7
- var persistence = require('./types-BP-4phS_.cjs');
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.98";
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.98",
168
- "very-happy-tools-x64-darwin": "0.2.98",
169
- "very-happy-tools-arm64-linux": "0.2.98",
170
- "very-happy-tools-x64-linux": "0.2.98",
171
- "very-happy-tools-arm64-win32": "0.2.98",
172
- "very-happy-tools-x64-win32": "0.2.98"
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-BP-4phS_.cjs', document.baseURI).href))));
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.98";
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.98",
146
- "very-happy-tools-x64-darwin": "0.2.98",
147
- "very-happy-tools-arm64-linux": "0.2.98",
148
- "very-happy-tools-x64-linux": "0.2.98",
149
- "very-happy-tools-arm64-win32": "0.2.98",
150
- "very-happy-tools-x64-win32": "0.2.98"
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.98",
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.98",
117
- "very-happy-tools-x64-darwin": "0.2.98",
118
- "very-happy-tools-arm64-linux": "0.2.98",
119
- "very-happy-tools-x64-linux": "0.2.98",
120
- "very-happy-tools-arm64-win32": "0.2.98",
121
- "very-happy-tools-x64-win32": "0.2.98"
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:*",