very-happy-cli 0.2.81 → 0.2.82

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-cBt4R6ce.mjs → AcpBackend-DMLCBDru.mjs} +1 -1
  2. package/dist/{AcpBackend-B7Z1Gk_l.cjs → AcpBackend-DjHJfd8y.cjs} +1 -1
  3. package/dist/{AcpSessionManager-D3-rBUxk.cjs → AcpSessionManager-Bd-LtS2E.cjs} +1 -1
  4. package/dist/{AcpSessionManager-AyrINTu7.mjs → AcpSessionManager-xyImjcMI.mjs} +1 -1
  5. package/dist/{config-B2TBK1UZ.cjs → config-BjgfmsPT.cjs} +2 -2
  6. package/dist/{config-CZdNxl3d.mjs → config-DRjtWNd0.mjs} +2 -2
  7. package/dist/{index-DuvoxKEM.mjs → index-1ZE940yd.mjs} +5 -5
  8. package/dist/{index-SjWW0gIt.cjs → index-BTtTqsj4.cjs} +74 -42
  9. package/dist/{index-C9UnJZEo.cjs → index-CR24hlKJ.cjs} +4 -4
  10. package/dist/{index-W3oj-d6C.mjs → index-DZ7tAffg.mjs} +71 -39
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-Xtl0pMWH.cjs → installTerminalHooks-DSfE4ui6.cjs} +2 -2
  14. package/dist/{installTerminalHooks-BqpxXB8n.mjs → installTerminalHooks-Do3vnipG.mjs} +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-DqaW6nz5.mjs → mcp-2Ee6mSAP.mjs} +2 -2
  20. package/dist/{mcp-BxO80DMH.cjs → mcp-CJHJEBto.cjs} +2 -2
  21. package/dist/{runGemini-Ctc5nKHC.mjs → runGemini-DQKPf1RX.mjs} +4 -4
  22. package/dist/{runGemini-DZay2CN7.cjs → runGemini-Dj7g2-B_.cjs} +4 -4
  23. package/dist/{runOpenClaw-CF0133Vk.mjs → runOpenClaw-BNfz77EE.mjs} +3 -3
  24. package/dist/{runOpenClaw-W3Ogud1U.cjs → runOpenClaw-BWAVwl3x.cjs} +3 -3
  25. package/dist/{send-By1xNQ6E.mjs → send-CIm5kZBx.mjs} +2 -2
  26. package/dist/{send-D0U0T_bK.cjs → send-Cm28ijOj.cjs} +2 -2
  27. package/dist/{spawn-BnvqaVCf.cjs → spawn-BPgkpGXX.cjs} +2 -2
  28. package/dist/{spawn-BLbFNopc.mjs → spawn-Dd8qj3l4.mjs} +2 -2
  29. package/dist/{types-DJC5rGtd.cjs → types-B7qS_-8e.cjs} +8 -8
  30. package/dist/{types-DFKdwxE-.mjs → types-C4duxyB7.mjs} +7 -7
  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-DFKdwxE-.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-C4duxyB7.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-DJC5rGtd.cjs');
6
+ var persistence = require('./types-B7qS_-8e.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-DJC5rGtd.cjs');
4
+ var persistence = require('./types-B7qS_-8e.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-DFKdwxE-.mjs';
2
+ import { b as createEnvelope } from './types-C4duxyB7.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-DJC5rGtd.cjs');
8
- var index = require('./index-SjWW0gIt.cjs');
7
+ var persistence = require('./types-B7qS_-8e.cjs');
8
+ var index = require('./index-BTtTqsj4.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-DFKdwxE-.mjs';
6
- import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-W3oj-d6C.mjs';
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';
7
7
  import 'axios';
8
8
  import 'chalk';
9
9
  import 'node:util';
@@ -1,10 +1,10 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-cBt4R6ce.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-cBt4R6ce.mjs';
3
- import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-DFKdwxE-.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-AyrINTu7.mjs';
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';
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-W3oj-d6C.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-DZ7tAffg.mjs';
8
8
  import 'node:child_process';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import '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-DJC5rGtd.cjs');
6
+ var persistence = require('./types-B7qS_-8e.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -3004,6 +3004,49 @@ function applyClaudeResultLifecycle(result, callbacks) {
3004
3004
  callbacks.onCompleted();
3005
3005
  }
3006
3006
 
3007
+ const CLAUDE_ATTACHMENT_KINDS = [
3008
+ "image/jpeg",
3009
+ "image/png",
3010
+ "image/gif",
3011
+ "image/webp",
3012
+ "application/pdf"
3013
+ ];
3014
+ function detectClaudeImageMime(bytes) {
3015
+ if (bytes.length >= 4 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71) {
3016
+ return "image/png";
3017
+ }
3018
+ if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {
3019
+ return "image/jpeg";
3020
+ }
3021
+ if (bytes.length >= 4 && bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56) {
3022
+ return "image/gif";
3023
+ }
3024
+ if (bytes.length >= 12 && bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80) {
3025
+ return "image/webp";
3026
+ }
3027
+ return null;
3028
+ }
3029
+ function isPdf(bytes) {
3030
+ return bytes.length >= 5 && bytes[0] === 37 && bytes[1] === 80 && bytes[2] === 68 && bytes[3] === 70 && bytes[4] === 45;
3031
+ }
3032
+ function attachmentToClaudeContentBlock(bytes) {
3033
+ const data = Buffer.from(bytes).toString("base64");
3034
+ const imageMime = detectClaudeImageMime(bytes);
3035
+ if (imageMime) {
3036
+ return {
3037
+ type: "image",
3038
+ source: { type: "base64", media_type: imageMime, data }
3039
+ };
3040
+ }
3041
+ if (isPdf(bytes)) {
3042
+ return {
3043
+ type: "document",
3044
+ source: { type: "base64", media_type: "application/pdf", data }
3045
+ };
3046
+ }
3047
+ return null;
3048
+ }
3049
+
3007
3050
  function applyClaudeSdkMetadata(current, update) {
3008
3051
  return {
3009
3052
  ...current,
@@ -3011,6 +3054,7 @@ function applyClaudeSdkMetadata(current, update) {
3011
3054
  slashCommands: update.slashCommands,
3012
3055
  mcpServers: update.mcpServers,
3013
3056
  skills: update.skills,
3057
+ attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
3014
3058
  ...update.modelIsDefault && update.model ? { defaultModelCode: update.model } : {}
3015
3059
  };
3016
3060
  }
@@ -3286,23 +3330,23 @@ async function claudeRemoteLauncher(session) {
3286
3330
  const attachments = msg.attachments ?? [];
3287
3331
  if (attachments.length > 0) {
3288
3332
  const contentBlocks = [];
3333
+ let acceptedAttachments = 0;
3289
3334
  for (const att of attachments) {
3290
- const detected = detectClaudeImageMime(att.data);
3291
- if (!detected) {
3335
+ const block = attachmentToClaudeContentBlock(att.data);
3336
+ if (!block) {
3292
3337
  persistence.logger.debug(`[remote] Skipping unsupported attachment (no magic-byte match): ${att.name}, claimed mimeType=${att.mimeType}`);
3293
3338
  continue;
3294
3339
  }
3295
- contentBlocks.push({
3296
- type: "image",
3297
- source: {
3298
- type: "base64",
3299
- media_type: detected,
3300
- data: Buffer.from(att.data).toString("base64")
3301
- }
3302
- });
3340
+ contentBlocks.push(block);
3341
+ acceptedAttachments++;
3342
+ }
3343
+ if (msg.message.trim().length > 0) {
3344
+ contentBlocks.push({ type: "text", text: msg.message });
3303
3345
  }
3304
- contentBlocks.push({ type: "text", text: msg.message });
3305
- persistence.logger.debug(`[remote] Combined ${contentBlocks.length - 1} image(s) with text message`);
3346
+ if (contentBlocks.length === 0) {
3347
+ throw new Error("No supported attachment content was available to send");
3348
+ }
3349
+ persistence.logger.debug(`[remote] Combined ${acceptedAttachments} attachment(s) with${msg.message.trim() ? "" : "out"} text message`);
3306
3350
  return {
3307
3351
  message: contentBlocks,
3308
3352
  mode: msg.mode
@@ -3434,21 +3478,6 @@ async function claudeRemoteLauncher(session) {
3434
3478
  }
3435
3479
  return exitReason || "exit";
3436
3480
  }
3437
- function detectClaudeImageMime(bytes) {
3438
- if (bytes.length >= 4 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71) {
3439
- return "image/png";
3440
- }
3441
- if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {
3442
- return "image/jpeg";
3443
- }
3444
- if (bytes.length >= 4 && bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56) {
3445
- return "image/gif";
3446
- }
3447
- if (bytes.length >= 12 && bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80) {
3448
- return "image/webp";
3449
- }
3450
- return null;
3451
- }
3452
3481
 
3453
3482
  async function loop(opts) {
3454
3483
  const logPath = persistence.logger.logFilePath;
@@ -8503,7 +8532,7 @@ const MAX_TITLE_CHARS = 60;
8503
8532
  const GENERATION_TIMEOUT_MS = 3e4;
8504
8533
  function resolveClaudeBinary() {
8505
8534
  try {
8506
- 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-SjWW0gIt.cjs', document.baseURI).href)));
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)));
8507
8536
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
8508
8537
  const { getClaudeCliPath } = require$1(utilsPath);
8509
8538
  const path$1 = getClaudeCliPath();
@@ -8956,6 +8985,9 @@ async function runClaude(credentials, options = {}) {
8956
8985
  lifecycleState: "running",
8957
8986
  lifecycleStateSince: Date.now(),
8958
8987
  flavor: "claude",
8988
+ // Advertise composer support before the first SDK response. Otherwise
8989
+ // a brand-new session cannot pick a PDF until after sending once.
8990
+ attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
8959
8991
  sandbox: sandboxConfig?.enabled ? sandboxConfig : null,
8960
8992
  dangerouslySkipPermissions,
8961
8993
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
@@ -10620,9 +10652,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
10620
10652
  };
10621
10653
  }
10622
10654
 
10623
- 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-SjWW0gIt.cjs', document.baseURI).href)));
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)));
10624
10656
  const __dirname$1 = path.dirname(__filename$1);
10625
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-SjWW0gIt.cjs', document.baseURI).href)));
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)));
10626
10658
  const PRISMA_QUERY_ENGINE_FILES = {
10627
10659
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
10628
10660
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -13234,7 +13266,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13234
13266
  process.exit(0);
13235
13267
  } else if (subcommand === "install-terminal-hooks") {
13236
13268
  try {
13237
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-Xtl0pMWH.cjs'); });
13269
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-DSfE4ui6.cjs'); });
13238
13270
  const command = parseTerminalHooksArgs(args.slice(1));
13239
13271
  if (command.action === "help") {
13240
13272
  console.log(TERMINAL_HOOKS_HELP);
@@ -13251,7 +13283,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13251
13283
  }
13252
13284
  } else if (subcommand === "spawn") {
13253
13285
  try {
13254
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-BnvqaVCf.cjs'); });
13286
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-BPgkpGXX.cjs'); });
13255
13287
  await handleSpawnCommand(args.slice(1));
13256
13288
  } catch (error) {
13257
13289
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13263,7 +13295,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13263
13295
  return;
13264
13296
  } else if (subcommand === "send") {
13265
13297
  try {
13266
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-D0U0T_bK.cjs'); });
13298
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-Cm28ijOj.cjs'); });
13267
13299
  await handleSendCommand(args.slice(1));
13268
13300
  } catch (error) {
13269
13301
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13369,9 +13401,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13369
13401
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13370
13402
  const projectId = args[3];
13371
13403
  try {
13372
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-B2TBK1UZ.cjs'); });
13373
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-DJC5rGtd.cjs'); }).then(function (n) { return n.persistence; });
13374
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-DJC5rGtd.cjs'); }).then(function (n) { return n.api; });
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; });
13375
13407
  let userEmail = void 0;
13376
13408
  try {
13377
13409
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13402,7 +13434,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13402
13434
  }
13403
13435
  if (geminiSubcommand === "project" && args[2] === "get") {
13404
13436
  try {
13405
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-B2TBK1UZ.cjs'); });
13437
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-BjgfmsPT.cjs'); });
13406
13438
  const config = readGeminiLocalConfig();
13407
13439
  if (config.googleCloudProject) {
13408
13440
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13442,7 +13474,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13442
13474
  process.exit(0);
13443
13475
  }
13444
13476
  try {
13445
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-DZay2CN7.cjs'); });
13477
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Dj7g2-B_.cjs'); });
13446
13478
  let startedBy = void 0;
13447
13479
  for (let i = 1; i < args.length; i++) {
13448
13480
  if (args[i] === "--started-by") {
@@ -13464,7 +13496,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13464
13496
  return;
13465
13497
  } else if (subcommand === "acp") {
13466
13498
  try {
13467
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-C9UnJZEo.cjs'); });
13499
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-CR24hlKJ.cjs'); });
13468
13500
  let startedBy = void 0;
13469
13501
  let verbose = false;
13470
13502
  const acpArgs = [];
@@ -13504,7 +13536,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13504
13536
  return;
13505
13537
  } else if (subcommand === "openclaw") {
13506
13538
  try {
13507
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-W3Ogud1U.cjs'); });
13539
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-BWAVwl3x.cjs'); });
13508
13540
  let startedBy = void 0;
13509
13541
  let verbose = false;
13510
13542
  let gatewayUrl;
@@ -13555,7 +13587,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13555
13587
  return;
13556
13588
  } else if (subcommand === "mcp" && args.length === 1) {
13557
13589
  try {
13558
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-BxO80DMH.cjs'); });
13590
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-CJHJEBto.cjs'); });
13559
13591
  await handleMcpCommand();
13560
13592
  } catch (error) {
13561
13593
  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-B7Z1Gk_l.cjs');
4
- var persistence = require('./types-DJC5rGtd.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-D3-rBUxk.cjs');
3
+ var AcpBackend = require('./AcpBackend-DjHJfd8y.cjs');
4
+ var persistence = require('./types-B7qS_-8e.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-Bd-LtS2E.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-SjWW0gIt.cjs');
8
+ var index = require('./index-BTtTqsj4.cjs');
9
9
  require('node:child_process');
10
10
  require('@agentclientprotocol/sdk');
11
11
  require('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-DFKdwxE-.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-C4duxyB7.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';
@@ -2982,6 +2982,49 @@ function applyClaudeResultLifecycle(result, callbacks) {
2982
2982
  callbacks.onCompleted();
2983
2983
  }
2984
2984
 
2985
+ const CLAUDE_ATTACHMENT_KINDS = [
2986
+ "image/jpeg",
2987
+ "image/png",
2988
+ "image/gif",
2989
+ "image/webp",
2990
+ "application/pdf"
2991
+ ];
2992
+ function detectClaudeImageMime(bytes) {
2993
+ if (bytes.length >= 4 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71) {
2994
+ return "image/png";
2995
+ }
2996
+ if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {
2997
+ return "image/jpeg";
2998
+ }
2999
+ if (bytes.length >= 4 && bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56) {
3000
+ return "image/gif";
3001
+ }
3002
+ if (bytes.length >= 12 && bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80) {
3003
+ return "image/webp";
3004
+ }
3005
+ return null;
3006
+ }
3007
+ function isPdf(bytes) {
3008
+ return bytes.length >= 5 && bytes[0] === 37 && bytes[1] === 80 && bytes[2] === 68 && bytes[3] === 70 && bytes[4] === 45;
3009
+ }
3010
+ function attachmentToClaudeContentBlock(bytes) {
3011
+ const data = Buffer.from(bytes).toString("base64");
3012
+ const imageMime = detectClaudeImageMime(bytes);
3013
+ if (imageMime) {
3014
+ return {
3015
+ type: "image",
3016
+ source: { type: "base64", media_type: imageMime, data }
3017
+ };
3018
+ }
3019
+ if (isPdf(bytes)) {
3020
+ return {
3021
+ type: "document",
3022
+ source: { type: "base64", media_type: "application/pdf", data }
3023
+ };
3024
+ }
3025
+ return null;
3026
+ }
3027
+
2985
3028
  function applyClaudeSdkMetadata(current, update) {
2986
3029
  return {
2987
3030
  ...current,
@@ -2989,6 +3032,7 @@ function applyClaudeSdkMetadata(current, update) {
2989
3032
  slashCommands: update.slashCommands,
2990
3033
  mcpServers: update.mcpServers,
2991
3034
  skills: update.skills,
3035
+ attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
2992
3036
  ...update.modelIsDefault && update.model ? { defaultModelCode: update.model } : {}
2993
3037
  };
2994
3038
  }
@@ -3264,23 +3308,23 @@ async function claudeRemoteLauncher(session) {
3264
3308
  const attachments = msg.attachments ?? [];
3265
3309
  if (attachments.length > 0) {
3266
3310
  const contentBlocks = [];
3311
+ let acceptedAttachments = 0;
3267
3312
  for (const att of attachments) {
3268
- const detected = detectClaudeImageMime(att.data);
3269
- if (!detected) {
3313
+ const block = attachmentToClaudeContentBlock(att.data);
3314
+ if (!block) {
3270
3315
  logger.debug(`[remote] Skipping unsupported attachment (no magic-byte match): ${att.name}, claimed mimeType=${att.mimeType}`);
3271
3316
  continue;
3272
3317
  }
3273
- contentBlocks.push({
3274
- type: "image",
3275
- source: {
3276
- type: "base64",
3277
- media_type: detected,
3278
- data: Buffer.from(att.data).toString("base64")
3279
- }
3280
- });
3318
+ contentBlocks.push(block);
3319
+ acceptedAttachments++;
3320
+ }
3321
+ if (msg.message.trim().length > 0) {
3322
+ contentBlocks.push({ type: "text", text: msg.message });
3281
3323
  }
3282
- contentBlocks.push({ type: "text", text: msg.message });
3283
- logger.debug(`[remote] Combined ${contentBlocks.length - 1} image(s) with text message`);
3324
+ if (contentBlocks.length === 0) {
3325
+ throw new Error("No supported attachment content was available to send");
3326
+ }
3327
+ logger.debug(`[remote] Combined ${acceptedAttachments} attachment(s) with${msg.message.trim() ? "" : "out"} text message`);
3284
3328
  return {
3285
3329
  message: contentBlocks,
3286
3330
  mode: msg.mode
@@ -3412,21 +3456,6 @@ async function claudeRemoteLauncher(session) {
3412
3456
  }
3413
3457
  return exitReason || "exit";
3414
3458
  }
3415
- function detectClaudeImageMime(bytes) {
3416
- if (bytes.length >= 4 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71) {
3417
- return "image/png";
3418
- }
3419
- if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {
3420
- return "image/jpeg";
3421
- }
3422
- if (bytes.length >= 4 && bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56) {
3423
- return "image/gif";
3424
- }
3425
- if (bytes.length >= 12 && bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80) {
3426
- return "image/webp";
3427
- }
3428
- return null;
3429
- }
3430
3459
 
3431
3460
  async function loop(opts) {
3432
3461
  const logPath = logger.logFilePath;
@@ -8934,6 +8963,9 @@ async function runClaude(credentials, options = {}) {
8934
8963
  lifecycleState: "running",
8935
8964
  lifecycleStateSince: Date.now(),
8936
8965
  flavor: "claude",
8966
+ // Advertise composer support before the first SDK response. Otherwise
8967
+ // a brand-new session cannot pick a PDF until after sending once.
8968
+ attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
8937
8969
  sandbox: sandboxConfig?.enabled ? sandboxConfig : null,
8938
8970
  dangerouslySkipPermissions,
8939
8971
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
@@ -13212,7 +13244,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13212
13244
  process.exit(0);
13213
13245
  } else if (subcommand === "install-terminal-hooks") {
13214
13246
  try {
13215
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-BqpxXB8n.mjs');
13247
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-Do3vnipG.mjs');
13216
13248
  const command = parseTerminalHooksArgs(args.slice(1));
13217
13249
  if (command.action === "help") {
13218
13250
  console.log(TERMINAL_HOOKS_HELP);
@@ -13229,7 +13261,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13229
13261
  }
13230
13262
  } else if (subcommand === "spawn") {
13231
13263
  try {
13232
- const { handleSpawnCommand } = await import('./spawn-BLbFNopc.mjs');
13264
+ const { handleSpawnCommand } = await import('./spawn-Dd8qj3l4.mjs');
13233
13265
  await handleSpawnCommand(args.slice(1));
13234
13266
  } catch (error) {
13235
13267
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13241,7 +13273,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13241
13273
  return;
13242
13274
  } else if (subcommand === "send") {
13243
13275
  try {
13244
- const { handleSendCommand } = await import('./send-By1xNQ6E.mjs');
13276
+ const { handleSendCommand } = await import('./send-CIm5kZBx.mjs');
13245
13277
  await handleSendCommand(args.slice(1));
13246
13278
  } catch (error) {
13247
13279
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13347,9 +13379,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13347
13379
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13348
13380
  const projectId = args[3];
13349
13381
  try {
13350
- const { saveGoogleCloudProjectToConfig } = await import('./config-CZdNxl3d.mjs');
13351
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-DFKdwxE-.mjs').then(function (n) { return n.af; });
13352
- const { ApiClient: ApiClient2 } = await import('./types-DFKdwxE-.mjs').then(function (n) { return n.ag; });
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; });
13353
13385
  let userEmail = void 0;
13354
13386
  try {
13355
13387
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13380,7 +13412,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13380
13412
  }
13381
13413
  if (geminiSubcommand === "project" && args[2] === "get") {
13382
13414
  try {
13383
- const { readGeminiLocalConfig } = await import('./config-CZdNxl3d.mjs');
13415
+ const { readGeminiLocalConfig } = await import('./config-DRjtWNd0.mjs');
13384
13416
  const config = readGeminiLocalConfig();
13385
13417
  if (config.googleCloudProject) {
13386
13418
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13420,7 +13452,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13420
13452
  process.exit(0);
13421
13453
  }
13422
13454
  try {
13423
- const { runGemini } = await import('./runGemini-Ctc5nKHC.mjs');
13455
+ const { runGemini } = await import('./runGemini-DQKPf1RX.mjs');
13424
13456
  let startedBy = void 0;
13425
13457
  for (let i = 1; i < args.length; i++) {
13426
13458
  if (args[i] === "--started-by") {
@@ -13442,7 +13474,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13442
13474
  return;
13443
13475
  } else if (subcommand === "acp") {
13444
13476
  try {
13445
- const { runAcp, resolveAcpAgentConfig } = await import('./index-DuvoxKEM.mjs');
13477
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-1ZE940yd.mjs');
13446
13478
  let startedBy = void 0;
13447
13479
  let verbose = false;
13448
13480
  const acpArgs = [];
@@ -13482,7 +13514,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13482
13514
  return;
13483
13515
  } else if (subcommand === "openclaw") {
13484
13516
  try {
13485
- const { runOpenClaw } = await import('./runOpenClaw-CF0133Vk.mjs');
13517
+ const { runOpenClaw } = await import('./runOpenClaw-BNfz77EE.mjs');
13486
13518
  let startedBy = void 0;
13487
13519
  let verbose = false;
13488
13520
  let gatewayUrl;
@@ -13533,7 +13565,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13533
13565
  return;
13534
13566
  } else if (subcommand === "mcp" && args.length === 1) {
13535
13567
  try {
13536
- const { handleMcpCommand } = await import('./mcp-DqaW6nz5.mjs');
13568
+ const { handleMcpCommand } = await import('./mcp-2Ee6mSAP.mjs');
13537
13569
  await handleMcpCommand();
13538
13570
  } catch (error) {
13539
13571
  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-SjWW0gIt.cjs');
5
- require('./types-DJC5rGtd.cjs');
4
+ require('./index-BTtTqsj4.cjs');
5
+ require('./types-B7qS_-8e.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-W3oj-d6C.mjs';
3
- import './types-DFKdwxE-.mjs';
2
+ import './index-DZ7tAffg.mjs';
3
+ import './types-C4duxyB7.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:os';
@@ -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-DJC5rGtd.cjs');
9
- var index = require('./index-SjWW0gIt.cjs');
8
+ var persistence = require('./types-B7qS_-8e.cjs');
9
+ var index = require('./index-BTtTqsj4.cjs');
10
10
  require('axios');
11
11
  require('node:util');
12
12
  require('node:fs/promises');
@@ -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-DFKdwxE-.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-W3oj-d6C.mjs';
6
+ import { p as projectPath } from './types-C4duxyB7.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-DZ7tAffg.mjs';
8
8
  import 'axios';
9
9
  import 'node:util';
10
10
  import 'node:fs/promises';
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var persistence = require('./types-DJC5rGtd.cjs');
3
+ var persistence = require('./types-B7qS_-8e.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -427,6 +427,8 @@ type Metadata = {
427
427
  status: string;
428
428
  }>;
429
429
  skills?: string[];
430
+ /** Attachment content blocks this daemon can forward to the active SDK. */
431
+ attachmentKinds?: string[];
430
432
  homeDir: string;
431
433
  happyHomeDir: string;
432
434
  happyLibDir: string;
package/dist/lib.d.mts CHANGED
@@ -427,6 +427,8 @@ type Metadata = {
427
427
  status: string;
428
428
  }>;
429
429
  skills?: string[];
430
+ /** Attachment content blocks this daemon can forward to the active SDK. */
431
+ attachmentKinds?: string[];
430
432
  homeDir: string;
431
433
  happyHomeDir: string;
432
434
  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-DFKdwxE-.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-C4duxyB7.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-W3oj-d6C.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-DZ7tAffg.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-DFKdwxE-.mjs';
6
+ import { l as logger } from './types-C4duxyB7.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-SjWW0gIt.cjs');
6
+ var index = require('./index-BTtTqsj4.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-DJC5rGtd.cjs');
8
+ var persistence = require('./types-B7qS_-8e.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -2,10 +2,10 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { join } from 'node:path';
5
- import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-DFKdwxE-.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-W3oj-d6C.mjs';
7
- import { A as AcpBackend } from './AcpBackend-cBt4R6ce.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-CZdNxl3d.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-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';
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-DJC5rGtd.cjs');
8
- var index = require('./index-SjWW0gIt.cjs');
9
- var AcpBackend = require('./AcpBackend-B7Z1Gk_l.cjs');
10
- var config = require('./config-B2TBK1UZ.cjs');
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');
11
11
  require('axios');
12
12
  require('chalk');
13
13
  require('node:util');
@@ -3,9 +3,9 @@ import { execFileSync } from 'node:child_process';
3
3
  import os from 'node:os';
4
4
  import { existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
- import { k as ensurePrivateDirectorySync, m as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, c as configuration } from './types-DFKdwxE-.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-AyrINTu7.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-W3oj-d6C.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-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';
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-DJC5rGtd.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-D3-rBUxk.cjs');
10
- var index = require('./index-SjWW0gIt.cjs');
8
+ var persistence = require('./types-B7qS_-8e.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-Bd-LtS2E.cjs');
10
+ var index = require('./index-BTtTqsj4.cjs');
11
11
  var WebSocket = require('ws');
12
12
  var ed = require('@noble/ed25519');
13
13
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -1,8 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { r as readPersistedSessions, c as configuration } from './types-DFKdwxE-.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-W3oj-d6C.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-C4duxyB7.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-DZ7tAffg.mjs';
6
6
  import 'axios';
7
7
  import 'node:util';
8
8
  import 'node:os';
@@ -3,8 +3,8 @@
3
3
  var chalk = require('chalk');
4
4
  var node_fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var persistence = require('./types-DJC5rGtd.cjs');
7
- var index = require('./index-SjWW0gIt.cjs');
6
+ var persistence = require('./types-B7qS_-8e.cjs');
7
+ var index = require('./index-BTtTqsj4.cjs');
8
8
  require('axios');
9
9
  require('node:util');
10
10
  require('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-SjWW0gIt.cjs');
7
- var persistence = require('./types-DJC5rGtd.cjs');
6
+ var index = require('./index-BTtTqsj4.cjs');
7
+ var persistence = require('./types-B7qS_-8e.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-W3oj-d6C.mjs';
5
- import { l as logger } from './types-DFKdwxE-.mjs';
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';
6
6
  import 'node:os';
7
7
  import 'node:crypto';
8
8
  import 'cross-spawn';
@@ -51,7 +51,7 @@ var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
51
51
  var pty__namespace = /*#__PURE__*/_interopNamespaceDefault(pty);
52
52
 
53
53
  var name = "very-happy-cli";
54
- var version = "0.2.81";
54
+ var version = "0.2.82";
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.81",
168
- "very-happy-tools-x64-darwin": "0.2.81",
169
- "very-happy-tools-arm64-linux": "0.2.81",
170
- "very-happy-tools-x64-linux": "0.2.81",
171
- "very-happy-tools-arm64-win32": "0.2.81",
172
- "very-happy-tools-x64-win32": "0.2.81"
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"
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-DJC5rGtd.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-B7qS_-8e.cjs', document.baseURI).href))));
1484
1484
  function projectPath() {
1485
1485
  const path = path$1.resolve(__dirname$1, "..");
1486
1486
  return path;
@@ -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.81";
32
+ var version = "0.2.82";
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.81",
146
- "very-happy-tools-x64-darwin": "0.2.81",
147
- "very-happy-tools-arm64-linux": "0.2.81",
148
- "very-happy-tools-x64-linux": "0.2.81",
149
- "very-happy-tools-arm64-win32": "0.2.81",
150
- "very-happy-tools-x64-win32": "0.2.81"
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"
151
151
  };
152
152
  var devDependencies = {
153
153
  "@slopus/happy-wire": "workspace:*",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.81",
3
+ "version": "0.2.82",
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.81",
117
- "very-happy-tools-x64-darwin": "0.2.81",
118
- "very-happy-tools-arm64-linux": "0.2.81",
119
- "very-happy-tools-x64-linux": "0.2.81",
120
- "very-happy-tools-arm64-win32": "0.2.81",
121
- "very-happy-tools-x64-win32": "0.2.81"
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"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",