very-happy-cli 0.2.77 → 0.2.78

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-CsLnh1So.cjs → AcpBackend-BxZ-KvBy.cjs} +1 -1
  2. package/dist/{AcpBackend-BFFC77vV.mjs → AcpBackend-CDngyx5G.mjs} +1 -1
  3. package/dist/{AcpSessionManager--CixPN-p.cjs → AcpSessionManager-BWFM_8f9.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CU5vsxgF.mjs → AcpSessionManager-Dcq8dl4l.mjs} +1 -1
  5. package/dist/{config-pv17N6Kg.cjs → config-Byay91xM.cjs} +2 -2
  6. package/dist/{config-CRFTYuTN.mjs → config-Co1Tpb5e.mjs} +2 -2
  7. package/dist/{index-C1OnwMx0.cjs → index-CkjEzh-Y.cjs} +4 -4
  8. package/dist/{index-Dcv1RKe8.cjs → index-CuvhWx_d.cjs} +15 -15
  9. package/dist/{index-BkvUwyIU.mjs → index-DdOYA0qe.mjs} +5 -5
  10. package/dist/{index-DOb57EGb.mjs → index-w0zkr6EM.mjs} +12 -12
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-IXvZMGJq.mjs → installTerminalHooks-DFmjn6EQ.mjs} +2 -2
  14. package/dist/{installTerminalHooks-YyT3fv6w.cjs → installTerminalHooks-nXjKPP3D.cjs} +2 -2
  15. package/dist/lib.cjs +1 -1
  16. package/dist/lib.d.cts +3 -0
  17. package/dist/lib.d.mts +3 -0
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-CsKnmeE5.cjs → mcp-BreMIH5r.cjs} +2 -2
  20. package/dist/{mcp-B-GdhlKD.mjs → mcp-nlZLEkmO.mjs} +2 -2
  21. package/dist/{runGemini-D0lddF43.mjs → runGemini-DEZ0neEl.mjs} +4 -4
  22. package/dist/{runGemini-DuUdmlVZ.cjs → runGemini-by29Tp8r.cjs} +4 -4
  23. package/dist/{runOpenClaw-DEMCYSoD.cjs → runOpenClaw-DENpTXhw.cjs} +3 -3
  24. package/dist/{runOpenClaw-BiwwYnYf.mjs → runOpenClaw-DyJQFzoX.mjs} +3 -3
  25. package/dist/{send-DijSXAMp.cjs → send-e6BSMl0m.cjs} +2 -2
  26. package/dist/{send-DM8oqJFp.mjs → send-pX36Sd4p.mjs} +2 -2
  27. package/dist/{spawn-De3b5Hsu.cjs → spawn-C87d_KDj.cjs} +2 -2
  28. package/dist/{spawn-nISXbZD5.mjs → spawn-Da-94Ejo.mjs} +2 -2
  29. package/dist/{types-D2qSKjsO.mjs → types-Clmu74iY.mjs} +74 -10
  30. package/dist/{types-NwtcBgfS.cjs → types-Dua2iF5S.cjs} +75 -11
  31. package/package.json +7 -7
@@ -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-NwtcBgfS.cjs');
6
+ var persistence = require('./types-Dua2iF5S.cjs');
7
7
 
8
8
  const DEFAULT_TIMEOUTS = {
9
9
  /** Default initialization timeout: 60 seconds */
@@ -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-D2qSKjsO.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-Clmu74iY.mjs';
5
5
 
6
6
  const DEFAULT_TIMEOUTS = {
7
7
  /** Default initialization timeout: 60 seconds */
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var persistence = require('./types-NwtcBgfS.cjs');
4
+ var persistence = require('./types-Dua2iF5S.cjs');
5
5
 
6
6
  function turnOptions(turnId, time) {
7
7
  return turnId ? { turn: turnId, time } : { time };
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { b as createEnvelope } from './types-D2qSKjsO.mjs';
2
+ import { b as createEnvelope } from './types-Clmu74iY.mjs';
3
3
 
4
4
  function turnOptions(turnId, time) {
5
5
  return turnId ? { turn: turnId, time } : { time };
@@ -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-NwtcBgfS.cjs');
8
- var index = require('./index-Dcv1RKe8.cjs');
7
+ var persistence = require('./types-Dua2iF5S.cjs');
8
+ var index = require('./index-CuvhWx_d.cjs');
9
9
  require('axios');
10
10
  require('chalk');
11
11
  require('node:util');
@@ -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-D2qSKjsO.mjs';
6
- import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-DOb57EGb.mjs';
5
+ import { l as logger } from './types-Clmu74iY.mjs';
6
+ import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-w0zkr6EM.mjs';
7
7
  import 'axios';
8
8
  import 'chalk';
9
9
  import 'node:util';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var AcpBackend = require('./AcpBackend-CsLnh1So.cjs');
4
- var persistence = require('./types-NwtcBgfS.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager--CixPN-p.cjs');
3
+ var AcpBackend = require('./AcpBackend-BxZ-KvBy.cjs');
4
+ var persistence = require('./types-Dua2iF5S.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-BWFM_8f9.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-Dcv1RKe8.cjs');
8
+ var index = require('./index-CuvhWx_d.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-NwtcBgfS.cjs');
6
+ var persistence = require('./types-Dua2iF5S.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -8274,7 +8274,7 @@ const MAX_TITLE_CHARS = 60;
8274
8274
  const GENERATION_TIMEOUT_MS = 3e4;
8275
8275
  function resolveClaudeBinary() {
8276
8276
  try {
8277
- 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-Dcv1RKe8.cjs', document.baseURI).href)));
8277
+ 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-CuvhWx_d.cjs', document.baseURI).href)));
8278
8278
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
8279
8279
  const { getClaudeCliPath } = require$1(utilsPath);
8280
8280
  const path$1 = getClaudeCliPath();
@@ -10391,9 +10391,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
10391
10391
  };
10392
10392
  }
10393
10393
 
10394
- 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-Dcv1RKe8.cjs', document.baseURI).href)));
10394
+ 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-CuvhWx_d.cjs', document.baseURI).href)));
10395
10395
  const __dirname$1 = path.dirname(__filename$1);
10396
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dcv1RKe8.cjs', document.baseURI).href)));
10396
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CuvhWx_d.cjs', document.baseURI).href)));
10397
10397
  const PRISMA_QUERY_ENGINE_FILES = {
10398
10398
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
10399
10399
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -13005,7 +13005,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13005
13005
  process.exit(0);
13006
13006
  } else if (subcommand === "install-terminal-hooks") {
13007
13007
  try {
13008
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-YyT3fv6w.cjs'); });
13008
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-nXjKPP3D.cjs'); });
13009
13009
  const command = parseTerminalHooksArgs(args.slice(1));
13010
13010
  if (command.action === "help") {
13011
13011
  console.log(TERMINAL_HOOKS_HELP);
@@ -13022,7 +13022,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13022
13022
  }
13023
13023
  } else if (subcommand === "spawn") {
13024
13024
  try {
13025
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-De3b5Hsu.cjs'); });
13025
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-C87d_KDj.cjs'); });
13026
13026
  await handleSpawnCommand(args.slice(1));
13027
13027
  } catch (error) {
13028
13028
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13034,7 +13034,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13034
13034
  return;
13035
13035
  } else if (subcommand === "send") {
13036
13036
  try {
13037
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-DijSXAMp.cjs'); });
13037
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-e6BSMl0m.cjs'); });
13038
13038
  await handleSendCommand(args.slice(1));
13039
13039
  } catch (error) {
13040
13040
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13140,9 +13140,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13140
13140
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13141
13141
  const projectId = args[3];
13142
13142
  try {
13143
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-pv17N6Kg.cjs'); });
13144
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-NwtcBgfS.cjs'); }).then(function (n) { return n.persistence; });
13145
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-NwtcBgfS.cjs'); }).then(function (n) { return n.api; });
13143
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-Byay91xM.cjs'); });
13144
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-Dua2iF5S.cjs'); }).then(function (n) { return n.persistence; });
13145
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-Dua2iF5S.cjs'); }).then(function (n) { return n.api; });
13146
13146
  let userEmail = void 0;
13147
13147
  try {
13148
13148
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13173,7 +13173,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13173
13173
  }
13174
13174
  if (geminiSubcommand === "project" && args[2] === "get") {
13175
13175
  try {
13176
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-pv17N6Kg.cjs'); });
13176
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-Byay91xM.cjs'); });
13177
13177
  const config = readGeminiLocalConfig();
13178
13178
  if (config.googleCloudProject) {
13179
13179
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13213,7 +13213,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13213
13213
  process.exit(0);
13214
13214
  }
13215
13215
  try {
13216
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-DuUdmlVZ.cjs'); });
13216
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-by29Tp8r.cjs'); });
13217
13217
  let startedBy = void 0;
13218
13218
  for (let i = 1; i < args.length; i++) {
13219
13219
  if (args[i] === "--started-by") {
@@ -13235,7 +13235,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13235
13235
  return;
13236
13236
  } else if (subcommand === "acp") {
13237
13237
  try {
13238
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-C1OnwMx0.cjs'); });
13238
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-CkjEzh-Y.cjs'); });
13239
13239
  let startedBy = void 0;
13240
13240
  let verbose = false;
13241
13241
  const acpArgs = [];
@@ -13275,7 +13275,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13275
13275
  return;
13276
13276
  } else if (subcommand === "openclaw") {
13277
13277
  try {
13278
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-DEMCYSoD.cjs'); });
13278
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-DENpTXhw.cjs'); });
13279
13279
  let startedBy = void 0;
13280
13280
  let verbose = false;
13281
13281
  let gatewayUrl;
@@ -13326,7 +13326,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13326
13326
  return;
13327
13327
  } else if (subcommand === "mcp" && args.length === 1) {
13328
13328
  try {
13329
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-CsKnmeE5.cjs'); });
13329
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-BreMIH5r.cjs'); });
13330
13330
  await handleMcpCommand();
13331
13331
  } catch (error) {
13332
13332
  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-BFFC77vV.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-BFFC77vV.mjs';
3
- import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-D2qSKjsO.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-CU5vsxgF.mjs';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-CDngyx5G.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-CDngyx5G.mjs';
3
+ import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-Clmu74iY.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-Dcq8dl4l.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-DOb57EGb.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-w0zkr6EM.mjs';
8
8
  import 'node:child_process';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'axios';
@@ -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 } 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, f as packageJson, i as readSettings, v as readCredentials, x as credentialRelayProblem, y as deriveLocalCliUpdateSummary, j as encodeBase64, z as updateSettings, B as encodeBase64Url, C as decodeBase64, D as writeCredentialsLegacy, E as writeCredentialsDataKey, F as readCredentialsForConfiguredRelay, G as encrypt, r as readPersistedSessions, H as getLocalHappyAgentCredentialPath, J as readLocalHappyAgentCredentials, K as decryptWithDataKey, L as decryptLegacy, M as extractCompleteLines, N as decideBackfill, O as parseTerminalHookPayload, P as decideMirrorBinding, Q as persistSession, S as MIRROR_BACKFILL_LINES_DEFAULT, T as mirrorLineKey, U as mirrorLocalId, V as detectResumeSupport, W as detectCLIAvailability, X as acquireDaemonLock, Y as summarizeSpawnSessionForLog, Z as deletePersistedSessions, _ as decrypt, $ as writeDaemonState, A as ApiClient, a0 as fetchCliUpdateState, a1 as resolveCliUpdateCheckInterval, a2 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a3 as releaseDaemonLock, a4 as isValidSessionId, a5 as listVhTerminals, a6 as isValidTerminalId, a7 as readVhTerminal, a8 as sendToVhTerminal, h as connectionState, a9 as startOfflineReconnection, aa as clearCredentials, ab as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ac as SandboxConfigSchema, b as createEnvelope, ad as CodexAppServerClient, ae as getLatestDaemonLog } from './types-D2qSKjsO.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, f as packageJson, i as readSettings, v as readCredentials, x as credentialRelayProblem, y as deriveLocalCliUpdateSummary, j as encodeBase64, z as updateSettings, B as encodeBase64Url, C as decodeBase64, D as writeCredentialsLegacy, E as writeCredentialsDataKey, F as readCredentialsForConfiguredRelay, G as encrypt, r as readPersistedSessions, H as getLocalHappyAgentCredentialPath, J as readLocalHappyAgentCredentials, K as decryptWithDataKey, L as decryptLegacy, M as extractCompleteLines, N as decideBackfill, O as parseTerminalHookPayload, P as decideMirrorBinding, Q as persistSession, S as MIRROR_BACKFILL_LINES_DEFAULT, T as mirrorLineKey, U as mirrorLocalId, V as detectResumeSupport, W as detectCLIAvailability, X as acquireDaemonLock, Y as summarizeSpawnSessionForLog, Z as deletePersistedSessions, _ as decrypt, $ as writeDaemonState, A as ApiClient, a0 as fetchCliUpdateState, a1 as resolveCliUpdateCheckInterval, a2 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a3 as releaseDaemonLock, a4 as isValidSessionId, a5 as listVhTerminals, a6 as isValidTerminalId, a7 as readVhTerminal, a8 as sendToVhTerminal, h as connectionState, a9 as startOfflineReconnection, aa as clearCredentials, ab as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ac as SandboxConfigSchema, b as createEnvelope, ad as CodexAppServerClient, ae as getLatestDaemonLog } from './types-Clmu74iY.mjs';
5
5
  import spawn$1, { spawn } from 'cross-spawn';
6
6
  import path, { join, resolve, isAbsolute, normalize, sep, dirname } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -12983,7 +12983,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
12983
12983
  process.exit(0);
12984
12984
  } else if (subcommand === "install-terminal-hooks") {
12985
12985
  try {
12986
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-IXvZMGJq.mjs');
12986
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-DFmjn6EQ.mjs');
12987
12987
  const command = parseTerminalHooksArgs(args.slice(1));
12988
12988
  if (command.action === "help") {
12989
12989
  console.log(TERMINAL_HOOKS_HELP);
@@ -13000,7 +13000,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13000
13000
  }
13001
13001
  } else if (subcommand === "spawn") {
13002
13002
  try {
13003
- const { handleSpawnCommand } = await import('./spawn-nISXbZD5.mjs');
13003
+ const { handleSpawnCommand } = await import('./spawn-Da-94Ejo.mjs');
13004
13004
  await handleSpawnCommand(args.slice(1));
13005
13005
  } catch (error) {
13006
13006
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13012,7 +13012,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13012
13012
  return;
13013
13013
  } else if (subcommand === "send") {
13014
13014
  try {
13015
- const { handleSendCommand } = await import('./send-DM8oqJFp.mjs');
13015
+ const { handleSendCommand } = await import('./send-pX36Sd4p.mjs');
13016
13016
  await handleSendCommand(args.slice(1));
13017
13017
  } catch (error) {
13018
13018
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13118,9 +13118,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13118
13118
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13119
13119
  const projectId = args[3];
13120
13120
  try {
13121
- const { saveGoogleCloudProjectToConfig } = await import('./config-CRFTYuTN.mjs');
13122
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-D2qSKjsO.mjs').then(function (n) { return n.af; });
13123
- const { ApiClient: ApiClient2 } = await import('./types-D2qSKjsO.mjs').then(function (n) { return n.ag; });
13121
+ const { saveGoogleCloudProjectToConfig } = await import('./config-Co1Tpb5e.mjs');
13122
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-Clmu74iY.mjs').then(function (n) { return n.af; });
13123
+ const { ApiClient: ApiClient2 } = await import('./types-Clmu74iY.mjs').then(function (n) { return n.ag; });
13124
13124
  let userEmail = void 0;
13125
13125
  try {
13126
13126
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13151,7 +13151,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13151
13151
  }
13152
13152
  if (geminiSubcommand === "project" && args[2] === "get") {
13153
13153
  try {
13154
- const { readGeminiLocalConfig } = await import('./config-CRFTYuTN.mjs');
13154
+ const { readGeminiLocalConfig } = await import('./config-Co1Tpb5e.mjs');
13155
13155
  const config = readGeminiLocalConfig();
13156
13156
  if (config.googleCloudProject) {
13157
13157
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13191,7 +13191,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13191
13191
  process.exit(0);
13192
13192
  }
13193
13193
  try {
13194
- const { runGemini } = await import('./runGemini-D0lddF43.mjs');
13194
+ const { runGemini } = await import('./runGemini-DEZ0neEl.mjs');
13195
13195
  let startedBy = void 0;
13196
13196
  for (let i = 1; i < args.length; i++) {
13197
13197
  if (args[i] === "--started-by") {
@@ -13213,7 +13213,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13213
13213
  return;
13214
13214
  } else if (subcommand === "acp") {
13215
13215
  try {
13216
- const { runAcp, resolveAcpAgentConfig } = await import('./index-BkvUwyIU.mjs');
13216
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-DdOYA0qe.mjs');
13217
13217
  let startedBy = void 0;
13218
13218
  let verbose = false;
13219
13219
  const acpArgs = [];
@@ -13253,7 +13253,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13253
13253
  return;
13254
13254
  } else if (subcommand === "openclaw") {
13255
13255
  try {
13256
- const { runOpenClaw } = await import('./runOpenClaw-BiwwYnYf.mjs');
13256
+ const { runOpenClaw } = await import('./runOpenClaw-DyJQFzoX.mjs');
13257
13257
  let startedBy = void 0;
13258
13258
  let verbose = false;
13259
13259
  let gatewayUrl;
@@ -13304,7 +13304,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13304
13304
  return;
13305
13305
  } else if (subcommand === "mcp" && args.length === 1) {
13306
13306
  try {
13307
- const { handleMcpCommand } = await import('./mcp-B-GdhlKD.mjs');
13307
+ const { handleMcpCommand } = await import('./mcp-nlZLEkmO.mjs');
13308
13308
  await handleMcpCommand();
13309
13309
  } catch (error) {
13310
13310
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-Dcv1RKe8.cjs');
5
- require('./types-NwtcBgfS.cjs');
4
+ require('./index-CuvhWx_d.cjs');
5
+ require('./types-Dua2iF5S.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-DOb57EGb.mjs';
3
- import './types-D2qSKjsO.mjs';
2
+ import './index-w0zkr6EM.mjs';
3
+ import './types-Clmu74iY.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-D2qSKjsO.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-DOb57EGb.mjs';
6
+ import { p as projectPath } from './types-Clmu74iY.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-w0zkr6EM.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-NwtcBgfS.cjs');
9
- var index = require('./index-Dcv1RKe8.cjs');
8
+ var persistence = require('./types-Dua2iF5S.cjs');
9
+ var index = require('./index-CuvhWx_d.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-NwtcBgfS.cjs');
3
+ var persistence = require('./types-Dua2iF5S.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -273,6 +273,7 @@ declare const DaemonStateSchema: z$1.ZodObject<{
273
273
  terminals: z$1.ZodArray<z$1.ZodObject<{
274
274
  id: z$1.ZodString;
275
275
  title: z$1.ZodOptional<z$1.ZodString>;
276
+ tags: z$1.ZodOptional<z$1.ZodArray<z$1.ZodString>>;
276
277
  cwd: z$1.ZodOptional<z$1.ZodString>;
277
278
  createdAt: z$1.ZodOptional<z$1.ZodNumber>;
278
279
  activityAt: z$1.ZodOptional<z$1.ZodNumber>;
@@ -974,6 +975,8 @@ type AgentState = 'working' | 'needs_input' | 'idle' | 'shell';
974
975
  interface TerminalListItem {
975
976
  id: string;
976
977
  title?: string;
978
+ /** Always present in new daemon output; optional for old persisted state. */
979
+ tags?: string[];
977
980
  cwd?: string;
978
981
  createdAt?: number;
979
982
  activityAt?: number;
package/dist/lib.d.mts CHANGED
@@ -273,6 +273,7 @@ declare const DaemonStateSchema: z$1.ZodObject<{
273
273
  terminals: z$1.ZodArray<z$1.ZodObject<{
274
274
  id: z$1.ZodString;
275
275
  title: z$1.ZodOptional<z$1.ZodString>;
276
+ tags: z$1.ZodOptional<z$1.ZodArray<z$1.ZodString>>;
276
277
  cwd: z$1.ZodOptional<z$1.ZodString>;
277
278
  createdAt: z$1.ZodOptional<z$1.ZodNumber>;
278
279
  activityAt: z$1.ZodOptional<z$1.ZodNumber>;
@@ -974,6 +975,8 @@ type AgentState = 'working' | 'needs_input' | 'idle' | 'shell';
974
975
  interface TerminalListItem {
975
976
  id: string;
976
977
  title?: string;
978
+ /** Always present in new daemon output; optional for old persisted state. */
979
+ tags?: string[];
977
980
  cwd?: string;
978
981
  createdAt?: number;
979
982
  activityAt?: number;
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-D2qSKjsO.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-Clmu74iY.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'node:util';
@@ -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-Dcv1RKe8.cjs');
6
+ var index = require('./index-CuvhWx_d.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-NwtcBgfS.cjs');
8
+ var persistence = require('./types-Dua2iF5S.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -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-DOb57EGb.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-w0zkr6EM.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-D2qSKjsO.mjs';
6
+ import { l as logger } from './types-Clmu74iY.mjs';
7
7
  import 'chalk';
8
8
  import 'node:os';
9
9
  import '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-D2qSKjsO.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-DOb57EGb.mjs';
7
- import { A as AcpBackend } from './AcpBackend-BFFC77vV.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-CRFTYuTN.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-Clmu74iY.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-w0zkr6EM.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-CDngyx5G.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-Co1Tpb5e.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-NwtcBgfS.cjs');
8
- var index = require('./index-Dcv1RKe8.cjs');
9
- var AcpBackend = require('./AcpBackend-CsLnh1So.cjs');
10
- var config = require('./config-pv17N6Kg.cjs');
7
+ var persistence = require('./types-Dua2iF5S.cjs');
8
+ var index = require('./index-CuvhWx_d.cjs');
9
+ var AcpBackend = require('./AcpBackend-BxZ-KvBy.cjs');
10
+ var config = require('./config-Byay91xM.cjs');
11
11
  require('axios');
12
12
  require('chalk');
13
13
  require('node:util');
@@ -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-NwtcBgfS.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager--CixPN-p.cjs');
10
- var index = require('./index-Dcv1RKe8.cjs');
8
+ var persistence = require('./types-Dua2iF5S.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-BWFM_8f9.cjs');
10
+ var index = require('./index-CuvhWx_d.cjs');
11
11
  var WebSocket = require('ws');
12
12
  var ed = require('@noble/ed25519');
13
13
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -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-D2qSKjsO.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-CU5vsxgF.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-DOb57EGb.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-Clmu74iY.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-Dcq8dl4l.mjs';
8
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-w0zkr6EM.mjs';
9
9
  import WebSocket from 'ws';
10
10
  import * as ed from '@noble/ed25519';
11
11
  import { sha512 } from '@noble/hashes/sha2.js';
@@ -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-NwtcBgfS.cjs');
7
- var index = require('./index-Dcv1RKe8.cjs');
6
+ var persistence = require('./types-Dua2iF5S.cjs');
7
+ var index = require('./index-CuvhWx_d.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 } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { r as readPersistedSessions, c as configuration } from './types-D2qSKjsO.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-DOb57EGb.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-Clmu74iY.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-w0zkr6EM.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 index = require('./index-Dcv1RKe8.cjs');
7
- var persistence = require('./types-NwtcBgfS.cjs');
6
+ var index = require('./index-CuvhWx_d.cjs');
7
+ var persistence = require('./types-Dua2iF5S.cjs');
8
8
  require('node:os');
9
9
  require('node:crypto');
10
10
  require('cross-spawn');
@@ -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-DOb57EGb.mjs';
5
- import { l as logger } from './types-D2qSKjsO.mjs';
4
+ import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-w0zkr6EM.mjs';
5
+ import { l as logger } from './types-Clmu74iY.mjs';
6
6
  import 'node:os';
7
7
  import 'node:crypto';
8
8
  import '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.77";
32
+ var version = "0.2.78";
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.77",
146
- "very-happy-tools-x64-darwin": "0.2.77",
147
- "very-happy-tools-arm64-linux": "0.2.77",
148
- "very-happy-tools-x64-linux": "0.2.77",
149
- "very-happy-tools-arm64-win32": "0.2.77",
150
- "very-happy-tools-x64-win32": "0.2.77"
145
+ "very-happy-tools-arm64-darwin": "0.2.78",
146
+ "very-happy-tools-x64-darwin": "0.2.78",
147
+ "very-happy-tools-arm64-linux": "0.2.78",
148
+ "very-happy-tools-x64-linux": "0.2.78",
149
+ "very-happy-tools-arm64-win32": "0.2.78",
150
+ "very-happy-tools-x64-win32": "0.2.78"
151
151
  };
152
152
  var devDependencies = {
153
153
  "@slopus/happy-wire": "workspace:*",
@@ -938,6 +938,9 @@ const CliUpdateStateSchema = z$1.object({
938
938
  const WebTerminalListItemSchema = z$1.object({
939
939
  id: z$1.string(),
940
940
  title: z$1.string().optional(),
941
+ /** New daemons always send an array (including []); absence identifies an
942
+ * old daemon that cannot persist terminal tags. */
943
+ tags: z$1.array(z$1.string()).optional(),
941
944
  cwd: z$1.string().optional(),
942
945
  createdAt: z$1.number().optional(),
943
946
  activityAt: z$1.number().optional(),
@@ -9786,6 +9789,7 @@ function terminalListSignature(items) {
9786
9789
  const canon = [...items].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0).map((t) => [
9787
9790
  t.id,
9788
9791
  t.title ?? "",
9792
+ t.tags ?? [],
9789
9793
  t.cwd ?? "",
9790
9794
  t.createdAt ?? 0,
9791
9795
  Math.floor((t.activityAt ?? 0) / ACTIVITY_SIGNATURE_BUCKET_MS),
@@ -9819,6 +9823,7 @@ const LIST_SESSIONS_FORMAT = [
9819
9823
  "#{pane_current_path}",
9820
9824
  "#{@vh_title}",
9821
9825
  "#{@vh_title_manual}",
9826
+ "#{@vh_tags}",
9822
9827
  // B-121: the control-mode client has no `pty.process`, so the agent-state
9823
9828
  // fast path lost its live `#{pane_current_command}` equivalent. Carry it in
9824
9829
  // the ONE list-sessions call the tracker already makes — the value goes
@@ -9833,8 +9838,8 @@ const LIST_SESSIONS_FORMAT = [
9833
9838
  function parseSessionListLine(line) {
9834
9839
  if (!line) return void 0;
9835
9840
  const parts = line.split(LIST_FIELD_SEP);
9836
- if (parts.length < 8) return void 0;
9837
- const [name, created, activity, cwd, vhTitle, manual, paneCommand] = parts;
9841
+ if (parts.length < 9) return void 0;
9842
+ const [name, created, activity, cwd, vhTitle, manual, vhTags, paneCommand] = parts;
9838
9843
  if (!name) return void 0;
9839
9844
  return {
9840
9845
  name,
@@ -9843,12 +9848,40 @@ function parseSessionListLine(line) {
9843
9848
  cwd: cwd || void 0,
9844
9849
  vhTitle: vhTitle.trim() || void 0,
9845
9850
  manual: manual.trim().length > 0,
9851
+ tags: parseTerminalTags(vhTags),
9846
9852
  paneCurrentCommand: paneCommand.trim() || void 0,
9847
9853
  // pane_title is last, so anything after field 8 is title content that
9848
9854
  // contained the separator — rejoin it rather than dropping it.
9849
- paneTitle: parts.slice(7).join(LIST_FIELD_SEP) || void 0
9855
+ paneTitle: parts.slice(8).join(LIST_FIELD_SEP) || void 0
9850
9856
  };
9851
9857
  }
9858
+ const TERMINAL_TAG_MAX_COUNT = 64;
9859
+ const TERMINAL_TAG_MAX_LENGTH = 24;
9860
+ const TERMINAL_TAGS_MAX_BYTES = 4096;
9861
+ function validateTerminalTags(value) {
9862
+ if (!Array.isArray(value) || value.length > TERMINAL_TAG_MAX_COUNT) return void 0;
9863
+ const seen = /* @__PURE__ */ new Set();
9864
+ const out = [];
9865
+ for (const valueTag of value) {
9866
+ if (typeof valueTag !== "string") return void 0;
9867
+ const tag = valueTag.trim().replace(/^#+/, "").trim().replace(/\s+/g, "-").slice(0, TERMINAL_TAG_MAX_LENGTH);
9868
+ if (!tag || tag !== valueTag) return void 0;
9869
+ const key = tag.toLowerCase();
9870
+ if (seen.has(key)) return void 0;
9871
+ seen.add(key);
9872
+ out.push(tag);
9873
+ }
9874
+ if (Buffer.byteLength(JSON.stringify(out), "utf8") > TERMINAL_TAGS_MAX_BYTES) return void 0;
9875
+ return out;
9876
+ }
9877
+ function parseTerminalTags(raw) {
9878
+ if (typeof raw !== "string" || !raw.trim()) return [];
9879
+ try {
9880
+ return validateTerminalTags(JSON.parse(raw)) ?? [];
9881
+ } catch {
9882
+ return [];
9883
+ }
9884
+ }
9852
9885
  function classifyPane(currentCommand, tail) {
9853
9886
  const cmd = (currentCommand || "").trim().replace(/^-/, "").toLowerCase();
9854
9887
  const isShell = SHELL_COMMANDS.has(cmd);
@@ -11281,6 +11314,8 @@ class WebTerminalManager {
11281
11314
  out.push({
11282
11315
  id,
11283
11316
  title,
11317
+ // Always include [] so Web can feature-detect tag support.
11318
+ tags: s.tags,
11284
11319
  cwd: s.cwd,
11285
11320
  createdAt: s.created,
11286
11321
  // tmux last-activity (epoch s) → ms; optional so old daemons
@@ -11458,6 +11493,25 @@ class WebTerminalManager {
11458
11493
  return false;
11459
11494
  }
11460
11495
  }
11496
+ /** Persist terminal tags in tmux, parallel to @vh_title. */
11497
+ setTags(terminalId, tags) {
11498
+ if (!isTmuxAvailable()) return false;
11499
+ if (!/^[a-zA-Z0-9_-]{1,64}$/.test(terminalId)) return false;
11500
+ const valid = validateTerminalTags(tags);
11501
+ if (!valid) return false;
11502
+ const name = `vh-${terminalId}`;
11503
+ try {
11504
+ const r = spawnSync("tmux", ["set-option", "-t", name, "@vh_tags", JSON.stringify(valid)], {
11505
+ stdio: "ignore",
11506
+ env: ptyEnv()
11507
+ });
11508
+ if (r.status !== 0) return false;
11509
+ this.kickListRefresh();
11510
+ return true;
11511
+ } catch {
11512
+ return false;
11513
+ }
11514
+ }
11461
11515
  }
11462
11516
 
11463
11517
  const TMUX_TIMEOUT_MS = 3e3;
@@ -13406,6 +13460,16 @@ class ApiMachineClient {
13406
13460
  }
13407
13461
  return { type: "success" };
13408
13462
  });
13463
+ this.rpcHandlerManager.registerHandler("set-terminal-tags", async (params) => {
13464
+ const { terminalId, tags } = params || {};
13465
+ if (!terminalId || !Array.isArray(tags)) {
13466
+ throw new Error("terminalId and tags are required");
13467
+ }
13468
+ if (!this.webTerminal.setTags(terminalId, tags)) {
13469
+ throw new Error("Failed to set terminal tags (invalid tags, tmux unavailable, or session gone)");
13470
+ }
13471
+ return { type: "success" };
13472
+ });
13409
13473
  this.rpcHandlerManager.registerHandler("stop-session", (params) => {
13410
13474
  const { sessionId } = params || {};
13411
13475
  if (!sessionId) {
@@ -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.77";
54
+ var version = "0.2.78";
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.77",
168
- "very-happy-tools-x64-darwin": "0.2.77",
169
- "very-happy-tools-arm64-linux": "0.2.77",
170
- "very-happy-tools-x64-linux": "0.2.77",
171
- "very-happy-tools-arm64-win32": "0.2.77",
172
- "very-happy-tools-x64-win32": "0.2.77"
167
+ "very-happy-tools-arm64-darwin": "0.2.78",
168
+ "very-happy-tools-x64-darwin": "0.2.78",
169
+ "very-happy-tools-arm64-linux": "0.2.78",
170
+ "very-happy-tools-x64-linux": "0.2.78",
171
+ "very-happy-tools-arm64-win32": "0.2.78",
172
+ "very-happy-tools-x64-win32": "0.2.78"
173
173
  };
174
174
  var devDependencies = {
175
175
  "@slopus/happy-wire": "workspace:*",
@@ -960,6 +960,9 @@ const CliUpdateStateSchema = z.z.object({
960
960
  const WebTerminalListItemSchema = z.z.object({
961
961
  id: z.z.string(),
962
962
  title: z.z.string().optional(),
963
+ /** New daemons always send an array (including []); absence identifies an
964
+ * old daemon that cannot persist terminal tags. */
965
+ tags: z.z.array(z.z.string()).optional(),
963
966
  cwd: z.z.string().optional(),
964
967
  createdAt: z.z.number().optional(),
965
968
  activityAt: z.z.number().optional(),
@@ -1474,7 +1477,7 @@ class RpcHandlerManager {
1474
1477
  }
1475
1478
  }
1476
1479
 
1477
- 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-NwtcBgfS.cjs', document.baseURI).href))));
1480
+ 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-Dua2iF5S.cjs', document.baseURI).href))));
1478
1481
  function projectPath() {
1479
1482
  const path = path$1.resolve(__dirname$1, "..");
1480
1483
  return path;
@@ -9808,6 +9811,7 @@ function terminalListSignature(items) {
9808
9811
  const canon = [...items].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0).map((t) => [
9809
9812
  t.id,
9810
9813
  t.title ?? "",
9814
+ t.tags ?? [],
9811
9815
  t.cwd ?? "",
9812
9816
  t.createdAt ?? 0,
9813
9817
  Math.floor((t.activityAt ?? 0) / ACTIVITY_SIGNATURE_BUCKET_MS),
@@ -9841,6 +9845,7 @@ const LIST_SESSIONS_FORMAT = [
9841
9845
  "#{pane_current_path}",
9842
9846
  "#{@vh_title}",
9843
9847
  "#{@vh_title_manual}",
9848
+ "#{@vh_tags}",
9844
9849
  // B-121: the control-mode client has no `pty.process`, so the agent-state
9845
9850
  // fast path lost its live `#{pane_current_command}` equivalent. Carry it in
9846
9851
  // the ONE list-sessions call the tracker already makes — the value goes
@@ -9855,8 +9860,8 @@ const LIST_SESSIONS_FORMAT = [
9855
9860
  function parseSessionListLine(line) {
9856
9861
  if (!line) return void 0;
9857
9862
  const parts = line.split(LIST_FIELD_SEP);
9858
- if (parts.length < 8) return void 0;
9859
- const [name, created, activity, cwd, vhTitle, manual, paneCommand] = parts;
9863
+ if (parts.length < 9) return void 0;
9864
+ const [name, created, activity, cwd, vhTitle, manual, vhTags, paneCommand] = parts;
9860
9865
  if (!name) return void 0;
9861
9866
  return {
9862
9867
  name,
@@ -9865,12 +9870,40 @@ function parseSessionListLine(line) {
9865
9870
  cwd: cwd || void 0,
9866
9871
  vhTitle: vhTitle.trim() || void 0,
9867
9872
  manual: manual.trim().length > 0,
9873
+ tags: parseTerminalTags(vhTags),
9868
9874
  paneCurrentCommand: paneCommand.trim() || void 0,
9869
9875
  // pane_title is last, so anything after field 8 is title content that
9870
9876
  // contained the separator — rejoin it rather than dropping it.
9871
- paneTitle: parts.slice(7).join(LIST_FIELD_SEP) || void 0
9877
+ paneTitle: parts.slice(8).join(LIST_FIELD_SEP) || void 0
9872
9878
  };
9873
9879
  }
9880
+ const TERMINAL_TAG_MAX_COUNT = 64;
9881
+ const TERMINAL_TAG_MAX_LENGTH = 24;
9882
+ const TERMINAL_TAGS_MAX_BYTES = 4096;
9883
+ function validateTerminalTags(value) {
9884
+ if (!Array.isArray(value) || value.length > TERMINAL_TAG_MAX_COUNT) return void 0;
9885
+ const seen = /* @__PURE__ */ new Set();
9886
+ const out = [];
9887
+ for (const valueTag of value) {
9888
+ if (typeof valueTag !== "string") return void 0;
9889
+ const tag = valueTag.trim().replace(/^#+/, "").trim().replace(/\s+/g, "-").slice(0, TERMINAL_TAG_MAX_LENGTH);
9890
+ if (!tag || tag !== valueTag) return void 0;
9891
+ const key = tag.toLowerCase();
9892
+ if (seen.has(key)) return void 0;
9893
+ seen.add(key);
9894
+ out.push(tag);
9895
+ }
9896
+ if (Buffer.byteLength(JSON.stringify(out), "utf8") > TERMINAL_TAGS_MAX_BYTES) return void 0;
9897
+ return out;
9898
+ }
9899
+ function parseTerminalTags(raw) {
9900
+ if (typeof raw !== "string" || !raw.trim()) return [];
9901
+ try {
9902
+ return validateTerminalTags(JSON.parse(raw)) ?? [];
9903
+ } catch {
9904
+ return [];
9905
+ }
9906
+ }
9874
9907
  function classifyPane(currentCommand, tail) {
9875
9908
  const cmd = (currentCommand || "").trim().replace(/^-/, "").toLowerCase();
9876
9909
  const isShell = SHELL_COMMANDS.has(cmd);
@@ -11303,6 +11336,8 @@ class WebTerminalManager {
11303
11336
  out.push({
11304
11337
  id,
11305
11338
  title,
11339
+ // Always include [] so Web can feature-detect tag support.
11340
+ tags: s.tags,
11306
11341
  cwd: s.cwd,
11307
11342
  createdAt: s.created,
11308
11343
  // tmux last-activity (epoch s) → ms; optional so old daemons
@@ -11480,6 +11515,25 @@ class WebTerminalManager {
11480
11515
  return false;
11481
11516
  }
11482
11517
  }
11518
+ /** Persist terminal tags in tmux, parallel to @vh_title. */
11519
+ setTags(terminalId, tags) {
11520
+ if (!isTmuxAvailable()) return false;
11521
+ if (!/^[a-zA-Z0-9_-]{1,64}$/.test(terminalId)) return false;
11522
+ const valid = validateTerminalTags(tags);
11523
+ if (!valid) return false;
11524
+ const name = `vh-${terminalId}`;
11525
+ try {
11526
+ const r = node_child_process.spawnSync("tmux", ["set-option", "-t", name, "@vh_tags", JSON.stringify(valid)], {
11527
+ stdio: "ignore",
11528
+ env: ptyEnv()
11529
+ });
11530
+ if (r.status !== 0) return false;
11531
+ this.kickListRefresh();
11532
+ return true;
11533
+ } catch {
11534
+ return false;
11535
+ }
11536
+ }
11483
11537
  }
11484
11538
 
11485
11539
  const TMUX_TIMEOUT_MS = 3e3;
@@ -13428,6 +13482,16 @@ class ApiMachineClient {
13428
13482
  }
13429
13483
  return { type: "success" };
13430
13484
  });
13485
+ this.rpcHandlerManager.registerHandler("set-terminal-tags", async (params) => {
13486
+ const { terminalId, tags } = params || {};
13487
+ if (!terminalId || !Array.isArray(tags)) {
13488
+ throw new Error("terminalId and tags are required");
13489
+ }
13490
+ if (!this.webTerminal.setTags(terminalId, tags)) {
13491
+ throw new Error("Failed to set terminal tags (invalid tags, tmux unavailable, or session gone)");
13492
+ }
13493
+ return { type: "success" };
13494
+ });
13431
13495
  this.rpcHandlerManager.registerHandler("stop-session", (params) => {
13432
13496
  const { sessionId } = params || {};
13433
13497
  if (!sessionId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.77",
3
+ "version": "0.2.78",
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.77",
117
- "very-happy-tools-x64-darwin": "0.2.77",
118
- "very-happy-tools-arm64-linux": "0.2.77",
119
- "very-happy-tools-x64-linux": "0.2.77",
120
- "very-happy-tools-arm64-win32": "0.2.77",
121
- "very-happy-tools-x64-win32": "0.2.77"
116
+ "very-happy-tools-arm64-darwin": "0.2.78",
117
+ "very-happy-tools-x64-darwin": "0.2.78",
118
+ "very-happy-tools-arm64-linux": "0.2.78",
119
+ "very-happy-tools-x64-linux": "0.2.78",
120
+ "very-happy-tools-arm64-win32": "0.2.78",
121
+ "very-happy-tools-x64-win32": "0.2.78"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",