very-happy-cli 0.2.98 → 0.2.99

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 (31) hide show
  1. package/dist/{AcpBackend-BXiGiFC7.mjs → AcpBackend-C9LtzYSx.mjs} +1 -1
  2. package/dist/{AcpBackend-DhR8ml8L.cjs → AcpBackend-DkvV2nhl.cjs} +1 -1
  3. package/dist/{AcpSessionManager-CDnrxAfQ.mjs → AcpSessionManager-B5rJcE82.mjs} +1 -1
  4. package/dist/{AcpSessionManager-Ckc0NFmf.cjs → AcpSessionManager-gsp_-PGy.cjs} +1 -1
  5. package/dist/{config-B3pA9YsN.mjs → config-BcCVR-Wx.mjs} +2 -2
  6. package/dist/{config-GJQc_kpD.cjs → config-Bidi0Yeq.cjs} +2 -2
  7. package/dist/{index-CuUVSZnK.mjs → index-B87z2DOo.mjs} +12 -12
  8. package/dist/{index-BBm2b34F.cjs → index-CxdGnaov.cjs} +4 -4
  9. package/dist/{index-CO1gNtuP.cjs → index-Dp1EYEyF.cjs} +16 -16
  10. package/dist/{index-Bh5Rcy0s.mjs → index-Wfds4scC.mjs} +5 -5
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-Ru0dn_zF.mjs → installTerminalHooks-DkOh088o.mjs} +2 -2
  14. package/dist/{installTerminalHooks-Cp9JVxQ-.cjs → installTerminalHooks-jaCruGfR.cjs} +2 -2
  15. package/dist/lib.cjs +1 -1
  16. package/dist/lib.d.cts +1 -0
  17. package/dist/lib.d.mts +1 -0
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-CQoVN0u2.mjs → mcp-DhftF_XE.mjs} +2 -2
  20. package/dist/{mcp-B5HMF24K.cjs → mcp-ZQbu8tL1.cjs} +2 -2
  21. package/dist/{runGemini-CwZXQsgu.mjs → runGemini-3-xWWBRA.mjs} +4 -4
  22. package/dist/{runGemini-BBzPVzuc.cjs → runGemini-Ce7Maf-D.cjs} +4 -4
  23. package/dist/{runOpenClaw-C-jz4rWr.mjs → runOpenClaw-DZhGhihh.mjs} +3 -3
  24. package/dist/{runOpenClaw-B4nC6XGL.cjs → runOpenClaw-q3inEsDr.cjs} +3 -3
  25. package/dist/{send-DN-nVBEI.mjs → send-B3NOqi9-.mjs} +2 -2
  26. package/dist/{send-CWgaINHC.cjs → send-BdEJeVye.cjs} +2 -2
  27. package/dist/{spawn-CqcfbOnk.mjs → spawn-CCYAeBfN.mjs} +2 -2
  28. package/dist/{spawn-C0NSP84Y.cjs → spawn-DEVUh4iW.cjs} +2 -2
  29. package/dist/{types-Cl4vWuDY.mjs → types-CrJj-daH.mjs} +23 -12
  30. package/dist/{types-BP-4phS_.cjs → types-DhxxJFD0.cjs} +24 -13
  31. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-Cl4vWuDY.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-CrJj-daH.mjs';
5
5
 
6
6
  const DEFAULT_TIMEOUTS = {
7
7
  /** Default initialization timeout: 60 seconds */
@@ -3,7 +3,7 @@
3
3
  var node_child_process = require('node:child_process');
4
4
  var sdk = require('@agentclientprotocol/sdk');
5
5
  var node_crypto = require('node:crypto');
6
- var persistence = require('./types-BP-4phS_.cjs');
6
+ var persistence = require('./types-DhxxJFD0.cjs');
7
7
 
8
8
  const DEFAULT_TIMEOUTS = {
9
9
  /** Default initialization timeout: 60 seconds */
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { b as createEnvelope } from './types-Cl4vWuDY.mjs';
2
+ import { b as createEnvelope } from './types-CrJj-daH.mjs';
3
3
 
4
4
  function turnOptions(turnId, time) {
5
5
  return turnId ? { turn: turnId, time } : { time };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var persistence = require('./types-BP-4phS_.cjs');
4
+ var persistence = require('./types-DhxxJFD0.cjs');
5
5
 
6
6
  function turnOptions(turnId, time) {
7
7
  return turnId ? { turn: turnId, time } : { time };
@@ -2,8 +2,8 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { execSync } from 'child_process';
5
- import { l as logger } from './types-Cl4vWuDY.mjs';
6
- import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-CuUVSZnK.mjs';
5
+ import { l as logger } from './types-CrJj-daH.mjs';
6
+ import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-B87z2DOo.mjs';
7
7
  import 'axios';
8
8
  import 'chalk';
9
9
  import 'node:util';
@@ -4,8 +4,8 @@ var fs = require('fs');
4
4
  var path = require('path');
5
5
  var os = require('os');
6
6
  var child_process = require('child_process');
7
- var persistence = require('./types-BP-4phS_.cjs');
8
- var index = require('./index-CO1gNtuP.cjs');
7
+ var persistence = require('./types-DhxxJFD0.cjs');
8
+ var index = require('./index-Dp1EYEyF.cjs');
9
9
  require('axios');
10
10
  require('chalk');
11
11
  require('node:util');
@@ -1,7 +1,7 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
2
  import os, { homedir, userInfo } from 'node:os';
3
3
  import { randomUUID, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
4
- import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as isClaudeSessionId, L as getLocalHappyAgentCredentialPath, N as readLocalHappyAgentCredentials, O as decryptWithDataKey, P as decryptLegacy, Q as extractCompleteLines, S as decideBackfill, T as parseTerminalHookPayload, U as tmuxArgs, V as scrubTmuxClientEnv, W as decideMirrorBinding, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as persistSession, Z as mirrorLineKey, _ as mirrorLocalId, w as writePrivateFileSync, $ as detectResumeSupport, a0 as detectCLIAvailability, a1 as acquireDaemonLock, a2 as summarizeSpawnSessionForLog, a3 as deletePersistedSessions, a4 as shellescape, a5 as decrypt, a6 as writeDaemonState, A as ApiClient, a7 as writeSettings, a8 as fetchCliUpdateState, a9 as resolveCliUpdateCheckInterval, aa as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ab as releaseDaemonLock, ac as isValidSessionId, ad as listVhTerminals, ae as isValidTerminalId, af as readVhTerminal, ag as sendToVhTerminal, h as connectionState, ah as startOfflineReconnection, ai as clearCredentials, aj as clearMachineId, k as ensurePrivateDirectorySync, ak as SandboxConfigSchema, b as createEnvelope, al as CodexAppServerClient, am as getLatestDaemonLog } from './types-Cl4vWuDY.mjs';
4
+ import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as isClaudeSessionId, L as getLocalHappyAgentCredentialPath, N as readLocalHappyAgentCredentials, O as decryptWithDataKey, P as decryptLegacy, Q as extractCompleteLines, S as decideBackfill, T as parseTerminalHookPayload, U as tmuxArgs, V as scrubTmuxClientEnv, W as decideMirrorBinding, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as persistSession, Z as mirrorLineKey, _ as mirrorLocalId, w as writePrivateFileSync, $ as detectResumeSupport, a0 as detectCLIAvailability, a1 as acquireDaemonLock, a2 as summarizeSpawnSessionForLog, a3 as deletePersistedSessions, a4 as shellescape, a5 as decrypt, a6 as writeDaemonState, A as ApiClient, a7 as writeSettings, a8 as fetchCliUpdateState, a9 as resolveCliUpdateCheckInterval, aa as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ab as releaseDaemonLock, ac as isValidSessionId, ad as listVhTerminals, ae as isValidTerminalId, af as readVhTerminal, ag as sendToVhTerminal, h as connectionState, ah as startOfflineReconnection, ai as clearCredentials, aj as clearMachineId, k as ensurePrivateDirectorySync, ak as SandboxConfigSchema, b as createEnvelope, al as CodexAppServerClient, am as getLatestDaemonLog } from './types-CrJj-daH.mjs';
5
5
  import spawn$1, { spawn } from 'cross-spawn';
6
6
  import path, { join, resolve, basename, delimiter, isAbsolute, normalize, sep, dirname } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -14738,7 +14738,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14738
14738
  process.exit(0);
14739
14739
  } else if (subcommand === "install-terminal-hooks") {
14740
14740
  try {
14741
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-Ru0dn_zF.mjs');
14741
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-DkOh088o.mjs');
14742
14742
  const command = parseTerminalHooksArgs(args.slice(1));
14743
14743
  if (command.action === "help") {
14744
14744
  console.log(TERMINAL_HOOKS_HELP);
@@ -14755,7 +14755,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14755
14755
  }
14756
14756
  } else if (subcommand === "spawn") {
14757
14757
  try {
14758
- const { handleSpawnCommand } = await import('./spawn-CqcfbOnk.mjs');
14758
+ const { handleSpawnCommand } = await import('./spawn-CCYAeBfN.mjs');
14759
14759
  await handleSpawnCommand(args.slice(1));
14760
14760
  } catch (error) {
14761
14761
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -14767,7 +14767,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14767
14767
  return;
14768
14768
  } else if (subcommand === "send") {
14769
14769
  try {
14770
- const { handleSendCommand } = await import('./send-DN-nVBEI.mjs');
14770
+ const { handleSendCommand } = await import('./send-B3NOqi9-.mjs');
14771
14771
  await handleSendCommand(args.slice(1));
14772
14772
  } catch (error) {
14773
14773
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -14873,9 +14873,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14873
14873
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
14874
14874
  const projectId = args[3];
14875
14875
  try {
14876
- const { saveGoogleCloudProjectToConfig } = await import('./config-B3pA9YsN.mjs');
14877
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-Cl4vWuDY.mjs').then(function (n) { return n.an; });
14878
- const { ApiClient: ApiClient2 } = await import('./types-Cl4vWuDY.mjs').then(function (n) { return n.ao; });
14876
+ const { saveGoogleCloudProjectToConfig } = await import('./config-BcCVR-Wx.mjs');
14877
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-CrJj-daH.mjs').then(function (n) { return n.an; });
14878
+ const { ApiClient: ApiClient2 } = await import('./types-CrJj-daH.mjs').then(function (n) { return n.ao; });
14879
14879
  let userEmail = void 0;
14880
14880
  try {
14881
14881
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -14906,7 +14906,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14906
14906
  }
14907
14907
  if (geminiSubcommand === "project" && args[2] === "get") {
14908
14908
  try {
14909
- const { readGeminiLocalConfig } = await import('./config-B3pA9YsN.mjs');
14909
+ const { readGeminiLocalConfig } = await import('./config-BcCVR-Wx.mjs');
14910
14910
  const config = readGeminiLocalConfig();
14911
14911
  if (config.googleCloudProject) {
14912
14912
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -14946,7 +14946,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14946
14946
  process.exit(0);
14947
14947
  }
14948
14948
  try {
14949
- const { runGemini } = await import('./runGemini-CwZXQsgu.mjs');
14949
+ const { runGemini } = await import('./runGemini-3-xWWBRA.mjs');
14950
14950
  let startedBy = void 0;
14951
14951
  for (let i = 1; i < args.length; i++) {
14952
14952
  if (args[i] === "--started-by") {
@@ -14968,7 +14968,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14968
14968
  return;
14969
14969
  } else if (subcommand === "acp") {
14970
14970
  try {
14971
- const { runAcp, resolveAcpAgentConfig } = await import('./index-Bh5Rcy0s.mjs');
14971
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-Wfds4scC.mjs');
14972
14972
  let startedBy = void 0;
14973
14973
  let verbose = false;
14974
14974
  const acpArgs = [];
@@ -15008,7 +15008,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15008
15008
  return;
15009
15009
  } else if (subcommand === "openclaw") {
15010
15010
  try {
15011
- const { runOpenClaw } = await import('./runOpenClaw-C-jz4rWr.mjs');
15011
+ const { runOpenClaw } = await import('./runOpenClaw-DZhGhihh.mjs');
15012
15012
  let startedBy = void 0;
15013
15013
  let verbose = false;
15014
15014
  let gatewayUrl;
@@ -15059,7 +15059,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15059
15059
  return;
15060
15060
  } else if (subcommand === "mcp" && args.length === 1) {
15061
15061
  try {
15062
- const { handleMcpCommand } = await import('./mcp-CQoVN0u2.mjs');
15062
+ const { handleMcpCommand } = await import('./mcp-DhftF_XE.mjs');
15063
15063
  await handleMcpCommand();
15064
15064
  } catch (error) {
15065
15065
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var AcpBackend = require('./AcpBackend-DhR8ml8L.cjs');
4
- var persistence = require('./types-BP-4phS_.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-Ckc0NFmf.cjs');
3
+ var AcpBackend = require('./AcpBackend-DkvV2nhl.cjs');
4
+ var persistence = require('./types-DhxxJFD0.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-gsp_-PGy.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-CO1gNtuP.cjs');
8
+ var index = require('./index-Dp1EYEyF.cjs');
9
9
  require('node:child_process');
10
10
  require('@agentclientprotocol/sdk');
11
11
  require('axios');
@@ -3,7 +3,7 @@
3
3
  var chalk = require('chalk');
4
4
  var os = require('node:os');
5
5
  var node_crypto = require('node:crypto');
6
- var persistence = require('./types-BP-4phS_.cjs');
6
+ var persistence = require('./types-DhxxJFD0.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -6771,7 +6771,7 @@ function parseJsonObject(text) {
6771
6771
  return null;
6772
6772
  }
6773
6773
  }
6774
- function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CO1gNtuP.cjs', document.baseURI).href))).resolve(s)) {
6774
+ function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dp1EYEyF.cjs', document.baseURI).href))).resolve(s)) {
6775
6775
  const platformArch = `${platform}-${arch}`;
6776
6776
  const candidates = [
6777
6777
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -9939,7 +9939,7 @@ const MAX_TITLE_CHARS = 60;
9939
9939
  const GENERATION_TIMEOUT_MS = 3e4;
9940
9940
  function resolveClaudeBinary() {
9941
9941
  try {
9942
- const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CO1gNtuP.cjs', document.baseURI).href)));
9942
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dp1EYEyF.cjs', document.baseURI).href)));
9943
9943
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
9944
9944
  const { getClaudeCliPath } = require$1(utilsPath);
9945
9945
  const path$1 = getClaudeCliPath();
@@ -12134,9 +12134,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
12134
12134
  };
12135
12135
  }
12136
12136
 
12137
- const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CO1gNtuP.cjs', document.baseURI).href)));
12137
+ const __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dp1EYEyF.cjs', document.baseURI).href)));
12138
12138
  const __dirname$1 = path.dirname(__filename$1);
12139
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CO1gNtuP.cjs', document.baseURI).href)));
12139
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dp1EYEyF.cjs', document.baseURI).href)));
12140
12140
  const PRISMA_QUERY_ENGINE_FILES = {
12141
12141
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
12142
12142
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -14760,7 +14760,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14760
14760
  process.exit(0);
14761
14761
  } else if (subcommand === "install-terminal-hooks") {
14762
14762
  try {
14763
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-Cp9JVxQ-.cjs'); });
14763
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-jaCruGfR.cjs'); });
14764
14764
  const command = parseTerminalHooksArgs(args.slice(1));
14765
14765
  if (command.action === "help") {
14766
14766
  console.log(TERMINAL_HOOKS_HELP);
@@ -14777,7 +14777,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14777
14777
  }
14778
14778
  } else if (subcommand === "spawn") {
14779
14779
  try {
14780
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-C0NSP84Y.cjs'); });
14780
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-DEVUh4iW.cjs'); });
14781
14781
  await handleSpawnCommand(args.slice(1));
14782
14782
  } catch (error) {
14783
14783
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -14789,7 +14789,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14789
14789
  return;
14790
14790
  } else if (subcommand === "send") {
14791
14791
  try {
14792
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-CWgaINHC.cjs'); });
14792
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-BdEJeVye.cjs'); });
14793
14793
  await handleSendCommand(args.slice(1));
14794
14794
  } catch (error) {
14795
14795
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -14895,9 +14895,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14895
14895
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
14896
14896
  const projectId = args[3];
14897
14897
  try {
14898
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-GJQc_kpD.cjs'); });
14899
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-BP-4phS_.cjs'); }).then(function (n) { return n.persistence; });
14900
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-BP-4phS_.cjs'); }).then(function (n) { return n.api; });
14898
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-Bidi0Yeq.cjs'); });
14899
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-DhxxJFD0.cjs'); }).then(function (n) { return n.persistence; });
14900
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-DhxxJFD0.cjs'); }).then(function (n) { return n.api; });
14901
14901
  let userEmail = void 0;
14902
14902
  try {
14903
14903
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -14928,7 +14928,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14928
14928
  }
14929
14929
  if (geminiSubcommand === "project" && args[2] === "get") {
14930
14930
  try {
14931
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-GJQc_kpD.cjs'); });
14931
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-Bidi0Yeq.cjs'); });
14932
14932
  const config = readGeminiLocalConfig();
14933
14933
  if (config.googleCloudProject) {
14934
14934
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -14968,7 +14968,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14968
14968
  process.exit(0);
14969
14969
  }
14970
14970
  try {
14971
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-BBzPVzuc.cjs'); });
14971
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Ce7Maf-D.cjs'); });
14972
14972
  let startedBy = void 0;
14973
14973
  for (let i = 1; i < args.length; i++) {
14974
14974
  if (args[i] === "--started-by") {
@@ -14990,7 +14990,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
14990
14990
  return;
14991
14991
  } else if (subcommand === "acp") {
14992
14992
  try {
14993
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-BBm2b34F.cjs'); });
14993
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-CxdGnaov.cjs'); });
14994
14994
  let startedBy = void 0;
14995
14995
  let verbose = false;
14996
14996
  const acpArgs = [];
@@ -15030,7 +15030,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15030
15030
  return;
15031
15031
  } else if (subcommand === "openclaw") {
15032
15032
  try {
15033
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-B4nC6XGL.cjs'); });
15033
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-q3inEsDr.cjs'); });
15034
15034
  let startedBy = void 0;
15035
15035
  let verbose = false;
15036
15036
  let gatewayUrl;
@@ -15081,7 +15081,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15081
15081
  return;
15082
15082
  } else if (subcommand === "mcp" && args.length === 1) {
15083
15083
  try {
15084
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-B5HMF24K.cjs'); });
15084
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-ZQbu8tL1.cjs'); });
15085
15085
  await handleMcpCommand();
15086
15086
  } catch (error) {
15087
15087
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -1,10 +1,10 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-BXiGiFC7.mjs';
2
- export { a as DEFAULT_IDLE_TIMEOUT_MS, b as DEFAULT_TOOL_CALL_TIMEOUT_MS, e as extractErrorDetail, f as formatDuration, c as formatDurationMinutes, h as handleAgentMessageChunk, d as handleAgentThoughtChunk, g as handleLegacyMessageChunk, i as handlePlanUpdate, j as handleThinkingUpdate, k as handleToolCall, l as handleToolCallUpdate, p as parseArgsFromContent } from './AcpBackend-BXiGiFC7.mjs';
3
- import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-Cl4vWuDY.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-CDnrxAfQ.mjs';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-C9LtzYSx.mjs';
2
+ export { a as DEFAULT_IDLE_TIMEOUT_MS, b as DEFAULT_TOOL_CALL_TIMEOUT_MS, e as extractErrorDetail, f as formatDuration, c as formatDurationMinutes, h as handleAgentMessageChunk, d as handleAgentThoughtChunk, g as handleLegacyMessageChunk, i as handlePlanUpdate, j as handleThinkingUpdate, k as handleToolCall, l as handleToolCallUpdate, p as parseArgsFromContent } from './AcpBackend-C9LtzYSx.mjs';
3
+ import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-CrJj-daH.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-B5rJcE82.mjs';
5
5
  import { randomUUID } from 'node:crypto';
6
6
  import { join } from 'node:path';
7
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, f as startHappyServer, r as registerKillSessionHandler, B as BasePermissionHandler } from './index-CuUVSZnK.mjs';
7
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, f as startHappyServer, r as registerKillSessionHandler, B as BasePermissionHandler } from './index-B87z2DOo.mjs';
8
8
  import 'node:child_process';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'axios';
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-CO1gNtuP.cjs');
5
- require('./types-BP-4phS_.cjs');
4
+ require('./index-Dp1EYEyF.cjs');
5
+ require('./types-DhxxJFD0.cjs');
6
6
  require('zod');
7
7
  require('node:child_process');
8
8
  require('node:os');
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import 'chalk';
2
- import './index-CuUVSZnK.mjs';
3
- import './types-Cl4vWuDY.mjs';
2
+ import './index-B87z2DOo.mjs';
3
+ import './types-CrJj-daH.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:os';
@@ -3,8 +3,8 @@ import { join, resolve } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import chalk from 'chalk';
6
- import { p as projectPath } from './types-Cl4vWuDY.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-CuUVSZnK.mjs';
6
+ import { p as projectPath } from './types-CrJj-daH.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-B87z2DOo.mjs';
8
8
  import 'axios';
9
9
  import 'node:util';
10
10
  import 'node:fs/promises';
@@ -5,8 +5,8 @@ var path = require('node:path');
5
5
  var os = require('node:os');
6
6
  var node_child_process = require('node:child_process');
7
7
  var chalk = require('chalk');
8
- var persistence = require('./types-BP-4phS_.cjs');
9
- var index = require('./index-CO1gNtuP.cjs');
8
+ var persistence = require('./types-DhxxJFD0.cjs');
9
+ var index = require('./index-Dp1EYEyF.cjs');
10
10
  require('axios');
11
11
  require('node:util');
12
12
  require('node:fs/promises');
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var persistence = require('./types-BP-4phS_.cjs');
3
+ var persistence = require('./types-DhxxJFD0.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -369,6 +369,7 @@ declare const DaemonStateSchema: z$1.ZodObject<{
369
369
  tmuxSessions: z$1.ZodOptional<z$1.ZodObject<{
370
370
  rpcAvailable: z$1.ZodBoolean;
371
371
  detectedAt: z$1.ZodNumber;
372
+ killAttached: z$1.ZodOptional<z$1.ZodBoolean>;
372
373
  }, z$1.core.$strip>>;
373
374
  cliUpdate: z$1.ZodOptional<z$1.ZodObject<{
374
375
  currentVersion: z$1.ZodString;
package/dist/lib.d.mts CHANGED
@@ -369,6 +369,7 @@ declare const DaemonStateSchema: z$1.ZodObject<{
369
369
  tmuxSessions: z$1.ZodOptional<z$1.ZodObject<{
370
370
  rpcAvailable: z$1.ZodBoolean;
371
371
  detectedAt: z$1.ZodNumber;
372
+ killAttached: z$1.ZodOptional<z$1.ZodBoolean>;
372
373
  }, z$1.core.$strip>>;
373
374
  cliUpdate: z$1.ZodOptional<z$1.ZodObject<{
374
375
  currentVersion: z$1.ZodString;
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-Cl4vWuDY.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-CrJj-daH.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'node:util';
@@ -1,9 +1,9 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { z } from 'zod';
4
- import { p as pushClipboardViaDaemon } from './index-CuUVSZnK.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-B87z2DOo.mjs';
5
5
  import { C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, c as CLIPBOARD_MAX_BYTES } from './limits-CwFb5S2b.mjs';
6
- import { l as logger } from './types-Cl4vWuDY.mjs';
6
+ import { l as logger } from './types-CrJj-daH.mjs';
7
7
  import 'chalk';
8
8
  import 'node:os';
9
9
  import 'node:crypto';
@@ -3,9 +3,9 @@
3
3
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
4
4
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
5
5
  var z = require('zod');
6
- var index = require('./index-CO1gNtuP.cjs');
6
+ var index = require('./index-Dp1EYEyF.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-BP-4phS_.cjs');
8
+ var persistence = require('./types-DhxxJFD0.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -2,10 +2,10 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { join } from 'node:path';
5
- import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-Cl4vWuDY.mjs';
6
- import { g as GEMINI_API_KEY_ENV, j as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, k as BaseReasoningProcessor, i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, l as MessageBuffer, C as CHANGE_TITLE_INSTRUCTION, r as registerKillSessionHandler, f as startHappyServer } from './index-CuUVSZnK.mjs';
7
- import { A as AcpBackend } from './AcpBackend-BXiGiFC7.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-B3pA9YsN.mjs';
5
+ import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-CrJj-daH.mjs';
6
+ import { g as GEMINI_API_KEY_ENV, j as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, k as BaseReasoningProcessor, i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, l as MessageBuffer, C as CHANGE_TITLE_INSTRUCTION, r as registerKillSessionHandler, f as startHappyServer } from './index-B87z2DOo.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-C9LtzYSx.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-BcCVR-Wx.mjs';
9
9
  import 'axios';
10
10
  import 'chalk';
11
11
  import 'node:util';
@@ -4,10 +4,10 @@ var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
6
  var path = require('node:path');
7
- var persistence = require('./types-BP-4phS_.cjs');
8
- var index = require('./index-CO1gNtuP.cjs');
9
- var AcpBackend = require('./AcpBackend-DhR8ml8L.cjs');
10
- var config = require('./config-GJQc_kpD.cjs');
7
+ var persistence = require('./types-DhxxJFD0.cjs');
8
+ var index = require('./index-Dp1EYEyF.cjs');
9
+ var AcpBackend = require('./AcpBackend-DkvV2nhl.cjs');
10
+ var config = require('./config-Bidi0Yeq.cjs');
11
11
  require('axios');
12
12
  require('chalk');
13
13
  require('node:util');
@@ -3,9 +3,9 @@ import { execFileSync } from 'node:child_process';
3
3
  import os from 'node:os';
4
4
  import { existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
- import { k as ensurePrivateDirectorySync, m as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, c as configuration } from './types-Cl4vWuDY.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-CDnrxAfQ.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-CuUVSZnK.mjs';
6
+ import { k as ensurePrivateDirectorySync, m as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, c as configuration } from './types-CrJj-daH.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-B5rJcE82.mjs';
8
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-B87z2DOo.mjs';
9
9
  import WebSocket from 'ws';
10
10
  import * as ed from '@noble/ed25519';
11
11
  import { sha512 } from '@noble/hashes/sha2.js';
@@ -5,9 +5,9 @@ var node_child_process = require('node:child_process');
5
5
  var os = require('node:os');
6
6
  var node_fs = require('node:fs');
7
7
  var path = require('node:path');
8
- var persistence = require('./types-BP-4phS_.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-Ckc0NFmf.cjs');
10
- var index = require('./index-CO1gNtuP.cjs');
8
+ var persistence = require('./types-DhxxJFD0.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-gsp_-PGy.cjs');
10
+ var index = require('./index-Dp1EYEyF.cjs');
11
11
  var WebSocket = require('ws');
12
12
  var ed = require('@noble/ed25519');
13
13
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -1,8 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { r as readPersistedSessions, c as configuration } from './types-Cl4vWuDY.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-CuUVSZnK.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-CrJj-daH.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-B87z2DOo.mjs';
6
6
  import 'axios';
7
7
  import 'node:util';
8
8
  import 'node:os';
@@ -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-DhxxJFD0.cjs');
7
+ var index = require('./index-Dp1EYEyF.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-B87z2DOo.mjs';
5
+ import { l as logger } from './types-CrJj-daH.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-Dp1EYEyF.cjs');
7
+ var persistence = require('./types-DhxxJFD0.cjs');
8
8
  require('node:os');
9
9
  require('node:crypto');
10
10
  require('cross-spawn');
@@ -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.99";
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.99",
146
+ "very-happy-tools-x64-darwin": "0.2.99",
147
+ "very-happy-tools-arm64-linux": "0.2.99",
148
+ "very-happy-tools-x64-linux": "0.2.99",
149
+ "very-happy-tools-arm64-win32": "0.2.99",
150
+ "very-happy-tools-x64-win32": "0.2.99"
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.
@@ -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.99";
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.99",
168
+ "very-happy-tools-x64-darwin": "0.2.99",
169
+ "very-happy-tools-arm64-linux": "0.2.99",
170
+ "very-happy-tools-x64-linux": "0.2.99",
171
+ "very-happy-tools-arm64-win32": "0.2.99",
172
+ "very-happy-tools-x64-win32": "0.2.99"
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-DhxxJFD0.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.
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.99",
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.99",
117
+ "very-happy-tools-x64-darwin": "0.2.99",
118
+ "very-happy-tools-arm64-linux": "0.2.99",
119
+ "very-happy-tools-x64-linux": "0.2.99",
120
+ "very-happy-tools-arm64-win32": "0.2.99",
121
+ "very-happy-tools-x64-win32": "0.2.99"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",