very-happy-cli 0.2.135 → 0.2.137

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 (43) hide show
  1. package/dist/{AcpBackend-C0Bwx6bc.cjs → AcpBackend-Bcmm51Ya.cjs} +2 -2
  2. package/dist/{AcpBackend-CkDpu1n_.mjs → AcpBackend-POcimRNQ.mjs} +2 -2
  3. package/dist/{AcpSessionManager-DqvUp-UU.cjs → AcpSessionManager-CjrwSZbh.cjs} +1 -1
  4. package/dist/{AcpSessionManager-DB_mfFaH.mjs → AcpSessionManager-D54Juu2-.mjs} +1 -1
  5. package/dist/{agentGuidance-DlZM_YPV.cjs → agentGuidance-D1tKg2UW.cjs} +1 -1
  6. package/dist/{agentGuidance-7MByWxKj.mjs → agentGuidance-DulugsMk.mjs} +1 -1
  7. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  8. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  9. package/dist/{config-DzvbcL_x.mjs → config-C1gQprK_.mjs} +4 -4
  10. package/dist/{config-BO0ZHyoB.cjs → config-Dr3A4IGp.cjs} +4 -4
  11. package/dist/{index-DNbKbe23.cjs → index-B0KIJdSt.cjs} +98 -32
  12. package/dist/{index-C33JB4xB.mjs → index-B11rFE7f.mjs} +7 -7
  13. package/dist/{index-BEpZjXs4.cjs → index-C3JqT3Ql.cjs} +6 -6
  14. package/dist/{index-CpEdOGpe.mjs → index-C3agc8KT.mjs} +4 -4
  15. package/dist/{index-gefLe1Bk.mjs → index-D5MRxCHs.mjs} +94 -28
  16. package/dist/{index-DHI6Y1xW.cjs → index-hGg5G5uO.cjs} +4 -4
  17. package/dist/index.cjs +4 -4
  18. package/dist/index.mjs +4 -4
  19. package/dist/{installTerminalHooks-gmWKACNb.cjs → installTerminalHooks-Culr259-.cjs} +4 -4
  20. package/dist/{installTerminalHooks-BWoHGCew.mjs → installTerminalHooks-DfZTXVWO.mjs} +4 -4
  21. package/dist/lib.cjs +2 -2
  22. package/dist/lib.mjs +2 -2
  23. package/dist/{limits-CPTgiQ9A.mjs → limits-CAD4UF8w.mjs} +7 -7
  24. package/dist/{limits-K17AgMHD.cjs → limits-CJrrAhB4.cjs} +7 -7
  25. package/dist/{mcp-CK1NCZm0.cjs → mcp-5Jf6V4eb.cjs} +4 -4
  26. package/dist/{mcp-DhuxpwTB.mjs → mcp-CdnZbYKV.mjs} +4 -4
  27. package/dist/{runGemini-BVJE7LZl.mjs → runGemini-CwWEorS7.mjs} +6 -6
  28. package/dist/{runGemini-n0wD2Z9R.cjs → runGemini-GjBPzXEt.cjs} +6 -6
  29. package/dist/{runOpenClaw-CJaIYpB7.mjs → runOpenClaw-BZHHy9T7.mjs} +5 -5
  30. package/dist/{runOpenClaw-fYx1XweW.cjs → runOpenClaw-DGe5c571.cjs} +5 -5
  31. package/dist/{send-fWHOFJV9.mjs → send-BN2PncAH.mjs} +4 -4
  32. package/dist/{send-WlJ4r3U2.cjs → send-teYpfTtw.cjs} +4 -4
  33. package/dist/{sessions-5fJxQ2xj.mjs → sessions-TLUfYdLX.mjs} +4 -4
  34. package/dist/{sessions-Cx_3cvN6.cjs → sessions-qP1YUf5E.cjs} +4 -4
  35. package/dist/{spawn-CF1ZV-YH.mjs → spawn-D3P8wJ_r.mjs} +4 -4
  36. package/dist/{spawn-DVJtNwWN.cjs → spawn-GekaZ7h2.cjs} +4 -4
  37. package/dist/{teams-BbYi0fWG.cjs → teams-BSqAW2S5.cjs} +4 -4
  38. package/dist/{teams-gzvKrMfn.mjs → teams-WSjEXh4d.mjs} +4 -4
  39. package/dist/{todo-BAK2DVLV.mjs → todo-BblDgT77.mjs} +3 -3
  40. package/dist/{todo-DHY20tpD.cjs → todo-DsnXWl77.cjs} +3 -3
  41. package/dist/{types-BEXGahmj.mjs → types-B8g_V-LQ.mjs} +19 -5
  42. package/dist/{types-DjAHWb4J.cjs → types-BAhQF6Xp.cjs} +20 -6
  43. package/package.json +7 -7
@@ -1,13 +1,13 @@
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, tmpdir } from 'node:os';
3
3
  import { randomUUID, randomInt, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
4
- import { j as getProjectPath, g as BUILTIN_TODO_DISCOVERY, p as projectPath, k as initializeSandbox, w as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, h as delay, l as AsyncLock, S as STREAM_DELTA_MAX_CHARS, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, m as commandOnPath, n as deriveLocalCliUpdateSummary, o as AGENT_VERSION_SOURCES, q as isClaudeSessionId, r as getLocalHappyAgentCredentialPath, t as readLocalHappyAgentCredentials, u as parseExactVersion, v as compareExactVersions, x as extractCompleteLines, y as decideBackfill, z as parseTerminalHookPayload, C as tmuxArgs, D as scrubTmuxClientEnv, E as decideMirrorBinding, F as MIRROR_BACKFILL_LINES_DEFAULT, G as mirrorLineKey, H as mirrorLocalId, J as detectCLIAvailability, K as detectResumeSupport, L as summarizeSpawnSessionForLog, N as shellescape, A as ApiClient, O as fetchCliUpdateState, P as resolveCliUpdateCheckInterval, Q as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, i as isValidSessionId, T as listVhTerminals, U as isValidTerminalId, V as readVhTerminal, W as sendToVhTerminal, X as ContextUsageSchema, Y as TITLE_PROMPT_PREFIX, Z as BOARD_ANALYZER_PROMPT_PREFIX, f as connectionState, _ as startOfflineReconnection, c as createEnvelope, $ as CodexAppServerClient } from './types-BEXGahmj.mjs';
5
- import { z as readDaemonState, l as logger, c as configuration, A as clearDaemonState, B as ensurePrivateDirectory, D as hardenPrivateFile, p as packageJson, g as readSettings, E as readCredentials, s as credentialRelayProblem, i as encodeBase64, F as readSettingsOutcome, G as updateSettings, H as encodeBase64Url, m as decodeBase64, I as writeCredentialsLegacy, J as writeCredentialsDataKey, d as readCredentialsForConfiguredRelay, j as encrypt, r as readPersistedSessions, w as writePrivateFileSync, K as decryptWithDataKey, L as decryptLegacy, M as persistSession, k as decrypt, f as ensurePrivateDirectorySync, N as acquireDaemonLock, O as deletePersistedSessions, P as writeDaemonState, Q as writeSettings, R as releaseDaemonLock, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES, S as clearCredentials, T as clearMachineId, U as SandboxConfigSchema, V as getLatestDaemonLog } from './limits-CPTgiQ9A.mjs';
4
+ import { j as getProjectPath, g as BUILTIN_TODO_DISCOVERY, p as projectPath, k as initializeSandbox, w as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, h as delay, l as AsyncLock, S as STREAM_DELTA_MAX_CHARS, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, m as commandOnPath, n as deriveLocalCliUpdateSummary, o as AGENT_VERSION_SOURCES, q as isClaudeSessionId, r as getLocalHappyAgentCredentialPath, t as readLocalHappyAgentCredentials, u as parseExactVersion, v as compareExactVersions, x as extractCompleteLines, y as decideBackfill, z as parseTerminalHookPayload, C as tmuxArgs, D as scrubTmuxClientEnv, E as decideMirrorBinding, F as MIRROR_BACKFILL_LINES_DEFAULT, G as mirrorLineKey, H as mirrorLocalId, J as detectCLIAvailability, K as detectResumeSupport, L as summarizeSpawnSessionForLog, N as shellescape, A as ApiClient, O as fetchCliUpdateState, P as resolveCliUpdateCheckInterval, Q as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, i as isValidSessionId, T as listVhTerminals, U as isValidTerminalId, V as readVhTerminal, W as sendToVhTerminal, X as ContextUsageSchema, Y as TITLE_PROMPT_PREFIX, Z as BOARD_ANALYZER_PROMPT_PREFIX, f as connectionState, _ as startOfflineReconnection, c as createEnvelope, $ as CodexAppServerClient } from './types-B8g_V-LQ.mjs';
5
+ import { z as readDaemonState, l as logger, c as configuration, A as clearDaemonState, B as ensurePrivateDirectory, D as hardenPrivateFile, p as packageJson, g as readSettings, E as readCredentials, s as credentialRelayProblem, i as encodeBase64, F as readSettingsOutcome, G as updateSettings, H as encodeBase64Url, m as decodeBase64, I as writeCredentialsLegacy, J as writeCredentialsDataKey, d as readCredentialsForConfiguredRelay, j as encrypt, r as readPersistedSessions, w as writePrivateFileSync, K as decryptWithDataKey, L as decryptLegacy, M as persistSession, k as decrypt, f as ensurePrivateDirectorySync, N as acquireDaemonLock, O as deletePersistedSessions, P as writeDaemonState, Q as writeSettings, R as releaseDaemonLock, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES, S as clearCredentials, T as clearMachineId, U as SandboxConfigSchema, V as getLatestDaemonLog } from './limits-CAD4UF8w.mjs';
6
6
  import spawn$1, { spawn } from 'cross-spawn';
7
7
  import path, { join, resolve, basename, isAbsolute, dirname, sep, delimiter, normalize } from 'node:path';
8
8
  import { createInterface } from 'node:readline';
9
9
  import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, unlinkSync, renameSync, writeFileSync, accessSync, constants, openSync, fsyncSync, closeSync, rmSync as rmSync$1, chmodSync as chmodSync$1 } from 'node:fs';
10
- import { f as trimIdent, A as AGENT_GUIDANCE, t as teamScopePath, T as TeamConnectionPreflightError, e as createTeamsClient, P as PREVIEW_TOOL_NAME, R as REPORT_PROGRESS_TOOL_NAME, g as TEAM_TOOL_NAMES, r as registerTeamsTools, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, h as REPORT_PROGRESS_TOOL_TITLE, i as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-7MByWxKj.mjs';
10
+ import { f as trimIdent, A as AGENT_GUIDANCE, t as teamScopePath, T as TeamConnectionPreflightError, e as createTeamsClient, P as PREVIEW_TOOL_NAME, R as REPORT_PROGRESS_TOOL_NAME, g as TEAM_TOOL_NAMES, r as registerTeamsTools, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, h as REPORT_PROGRESS_TOOL_TITLE, i as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-DulugsMk.mjs';
11
11
  import { readFile, writeFile, rename, unlink, mkdir, symlink, rm, readlink, lstat, stat, open as open$1, appendFile } from 'node:fs/promises';
12
12
  import fs, { watch, access } from 'fs/promises';
13
13
  import { useStdout, useInput, Box, Text, render } from 'ink';
@@ -320,6 +320,20 @@ class Session {
320
320
  sessionId;
321
321
  mode = "local";
322
322
  thinking = false;
323
+ /**
324
+ * Window after a user-initiated abort during which stray promise rejections
325
+ * from tearing down the SDK query (MCP transports, in-flight tool calls,
326
+ * the aborted streaming generator) are benign teardown noise — NOT a real
327
+ * crash. The process-level unhandledRejection/uncaughtException handlers
328
+ * must not treat them as fatal and force-archive the session (the reported
329
+ * "点终止就 archive" bug). Self-expiring so a genuine later crash still
330
+ * archives normally.
331
+ */
332
+ abortingUntil = 0;
333
+ markAborting = (windowMs = 8e3) => {
334
+ this.abortingUntil = Date.now() + windowMs;
335
+ };
336
+ isAborting = () => Date.now() < this.abortingUntil;
323
337
  /**
324
338
  * Account-encrypted notification producer. Set lazily once we have a
325
339
  * server session id (notifications are addressed per session). May be
@@ -3903,6 +3917,18 @@ function createTurnSteeringController() {
3903
3917
  throw error;
3904
3918
  }
3905
3919
  },
3920
+ /**
3921
+ * Interrupt the current turn WITHOUT injecting a follow-up message —
3922
+ * used by the stop button. Like steer it keeps the streaming query
3923
+ * alive (same process, same claudeSessionId); unlike steer it does not
3924
+ * set the steering flag, so the turn simply ends and the query waits
3925
+ * for the next user message. Returns false when no query is attached.
3926
+ */
3927
+ async interruptTurn() {
3928
+ if (!interrupt) return false;
3929
+ await interrupt();
3930
+ return true;
3931
+ },
3906
3932
  consumeReady() {
3907
3933
  if (!steering) return false;
3908
3934
  steering = false;
@@ -4011,6 +4037,7 @@ class LaunchModeGate {
4011
4037
  }
4012
4038
  }
4013
4039
 
4040
+ const ABORT_INTERRUPT_GRACE_MS = 4e3;
4014
4041
  async function claudeRemoteLauncher(session, onPermissionModeChange, onEffectivePermissionMode, onPromptFinalized) {
4015
4042
  logger.debug("[claudeRemoteLauncher] Starting remote launcher");
4016
4043
  const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
@@ -4059,9 +4086,29 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4059
4086
  }
4060
4087
  async function doAbort() {
4061
4088
  logger.debug("[remote]: doAbort");
4089
+ session.markAborting();
4062
4090
  session.onAbort();
4091
+ if (session.thinking) {
4092
+ const interrupted = await turnSteering.interruptTurn().catch((e) => {
4093
+ logger.debug("[remote]: interruptTurn threw, falling back to hard abort", e);
4094
+ return false;
4095
+ });
4096
+ if (interrupted && await waitForThinkingToStop(ABORT_INTERRUPT_GRACE_MS)) {
4097
+ logger.debug("[remote]: interrupt stopped the turn gracefully; query kept alive");
4098
+ return;
4099
+ }
4100
+ logger.debug("[remote]: interrupt did not stop the turn in time; escalating to hard abort");
4101
+ }
4063
4102
  await abort();
4064
4103
  }
4104
+ async function waitForThinkingToStop(graceMs) {
4105
+ const deadline = Date.now() + graceMs;
4106
+ while (Date.now() < deadline) {
4107
+ if (!session.thinking) return true;
4108
+ await new Promise((resolve) => setTimeout(resolve, 100));
4109
+ }
4110
+ return !session.thinking;
4111
+ }
4065
4112
  async function doSwitch() {
4066
4113
  logger.debug("[remote]: doSwitch");
4067
4114
  if (!exitReason) {
@@ -7477,10 +7524,13 @@ function buildResumeLaunch(session, options = {}) {
7477
7524
  const { metadata } = session;
7478
7525
  const flavor = resolveFlavor(metadata);
7479
7526
  if (flavor === "codex") {
7480
- if (!metadata.codexThreadId) {
7481
- throw new Error(`Happy session ${session.id} is missing its Codex thread ID.`);
7527
+ const args = ["codex"];
7528
+ if (options.freshConversation) ; else {
7529
+ if (!metadata.codexThreadId) {
7530
+ throw new Error(`Happy session ${session.id} is missing its Codex thread ID.`);
7531
+ }
7532
+ args.push("--resume", metadata.codexThreadId);
7482
7533
  }
7483
- const args = ["codex", "--resume", metadata.codexThreadId];
7484
7534
  if (options.startedBy) {
7485
7535
  args.push("--started-by", options.startedBy);
7486
7536
  }
@@ -7490,9 +7540,6 @@ function buildResumeLaunch(session, options = {}) {
7490
7540
  };
7491
7541
  }
7492
7542
  if (flavor === "claude") {
7493
- if (!metadata.claudeSessionId) {
7494
- throw new Error(`Happy session ${session.id} is missing its Claude session ID.`);
7495
- }
7496
7543
  const args = ["claude"];
7497
7544
  if (options.claudeStartingMode) {
7498
7545
  args.push("--happy-starting-mode", options.claudeStartingMode);
@@ -7500,7 +7547,12 @@ function buildResumeLaunch(session, options = {}) {
7500
7547
  if (options.startedBy) {
7501
7548
  args.push("--started-by", options.startedBy);
7502
7549
  }
7503
- args.push("--resume", metadata.claudeSessionId);
7550
+ if (options.freshConversation) ; else {
7551
+ if (!metadata.claudeSessionId) {
7552
+ throw new Error(`Happy session ${session.id} is missing its Claude session ID.`);
7553
+ }
7554
+ args.push("--resume", metadata.claudeSessionId);
7555
+ }
7504
7556
  return {
7505
7557
  cwd: metadata.path,
7506
7558
  args
@@ -10799,12 +10851,18 @@ async function startDaemon() {
10799
10851
  cwdExists: (p) => existsSync$1(p),
10800
10852
  conversationExists: (cwd, claudeSessionId) => existsSync$1(join$1(getProjectPath(cwd), `${claudeSessionId}.jsonl`))
10801
10853
  });
10854
+ let freshConversation = false;
10802
10855
  if (!precheck.ok) {
10803
- return { type: "error", errorMessage: `resume-precheck:${precheck.reason}: ${precheck.detail}` };
10856
+ if (precheck.reason === "conversation-missing") {
10857
+ logger.debug(`[DAEMON RUN] resume: transcript for ${happySessionId} is gone (${precheck.detail}); starting a fresh conversation in ${metadata.path}`);
10858
+ freshConversation = true;
10859
+ } else {
10860
+ return { type: "error", errorMessage: `resume-precheck:${precheck.reason}: ${precheck.detail}` };
10861
+ }
10804
10862
  }
10805
10863
  const launch = buildResumeLaunch(
10806
10864
  { id: happySessionId, active: true, metadata },
10807
- { startedBy: "daemon", claudeStartingMode: "remote" }
10865
+ { startedBy: "daemon", claudeStartingMode: "remote", freshConversation }
10808
10866
  );
10809
10867
  const model = sanitizeResumeModel(options?.model);
10810
10868
  if (model) launch.args.push("--model", model);
@@ -12418,7 +12476,7 @@ function registerSideQuestionHandler(rpc, deps) {
12418
12476
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
12419
12477
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
12420
12478
  const run = deps.run ?? (async (input) => {
12421
- const { query } = await import('./index-CpEdOGpe.mjs');
12479
+ const { query } = await import('./index-C3agc8KT.mjs');
12422
12480
  return runSideQuestion(query, input);
12423
12481
  });
12424
12482
  const slots = /* @__PURE__ */ new Map();
@@ -13560,10 +13618,18 @@ async function runClaude(credentials, options = {}) {
13560
13618
  });
13561
13619
  process.on("uncaughtException", (error) => {
13562
13620
  logger.debug("[START] Uncaught exception:", error);
13621
+ if (currentSession?.isAborting()) {
13622
+ logger.debug("[START] Uncaught exception during abort teardown \u2014 swallowing, not archiving");
13623
+ return;
13624
+ }
13563
13625
  void cleanup({ archive: true });
13564
13626
  });
13565
13627
  process.on("unhandledRejection", (reason) => {
13566
13628
  logger.debug("[START] Unhandled rejection:", reason);
13629
+ if (currentSession?.isAborting()) {
13630
+ logger.debug("[START] Unhandled rejection during abort teardown \u2014 swallowing, not archiving");
13631
+ return;
13632
+ }
13567
13633
  void cleanup({ archive: true });
13568
13634
  });
13569
13635
  registerKillSessionHandler(session.rpcHandlerManager, () => cleanup({ archive: true }), session);
@@ -17499,7 +17565,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17499
17565
  process.exit(0);
17500
17566
  } else if (subcommand === "install-terminal-hooks") {
17501
17567
  try {
17502
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-BWoHGCew.mjs');
17568
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-DfZTXVWO.mjs');
17503
17569
  const command = parseTerminalHooksArgs(args.slice(1));
17504
17570
  if (command.action === "help") {
17505
17571
  console.log(TERMINAL_HOOKS_HELP);
@@ -17516,7 +17582,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17516
17582
  }
17517
17583
  } else if (subcommand === "spawn") {
17518
17584
  try {
17519
- const { handleSpawnCommand } = await import('./spawn-CF1ZV-YH.mjs');
17585
+ const { handleSpawnCommand } = await import('./spawn-D3P8wJ_r.mjs');
17520
17586
  await handleSpawnCommand(args.slice(1));
17521
17587
  } catch (error) {
17522
17588
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17528,7 +17594,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17528
17594
  return;
17529
17595
  } else if (subcommand === "sessions") {
17530
17596
  try {
17531
- const { handleSessionsCommand } = await import('./sessions-5fJxQ2xj.mjs');
17597
+ const { handleSessionsCommand } = await import('./sessions-TLUfYdLX.mjs');
17532
17598
  await handleSessionsCommand(args.slice(1));
17533
17599
  } catch (error) {
17534
17600
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17540,7 +17606,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17540
17606
  return;
17541
17607
  } else if (subcommand === "send") {
17542
17608
  try {
17543
- const { handleSendCommand } = await import('./send-fWHOFJV9.mjs');
17609
+ const { handleSendCommand } = await import('./send-BN2PncAH.mjs');
17544
17610
  await handleSendCommand(args.slice(1));
17545
17611
  } catch (error) {
17546
17612
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17646,9 +17712,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17646
17712
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
17647
17713
  const projectId = args[3];
17648
17714
  try {
17649
- const { saveGoogleCloudProjectToConfig } = await import('./config-DzvbcL_x.mjs');
17650
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./limits-CPTgiQ9A.mjs').then(function (n) { return n.W; });
17651
- const { ApiClient: ApiClient2 } = await import('./types-BEXGahmj.mjs').then(function (n) { return n.a0; });
17715
+ const { saveGoogleCloudProjectToConfig } = await import('./config-C1gQprK_.mjs');
17716
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./limits-CAD4UF8w.mjs').then(function (n) { return n.W; });
17717
+ const { ApiClient: ApiClient2 } = await import('./types-B8g_V-LQ.mjs').then(function (n) { return n.a0; });
17652
17718
  let userEmail = void 0;
17653
17719
  try {
17654
17720
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -17679,7 +17745,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17679
17745
  }
17680
17746
  if (geminiSubcommand === "project" && args[2] === "get") {
17681
17747
  try {
17682
- const { readGeminiLocalConfig } = await import('./config-DzvbcL_x.mjs');
17748
+ const { readGeminiLocalConfig } = await import('./config-C1gQprK_.mjs');
17683
17749
  const config = readGeminiLocalConfig();
17684
17750
  if (config.googleCloudProject) {
17685
17751
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -17719,7 +17785,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17719
17785
  process.exit(0);
17720
17786
  }
17721
17787
  try {
17722
- const { runGemini } = await import('./runGemini-BVJE7LZl.mjs');
17788
+ const { runGemini } = await import('./runGemini-CwWEorS7.mjs');
17723
17789
  let startedBy = void 0;
17724
17790
  for (let i = 1; i < args.length; i++) {
17725
17791
  if (args[i] === "--started-by") {
@@ -17749,7 +17815,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17749
17815
  }
17750
17816
  };
17751
17817
  try {
17752
- const { runAcp, resolveAcpAgentConfig } = await import('./index-C33JB4xB.mjs');
17818
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-B11rFE7f.mjs');
17753
17819
  const parsed = parsePiRunnerArgs(args.slice(1));
17754
17820
  const resolved = resolveAcpAgentConfig(["pi", ...parsed.passthrough]);
17755
17821
  const { credentials } = await authAndSetupMachineIfNeeded();
@@ -17777,7 +17843,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17777
17843
  return;
17778
17844
  } else if (subcommand === "acp") {
17779
17845
  try {
17780
- const { runAcp, resolveAcpAgentConfig } = await import('./index-C33JB4xB.mjs');
17846
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-B11rFE7f.mjs');
17781
17847
  let startedBy = void 0;
17782
17848
  let verbose = false;
17783
17849
  const acpArgs = [];
@@ -17817,7 +17883,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17817
17883
  return;
17818
17884
  } else if (subcommand === "openclaw") {
17819
17885
  try {
17820
- const { runOpenClaw } = await import('./runOpenClaw-CJaIYpB7.mjs');
17886
+ const { runOpenClaw } = await import('./runOpenClaw-BZHHy9T7.mjs');
17821
17887
  let startedBy = void 0;
17822
17888
  let verbose = false;
17823
17889
  let gatewayUrl;
@@ -17868,7 +17934,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17868
17934
  return;
17869
17935
  } else if (subcommand === "todo") {
17870
17936
  try {
17871
- const { handleTodoCommand } = await import('./todo-BAK2DVLV.mjs');
17937
+ const { handleTodoCommand } = await import('./todo-BblDgT77.mjs');
17872
17938
  await handleTodoCommand(args.slice(1));
17873
17939
  } catch (error) {
17874
17940
  console.error(JSON.stringify({ error: error instanceof Error ? error.message : "Todo command failed" }));
@@ -17877,7 +17943,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17877
17943
  return;
17878
17944
  } else if (subcommand === "teams") {
17879
17945
  try {
17880
- const { handleTeamsCommand } = await import('./teams-gzvKrMfn.mjs');
17946
+ const { handleTeamsCommand } = await import('./teams-WSjEXh4d.mjs');
17881
17947
  await handleTeamsCommand(args.slice(1));
17882
17948
  } catch (error) {
17883
17949
  console.error(error instanceof Error ? error.message : "Teams command failed");
@@ -17886,7 +17952,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17886
17952
  return;
17887
17953
  } else if (subcommand === "mcp" && args.length === 1) {
17888
17954
  try {
17889
- const { handleMcpCommand } = await import('./mcp-DhuxpwTB.mjs');
17955
+ const { handleMcpCommand } = await import('./mcp-CdnZbYKV.mjs');
17890
17956
  await handleMcpCommand();
17891
17957
  } catch (error) {
17892
17958
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-DNbKbe23.cjs');
3
+ var index = require('./index-B0KIJdSt.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-DjAHWb4J.cjs');
8
+ require('./types-BAhQF6Xp.cjs');
9
9
  require('axios');
10
- require('./limits-K17AgMHD.cjs');
10
+ require('./limits-CJrrAhB4.cjs');
11
11
  require('node:fs/promises');
12
12
  require('node:fs');
13
13
  require('node:path');
@@ -31,7 +31,7 @@ require('fs');
31
31
  require('node:readline');
32
32
  require('@anthropic-ai/sandbox-runtime');
33
33
  require('expo-server-sdk');
34
- require('./agentGuidance-DlZM_YPV.cjs');
34
+ require('./agentGuidance-D1tKg2UW.cjs');
35
35
  require('ink');
36
36
  require('react');
37
37
  require('ps-list');
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-DNbKbe23.cjs');
5
- require('./limits-K17AgMHD.cjs');
4
+ require('./index-B0KIJdSt.cjs');
5
+ require('./limits-CJrrAhB4.cjs');
6
6
  require('zod');
7
- require('./types-DjAHWb4J.cjs');
7
+ require('./types-BAhQF6Xp.cjs');
8
8
  require('node:child_process');
9
9
  require('node:os');
10
10
  require('node:crypto');
@@ -12,7 +12,7 @@ require('cross-spawn');
12
12
  require('node:path');
13
13
  require('node:readline');
14
14
  require('node:fs');
15
- require('./agentGuidance-DlZM_YPV.cjs');
15
+ require('./agentGuidance-D1tKg2UW.cjs');
16
16
  require('node:fs/promises');
17
17
  require('fs/promises');
18
18
  require('ink');
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './index-gefLe1Bk.mjs';
3
- import './limits-CPTgiQ9A.mjs';
2
+ import './index-D5MRxCHs.mjs';
3
+ import './limits-CAD4UF8w.mjs';
4
4
  import 'zod';
5
- import './types-BEXGahmj.mjs';
5
+ import './types-B8g_V-LQ.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:os';
8
8
  import 'node:crypto';
@@ -10,7 +10,7 @@ import 'cross-spawn';
10
10
  import 'node:path';
11
11
  import 'node:readline';
12
12
  import 'node:fs';
13
- import './agentGuidance-7MByWxKj.mjs';
13
+ import './agentGuidance-DulugsMk.mjs';
14
14
  import 'node:fs/promises';
15
15
  import 'fs/promises';
16
16
  import 'ink';
@@ -5,10 +5,10 @@ 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 api = require('./types-DjAHWb4J.cjs');
9
- var index = require('./index-DNbKbe23.cjs');
8
+ var api = require('./types-BAhQF6Xp.cjs');
9
+ var index = require('./index-B0KIJdSt.cjs');
10
10
  require('axios');
11
- require('./limits-K17AgMHD.cjs');
11
+ require('./limits-CJrrAhB4.cjs');
12
12
  require('node:fs/promises');
13
13
  require('zod');
14
14
  require('node:crypto');
@@ -30,7 +30,7 @@ require('fs');
30
30
  require('node:readline');
31
31
  require('@anthropic-ai/sandbox-runtime');
32
32
  require('expo-server-sdk');
33
- require('./agentGuidance-DlZM_YPV.cjs');
33
+ require('./agentGuidance-D1tKg2UW.cjs');
34
34
  require('ink');
35
35
  require('react');
36
36
  require('@anthropic-ai/claude-agent-sdk');
@@ -3,10 +3,10 @@ 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-BEXGahmj.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-gefLe1Bk.mjs';
6
+ import { p as projectPath } from './types-B8g_V-LQ.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-D5MRxCHs.mjs';
8
8
  import 'axios';
9
- import './limits-CPTgiQ9A.mjs';
9
+ import './limits-CAD4UF8w.mjs';
10
10
  import 'node:fs/promises';
11
11
  import 'zod';
12
12
  import 'node:crypto';
@@ -28,7 +28,7 @@ import 'fs';
28
28
  import 'node:readline';
29
29
  import '@anthropic-ai/sandbox-runtime';
30
30
  import 'expo-server-sdk';
31
- import './agentGuidance-7MByWxKj.mjs';
31
+ import './agentGuidance-DulugsMk.mjs';
32
32
  import 'ink';
33
33
  import 'react';
34
34
  import '@anthropic-ai/claude-agent-sdk';
package/dist/lib.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./types-DjAHWb4J.cjs');
4
- var persistence = require('./limits-K17AgMHD.cjs');
3
+ var api = require('./types-BAhQF6Xp.cjs');
4
+ var persistence = require('./limits-CJrrAhB4.cjs');
5
5
  require('axios');
6
6
  require('node:events');
7
7
  require('socket.io-client');
package/dist/lib.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-BEXGahmj.mjs';
2
- export { c as configuration, l as logger } from './limits-CPTgiQ9A.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-B8g_V-LQ.mjs';
2
+ export { c as configuration, l as logger } from './limits-CAD4UF8w.mjs';
3
3
  import 'axios';
4
4
  import 'node:events';
5
5
  import 'socket.io-client';
@@ -9,7 +9,7 @@ import chalk from 'chalk';
9
9
  import { inspect } from 'node:util';
10
10
 
11
11
  var name = "very-happy-cli";
12
- var version = "0.2.135";
12
+ var version = "0.2.137";
13
13
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
14
14
  var author = "Kirill Dubovitskiy";
15
15
  var contributors = [
@@ -122,12 +122,12 @@ var dependencies = {
122
122
  zod: "^4.0.0"
123
123
  };
124
124
  var optionalDependencies = {
125
- "very-happy-tools-arm64-darwin": "0.2.135",
126
- "very-happy-tools-x64-darwin": "0.2.135",
127
- "very-happy-tools-arm64-linux": "0.2.135",
128
- "very-happy-tools-x64-linux": "0.2.135",
129
- "very-happy-tools-arm64-win32": "0.2.135",
130
- "very-happy-tools-x64-win32": "0.2.135"
125
+ "very-happy-tools-arm64-darwin": "0.2.137",
126
+ "very-happy-tools-x64-darwin": "0.2.137",
127
+ "very-happy-tools-arm64-linux": "0.2.137",
128
+ "very-happy-tools-x64-linux": "0.2.137",
129
+ "very-happy-tools-arm64-win32": "0.2.137",
130
+ "very-happy-tools-x64-win32": "0.2.137"
131
131
  };
132
132
  var devDependencies = {
133
133
  "@slopus/happy-wire": "workspace:*",
@@ -30,7 +30,7 @@ function _interopNamespaceDefault(e) {
30
30
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
31
31
 
32
32
  var name = "very-happy-cli";
33
- var version = "0.2.135";
33
+ var version = "0.2.137";
34
34
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
35
35
  var author = "Kirill Dubovitskiy";
36
36
  var contributors = [
@@ -143,12 +143,12 @@ var dependencies = {
143
143
  zod: "^4.0.0"
144
144
  };
145
145
  var optionalDependencies = {
146
- "very-happy-tools-arm64-darwin": "0.2.135",
147
- "very-happy-tools-x64-darwin": "0.2.135",
148
- "very-happy-tools-arm64-linux": "0.2.135",
149
- "very-happy-tools-x64-linux": "0.2.135",
150
- "very-happy-tools-arm64-win32": "0.2.135",
151
- "very-happy-tools-x64-win32": "0.2.135"
146
+ "very-happy-tools-arm64-darwin": "0.2.137",
147
+ "very-happy-tools-x64-darwin": "0.2.137",
148
+ "very-happy-tools-arm64-linux": "0.2.137",
149
+ "very-happy-tools-x64-linux": "0.2.137",
150
+ "very-happy-tools-arm64-win32": "0.2.137",
151
+ "very-happy-tools-x64-win32": "0.2.137"
152
152
  };
153
153
  var devDependencies = {
154
154
  "@slopus/happy-wire": "workspace:*",
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var agentGuidance = require('./agentGuidance-DlZM_YPV.cjs');
3
+ var agentGuidance = require('./agentGuidance-D1tKg2UW.cjs');
4
4
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
5
5
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
6
6
  var z = require('zod');
7
- var index = require('./index-DNbKbe23.cjs');
8
- var persistence = require('./limits-K17AgMHD.cjs');
7
+ var index = require('./index-B0KIJdSt.cjs');
8
+ var persistence = require('./limits-CJrrAhB4.cjs');
9
9
  require('node:fs/promises');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -13,7 +13,7 @@ require('axios');
13
13
  require('tweetnacl');
14
14
  require('socket.io-client');
15
15
  require('node:child_process');
16
- require('./types-DjAHWb4J.cjs');
16
+ require('./types-BAhQF6Xp.cjs');
17
17
  require('node:fs');
18
18
  require('node:path');
19
19
  require('chalk');
@@ -1,9 +1,9 @@
1
- import { r as registerTeamsTools } from './agentGuidance-7MByWxKj.mjs';
1
+ import { r as registerTeamsTools } from './agentGuidance-DulugsMk.mjs';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { z } from 'zod';
5
- import { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-gefLe1Bk.mjs';
6
- import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-CPTgiQ9A.mjs';
5
+ import { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-D5MRxCHs.mjs';
6
+ import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-CAD4UF8w.mjs';
7
7
  import 'node:fs/promises';
8
8
  import 'node:os';
9
9
  import 'node:crypto';
@@ -11,7 +11,7 @@ import 'axios';
11
11
  import 'tweetnacl';
12
12
  import 'socket.io-client';
13
13
  import 'node:child_process';
14
- import './types-BEXGahmj.mjs';
14
+ import './types-B8g_V-LQ.mjs';
15
15
  import 'node:fs';
16
16
  import 'node:path';
17
17
  import 'chalk';
@@ -2,11 +2,11 @@ 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 { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-BEXGahmj.mjs';
6
- import { l as logger, g as readSettings, i as encodeBase64 } from './limits-CPTgiQ9A.mjs';
7
- import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-gefLe1Bk.mjs';
8
- import { A as AcpBackend } from './AcpBackend-CkDpu1n_.mjs';
9
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-DzvbcL_x.mjs';
5
+ import { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-B8g_V-LQ.mjs';
6
+ import { l as logger, g as readSettings, i as encodeBase64 } from './limits-CAD4UF8w.mjs';
7
+ import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-D5MRxCHs.mjs';
8
+ import { A as AcpBackend } from './AcpBackend-POcimRNQ.mjs';
9
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-C1gQprK_.mjs';
10
10
  import 'axios';
11
11
  import 'node:events';
12
12
  import 'socket.io-client';
@@ -32,7 +32,7 @@ import '@anthropic-ai/sandbox-runtime';
32
32
  import 'expo-server-sdk';
33
33
  import 'chalk';
34
34
  import 'node:util';
35
- import './agentGuidance-7MByWxKj.mjs';
35
+ import './agentGuidance-DulugsMk.mjs';
36
36
  import '@anthropic-ai/claude-agent-sdk';
37
37
  import 'ps-list';
38
38
  import 'tmp';
@@ -4,11 +4,11 @@ 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 api = require('./types-DjAHWb4J.cjs');
8
- var persistence = require('./limits-K17AgMHD.cjs');
9
- var index = require('./index-DNbKbe23.cjs');
10
- var AcpBackend = require('./AcpBackend-C0Bwx6bc.cjs');
11
- var config = require('./config-BO0ZHyoB.cjs');
7
+ var api = require('./types-BAhQF6Xp.cjs');
8
+ var persistence = require('./limits-CJrrAhB4.cjs');
9
+ var index = require('./index-B0KIJdSt.cjs');
10
+ var AcpBackend = require('./AcpBackend-Bcmm51Ya.cjs');
11
+ var config = require('./config-Dr3A4IGp.cjs');
12
12
  require('axios');
13
13
  require('node:events');
14
14
  require('socket.io-client');
@@ -34,7 +34,7 @@ require('@anthropic-ai/sandbox-runtime');
34
34
  require('expo-server-sdk');
35
35
  require('chalk');
36
36
  require('node:util');
37
- require('./agentGuidance-DlZM_YPV.cjs');
37
+ require('./agentGuidance-D1tKg2UW.cjs');
38
38
  require('@anthropic-ai/claude-agent-sdk');
39
39
  require('ps-list');
40
40
  require('tmp');
@@ -3,10 +3,10 @@ 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 { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-BEXGahmj.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-DB_mfFaH.mjs';
8
- import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-CPTgiQ9A.mjs';
9
- import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-gefLe1Bk.mjs';
6
+ import { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-B8g_V-LQ.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-D54Juu2-.mjs';
8
+ import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-CAD4UF8w.mjs';
9
+ import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-D5MRxCHs.mjs';
10
10
  import WebSocket from 'ws';
11
11
  import * as ed from '@noble/ed25519';
12
12
  import { sha512 } from '@noble/hashes/sha2.js';
@@ -32,7 +32,7 @@ import '@anthropic-ai/sandbox-runtime';
32
32
  import 'expo-server-sdk';
33
33
  import 'chalk';
34
34
  import 'node:util';
35
- import './agentGuidance-7MByWxKj.mjs';
35
+ import './agentGuidance-DulugsMk.mjs';
36
36
  import 'ink';
37
37
  import 'react';
38
38
  import '@anthropic-ai/claude-agent-sdk';