very-happy-cli 0.2.82 → 0.2.83

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-DMLCBDru.mjs → AcpBackend-DbS9-r10.mjs} +1 -1
  2. package/dist/{AcpBackend-DjHJfd8y.cjs → AcpBackend-sS5ln9nS.cjs} +1 -1
  3. package/dist/{AcpSessionManager-Bd-LtS2E.cjs → AcpSessionManager-DX5IvruC.cjs} +1 -1
  4. package/dist/{AcpSessionManager-xyImjcMI.mjs → AcpSessionManager-DuZN34yy.mjs} +1 -1
  5. package/dist/{config-DRjtWNd0.mjs → config-3BOBElkv.mjs} +2 -2
  6. package/dist/{config-BjgfmsPT.cjs → config-BkxNWcwM.cjs} +2 -2
  7. package/dist/{index-1ZE940yd.mjs → index-08H6z21h.mjs} +5 -5
  8. package/dist/{index-DZ7tAffg.mjs → index-BDhR8Zbc.mjs} +46 -20
  9. package/dist/{index-BTtTqsj4.cjs → index-BVlYjP10.cjs} +49 -23
  10. package/dist/{index-CR24hlKJ.cjs → index-fFNtiTSl.cjs} +4 -4
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-Do3vnipG.mjs → installTerminalHooks-C0X114sp.mjs} +2 -2
  14. package/dist/{installTerminalHooks-DSfE4ui6.cjs → installTerminalHooks-DC2wMq-X.cjs} +2 -2
  15. package/dist/lib.cjs +1 -1
  16. package/dist/lib.d.cts +2 -0
  17. package/dist/lib.d.mts +2 -0
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-2Ee6mSAP.mjs → mcp-B9UtB3lP.mjs} +2 -2
  20. package/dist/{mcp-CJHJEBto.cjs → mcp-CuDdOqST.cjs} +2 -2
  21. package/dist/{runGemini-Dj7g2-B_.cjs → runGemini-Cqstl6qb.cjs} +4 -4
  22. package/dist/{runGemini-DQKPf1RX.mjs → runGemini-Cvww7ebI.mjs} +4 -4
  23. package/dist/{runOpenClaw-BNfz77EE.mjs → runOpenClaw-BXmi-UcV.mjs} +3 -3
  24. package/dist/{runOpenClaw-BWAVwl3x.cjs → runOpenClaw-CHu488uC.cjs} +3 -3
  25. package/dist/{send-Cm28ijOj.cjs → send-C5dWPbV6.cjs} +2 -2
  26. package/dist/{send-CIm5kZBx.mjs → send-C6Uqkmxr.mjs} +2 -2
  27. package/dist/{spawn-BPgkpGXX.cjs → spawn-CZAHiPE6.cjs} +2 -2
  28. package/dist/{spawn-Dd8qj3l4.mjs → spawn-D8K3uJEp.mjs} +2 -2
  29. package/dist/{types-C4duxyB7.mjs → types-RASD9X96.mjs} +13 -12
  30. package/dist/{types-B7qS_-8e.cjs → types-sFcb_Sfz.cjs} +14 -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-C4duxyB7.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-RASD9X96.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-B7qS_-8e.cjs');
6
+ var persistence = require('./types-sFcb_Sfz.cjs');
7
7
 
8
8
  const DEFAULT_TIMEOUTS = {
9
9
  /** 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-B7qS_-8e.cjs');
4
+ var persistence = require('./types-sFcb_Sfz.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-C4duxyB7.mjs';
2
+ import { b as createEnvelope } from './types-RASD9X96.mjs';
3
3
 
4
4
  function turnOptions(turnId, time) {
5
5
  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-C4duxyB7.mjs';
6
- import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-DZ7tAffg.mjs';
5
+ import { l as logger } from './types-RASD9X96.mjs';
6
+ import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-BDhR8Zbc.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-B7qS_-8e.cjs');
8
- var index = require('./index-BTtTqsj4.cjs');
7
+ var persistence = require('./types-sFcb_Sfz.cjs');
8
+ var index = require('./index-BVlYjP10.cjs');
9
9
  require('axios');
10
10
  require('chalk');
11
11
  require('node:util');
@@ -1,10 +1,10 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-DMLCBDru.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-DMLCBDru.mjs';
3
- import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-C4duxyB7.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-xyImjcMI.mjs';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-DbS9-r10.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-DbS9-r10.mjs';
3
+ import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-RASD9X96.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-DuZN34yy.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-DZ7tAffg.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-BDhR8Zbc.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-C4duxyB7.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-RASD9X96.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';
@@ -3033,6 +3033,7 @@ function applyClaudeSdkMetadata(current, update) {
3033
3033
  mcpServers: update.mcpServers,
3034
3034
  skills: update.skills,
3035
3035
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
3036
+ queueCancellation: true,
3036
3037
  ...update.modelIsDefault && update.model ? { defaultModelCode: update.model } : {}
3037
3038
  };
3038
3039
  }
@@ -3531,7 +3532,7 @@ class MessageQueue2 {
3531
3532
  * Push a message to the queue with a mode and an optional list of
3532
3533
  * attachments that travel with this message.
3533
3534
  */
3534
- push(message, mode, attachments) {
3535
+ push(message, mode, attachments, sourceId) {
3535
3536
  if (this.closed) {
3536
3537
  throw new Error("Cannot push to closed queue");
3537
3538
  }
@@ -3542,7 +3543,8 @@ class MessageQueue2 {
3542
3543
  mode,
3543
3544
  modeHash,
3544
3545
  isolate: false,
3545
- attachments
3546
+ attachments,
3547
+ sourceId
3546
3548
  });
3547
3549
  if (this.onMessageHandler) {
3548
3550
  this.onMessageHandler(message, mode);
@@ -3587,7 +3589,7 @@ class MessageQueue2 {
3587
3589
  * Clears any pending messages and ensures this message is never batched with others.
3588
3590
  * Used for special commands that require dedicated processing.
3589
3591
  */
3590
- pushIsolateAndClear(message, mode, attachments) {
3592
+ pushIsolateAndClear(message, mode, attachments, sourceId) {
3591
3593
  if (this.closed) {
3592
3594
  throw new Error("Cannot push to closed queue");
3593
3595
  }
@@ -3599,7 +3601,8 @@ class MessageQueue2 {
3599
3601
  mode,
3600
3602
  modeHash,
3601
3603
  isolate: true,
3602
- attachments
3604
+ attachments,
3605
+ sourceId
3603
3606
  });
3604
3607
  if (this.onMessageHandler) {
3605
3608
  this.onMessageHandler(message, mode);
@@ -3671,6 +3674,21 @@ class MessageQueue2 {
3671
3674
  size() {
3672
3675
  return this.queue.length;
3673
3676
  }
3677
+ /**
3678
+ * Remove one message that has not yet been collected by the agent loop.
3679
+ * Source id is authoritative. Exact-text fallback only covers items that
3680
+ * entered this live process before transport ids were introduced.
3681
+ */
3682
+ cancelPending(sourceId, exactText) {
3683
+ let index = sourceId ? this.queue.findIndex((item) => item.sourceId === sourceId) : -1;
3684
+ if (index < 0 && exactText !== void 0) {
3685
+ index = this.queue.findIndex((item) => item.sourceId === void 0 && item.message === exactText);
3686
+ }
3687
+ if (index < 0) return false;
3688
+ this.queue.splice(index, 1);
3689
+ logger.debug(`[MessageQueue2] Cancelled pending item. Queue size: ${this.queue.length}`);
3690
+ return true;
3691
+ }
3674
3692
  /**
3675
3693
  * Wait for messages and return all messages with the same mode as a single string
3676
3694
  * Returns { message: string, mode: T } or null if aborted/closed
@@ -8966,6 +8984,7 @@ async function runClaude(credentials, options = {}) {
8966
8984
  // Advertise composer support before the first SDK response. Otherwise
8967
8985
  // a brand-new session cannot pick a PDF until after sending once.
8968
8986
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
8987
+ queueCancellation: true,
8969
8988
  sandbox: sandboxConfig?.enabled ? sandboxConfig : null,
8970
8989
  dangerouslySkipPermissions,
8971
8990
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
@@ -9069,7 +9088,8 @@ async function runClaude(credentials, options = {}) {
9069
9088
  session.updateMetadata((meta) => ({
9070
9089
  ...meta,
9071
9090
  lifecycleState: "running",
9072
- archivedBy: void 0
9091
+ archivedBy: void 0,
9092
+ queueCancellation: true
9073
9093
  }));
9074
9094
  }
9075
9095
  const forkClaudeSessionId = process.env.HAPPY_FORK_CLAUDE_SESSION_ID;
@@ -9194,6 +9214,12 @@ async function runClaude(credentials, options = {}) {
9194
9214
  disallowedTools: mode.disallowedTools,
9195
9215
  effort: mode.effort
9196
9216
  }));
9217
+ session.rpcHandlerManager.registerHandler("cancelQueuedMessage", async (params) => ({
9218
+ removed: messageQueue.cancelPending(
9219
+ typeof params?.localKey === "string" ? params.localKey : void 0,
9220
+ typeof params?.text === "string" ? params.text : void 0
9221
+ )
9222
+ }));
9197
9223
  let currentPermissionMode = initialPermissionMode;
9198
9224
  let currentModel = options.model ?? DEFAULT_CLAUDE_MODEL;
9199
9225
  let currentFallbackModel = void 0;
@@ -9336,7 +9362,7 @@ async function runClaude(credentials, options = {}) {
9336
9362
  disallowedTools: messageDisallowedTools,
9337
9363
  effort: messageEffort
9338
9364
  };
9339
- messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage);
9365
+ messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
9340
9366
  logger.debug("[start] /compact command pushed to queue:", {
9341
9367
  ...contentLogMetadata(message.content.text),
9342
9368
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -9356,7 +9382,7 @@ async function runClaude(credentials, options = {}) {
9356
9382
  disallowedTools: messageDisallowedTools,
9357
9383
  effort: messageEffort
9358
9384
  };
9359
- messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage);
9385
+ messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
9360
9386
  logger.debug("[start] /clear command pushed to queue:", {
9361
9387
  ...contentLogMetadata(message.content.text),
9362
9388
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -9412,7 +9438,7 @@ async function runClaude(credentials, options = {}) {
9412
9438
  disallowedTools: messageDisallowedTools,
9413
9439
  effort: messageEffort
9414
9440
  };
9415
- messageQueue.push(message.content.text, enhancedMode, attachmentsForThisMessage);
9441
+ messageQueue.push(message.content.text, enhancedMode, attachmentsForThisMessage, message.localKey);
9416
9442
  logger.debug("User message pushed to queue:", {
9417
9443
  ...contentLogMetadata(message.content.text),
9418
9444
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -13244,7 +13270,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13244
13270
  process.exit(0);
13245
13271
  } else if (subcommand === "install-terminal-hooks") {
13246
13272
  try {
13247
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-Do3vnipG.mjs');
13273
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-C0X114sp.mjs');
13248
13274
  const command = parseTerminalHooksArgs(args.slice(1));
13249
13275
  if (command.action === "help") {
13250
13276
  console.log(TERMINAL_HOOKS_HELP);
@@ -13261,7 +13287,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13261
13287
  }
13262
13288
  } else if (subcommand === "spawn") {
13263
13289
  try {
13264
- const { handleSpawnCommand } = await import('./spawn-Dd8qj3l4.mjs');
13290
+ const { handleSpawnCommand } = await import('./spawn-D8K3uJEp.mjs');
13265
13291
  await handleSpawnCommand(args.slice(1));
13266
13292
  } catch (error) {
13267
13293
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13273,7 +13299,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13273
13299
  return;
13274
13300
  } else if (subcommand === "send") {
13275
13301
  try {
13276
- const { handleSendCommand } = await import('./send-CIm5kZBx.mjs');
13302
+ const { handleSendCommand } = await import('./send-C6Uqkmxr.mjs');
13277
13303
  await handleSendCommand(args.slice(1));
13278
13304
  } catch (error) {
13279
13305
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13379,9 +13405,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13379
13405
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13380
13406
  const projectId = args[3];
13381
13407
  try {
13382
- const { saveGoogleCloudProjectToConfig } = await import('./config-DRjtWNd0.mjs');
13383
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-C4duxyB7.mjs').then(function (n) { return n.af; });
13384
- const { ApiClient: ApiClient2 } = await import('./types-C4duxyB7.mjs').then(function (n) { return n.ag; });
13408
+ const { saveGoogleCloudProjectToConfig } = await import('./config-3BOBElkv.mjs');
13409
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-RASD9X96.mjs').then(function (n) { return n.af; });
13410
+ const { ApiClient: ApiClient2 } = await import('./types-RASD9X96.mjs').then(function (n) { return n.ag; });
13385
13411
  let userEmail = void 0;
13386
13412
  try {
13387
13413
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13412,7 +13438,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13412
13438
  }
13413
13439
  if (geminiSubcommand === "project" && args[2] === "get") {
13414
13440
  try {
13415
- const { readGeminiLocalConfig } = await import('./config-DRjtWNd0.mjs');
13441
+ const { readGeminiLocalConfig } = await import('./config-3BOBElkv.mjs');
13416
13442
  const config = readGeminiLocalConfig();
13417
13443
  if (config.googleCloudProject) {
13418
13444
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13452,7 +13478,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13452
13478
  process.exit(0);
13453
13479
  }
13454
13480
  try {
13455
- const { runGemini } = await import('./runGemini-DQKPf1RX.mjs');
13481
+ const { runGemini } = await import('./runGemini-Cvww7ebI.mjs');
13456
13482
  let startedBy = void 0;
13457
13483
  for (let i = 1; i < args.length; i++) {
13458
13484
  if (args[i] === "--started-by") {
@@ -13474,7 +13500,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13474
13500
  return;
13475
13501
  } else if (subcommand === "acp") {
13476
13502
  try {
13477
- const { runAcp, resolveAcpAgentConfig } = await import('./index-1ZE940yd.mjs');
13503
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-08H6z21h.mjs');
13478
13504
  let startedBy = void 0;
13479
13505
  let verbose = false;
13480
13506
  const acpArgs = [];
@@ -13514,7 +13540,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13514
13540
  return;
13515
13541
  } else if (subcommand === "openclaw") {
13516
13542
  try {
13517
- const { runOpenClaw } = await import('./runOpenClaw-BNfz77EE.mjs');
13543
+ const { runOpenClaw } = await import('./runOpenClaw-BXmi-UcV.mjs');
13518
13544
  let startedBy = void 0;
13519
13545
  let verbose = false;
13520
13546
  let gatewayUrl;
@@ -13565,7 +13591,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13565
13591
  return;
13566
13592
  } else if (subcommand === "mcp" && args.length === 1) {
13567
13593
  try {
13568
- const { handleMcpCommand } = await import('./mcp-2Ee6mSAP.mjs');
13594
+ const { handleMcpCommand } = await import('./mcp-B9UtB3lP.mjs');
13569
13595
  await handleMcpCommand();
13570
13596
  } catch (error) {
13571
13597
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -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-B7qS_-8e.cjs');
6
+ var persistence = require('./types-sFcb_Sfz.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -3055,6 +3055,7 @@ function applyClaudeSdkMetadata(current, update) {
3055
3055
  mcpServers: update.mcpServers,
3056
3056
  skills: update.skills,
3057
3057
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
3058
+ queueCancellation: true,
3058
3059
  ...update.modelIsDefault && update.model ? { defaultModelCode: update.model } : {}
3059
3060
  };
3060
3061
  }
@@ -3553,7 +3554,7 @@ class MessageQueue2 {
3553
3554
  * Push a message to the queue with a mode and an optional list of
3554
3555
  * attachments that travel with this message.
3555
3556
  */
3556
- push(message, mode, attachments) {
3557
+ push(message, mode, attachments, sourceId) {
3557
3558
  if (this.closed) {
3558
3559
  throw new Error("Cannot push to closed queue");
3559
3560
  }
@@ -3564,7 +3565,8 @@ class MessageQueue2 {
3564
3565
  mode,
3565
3566
  modeHash,
3566
3567
  isolate: false,
3567
- attachments
3568
+ attachments,
3569
+ sourceId
3568
3570
  });
3569
3571
  if (this.onMessageHandler) {
3570
3572
  this.onMessageHandler(message, mode);
@@ -3609,7 +3611,7 @@ class MessageQueue2 {
3609
3611
  * Clears any pending messages and ensures this message is never batched with others.
3610
3612
  * Used for special commands that require dedicated processing.
3611
3613
  */
3612
- pushIsolateAndClear(message, mode, attachments) {
3614
+ pushIsolateAndClear(message, mode, attachments, sourceId) {
3613
3615
  if (this.closed) {
3614
3616
  throw new Error("Cannot push to closed queue");
3615
3617
  }
@@ -3621,7 +3623,8 @@ class MessageQueue2 {
3621
3623
  mode,
3622
3624
  modeHash,
3623
3625
  isolate: true,
3624
- attachments
3626
+ attachments,
3627
+ sourceId
3625
3628
  });
3626
3629
  if (this.onMessageHandler) {
3627
3630
  this.onMessageHandler(message, mode);
@@ -3693,6 +3696,21 @@ class MessageQueue2 {
3693
3696
  size() {
3694
3697
  return this.queue.length;
3695
3698
  }
3699
+ /**
3700
+ * Remove one message that has not yet been collected by the agent loop.
3701
+ * Source id is authoritative. Exact-text fallback only covers items that
3702
+ * entered this live process before transport ids were introduced.
3703
+ */
3704
+ cancelPending(sourceId, exactText) {
3705
+ let index = sourceId ? this.queue.findIndex((item) => item.sourceId === sourceId) : -1;
3706
+ if (index < 0 && exactText !== void 0) {
3707
+ index = this.queue.findIndex((item) => item.sourceId === void 0 && item.message === exactText);
3708
+ }
3709
+ if (index < 0) return false;
3710
+ this.queue.splice(index, 1);
3711
+ persistence.logger.debug(`[MessageQueue2] Cancelled pending item. Queue size: ${this.queue.length}`);
3712
+ return true;
3713
+ }
3696
3714
  /**
3697
3715
  * Wait for messages and return all messages with the same mode as a single string
3698
3716
  * Returns { message: string, mode: T } or null if aborted/closed
@@ -8532,7 +8550,7 @@ const MAX_TITLE_CHARS = 60;
8532
8550
  const GENERATION_TIMEOUT_MS = 3e4;
8533
8551
  function resolveClaudeBinary() {
8534
8552
  try {
8535
- 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-BTtTqsj4.cjs', document.baseURI).href)));
8553
+ 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-BVlYjP10.cjs', document.baseURI).href)));
8536
8554
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
8537
8555
  const { getClaudeCliPath } = require$1(utilsPath);
8538
8556
  const path$1 = getClaudeCliPath();
@@ -8988,6 +9006,7 @@ async function runClaude(credentials, options = {}) {
8988
9006
  // Advertise composer support before the first SDK response. Otherwise
8989
9007
  // a brand-new session cannot pick a PDF until after sending once.
8990
9008
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
9009
+ queueCancellation: true,
8991
9010
  sandbox: sandboxConfig?.enabled ? sandboxConfig : null,
8992
9011
  dangerouslySkipPermissions,
8993
9012
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
@@ -9091,7 +9110,8 @@ async function runClaude(credentials, options = {}) {
9091
9110
  session.updateMetadata((meta) => ({
9092
9111
  ...meta,
9093
9112
  lifecycleState: "running",
9094
- archivedBy: void 0
9113
+ archivedBy: void 0,
9114
+ queueCancellation: true
9095
9115
  }));
9096
9116
  }
9097
9117
  const forkClaudeSessionId = process.env.HAPPY_FORK_CLAUDE_SESSION_ID;
@@ -9216,6 +9236,12 @@ async function runClaude(credentials, options = {}) {
9216
9236
  disallowedTools: mode.disallowedTools,
9217
9237
  effort: mode.effort
9218
9238
  }));
9239
+ session.rpcHandlerManager.registerHandler("cancelQueuedMessage", async (params) => ({
9240
+ removed: messageQueue.cancelPending(
9241
+ typeof params?.localKey === "string" ? params.localKey : void 0,
9242
+ typeof params?.text === "string" ? params.text : void 0
9243
+ )
9244
+ }));
9219
9245
  let currentPermissionMode = initialPermissionMode;
9220
9246
  let currentModel = options.model ?? DEFAULT_CLAUDE_MODEL;
9221
9247
  let currentFallbackModel = void 0;
@@ -9358,7 +9384,7 @@ async function runClaude(credentials, options = {}) {
9358
9384
  disallowedTools: messageDisallowedTools,
9359
9385
  effort: messageEffort
9360
9386
  };
9361
- messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage);
9387
+ messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
9362
9388
  persistence.logger.debug("[start] /compact command pushed to queue:", {
9363
9389
  ...persistence.contentLogMetadata(message.content.text),
9364
9390
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -9378,7 +9404,7 @@ async function runClaude(credentials, options = {}) {
9378
9404
  disallowedTools: messageDisallowedTools,
9379
9405
  effort: messageEffort
9380
9406
  };
9381
- messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage);
9407
+ messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
9382
9408
  persistence.logger.debug("[start] /clear command pushed to queue:", {
9383
9409
  ...persistence.contentLogMetadata(message.content.text),
9384
9410
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -9434,7 +9460,7 @@ async function runClaude(credentials, options = {}) {
9434
9460
  disallowedTools: messageDisallowedTools,
9435
9461
  effort: messageEffort
9436
9462
  };
9437
- messageQueue.push(message.content.text, enhancedMode, attachmentsForThisMessage);
9463
+ messageQueue.push(message.content.text, enhancedMode, attachmentsForThisMessage, message.localKey);
9438
9464
  persistence.logger.debug("User message pushed to queue:", {
9439
9465
  ...persistence.contentLogMetadata(message.content.text),
9440
9466
  attachmentCount: attachmentsForThisMessage?.length ?? 0,
@@ -10652,9 +10678,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
10652
10678
  };
10653
10679
  }
10654
10680
 
10655
- 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-BTtTqsj4.cjs', document.baseURI).href)));
10681
+ 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-BVlYjP10.cjs', document.baseURI).href)));
10656
10682
  const __dirname$1 = path.dirname(__filename$1);
10657
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-BTtTqsj4.cjs', document.baseURI).href)));
10683
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-BVlYjP10.cjs', document.baseURI).href)));
10658
10684
  const PRISMA_QUERY_ENGINE_FILES = {
10659
10685
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
10660
10686
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -13266,7 +13292,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13266
13292
  process.exit(0);
13267
13293
  } else if (subcommand === "install-terminal-hooks") {
13268
13294
  try {
13269
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-DSfE4ui6.cjs'); });
13295
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-DC2wMq-X.cjs'); });
13270
13296
  const command = parseTerminalHooksArgs(args.slice(1));
13271
13297
  if (command.action === "help") {
13272
13298
  console.log(TERMINAL_HOOKS_HELP);
@@ -13283,7 +13309,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13283
13309
  }
13284
13310
  } else if (subcommand === "spawn") {
13285
13311
  try {
13286
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-BPgkpGXX.cjs'); });
13312
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-CZAHiPE6.cjs'); });
13287
13313
  await handleSpawnCommand(args.slice(1));
13288
13314
  } catch (error) {
13289
13315
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13295,7 +13321,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13295
13321
  return;
13296
13322
  } else if (subcommand === "send") {
13297
13323
  try {
13298
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-Cm28ijOj.cjs'); });
13324
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-C5dWPbV6.cjs'); });
13299
13325
  await handleSendCommand(args.slice(1));
13300
13326
  } catch (error) {
13301
13327
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13401,9 +13427,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13401
13427
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13402
13428
  const projectId = args[3];
13403
13429
  try {
13404
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-BjgfmsPT.cjs'); });
13405
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-B7qS_-8e.cjs'); }).then(function (n) { return n.persistence; });
13406
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-B7qS_-8e.cjs'); }).then(function (n) { return n.api; });
13430
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-BkxNWcwM.cjs'); });
13431
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-sFcb_Sfz.cjs'); }).then(function (n) { return n.persistence; });
13432
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-sFcb_Sfz.cjs'); }).then(function (n) { return n.api; });
13407
13433
  let userEmail = void 0;
13408
13434
  try {
13409
13435
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13434,7 +13460,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13434
13460
  }
13435
13461
  if (geminiSubcommand === "project" && args[2] === "get") {
13436
13462
  try {
13437
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-BjgfmsPT.cjs'); });
13463
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-BkxNWcwM.cjs'); });
13438
13464
  const config = readGeminiLocalConfig();
13439
13465
  if (config.googleCloudProject) {
13440
13466
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13474,7 +13500,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13474
13500
  process.exit(0);
13475
13501
  }
13476
13502
  try {
13477
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Dj7g2-B_.cjs'); });
13503
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Cqstl6qb.cjs'); });
13478
13504
  let startedBy = void 0;
13479
13505
  for (let i = 1; i < args.length; i++) {
13480
13506
  if (args[i] === "--started-by") {
@@ -13496,7 +13522,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13496
13522
  return;
13497
13523
  } else if (subcommand === "acp") {
13498
13524
  try {
13499
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-CR24hlKJ.cjs'); });
13525
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-fFNtiTSl.cjs'); });
13500
13526
  let startedBy = void 0;
13501
13527
  let verbose = false;
13502
13528
  const acpArgs = [];
@@ -13536,7 +13562,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13536
13562
  return;
13537
13563
  } else if (subcommand === "openclaw") {
13538
13564
  try {
13539
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-BWAVwl3x.cjs'); });
13565
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-CHu488uC.cjs'); });
13540
13566
  let startedBy = void 0;
13541
13567
  let verbose = false;
13542
13568
  let gatewayUrl;
@@ -13587,7 +13613,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13587
13613
  return;
13588
13614
  } else if (subcommand === "mcp" && args.length === 1) {
13589
13615
  try {
13590
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-CJHJEBto.cjs'); });
13616
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-CuDdOqST.cjs'); });
13591
13617
  await handleMcpCommand();
13592
13618
  } catch (error) {
13593
13619
  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-DjHJfd8y.cjs');
4
- var persistence = require('./types-B7qS_-8e.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-Bd-LtS2E.cjs');
3
+ var AcpBackend = require('./AcpBackend-sS5ln9nS.cjs');
4
+ var persistence = require('./types-sFcb_Sfz.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-DX5IvruC.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-BTtTqsj4.cjs');
8
+ var index = require('./index-BVlYjP10.cjs');
9
9
  require('node:child_process');
10
10
  require('@agentclientprotocol/sdk');
11
11
  require('axios');
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-BTtTqsj4.cjs');
5
- require('./types-B7qS_-8e.cjs');
4
+ require('./index-BVlYjP10.cjs');
5
+ require('./types-sFcb_Sfz.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-DZ7tAffg.mjs';
3
- import './types-C4duxyB7.mjs';
2
+ import './index-BDhR8Zbc.mjs';
3
+ import './types-RASD9X96.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-C4duxyB7.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-DZ7tAffg.mjs';
6
+ import { p as projectPath } from './types-RASD9X96.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-BDhR8Zbc.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-B7qS_-8e.cjs');
9
- var index = require('./index-BTtTqsj4.cjs');
8
+ var persistence = require('./types-sFcb_Sfz.cjs');
9
+ var index = require('./index-BVlYjP10.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-B7qS_-8e.cjs');
3
+ var persistence = require('./types-sFcb_Sfz.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -429,6 +429,8 @@ type Metadata = {
429
429
  skills?: string[];
430
430
  /** Attachment content blocks this daemon can forward to the active SDK. */
431
431
  attachmentKinds?: string[];
432
+ /** Pending user messages can be canceled by stable transport id. */
433
+ queueCancellation?: boolean;
432
434
  homeDir: string;
433
435
  happyHomeDir: string;
434
436
  happyLibDir: string;
package/dist/lib.d.mts CHANGED
@@ -429,6 +429,8 @@ type Metadata = {
429
429
  skills?: string[];
430
430
  /** Attachment content blocks this daemon can forward to the active SDK. */
431
431
  attachmentKinds?: string[];
432
+ /** Pending user messages can be canceled by stable transport id. */
433
+ queueCancellation?: boolean;
432
434
  homeDir: string;
433
435
  happyHomeDir: string;
434
436
  happyLibDir: string;
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-C4duxyB7.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-RASD9X96.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-DZ7tAffg.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-BDhR8Zbc.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-C4duxyB7.mjs';
6
+ import { l as logger } from './types-RASD9X96.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-BTtTqsj4.cjs');
6
+ var index = require('./index-BVlYjP10.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-B7qS_-8e.cjs');
8
+ var persistence = require('./types-sFcb_Sfz.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -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-B7qS_-8e.cjs');
8
- var index = require('./index-BTtTqsj4.cjs');
9
- var AcpBackend = require('./AcpBackend-DjHJfd8y.cjs');
10
- var config = require('./config-BjgfmsPT.cjs');
7
+ var persistence = require('./types-sFcb_Sfz.cjs');
8
+ var index = require('./index-BVlYjP10.cjs');
9
+ var AcpBackend = require('./AcpBackend-sS5ln9nS.cjs');
10
+ var config = require('./config-BkxNWcwM.cjs');
11
11
  require('axios');
12
12
  require('chalk');
13
13
  require('node:util');
@@ -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-C4duxyB7.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-DZ7tAffg.mjs';
7
- import { A as AcpBackend } from './AcpBackend-DMLCBDru.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-DRjtWNd0.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-RASD9X96.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-BDhR8Zbc.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-DbS9-r10.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-3BOBElkv.mjs';
9
9
  import 'axios';
10
10
  import 'chalk';
11
11
  import '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-C4duxyB7.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-xyImjcMI.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-DZ7tAffg.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-RASD9X96.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-DuZN34yy.mjs';
8
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-BDhR8Zbc.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-B7qS_-8e.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-Bd-LtS2E.cjs');
10
- var index = require('./index-BTtTqsj4.cjs');
8
+ var persistence = require('./types-sFcb_Sfz.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-DX5IvruC.cjs');
10
+ var index = require('./index-BVlYjP10.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,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-B7qS_-8e.cjs');
7
- var index = require('./index-BTtTqsj4.cjs');
6
+ var persistence = require('./types-sFcb_Sfz.cjs');
7
+ var index = require('./index-BVlYjP10.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-C4duxyB7.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-DZ7tAffg.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-RASD9X96.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-BDhR8Zbc.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-BTtTqsj4.cjs');
7
- var persistence = require('./types-B7qS_-8e.cjs');
6
+ var index = require('./index-BVlYjP10.cjs');
7
+ var persistence = require('./types-sFcb_Sfz.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-DZ7tAffg.mjs';
5
- import { l as logger } from './types-C4duxyB7.mjs';
4
+ import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-BDhR8Zbc.mjs';
5
+ import { l as logger } from './types-RASD9X96.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.82";
32
+ var version = "0.2.83";
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.82",
146
- "very-happy-tools-x64-darwin": "0.2.82",
147
- "very-happy-tools-arm64-linux": "0.2.82",
148
- "very-happy-tools-x64-linux": "0.2.82",
149
- "very-happy-tools-arm64-win32": "0.2.82",
150
- "very-happy-tools-x64-win32": "0.2.82"
145
+ "very-happy-tools-arm64-darwin": "0.2.83",
146
+ "very-happy-tools-x64-darwin": "0.2.83",
147
+ "very-happy-tools-arm64-linux": "0.2.83",
148
+ "very-happy-tools-x64-linux": "0.2.83",
149
+ "very-happy-tools-arm64-win32": "0.2.83",
150
+ "very-happy-tools-x64-win32": "0.2.83"
151
151
  };
152
152
  var devDependencies = {
153
153
  "@slopus/happy-wire": "workspace:*",
@@ -2915,7 +2915,7 @@ class ApiSessionClient extends EventEmitter {
2915
2915
  }
2916
2916
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(data.body.message.content.c));
2917
2917
  logger.debugLargeJson("[SOCKET] [UPDATE] Received update:", body);
2918
- this.routeIncomingMessage(body);
2918
+ this.routeIncomingMessage(body, localId);
2919
2919
  if (localId) this.rememberRoutedInbound(localId);
2920
2920
  this.lastSeq = messageSeq;
2921
2921
  } else if (data.body.t === "update-session") {
@@ -3143,8 +3143,9 @@ class ApiSessionClient extends EventEmitter {
3143
3143
  "X-Happy-Client": `cli-coding-session/${configuration.currentCliVersion}`
3144
3144
  };
3145
3145
  }
3146
- routeIncomingMessage(message) {
3147
- const userResult = UserMessageSchema.safeParse(message);
3146
+ routeIncomingMessage(message, sourceLocalId) {
3147
+ const messageWithSource = sourceLocalId && typeof message === "object" && message !== null ? { ...message, localKey: message.localKey ?? sourceLocalId } : message;
3148
+ const userResult = UserMessageSchema.safeParse(messageWithSource);
3148
3149
  if (userResult.success) {
3149
3150
  if (this.pendingMessageCallback) {
3150
3151
  this.pendingMessageCallback(userResult.data);
@@ -3199,7 +3200,7 @@ class ApiSessionClient extends EventEmitter {
3199
3200
  }
3200
3201
  try {
3201
3202
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(message.content.c));
3202
- this.routeIncomingMessage(body);
3203
+ this.routeIncomingMessage(body, message.localId);
3203
3204
  if (message.localId) this.rememberRoutedInbound(message.localId);
3204
3205
  } catch (error) {
3205
3206
  logger.debug("[API] Failed to decrypt fetched message", {
@@ -3319,7 +3320,7 @@ class ApiSessionClient extends EventEmitter {
3319
3320
  for (const item of batch) {
3320
3321
  if (this.routedInboundLocalIds.has(item.localId)) continue;
3321
3322
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(item.content));
3322
- this.routeIncomingMessage(body);
3323
+ this.routeIncomingMessage(body, item.localId);
3323
3324
  this.rememberRoutedInbound(item.localId);
3324
3325
  }
3325
3326
  callback({ ok: true, messages: stored });
@@ -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.82";
54
+ var version = "0.2.83";
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.82",
168
- "very-happy-tools-x64-darwin": "0.2.82",
169
- "very-happy-tools-arm64-linux": "0.2.82",
170
- "very-happy-tools-x64-linux": "0.2.82",
171
- "very-happy-tools-arm64-win32": "0.2.82",
172
- "very-happy-tools-x64-win32": "0.2.82"
167
+ "very-happy-tools-arm64-darwin": "0.2.83",
168
+ "very-happy-tools-x64-darwin": "0.2.83",
169
+ "very-happy-tools-arm64-linux": "0.2.83",
170
+ "very-happy-tools-x64-linux": "0.2.83",
171
+ "very-happy-tools-arm64-win32": "0.2.83",
172
+ "very-happy-tools-x64-win32": "0.2.83"
173
173
  };
174
174
  var devDependencies = {
175
175
  "@slopus/happy-wire": "workspace:*",
@@ -1480,7 +1480,7 @@ class RpcHandlerManager {
1480
1480
  }
1481
1481
  }
1482
1482
 
1483
- 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-B7qS_-8e.cjs', document.baseURI).href))));
1483
+ 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-sFcb_Sfz.cjs', document.baseURI).href))));
1484
1484
  function projectPath() {
1485
1485
  const path = path$1.resolve(__dirname$1, "..");
1486
1486
  return path;
@@ -2937,7 +2937,7 @@ class ApiSessionClient extends node_events.EventEmitter {
2937
2937
  }
2938
2938
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(data.body.message.content.c));
2939
2939
  logger.debugLargeJson("[SOCKET] [UPDATE] Received update:", body);
2940
- this.routeIncomingMessage(body);
2940
+ this.routeIncomingMessage(body, localId);
2941
2941
  if (localId) this.rememberRoutedInbound(localId);
2942
2942
  this.lastSeq = messageSeq;
2943
2943
  } else if (data.body.t === "update-session") {
@@ -3165,8 +3165,9 @@ class ApiSessionClient extends node_events.EventEmitter {
3165
3165
  "X-Happy-Client": `cli-coding-session/${configuration.currentCliVersion}`
3166
3166
  };
3167
3167
  }
3168
- routeIncomingMessage(message) {
3169
- const userResult = UserMessageSchema.safeParse(message);
3168
+ routeIncomingMessage(message, sourceLocalId) {
3169
+ const messageWithSource = sourceLocalId && typeof message === "object" && message !== null ? { ...message, localKey: message.localKey ?? sourceLocalId } : message;
3170
+ const userResult = UserMessageSchema.safeParse(messageWithSource);
3170
3171
  if (userResult.success) {
3171
3172
  if (this.pendingMessageCallback) {
3172
3173
  this.pendingMessageCallback(userResult.data);
@@ -3221,7 +3222,7 @@ class ApiSessionClient extends node_events.EventEmitter {
3221
3222
  }
3222
3223
  try {
3223
3224
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(message.content.c));
3224
- this.routeIncomingMessage(body);
3225
+ this.routeIncomingMessage(body, message.localId);
3225
3226
  if (message.localId) this.rememberRoutedInbound(message.localId);
3226
3227
  } catch (error) {
3227
3228
  logger.debug("[API] Failed to decrypt fetched message", {
@@ -3341,7 +3342,7 @@ class ApiSessionClient extends node_events.EventEmitter {
3341
3342
  for (const item of batch) {
3342
3343
  if (this.routedInboundLocalIds.has(item.localId)) continue;
3343
3344
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(item.content));
3344
- this.routeIncomingMessage(body);
3345
+ this.routeIncomingMessage(body, item.localId);
3345
3346
  this.rememberRoutedInbound(item.localId);
3346
3347
  }
3347
3348
  callback({ ok: true, messages: stored });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.82",
3
+ "version": "0.2.83",
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.82",
117
- "very-happy-tools-x64-darwin": "0.2.82",
118
- "very-happy-tools-arm64-linux": "0.2.82",
119
- "very-happy-tools-x64-linux": "0.2.82",
120
- "very-happy-tools-arm64-win32": "0.2.82",
121
- "very-happy-tools-x64-win32": "0.2.82"
116
+ "very-happy-tools-arm64-darwin": "0.2.83",
117
+ "very-happy-tools-x64-darwin": "0.2.83",
118
+ "very-happy-tools-arm64-linux": "0.2.83",
119
+ "very-happy-tools-x64-linux": "0.2.83",
120
+ "very-happy-tools-arm64-win32": "0.2.83",
121
+ "very-happy-tools-x64-win32": "0.2.83"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",