very-happy-cli 0.2.105 → 0.2.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{AcpBackend-CbMPn2Sx.cjs → AcpBackend-DMmvLNNM.cjs} +1 -1
  2. package/dist/{AcpBackend-zefm5lwc.mjs → AcpBackend-Ux5FD_6F.mjs} +1 -1
  3. package/dist/{AcpSessionManager-DFeZAfz4.mjs → AcpSessionManager-C1hoU_rK.mjs} +1 -1
  4. package/dist/{AcpSessionManager-lM9HBlOx.cjs → AcpSessionManager-RYkxYWDn.cjs} +1 -1
  5. package/dist/{config-CRCUgh2E.mjs → config-DAb5saOC.mjs} +2 -2
  6. package/dist/{config-CYpWD6Tc.cjs → config-Dkn5KcXp.cjs} +2 -2
  7. package/dist/{index-Cietz-nU.cjs → index-BLW-smJu.cjs} +29 -17
  8. package/dist/{index-NiUS5t0N.mjs → index-CgWdwkhB.mjs} +25 -13
  9. package/dist/{index-_t9O9dGp.mjs → index-D2ZzPm58.mjs} +5 -5
  10. package/dist/{index-Bmv3lZU7.cjs → index-D48mWUTN.cjs} +2 -2
  11. package/dist/{index-neppKLsI.mjs → index-DCpgRGWy.mjs} +2 -2
  12. package/dist/{index-m9BL5ZWn.cjs → index-Do3JnAi7.cjs} +4 -4
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.mjs +2 -2
  15. package/dist/{installTerminalHooks-BMDcB8nc.cjs → installTerminalHooks-9rn15uP8.cjs} +2 -2
  16. package/dist/{installTerminalHooks-Czv6GUOw.mjs → installTerminalHooks-l1B-nbWa.mjs} +2 -2
  17. package/dist/lib.cjs +1 -1
  18. package/dist/lib.d.cts +5 -0
  19. package/dist/lib.d.mts +5 -0
  20. package/dist/lib.mjs +1 -1
  21. package/dist/{mcp-Cn4icOYK.cjs → mcp-C3zpbx-m.cjs} +2 -2
  22. package/dist/{mcp-Bt4btDMD.mjs → mcp-ZvHzv_lJ.mjs} +2 -2
  23. package/dist/{runGemini-wMF-U7zR.mjs → runGemini-0QqaFN1l.mjs} +4 -4
  24. package/dist/{runGemini-5Rgckz_I.cjs → runGemini-q20IdxQV.cjs} +4 -4
  25. package/dist/{runOpenClaw-Za9vMsSB.mjs → runOpenClaw-C6Z6MLHq.mjs} +3 -3
  26. package/dist/{runOpenClaw-DnbKLi5s.cjs → runOpenClaw-CtWkyvDJ.cjs} +3 -3
  27. package/dist/{send-v6085rvq.cjs → send-B8YQyV3D.cjs} +2 -2
  28. package/dist/{send-DliNFuy7.mjs → send-DEhUWg8v.mjs} +2 -2
  29. package/dist/{spawn-D3D-H-VF.mjs → spawn-BzbPyTHU.mjs} +2 -2
  30. package/dist/{spawn-DUU9rhJa.cjs → spawn-ChmlP1Z_.cjs} +2 -2
  31. package/dist/{types-Cq7yzNWv.cjs → types-C8-WODFE.cjs} +15 -10
  32. package/dist/{types-CFIlcwe9.mjs → types-lSeHEzPR.mjs} +14 -9
  33. package/package.json +7 -7
@@ -3,7 +3,7 @@
3
3
  var node_child_process = require('node:child_process');
4
4
  var sdk = require('@agentclientprotocol/sdk');
5
5
  var node_crypto = require('node:crypto');
6
- var persistence = require('./types-Cq7yzNWv.cjs');
6
+ var persistence = require('./types-C8-WODFE.cjs');
7
7
 
8
8
  const DEFAULT_TIMEOUTS = {
9
9
  /** Default initialization timeout: 60 seconds */
@@ -1,7 +1,7 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-CFIlcwe9.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-lSeHEzPR.mjs';
5
5
 
6
6
  const DEFAULT_TIMEOUTS = {
7
7
  /** Default initialization timeout: 60 seconds */
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { b as createEnvelope } from './types-CFIlcwe9.mjs';
2
+ import { b as createEnvelope } from './types-lSeHEzPR.mjs';
3
3
 
4
4
  function turnOptions(turnId, time) {
5
5
  return turnId ? { turn: turnId, time } : { time };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var persistence = require('./types-Cq7yzNWv.cjs');
4
+ var persistence = require('./types-C8-WODFE.cjs');
5
5
 
6
6
  function turnOptions(turnId, time) {
7
7
  return turnId ? { turn: turnId, time } : { time };
@@ -2,8 +2,8 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { execSync } from 'child_process';
5
- import { l as logger } from './types-CFIlcwe9.mjs';
6
- import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-NiUS5t0N.mjs';
5
+ import { l as logger } from './types-lSeHEzPR.mjs';
6
+ import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-CgWdwkhB.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-Cq7yzNWv.cjs');
8
- var index = require('./index-Cietz-nU.cjs');
7
+ var persistence = require('./types-C8-WODFE.cjs');
8
+ var index = require('./index-BLW-smJu.cjs');
9
9
  require('axios');
10
10
  require('chalk');
11
11
  require('node:util');
@@ -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-Cq7yzNWv.cjs');
6
+ var persistence = require('./types-C8-WODFE.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -6913,7 +6913,7 @@ function parseJsonObject(text) {
6913
6913
  return null;
6914
6914
  }
6915
6915
  }
6916
- function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Cietz-nU.cjs', document.baseURI).href))).resolve(s)) {
6916
+ function resolveSdkClaudeBinary(platform = process.platform, arch = process.arch, resolver = (s) => node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-BLW-smJu.cjs', document.baseURI).href))).resolve(s)) {
6917
6917
  const platformArch = `${platform}-${arch}`;
6918
6918
  const candidates = [
6919
6919
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -7993,6 +7993,12 @@ async function claimSessionOrExit(happySessionId, options) {
7993
7993
  }
7994
7994
 
7995
7995
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
7996
+ function sanitizeImportTitle(value) {
7997
+ if (typeof value !== "string") return null;
7998
+ const collapsed = value.replace(/[\u0000-\u001f\u007f]/g, " ").replace(/\s+/g, " ").trim();
7999
+ if (collapsed.length === 0) return null;
8000
+ return collapsed.length > 200 ? `${collapsed.slice(0, 199)}\u2026` : collapsed;
8001
+ }
7996
8002
  const hostSuffix = process.env.HAPPY_VARIANT === "dev" ? "-dev" : "";
7997
8003
  const initialMachineMetadata = {
7998
8004
  host: os$1.hostname() + hostSuffix,
@@ -8331,6 +8337,10 @@ async function startDaemon() {
8331
8337
  if (options.importedFromClaudeSessionId && UUID_RE.test(options.importedFromClaudeSessionId)) {
8332
8338
  extraEnv.HAPPY_IMPORTED_FROM_CLAUDE_SESSION_ID = options.importedFromClaudeSessionId;
8333
8339
  }
8340
+ const importTitle = sanitizeImportTitle(options.importTitle);
8341
+ if (importTitle) {
8342
+ extraEnv.HAPPY_IMPORT_TITLE = importTitle;
8343
+ }
8334
8344
  if (options.resumeCodexThreadId) {
8335
8345
  extraEnv.HAPPY_FORK_CODEX_THREAD_ID = options.resumeCodexThreadId;
8336
8346
  }
@@ -10192,7 +10202,7 @@ function registerSideQuestionHandler(rpc, deps) {
10192
10202
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
10193
10203
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
10194
10204
  const run = deps.run ?? (async (input) => {
10195
- const { query } = await Promise.resolve().then(function () { return require('./index-Bmv3lZU7.cjs'); });
10205
+ const { query } = await Promise.resolve().then(function () { return require('./index-D48mWUTN.cjs'); });
10196
10206
  return runSideQuestion(query, input);
10197
10207
  });
10198
10208
  const slots = /* @__PURE__ */ new Map();
@@ -10294,7 +10304,7 @@ const MAX_TITLE_CHARS = 60;
10294
10304
  const GENERATION_TIMEOUT_MS = 3e4;
10295
10305
  function resolveClaudeBinary() {
10296
10306
  try {
10297
- 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-Cietz-nU.cjs', document.baseURI).href)));
10307
+ 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-BLW-smJu.cjs', document.baseURI).href)));
10298
10308
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
10299
10309
  const { getClaudeCliPath } = require$1(utilsPath);
10300
10310
  const path$1 = getClaudeCliPath();
@@ -10731,6 +10741,7 @@ async function runClaude(credentials, options = {}) {
10731
10741
  const forkedFromSessionId = process.env.HAPPY_FORKED_FROM_SESSION_ID;
10732
10742
  const forkedFromMessageId = process.env.HAPPY_FORKED_FROM_MESSAGE_ID;
10733
10743
  const importedFromClaudeSessionId = process.env.HAPPY_IMPORTED_FROM_CLAUDE_SESSION_ID;
10744
+ const importTitle = process.env.HAPPY_IMPORT_TITLE;
10734
10745
  let metadata = {
10735
10746
  path: workingDirectory,
10736
10747
  host: os.hostname(),
@@ -10761,6 +10772,7 @@ async function runClaude(credentials, options = {}) {
10761
10772
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
10762
10773
  ...forkedFromMessageId ? { forkedFromMessageId } : {},
10763
10774
  ...importedFromClaudeSessionId ? { importedFromClaudeSessionId } : {},
10775
+ ...importTitle ? { summary: { text: importTitle, updatedAt: Date.now() } } : {},
10764
10776
  ...isAssistantVariant ? { variant: "assistant" } : {},
10765
10777
  // B-091: sessions the assistant dispatched (daemon spawn RPC exports
10766
10778
  // HAPPY_SPAWNED_BY, B-069) are born with the 'assistant' tag so every
@@ -12492,9 +12504,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
12492
12504
  };
12493
12505
  }
12494
12506
 
12495
- 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-Cietz-nU.cjs', document.baseURI).href)));
12507
+ 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-BLW-smJu.cjs', document.baseURI).href)));
12496
12508
  const __dirname$1 = path.dirname(__filename$1);
12497
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Cietz-nU.cjs', document.baseURI).href)));
12509
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-BLW-smJu.cjs', document.baseURI).href)));
12498
12510
  const PRISMA_QUERY_ENGINE_FILES = {
12499
12511
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
12500
12512
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -15118,7 +15130,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15118
15130
  process.exit(0);
15119
15131
  } else if (subcommand === "install-terminal-hooks") {
15120
15132
  try {
15121
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-BMDcB8nc.cjs'); });
15133
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-9rn15uP8.cjs'); });
15122
15134
  const command = parseTerminalHooksArgs(args.slice(1));
15123
15135
  if (command.action === "help") {
15124
15136
  console.log(TERMINAL_HOOKS_HELP);
@@ -15135,7 +15147,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15135
15147
  }
15136
15148
  } else if (subcommand === "spawn") {
15137
15149
  try {
15138
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-DUU9rhJa.cjs'); });
15150
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-ChmlP1Z_.cjs'); });
15139
15151
  await handleSpawnCommand(args.slice(1));
15140
15152
  } catch (error) {
15141
15153
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15147,7 +15159,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15147
15159
  return;
15148
15160
  } else if (subcommand === "send") {
15149
15161
  try {
15150
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-v6085rvq.cjs'); });
15162
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-B8YQyV3D.cjs'); });
15151
15163
  await handleSendCommand(args.slice(1));
15152
15164
  } catch (error) {
15153
15165
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15253,9 +15265,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15253
15265
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
15254
15266
  const projectId = args[3];
15255
15267
  try {
15256
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-CYpWD6Tc.cjs'); });
15257
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-Cq7yzNWv.cjs'); }).then(function (n) { return n.persistence; });
15258
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-Cq7yzNWv.cjs'); }).then(function (n) { return n.api; });
15268
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-Dkn5KcXp.cjs'); });
15269
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-C8-WODFE.cjs'); }).then(function (n) { return n.persistence; });
15270
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-C8-WODFE.cjs'); }).then(function (n) { return n.api; });
15259
15271
  let userEmail = void 0;
15260
15272
  try {
15261
15273
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -15286,7 +15298,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15286
15298
  }
15287
15299
  if (geminiSubcommand === "project" && args[2] === "get") {
15288
15300
  try {
15289
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-CYpWD6Tc.cjs'); });
15301
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-Dkn5KcXp.cjs'); });
15290
15302
  const config = readGeminiLocalConfig();
15291
15303
  if (config.googleCloudProject) {
15292
15304
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -15326,7 +15338,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15326
15338
  process.exit(0);
15327
15339
  }
15328
15340
  try {
15329
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-5Rgckz_I.cjs'); });
15341
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-q20IdxQV.cjs'); });
15330
15342
  let startedBy = void 0;
15331
15343
  for (let i = 1; i < args.length; i++) {
15332
15344
  if (args[i] === "--started-by") {
@@ -15348,7 +15360,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15348
15360
  return;
15349
15361
  } else if (subcommand === "acp") {
15350
15362
  try {
15351
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-m9BL5ZWn.cjs'); });
15363
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-Do3JnAi7.cjs'); });
15352
15364
  let startedBy = void 0;
15353
15365
  let verbose = false;
15354
15366
  const acpArgs = [];
@@ -15388,7 +15400,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15388
15400
  return;
15389
15401
  } else if (subcommand === "openclaw") {
15390
15402
  try {
15391
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-DnbKLi5s.cjs'); });
15403
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-CtWkyvDJ.cjs'); });
15392
15404
  let startedBy = void 0;
15393
15405
  let verbose = false;
15394
15406
  let gatewayUrl;
@@ -15439,7 +15451,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15439
15451
  return;
15440
15452
  } else if (subcommand === "mcp" && args.length === 1) {
15441
15453
  try {
15442
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-Cn4icOYK.cjs'); });
15454
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-C3zpbx-m.cjs'); });
15443
15455
  await handleMcpCommand();
15444
15456
  } catch (error) {
15445
15457
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -1,7 +1,7 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
2
  import os, { homedir, userInfo } from 'node:os';
3
3
  import { randomUUID, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
4
- import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as isClaudeSessionId, L as getLocalHappyAgentCredentialPath, N as readLocalHappyAgentCredentials, O as decryptWithDataKey, P as decryptLegacy, Q as extractCompleteLines, S as decideBackfill, T as parseTerminalHookPayload, U as tmuxArgs, V as scrubTmuxClientEnv, W as decideMirrorBinding, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as persistSession, Z as mirrorLineKey, _ as mirrorLocalId, w as writePrivateFileSync, $ as detectResumeSupport, a0 as detectCLIAvailability, a1 as acquireDaemonLock, a2 as summarizeSpawnSessionForLog, a3 as deletePersistedSessions, a4 as shellescape, a5 as decrypt, a6 as writeDaemonState, A as ApiClient, a7 as writeSettings, a8 as fetchCliUpdateState, a9 as resolveCliUpdateCheckInterval, aa as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ab as releaseDaemonLock, ac as isValidSessionId, ad as listVhTerminals, ae as isValidTerminalId, af as readVhTerminal, ag as sendToVhTerminal, ah as TITLE_PROMPT_PREFIX, ai as BOARD_ANALYZER_PROMPT_PREFIX, h as connectionState, aj as startOfflineReconnection, ak as clearCredentials, al as clearMachineId, k as ensurePrivateDirectorySync, am as SandboxConfigSchema, b as createEnvelope, an as CodexAppServerClient, ao as getLatestDaemonLog } from './types-CFIlcwe9.mjs';
4
+ import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as isClaudeSessionId, L as getLocalHappyAgentCredentialPath, N as readLocalHappyAgentCredentials, O as decryptWithDataKey, P as decryptLegacy, Q as extractCompleteLines, S as decideBackfill, T as parseTerminalHookPayload, U as tmuxArgs, V as scrubTmuxClientEnv, W as decideMirrorBinding, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as persistSession, Z as mirrorLineKey, _ as mirrorLocalId, w as writePrivateFileSync, $ as detectResumeSupport, a0 as detectCLIAvailability, a1 as acquireDaemonLock, a2 as summarizeSpawnSessionForLog, a3 as deletePersistedSessions, a4 as shellescape, a5 as decrypt, a6 as writeDaemonState, A as ApiClient, a7 as writeSettings, a8 as fetchCliUpdateState, a9 as resolveCliUpdateCheckInterval, aa as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ab as releaseDaemonLock, ac as isValidSessionId, ad as listVhTerminals, ae as isValidTerminalId, af as readVhTerminal, ag as sendToVhTerminal, ah as TITLE_PROMPT_PREFIX, ai as BOARD_ANALYZER_PROMPT_PREFIX, h as connectionState, aj as startOfflineReconnection, ak as clearCredentials, al as clearMachineId, k as ensurePrivateDirectorySync, am as SandboxConfigSchema, b as createEnvelope, an as CodexAppServerClient, ao as getLatestDaemonLog } from './types-lSeHEzPR.mjs';
5
5
  import spawn$1, { spawn } from 'cross-spawn';
6
6
  import path, { join, resolve, basename, delimiter, isAbsolute, normalize, sep, dirname } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -7971,6 +7971,12 @@ async function claimSessionOrExit(happySessionId, options) {
7971
7971
  }
7972
7972
 
7973
7973
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
7974
+ function sanitizeImportTitle(value) {
7975
+ if (typeof value !== "string") return null;
7976
+ const collapsed = value.replace(/[\u0000-\u001f\u007f]/g, " ").replace(/\s+/g, " ").trim();
7977
+ if (collapsed.length === 0) return null;
7978
+ return collapsed.length > 200 ? `${collapsed.slice(0, 199)}\u2026` : collapsed;
7979
+ }
7974
7980
  const hostSuffix = process.env.HAPPY_VARIANT === "dev" ? "-dev" : "";
7975
7981
  const initialMachineMetadata = {
7976
7982
  host: os$1.hostname() + hostSuffix,
@@ -8309,6 +8315,10 @@ async function startDaemon() {
8309
8315
  if (options.importedFromClaudeSessionId && UUID_RE.test(options.importedFromClaudeSessionId)) {
8310
8316
  extraEnv.HAPPY_IMPORTED_FROM_CLAUDE_SESSION_ID = options.importedFromClaudeSessionId;
8311
8317
  }
8318
+ const importTitle = sanitizeImportTitle(options.importTitle);
8319
+ if (importTitle) {
8320
+ extraEnv.HAPPY_IMPORT_TITLE = importTitle;
8321
+ }
8312
8322
  if (options.resumeCodexThreadId) {
8313
8323
  extraEnv.HAPPY_FORK_CODEX_THREAD_ID = options.resumeCodexThreadId;
8314
8324
  }
@@ -10170,7 +10180,7 @@ function registerSideQuestionHandler(rpc, deps) {
10170
10180
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
10171
10181
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
10172
10182
  const run = deps.run ?? (async (input) => {
10173
- const { query } = await import('./index-neppKLsI.mjs');
10183
+ const { query } = await import('./index-DCpgRGWy.mjs');
10174
10184
  return runSideQuestion(query, input);
10175
10185
  });
10176
10186
  const slots = /* @__PURE__ */ new Map();
@@ -10709,6 +10719,7 @@ async function runClaude(credentials, options = {}) {
10709
10719
  const forkedFromSessionId = process.env.HAPPY_FORKED_FROM_SESSION_ID;
10710
10720
  const forkedFromMessageId = process.env.HAPPY_FORKED_FROM_MESSAGE_ID;
10711
10721
  const importedFromClaudeSessionId = process.env.HAPPY_IMPORTED_FROM_CLAUDE_SESSION_ID;
10722
+ const importTitle = process.env.HAPPY_IMPORT_TITLE;
10712
10723
  let metadata = {
10713
10724
  path: workingDirectory,
10714
10725
  host: os.hostname(),
@@ -10739,6 +10750,7 @@ async function runClaude(credentials, options = {}) {
10739
10750
  ...forkedFromSessionId ? { parentSessionId: forkedFromSessionId } : {},
10740
10751
  ...forkedFromMessageId ? { forkedFromMessageId } : {},
10741
10752
  ...importedFromClaudeSessionId ? { importedFromClaudeSessionId } : {},
10753
+ ...importTitle ? { summary: { text: importTitle, updatedAt: Date.now() } } : {},
10742
10754
  ...isAssistantVariant ? { variant: "assistant" } : {},
10743
10755
  // B-091: sessions the assistant dispatched (daemon spawn RPC exports
10744
10756
  // HAPPY_SPAWNED_BY, B-069) are born with the 'assistant' tag so every
@@ -15096,7 +15108,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15096
15108
  process.exit(0);
15097
15109
  } else if (subcommand === "install-terminal-hooks") {
15098
15110
  try {
15099
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-Czv6GUOw.mjs');
15111
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-l1B-nbWa.mjs');
15100
15112
  const command = parseTerminalHooksArgs(args.slice(1));
15101
15113
  if (command.action === "help") {
15102
15114
  console.log(TERMINAL_HOOKS_HELP);
@@ -15113,7 +15125,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15113
15125
  }
15114
15126
  } else if (subcommand === "spawn") {
15115
15127
  try {
15116
- const { handleSpawnCommand } = await import('./spawn-D3D-H-VF.mjs');
15128
+ const { handleSpawnCommand } = await import('./spawn-BzbPyTHU.mjs');
15117
15129
  await handleSpawnCommand(args.slice(1));
15118
15130
  } catch (error) {
15119
15131
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15125,7 +15137,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15125
15137
  return;
15126
15138
  } else if (subcommand === "send") {
15127
15139
  try {
15128
- const { handleSendCommand } = await import('./send-DliNFuy7.mjs');
15140
+ const { handleSendCommand } = await import('./send-DEhUWg8v.mjs');
15129
15141
  await handleSendCommand(args.slice(1));
15130
15142
  } catch (error) {
15131
15143
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15231,9 +15243,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15231
15243
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
15232
15244
  const projectId = args[3];
15233
15245
  try {
15234
- const { saveGoogleCloudProjectToConfig } = await import('./config-CRCUgh2E.mjs');
15235
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-CFIlcwe9.mjs').then(function (n) { return n.ap; });
15236
- const { ApiClient: ApiClient2 } = await import('./types-CFIlcwe9.mjs').then(function (n) { return n.aq; });
15246
+ const { saveGoogleCloudProjectToConfig } = await import('./config-DAb5saOC.mjs');
15247
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-lSeHEzPR.mjs').then(function (n) { return n.ap; });
15248
+ const { ApiClient: ApiClient2 } = await import('./types-lSeHEzPR.mjs').then(function (n) { return n.aq; });
15237
15249
  let userEmail = void 0;
15238
15250
  try {
15239
15251
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -15264,7 +15276,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15264
15276
  }
15265
15277
  if (geminiSubcommand === "project" && args[2] === "get") {
15266
15278
  try {
15267
- const { readGeminiLocalConfig } = await import('./config-CRCUgh2E.mjs');
15279
+ const { readGeminiLocalConfig } = await import('./config-DAb5saOC.mjs');
15268
15280
  const config = readGeminiLocalConfig();
15269
15281
  if (config.googleCloudProject) {
15270
15282
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -15304,7 +15316,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15304
15316
  process.exit(0);
15305
15317
  }
15306
15318
  try {
15307
- const { runGemini } = await import('./runGemini-wMF-U7zR.mjs');
15319
+ const { runGemini } = await import('./runGemini-0QqaFN1l.mjs');
15308
15320
  let startedBy = void 0;
15309
15321
  for (let i = 1; i < args.length; i++) {
15310
15322
  if (args[i] === "--started-by") {
@@ -15326,7 +15338,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15326
15338
  return;
15327
15339
  } else if (subcommand === "acp") {
15328
15340
  try {
15329
- const { runAcp, resolveAcpAgentConfig } = await import('./index-_t9O9dGp.mjs');
15341
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-D2ZzPm58.mjs');
15330
15342
  let startedBy = void 0;
15331
15343
  let verbose = false;
15332
15344
  const acpArgs = [];
@@ -15366,7 +15378,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15366
15378
  return;
15367
15379
  } else if (subcommand === "openclaw") {
15368
15380
  try {
15369
- const { runOpenClaw } = await import('./runOpenClaw-Za9vMsSB.mjs');
15381
+ const { runOpenClaw } = await import('./runOpenClaw-C6Z6MLHq.mjs');
15370
15382
  let startedBy = void 0;
15371
15383
  let verbose = false;
15372
15384
  let gatewayUrl;
@@ -15417,7 +15429,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15417
15429
  return;
15418
15430
  } else if (subcommand === "mcp" && args.length === 1) {
15419
15431
  try {
15420
- const { handleMcpCommand } = await import('./mcp-Bt4btDMD.mjs');
15432
+ const { handleMcpCommand } = await import('./mcp-ZvHzv_lJ.mjs');
15421
15433
  await handleMcpCommand();
15422
15434
  } catch (error) {
15423
15435
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -1,10 +1,10 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-zefm5lwc.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-zefm5lwc.mjs';
3
- import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-CFIlcwe9.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-DFeZAfz4.mjs';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-Ux5FD_6F.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-Ux5FD_6F.mjs';
3
+ import { h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, p as projectPath } from './types-lSeHEzPR.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-C1hoU_rK.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-NiUS5t0N.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-CgWdwkhB.mjs';
8
8
  import 'node:child_process';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'axios';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-Cietz-nU.cjs');
3
+ var index = require('./index-BLW-smJu.cjs');
4
4
  var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
5
5
  require('chalk');
6
6
  require('node:os');
7
7
  require('node:crypto');
8
- require('./types-Cq7yzNWv.cjs');
8
+ require('./types-C8-WODFE.cjs');
9
9
  require('axios');
10
10
  require('node:util');
11
11
  require('node:fs');
@@ -1,9 +1,9 @@
1
- import { q as query } from './index-NiUS5t0N.mjs';
1
+ import { q as query } from './index-CgWdwkhB.mjs';
2
2
  export { AbortError } from '@anthropic-ai/claude-agent-sdk';
3
3
  import 'chalk';
4
4
  import 'node:os';
5
5
  import 'node:crypto';
6
- import './types-CFIlcwe9.mjs';
6
+ import './types-lSeHEzPR.mjs';
7
7
  import 'axios';
8
8
  import 'node:util';
9
9
  import 'node:fs';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var AcpBackend = require('./AcpBackend-CbMPn2Sx.cjs');
4
- var persistence = require('./types-Cq7yzNWv.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-lM9HBlOx.cjs');
3
+ var AcpBackend = require('./AcpBackend-DMmvLNNM.cjs');
4
+ var persistence = require('./types-C8-WODFE.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-RYkxYWDn.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-Cietz-nU.cjs');
8
+ var index = require('./index-BLW-smJu.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-Cietz-nU.cjs');
5
- require('./types-Cq7yzNWv.cjs');
4
+ require('./index-BLW-smJu.cjs');
5
+ require('./types-C8-WODFE.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-NiUS5t0N.mjs';
3
- import './types-CFIlcwe9.mjs';
2
+ import './index-CgWdwkhB.mjs';
3
+ import './types-lSeHEzPR.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-Cq7yzNWv.cjs');
9
- var index = require('./index-Cietz-nU.cjs');
8
+ var persistence = require('./types-C8-WODFE.cjs');
9
+ var index = require('./index-BLW-smJu.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-CFIlcwe9.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-NiUS5t0N.mjs';
6
+ import { p as projectPath } from './types-lSeHEzPR.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-CgWdwkhB.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-Cq7yzNWv.cjs');
3
+ var persistence = require('./types-C8-WODFE.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -1002,6 +1002,11 @@ interface SpawnSessionOptions {
1002
1002
  * metadata so the import picker hides it. Old daemons ignore the field.
1003
1003
  */
1004
1004
  importedFromClaudeSessionId?: string;
1005
+ /**
1006
+ * B-294: title to stamp on the imported session's metadata (the source
1007
+ * conversation's summary / first prompt). Sanitized daemon-side.
1008
+ */
1009
+ importTitle?: string;
1005
1010
  /**
1006
1011
  * B-051: spawn the machine's assistant (meta-agent) session. The daemon
1007
1012
  * forces cwd to ~/.happy/assistant (the passed `directory` is ignored),
package/dist/lib.d.mts CHANGED
@@ -1002,6 +1002,11 @@ interface SpawnSessionOptions {
1002
1002
  * metadata so the import picker hides it. Old daemons ignore the field.
1003
1003
  */
1004
1004
  importedFromClaudeSessionId?: string;
1005
+ /**
1006
+ * B-294: title to stamp on the imported session's metadata (the source
1007
+ * conversation's summary / first prompt). Sanitized daemon-side.
1008
+ */
1009
+ importTitle?: string;
1005
1010
  /**
1006
1011
  * B-051: spawn the machine's assistant (meta-agent) session. The daemon
1007
1012
  * forces cwd to ~/.happy/assistant (the passed `directory` is ignored),
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-CFIlcwe9.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-lSeHEzPR.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'node:util';
@@ -3,9 +3,9 @@
3
3
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
4
4
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
5
5
  var z = require('zod');
6
- var index = require('./index-Cietz-nU.cjs');
6
+ var index = require('./index-BLW-smJu.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-Cq7yzNWv.cjs');
8
+ var persistence = require('./types-C8-WODFE.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -1,9 +1,9 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { z } from 'zod';
4
- import { p as pushClipboardViaDaemon } from './index-NiUS5t0N.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-CgWdwkhB.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-CFIlcwe9.mjs';
6
+ import { l as logger } from './types-lSeHEzPR.mjs';
7
7
  import 'chalk';
8
8
  import 'node:os';
9
9
  import 'node:crypto';
@@ -2,10 +2,10 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { join } from 'node:path';
5
- import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-CFIlcwe9.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-NiUS5t0N.mjs';
7
- import { A as AcpBackend } from './AcpBackend-zefm5lwc.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-CRCUgh2E.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-lSeHEzPR.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-CgWdwkhB.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-Ux5FD_6F.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-DAb5saOC.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-Cq7yzNWv.cjs');
8
- var index = require('./index-Cietz-nU.cjs');
9
- var AcpBackend = require('./AcpBackend-CbMPn2Sx.cjs');
10
- var config = require('./config-CYpWD6Tc.cjs');
7
+ var persistence = require('./types-C8-WODFE.cjs');
8
+ var index = require('./index-BLW-smJu.cjs');
9
+ var AcpBackend = require('./AcpBackend-DMmvLNNM.cjs');
10
+ var config = require('./config-Dkn5KcXp.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-CFIlcwe9.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-DFeZAfz4.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-NiUS5t0N.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-lSeHEzPR.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-C1hoU_rK.mjs';
8
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-CgWdwkhB.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-Cq7yzNWv.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-lM9HBlOx.cjs');
10
- var index = require('./index-Cietz-nU.cjs');
8
+ var persistence = require('./types-C8-WODFE.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-RYkxYWDn.cjs');
10
+ var index = require('./index-BLW-smJu.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-Cq7yzNWv.cjs');
7
- var index = require('./index-Cietz-nU.cjs');
6
+ var persistence = require('./types-C8-WODFE.cjs');
7
+ var index = require('./index-BLW-smJu.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-CFIlcwe9.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-NiUS5t0N.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-lSeHEzPR.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-CgWdwkhB.mjs';
6
6
  import 'axios';
7
7
  import 'node:util';
8
8
  import 'node:os';
@@ -1,8 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync, statSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-NiUS5t0N.mjs';
5
- import { l as logger } from './types-CFIlcwe9.mjs';
4
+ import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-CgWdwkhB.mjs';
5
+ import { l as logger } from './types-lSeHEzPR.mjs';
6
6
  import 'node:os';
7
7
  import 'node:crypto';
8
8
  import 'cross-spawn';
@@ -3,8 +3,8 @@
3
3
  var chalk = require('chalk');
4
4
  var node_fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var index = require('./index-Cietz-nU.cjs');
7
- var persistence = require('./types-Cq7yzNWv.cjs');
6
+ var index = require('./index-BLW-smJu.cjs');
7
+ var persistence = require('./types-C8-WODFE.cjs');
8
8
  require('node:os');
9
9
  require('node:crypto');
10
10
  require('cross-spawn');
@@ -51,7 +51,7 @@ var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
51
51
  var pty__namespace = /*#__PURE__*/_interopNamespaceDefault(pty);
52
52
 
53
53
  var name = "very-happy-cli";
54
- var version = "0.2.105";
54
+ var version = "0.2.106";
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.105",
168
- "very-happy-tools-x64-darwin": "0.2.105",
169
- "very-happy-tools-arm64-linux": "0.2.105",
170
- "very-happy-tools-x64-linux": "0.2.105",
171
- "very-happy-tools-arm64-win32": "0.2.105",
172
- "very-happy-tools-x64-win32": "0.2.105"
167
+ "very-happy-tools-arm64-darwin": "0.2.106",
168
+ "very-happy-tools-x64-darwin": "0.2.106",
169
+ "very-happy-tools-arm64-linux": "0.2.106",
170
+ "very-happy-tools-x64-linux": "0.2.106",
171
+ "very-happy-tools-arm64-win32": "0.2.106",
172
+ "very-happy-tools-x64-win32": "0.2.106"
173
173
  };
174
174
  var devDependencies = {
175
175
  "@slopus/happy-wire": "workspace:*",
@@ -1603,7 +1603,7 @@ class RpcHandlerManager {
1603
1603
  }
1604
1604
  }
1605
1605
 
1606
- 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-Cq7yzNWv.cjs', document.baseURI).href))));
1606
+ 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-C8-WODFE.cjs', document.baseURI).href))));
1607
1607
  function projectPath() {
1608
1608
  const path = path$1.resolve(__dirname$1, "..");
1609
1609
  return path;
@@ -14421,7 +14421,7 @@ class ApiMachineClient {
14421
14421
  }
14422
14422
  });
14423
14423
  this.rpcHandlerManager.registerHandler("claude-import-session", async (params) => {
14424
- const { directory, claudeSessionId, approvedNewDirectoryCreation, permissionMode } = params || {};
14424
+ const { directory, claudeSessionId, approvedNewDirectoryCreation, permissionMode, title } = params || {};
14425
14425
  if (typeof directory !== "string" || directory.length === 0) {
14426
14426
  throw new Error("directory is required");
14427
14427
  }
@@ -14447,7 +14447,12 @@ class ApiMachineClient {
14447
14447
  agent: "claude",
14448
14448
  resumeClaudeSessionId: newClaudeSessionId,
14449
14449
  importedFromClaudeSessionId: claudeSessionId,
14450
- permissionMode: typeof permissionMode === "string" ? permissionMode : void 0
14450
+ permissionMode: typeof permissionMode === "string" ? permissionMode : void 0,
14451
+ // B-294: the imported session carries the source title from the
14452
+ // start. The CLI's own title generator only fires on a new user
14453
+ // message and skips a session that already has a summary, so an
14454
+ // import without this stays "New chat" forever.
14455
+ importTitle: typeof title === "string" ? title : void 0
14451
14456
  });
14452
14457
  } catch (error) {
14453
14458
  await discardForkedSession(projectDir, newClaudeSessionId);
@@ -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.105";
32
+ var version = "0.2.106";
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.105",
146
- "very-happy-tools-x64-darwin": "0.2.105",
147
- "very-happy-tools-arm64-linux": "0.2.105",
148
- "very-happy-tools-x64-linux": "0.2.105",
149
- "very-happy-tools-arm64-win32": "0.2.105",
150
- "very-happy-tools-x64-win32": "0.2.105"
145
+ "very-happy-tools-arm64-darwin": "0.2.106",
146
+ "very-happy-tools-x64-darwin": "0.2.106",
147
+ "very-happy-tools-arm64-linux": "0.2.106",
148
+ "very-happy-tools-x64-linux": "0.2.106",
149
+ "very-happy-tools-arm64-win32": "0.2.106",
150
+ "very-happy-tools-x64-win32": "0.2.106"
151
151
  };
152
152
  var devDependencies = {
153
153
  "@slopus/happy-wire": "workspace:*",
@@ -14399,7 +14399,7 @@ class ApiMachineClient {
14399
14399
  }
14400
14400
  });
14401
14401
  this.rpcHandlerManager.registerHandler("claude-import-session", async (params) => {
14402
- const { directory, claudeSessionId, approvedNewDirectoryCreation, permissionMode } = params || {};
14402
+ const { directory, claudeSessionId, approvedNewDirectoryCreation, permissionMode, title } = params || {};
14403
14403
  if (typeof directory !== "string" || directory.length === 0) {
14404
14404
  throw new Error("directory is required");
14405
14405
  }
@@ -14425,7 +14425,12 @@ class ApiMachineClient {
14425
14425
  agent: "claude",
14426
14426
  resumeClaudeSessionId: newClaudeSessionId,
14427
14427
  importedFromClaudeSessionId: claudeSessionId,
14428
- permissionMode: typeof permissionMode === "string" ? permissionMode : void 0
14428
+ permissionMode: typeof permissionMode === "string" ? permissionMode : void 0,
14429
+ // B-294: the imported session carries the source title from the
14430
+ // start. The CLI's own title generator only fires on a new user
14431
+ // message and skips a session that already has a summary, so an
14432
+ // import without this stays "New chat" forever.
14433
+ importTitle: typeof title === "string" ? title : void 0
14429
14434
  });
14430
14435
  } catch (error) {
14431
14436
  await discardForkedSession(projectDir, newClaudeSessionId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.105",
3
+ "version": "0.2.106",
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.105",
117
- "very-happy-tools-x64-darwin": "0.2.105",
118
- "very-happy-tools-arm64-linux": "0.2.105",
119
- "very-happy-tools-x64-linux": "0.2.105",
120
- "very-happy-tools-arm64-win32": "0.2.105",
121
- "very-happy-tools-x64-win32": "0.2.105"
116
+ "very-happy-tools-arm64-darwin": "0.2.106",
117
+ "very-happy-tools-x64-darwin": "0.2.106",
118
+ "very-happy-tools-arm64-linux": "0.2.106",
119
+ "very-happy-tools-x64-linux": "0.2.106",
120
+ "very-happy-tools-arm64-win32": "0.2.106",
121
+ "very-happy-tools-x64-win32": "0.2.106"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",