very-happy-cli 0.2.90 → 0.2.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/{AcpBackend-BV4wSnJ3.mjs → AcpBackend-B5RRlzLU.mjs} +1 -1
  2. package/dist/{AcpBackend-CnYZFdd0.cjs → AcpBackend-GqveWg8u.cjs} +1 -1
  3. package/dist/{AcpSessionManager-Cyne6Rmg.mjs → AcpSessionManager-Ij1pI5Ex.mjs} +1 -1
  4. package/dist/{AcpSessionManager-BPBdrrME.cjs → AcpSessionManager-YcrSZwvq.cjs} +1 -1
  5. package/dist/{config-CgXitj0f.cjs → config-C4NCw7Dz.cjs} +2 -2
  6. package/dist/{config-BEdyyciP.mjs → config-ra8iKxdU.mjs} +2 -2
  7. package/dist/{index-B1wTVXjt.cjs → index-C1HIm7NY.cjs} +4 -4
  8. package/dist/{index-Dfu5uvjk.mjs → index-CB5H7YI6.mjs} +5 -5
  9. package/dist/{index-4YmVbx7j.cjs → index-FkXJNwiy.cjs} +87 -31
  10. package/dist/{index-an09rejO.mjs → index-UCYD5Wk3.mjs} +84 -28
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-DDpVxk8-.cjs → installTerminalHooks-CoK5wNcA.cjs} +2 -2
  14. package/dist/{installTerminalHooks-C-OgZr5k.mjs → installTerminalHooks-TkkGzzbI.mjs} +2 -2
  15. package/dist/lib.cjs +1 -1
  16. package/dist/lib.d.cts +34 -0
  17. package/dist/lib.d.mts +34 -0
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-Du-N0qlK.mjs → mcp-C3MiqObi.mjs} +2 -2
  20. package/dist/{mcp-B6Nq-RUL.cjs → mcp-DcRvswVI.cjs} +2 -2
  21. package/dist/{runGemini-DBr_TiTL.mjs → runGemini-BbC0uwUj.mjs} +4 -4
  22. package/dist/{runGemini-ChG7cGMC.cjs → runGemini-Dnvd2gWq.cjs} +4 -4
  23. package/dist/{runOpenClaw-Cbde8t92.mjs → runOpenClaw--nbqTW3K.mjs} +3 -3
  24. package/dist/{runOpenClaw-D2jtVgpC.cjs → runOpenClaw-CnuTBNQW.cjs} +3 -3
  25. package/dist/{send-BHliX59m.mjs → send-9nJxn09Y.mjs} +2 -2
  26. package/dist/{send-Bjen1TUE.cjs → send-DkKOPatx.cjs} +2 -2
  27. package/dist/{spawn-JxaPHAoP.mjs → spawn-CRW4ioms.mjs} +2 -2
  28. package/dist/{spawn-CH1Rq-LW.cjs → spawn-DE7WhS8Y.cjs} +2 -2
  29. package/dist/{types-DS3i_5LV.mjs → types-BKyjG23_.mjs} +251 -15
  30. package/dist/{types-BNGeiP1C.cjs → types-ClDADuxP.cjs} +252 -16
  31. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
2
  import os, { homedir } from 'node:os';
3
3
  import { randomUUID, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
4
- import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, 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 getLocalHappyAgentCredentialPath, L as readLocalHappyAgentCredentials, N as decryptWithDataKey, O as decryptLegacy, P as extractCompleteLines, Q as decideBackfill, S as parseTerminalHookPayload, T as tmuxArgs, U as scrubTmuxClientEnv, V as decideMirrorBinding, W as persistSession, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as mirrorLineKey, Z as mirrorLocalId, _ as detectResumeSupport, $ as detectCLIAvailability, a0 as acquireDaemonLock, a1 as summarizeSpawnSessionForLog, a2 as deletePersistedSessions, a3 as decrypt, a4 as writeDaemonState, A as ApiClient, a5 as fetchCliUpdateState, a6 as resolveCliUpdateCheckInterval, a7 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a8 as releaseDaemonLock, a9 as isValidSessionId, aa as listVhTerminals, ab as isValidTerminalId, ac as readVhTerminal, ad as sendToVhTerminal, h as connectionState, ae as startOfflineReconnection, af as clearCredentials, ag as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ah as SandboxConfigSchema, b as createEnvelope, ai as CodexAppServerClient, aj as getLatestDaemonLog } from './types-DS3i_5LV.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 getLocalHappyAgentCredentialPath, L as readLocalHappyAgentCredentials, N as decryptWithDataKey, O as decryptLegacy, P as extractCompleteLines, Q as decideBackfill, S as parseTerminalHookPayload, T as tmuxArgs, U as scrubTmuxClientEnv, V as decideMirrorBinding, W as persistSession, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as mirrorLineKey, Z as mirrorLocalId, _ as detectResumeSupport, $ as detectCLIAvailability, a0 as acquireDaemonLock, a1 as summarizeSpawnSessionForLog, a2 as deletePersistedSessions, a3 as decrypt, a4 as writeDaemonState, A as ApiClient, a5 as fetchCliUpdateState, a6 as resolveCliUpdateCheckInterval, a7 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a8 as releaseDaemonLock, a9 as isValidSessionId, aa as listVhTerminals, ab as isValidTerminalId, ac as readVhTerminal, ad as sendToVhTerminal, h as connectionState, ae as startOfflineReconnection, af as clearCredentials, ag as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ah as SandboxConfigSchema, b as createEnvelope, ai as CodexAppServerClient, aj as getLatestDaemonLog } from './types-BKyjG23_.mjs';
5
5
  import spawn$1, { spawn } from 'cross-spawn';
6
6
  import path, { join, resolve, basename, isAbsolute, normalize, sep, dirname } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -1633,6 +1633,12 @@ function resolveRemoteClaudePermissionMode(currentMode, incomingMode, sandboxEna
1633
1633
  }
1634
1634
  return nextMode;
1635
1635
  }
1636
+ function reconcilePublishedPermissionMode(input) {
1637
+ if (!input.effective) return null;
1638
+ const mismatch = input.effective !== input.intent;
1639
+ if (input.effective === input.published) return mismatch ? { publish: input.effective, mismatch } : null;
1640
+ return { publish: input.effective, mismatch };
1641
+ }
1636
1642
 
1637
1643
  function parseCompact(message) {
1638
1644
  const trimmed = message.trim();
@@ -1962,7 +1968,12 @@ async function claudeRemote(opts) {
1962
1968
  mcpServers: systemInit.mcp_servers?.map((s) => ({ name: s.name, status: s.status })),
1963
1969
  skills: systemInit.skills,
1964
1970
  model: systemInit.model,
1965
- modelIsDefault: initial.mode.model == null
1971
+ modelIsDefault: initial.mode.model == null,
1972
+ // The SDK's own verdict on the mode it will enforce —
1973
+ // settings (permissions.deny/ask/defaultMode/
1974
+ // disableBypassPermissionsMode) can override what we
1975
+ // asked for. runClaude publishes THIS, not our intent.
1976
+ permissionMode: systemInit.permissionMode
1966
1977
  });
1967
1978
  }
1968
1979
  if (systemInit.session_id) {
@@ -1980,6 +1991,10 @@ async function claudeRemote(opts) {
1980
1991
  if (message.type === "result") {
1981
1992
  updateThinking(false);
1982
1993
  logger.debug("[claudeRemote] Result received");
1994
+ const denials = message.permission_denials;
1995
+ if (denials && denials.length > 0) {
1996
+ logger.warn(`[claudeRemote] ${denials.length} tool call(s) auto-denied by Claude Code policy: ${denials.map((d) => d.tool_name ?? "?").join(", ")}`);
1997
+ }
1983
1998
  if (isCompactCommand) {
1984
1999
  const compactSucceeded = message.subtype === "success";
1985
2000
  logger.debug(`[claudeRemote] Compaction ${compactSucceeded ? "completed" : "failed"}`);
@@ -2190,16 +2205,9 @@ class PermissionHandler {
2190
2205
  }
2191
2206
  } else {
2192
2207
  if (response.approved && response.mode) {
2193
- try {
2194
- if (!this.setPermissionModeCallback) throw new Error("permission mode updater unavailable");
2195
- await this.setPermissionModeCallback(response.mode);
2196
- this.permissionMode = response.mode;
2197
- this.onModeChangedCallback?.(response.mode);
2198
- } catch (err) {
2199
- const reason = `Failed to switch permission mode: ${err instanceof Error ? err.message : String(err)}`;
2200
- pending.resolve({ behavior: "deny", message: reason });
2201
- return { ...response, approved: false, reason };
2202
- }
2208
+ this.permissionMode = response.mode;
2209
+ this.deferredPermissionMode = response.mode;
2210
+ this.onModeChangedCallback?.(response.mode);
2203
2211
  }
2204
2212
  if (response.approved && !pending.suggestions?.length && response.allowTools?.length) {
2205
2213
  response.allowTools.forEach((tool) => {
@@ -2540,6 +2548,17 @@ class PermissionHandler {
2540
2548
  }
2541
2549
  }
2542
2550
 
2551
+ function rewriteQueuedPermissionMode(queue, hasher, permissionMode) {
2552
+ let rewritten = 0;
2553
+ for (const item of queue) {
2554
+ if (item.mode.permissionMode === permissionMode) continue;
2555
+ item.mode = { ...item.mode, permissionMode };
2556
+ item.modeHash = hasher(item.mode);
2557
+ rewritten += 1;
2558
+ }
2559
+ return rewritten;
2560
+ }
2561
+
2543
2562
  function formatClaudeMessageForInk(message, messageBuffer, onAssistantResult) {
2544
2563
  logger.debugLargeJson("[CLAUDE INK] Message from remote mode:", message);
2545
2564
  switch (message.type) {
@@ -2794,7 +2813,13 @@ class SDKToLogConverter {
2794
2813
  type: "user",
2795
2814
  message: userMsg.message,
2796
2815
  ...userMsg.parent_tool_use_id ? { parent_tool_use_id: userMsg.parent_tool_use_id } : {},
2797
- ...meta ? { isMeta: true } : {}
2816
+ ...meta ? { isMeta: true } : {},
2817
+ // B-260-P2: structured tool output (Agent/Task final report +
2818
+ // run totals, or the `async_launched` stub marker) and the
2819
+ // message origin (task-notification). Both are consumed by
2820
+ // sessionProtocolMapper; the raw-line schema is passthrough.
2821
+ ...userMsg.tool_use_result !== void 0 ? { tool_use_result: userMsg.tool_use_result } : {},
2822
+ ...userMsg.origin ? { origin: userMsg.origin } : {}
2798
2823
  };
2799
2824
  if (Array.isArray(userMsg.message.content)) {
2800
2825
  for (const content of userMsg.message.content) {
@@ -3305,7 +3330,7 @@ function createTurnSteeringController() {
3305
3330
  };
3306
3331
  }
3307
3332
 
3308
- async function claudeRemoteLauncher(session, onPermissionModeChange) {
3333
+ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffectivePermissionMode) {
3309
3334
  logger.debug("[claudeRemoteLauncher] Starting remote launcher");
3310
3335
  const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
3311
3336
  logger.debug(`[claudeRemoteLauncher] TTY available: ${hasTTY}`);
@@ -3539,6 +3564,10 @@ async function claudeRemoteLauncher(session, onPermissionModeChange) {
3539
3564
  mode = { ...mode, permissionMode: nextMode };
3540
3565
  modeHash = session.queue.modeHasher(mode);
3541
3566
  }
3567
+ rewriteQueuedPermissionMode(session.queue.queue, session.queue.modeHasher, nextMode);
3568
+ if (pending) {
3569
+ pending = { ...pending, mode: { ...pending.mode, permissionMode: nextMode } };
3570
+ }
3542
3571
  onPermissionModeChange?.(nextMode);
3543
3572
  return nextMode;
3544
3573
  };
@@ -3611,6 +3640,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange) {
3611
3640
  skillCount: metadata.skills?.length ?? 0
3612
3641
  });
3613
3642
  session.client.updateMetadata((currentMetadata) => applyClaudeSdkMetadata(currentMetadata, metadata));
3643
+ if (metadata.permissionMode) onEffectivePermissionMode?.(metadata.permissionMode);
3614
3644
  },
3615
3645
  onQueryReady: (q) => {
3616
3646
  turnSteering.setInterrupt(q.interrupt);
@@ -3788,7 +3818,7 @@ async function loop(opts) {
3788
3818
  break;
3789
3819
  }
3790
3820
  case "remote": {
3791
- const reason = await claudeRemoteLauncher(session, opts.onPermissionModeChange);
3821
+ const reason = await claudeRemoteLauncher(session, opts.onPermissionModeChange, opts.onEffectivePermissionMode);
3792
3822
  switch (reason) {
3793
3823
  case "exit":
3794
3824
  return 0;
@@ -9386,7 +9416,11 @@ async function runClaude(credentials, options = {}) {
9386
9416
  ...meta,
9387
9417
  lifecycleState: "running",
9388
9418
  archivedBy: void 0,
9389
- queueCancellation: true
9419
+ queueCancellation: true,
9420
+ // B-262 batch 2 (B5): a reconnected process re-publishes the mode
9421
+ // IT enforces; the server copy may still carry the previous
9422
+ // process's value.
9423
+ permissionMode: mapToClaudeMode(initialPermissionMode ?? "default")
9390
9424
  }));
9391
9425
  }
9392
9426
  const forkClaudeSessionId = process.env.HAPPY_FORK_CLAUDE_SESSION_ID;
@@ -9526,6 +9560,22 @@ async function runClaude(credentials, options = {}) {
9526
9560
  publishedPermissionMode = published;
9527
9561
  session.updateMetadata((meta) => ({ ...meta, permissionMode: published }));
9528
9562
  };
9563
+ const publishEffectivePermissionMode = (effective) => {
9564
+ const decision = reconcilePublishedPermissionMode({
9565
+ intent: mapToClaudeMode(currentPermissionMode ?? "default"),
9566
+ published: publishedPermissionMode,
9567
+ effective
9568
+ });
9569
+ if (!decision) return;
9570
+ if (decision.mismatch) {
9571
+ logger.warn(`[loop] Claude Code enforces permission mode '${effective}' but this process asked for '${mapToClaudeMode(currentPermissionMode ?? "default")}' \u2014 check ~/.claude settings (permissions.deny/ask/defaultMode/disableBypassPermissionsMode). Publishing the effective mode.`);
9572
+ }
9573
+ if (decision.publish !== publishedPermissionMode) {
9574
+ publishedPermissionMode = decision.publish;
9575
+ session.updateMetadata((meta) => ({ ...meta, permissionMode: decision.publish }));
9576
+ }
9577
+ };
9578
+ let lastExplicitModeSwitchAt = 0;
9529
9579
  let currentModel = options.model ?? DEFAULT_CLAUDE_MODEL;
9530
9580
  let currentFallbackModel = void 0;
9531
9581
  let currentCustomSystemPrompt = void 0;
@@ -9570,7 +9620,11 @@ async function runClaude(credentials, options = {}) {
9570
9620
  }
9571
9621
  const attachmentsForThisMessage = await session.drainAttachmentsForUserMessage();
9572
9622
  let messagePermissionMode = currentPermissionMode;
9573
- if (message.meta?.permissionMode) {
9623
+ const messageCreatedAt = message.createdAt;
9624
+ const staleModeSnapshot = message.meta?.permissionMode !== void 0 && typeof messageCreatedAt === "number" && messageCreatedAt < lastExplicitModeSwitchAt;
9625
+ if (staleModeSnapshot) {
9626
+ logger.debug(`[loop] Ignoring stale meta.permissionMode=${message.meta?.permissionMode} (message ${messageCreatedAt} predates explicit switch ${lastExplicitModeSwitchAt}); keeping ${currentPermissionMode}`);
9627
+ } else if (message.meta?.permissionMode) {
9574
9628
  const previousPermissionMode = currentPermissionMode;
9575
9629
  messagePermissionMode = resolveRemoteClaudePermissionMode(
9576
9630
  currentPermissionMode,
@@ -9834,9 +9888,11 @@ async function runClaude(credentials, options = {}) {
9834
9888
  },
9835
9889
  onAbort: resetCurrentModeDefaults,
9836
9890
  onPermissionModeChange: (mode) => {
9891
+ lastExplicitModeSwitchAt = Date.now();
9837
9892
  publishPermissionMode(mode);
9838
9893
  logger.debug(`[loop] Permission mode updated from session RPC / approval to: ${mode}`);
9839
9894
  },
9895
+ onEffectivePermissionMode: (mode) => publishEffectivePermissionMode(mode),
9840
9896
  mcpServers: {
9841
9897
  "happy": {
9842
9898
  type: "http",
@@ -13593,7 +13649,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13593
13649
  process.exit(0);
13594
13650
  } else if (subcommand === "install-terminal-hooks") {
13595
13651
  try {
13596
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-C-OgZr5k.mjs');
13652
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-TkkGzzbI.mjs');
13597
13653
  const command = parseTerminalHooksArgs(args.slice(1));
13598
13654
  if (command.action === "help") {
13599
13655
  console.log(TERMINAL_HOOKS_HELP);
@@ -13610,7 +13666,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13610
13666
  }
13611
13667
  } else if (subcommand === "spawn") {
13612
13668
  try {
13613
- const { handleSpawnCommand } = await import('./spawn-JxaPHAoP.mjs');
13669
+ const { handleSpawnCommand } = await import('./spawn-CRW4ioms.mjs');
13614
13670
  await handleSpawnCommand(args.slice(1));
13615
13671
  } catch (error) {
13616
13672
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13622,7 +13678,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13622
13678
  return;
13623
13679
  } else if (subcommand === "send") {
13624
13680
  try {
13625
- const { handleSendCommand } = await import('./send-BHliX59m.mjs');
13681
+ const { handleSendCommand } = await import('./send-9nJxn09Y.mjs');
13626
13682
  await handleSendCommand(args.slice(1));
13627
13683
  } catch (error) {
13628
13684
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -13728,9 +13784,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13728
13784
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
13729
13785
  const projectId = args[3];
13730
13786
  try {
13731
- const { saveGoogleCloudProjectToConfig } = await import('./config-BEdyyciP.mjs');
13732
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-DS3i_5LV.mjs').then(function (n) { return n.ak; });
13733
- const { ApiClient: ApiClient2 } = await import('./types-DS3i_5LV.mjs').then(function (n) { return n.al; });
13787
+ const { saveGoogleCloudProjectToConfig } = await import('./config-ra8iKxdU.mjs');
13788
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-BKyjG23_.mjs').then(function (n) { return n.ak; });
13789
+ const { ApiClient: ApiClient2 } = await import('./types-BKyjG23_.mjs').then(function (n) { return n.al; });
13734
13790
  let userEmail = void 0;
13735
13791
  try {
13736
13792
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -13761,7 +13817,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13761
13817
  }
13762
13818
  if (geminiSubcommand === "project" && args[2] === "get") {
13763
13819
  try {
13764
- const { readGeminiLocalConfig } = await import('./config-BEdyyciP.mjs');
13820
+ const { readGeminiLocalConfig } = await import('./config-ra8iKxdU.mjs');
13765
13821
  const config = readGeminiLocalConfig();
13766
13822
  if (config.googleCloudProject) {
13767
13823
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -13801,7 +13857,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13801
13857
  process.exit(0);
13802
13858
  }
13803
13859
  try {
13804
- const { runGemini } = await import('./runGemini-DBr_TiTL.mjs');
13860
+ const { runGemini } = await import('./runGemini-BbC0uwUj.mjs');
13805
13861
  let startedBy = void 0;
13806
13862
  for (let i = 1; i < args.length; i++) {
13807
13863
  if (args[i] === "--started-by") {
@@ -13823,7 +13879,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13823
13879
  return;
13824
13880
  } else if (subcommand === "acp") {
13825
13881
  try {
13826
- const { runAcp, resolveAcpAgentConfig } = await import('./index-Dfu5uvjk.mjs');
13882
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-CB5H7YI6.mjs');
13827
13883
  let startedBy = void 0;
13828
13884
  let verbose = false;
13829
13885
  const acpArgs = [];
@@ -13863,7 +13919,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13863
13919
  return;
13864
13920
  } else if (subcommand === "openclaw") {
13865
13921
  try {
13866
- const { runOpenClaw } = await import('./runOpenClaw-Cbde8t92.mjs');
13922
+ const { runOpenClaw } = await import('./runOpenClaw--nbqTW3K.mjs');
13867
13923
  let startedBy = void 0;
13868
13924
  let verbose = false;
13869
13925
  let gatewayUrl;
@@ -13914,7 +13970,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
13914
13970
  return;
13915
13971
  } else if (subcommand === "mcp" && args.length === 1) {
13916
13972
  try {
13917
- const { handleMcpCommand } = await import('./mcp-Du-N0qlK.mjs');
13973
+ const { handleMcpCommand } = await import('./mcp-C3MiqObi.mjs');
13918
13974
  await handleMcpCommand();
13919
13975
  } catch (error) {
13920
13976
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-4YmVbx7j.cjs');
5
- require('./types-BNGeiP1C.cjs');
4
+ require('./index-FkXJNwiy.cjs');
5
+ require('./types-ClDADuxP.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-an09rejO.mjs';
3
- import './types-DS3i_5LV.mjs';
2
+ import './index-UCYD5Wk3.mjs';
3
+ import './types-BKyjG23_.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-BNGeiP1C.cjs');
9
- var index = require('./index-4YmVbx7j.cjs');
8
+ var persistence = require('./types-ClDADuxP.cjs');
9
+ var index = require('./index-FkXJNwiy.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-DS3i_5LV.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-an09rejO.mjs';
6
+ import { p as projectPath } from './types-BKyjG23_.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-UCYD5Wk3.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-BNGeiP1C.cjs');
3
+ var persistence = require('./types-ClDADuxP.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
package/dist/lib.d.cts CHANGED
@@ -45,6 +45,17 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
45
45
  }, z.core.$strip>, z.ZodObject<{
46
46
  t: z.ZodLiteral<"tool-call-end">;
47
47
  call: z.ZodString;
48
+ result: z.ZodOptional<z.ZodObject<{
49
+ text: z.ZodString;
50
+ truncated: z.ZodOptional<z.ZodBoolean>;
51
+ isError: z.ZodOptional<z.ZodBoolean>;
52
+ stats: z.ZodOptional<z.ZodObject<{
53
+ toolUses: z.ZodOptional<z.ZodNumber>;
54
+ totalTokens: z.ZodOptional<z.ZodNumber>;
55
+ durationMs: z.ZodOptional<z.ZodNumber>;
56
+ toolStats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
57
+ }, z.core.$strip>>;
58
+ }, z.core.$strip>>;
48
59
  }, z.core.$strip>, z.ZodObject<{
49
60
  t: z.ZodLiteral<"file">;
50
61
  ref: z.ZodString;
@@ -61,6 +72,8 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
61
72
  }, z.core.$strip>, z.ZodObject<{
62
73
  t: z.ZodLiteral<"start">;
63
74
  title: z.ZodOptional<z.ZodString>;
75
+ description: z.ZodOptional<z.ZodString>;
76
+ subagentType: z.ZodOptional<z.ZodString>;
64
77
  }, z.core.$strip>, z.ZodObject<{
65
78
  t: z.ZodLiteral<"turn-end">;
66
79
  status: z.ZodEnum<{
@@ -80,6 +93,27 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
80
93
  }, z.core.$strip>>;
81
94
  }, z.core.$strip>, z.ZodObject<{
82
95
  t: z.ZodLiteral<"stop">;
96
+ status: z.ZodOptional<z.ZodEnum<{
97
+ completed: "completed";
98
+ failed: "failed";
99
+ stopped: "stopped";
100
+ }>>;
101
+ result: z.ZodOptional<z.ZodObject<{
102
+ text: z.ZodString;
103
+ truncated: z.ZodOptional<z.ZodBoolean>;
104
+ }, z.core.$strip>>;
105
+ usage: z.ZodOptional<z.ZodObject<{
106
+ toolUses: z.ZodOptional<z.ZodNumber>;
107
+ totalTokens: z.ZodOptional<z.ZodNumber>;
108
+ durationMs: z.ZodOptional<z.ZodNumber>;
109
+ }, z.core.$strip>>;
110
+ }, z.core.$strip>, z.ZodObject<{
111
+ t: z.ZodLiteral<"progress">;
112
+ toolUses: z.ZodNumber;
113
+ lastTool: z.ZodOptional<z.ZodString>;
114
+ totalTokens: z.ZodOptional<z.ZodNumber>;
115
+ durationMs: z.ZodOptional<z.ZodNumber>;
116
+ summary: z.ZodOptional<z.ZodString>;
83
117
  }, z.core.$strip>], "t">;
84
118
  }, z.core.$strip>;
85
119
  type SessionEnvelope = z.infer<typeof sessionEnvelopeSchema>;
package/dist/lib.d.mts CHANGED
@@ -45,6 +45,17 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
45
45
  }, z.core.$strip>, z.ZodObject<{
46
46
  t: z.ZodLiteral<"tool-call-end">;
47
47
  call: z.ZodString;
48
+ result: z.ZodOptional<z.ZodObject<{
49
+ text: z.ZodString;
50
+ truncated: z.ZodOptional<z.ZodBoolean>;
51
+ isError: z.ZodOptional<z.ZodBoolean>;
52
+ stats: z.ZodOptional<z.ZodObject<{
53
+ toolUses: z.ZodOptional<z.ZodNumber>;
54
+ totalTokens: z.ZodOptional<z.ZodNumber>;
55
+ durationMs: z.ZodOptional<z.ZodNumber>;
56
+ toolStats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
57
+ }, z.core.$strip>>;
58
+ }, z.core.$strip>>;
48
59
  }, z.core.$strip>, z.ZodObject<{
49
60
  t: z.ZodLiteral<"file">;
50
61
  ref: z.ZodString;
@@ -61,6 +72,8 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
61
72
  }, z.core.$strip>, z.ZodObject<{
62
73
  t: z.ZodLiteral<"start">;
63
74
  title: z.ZodOptional<z.ZodString>;
75
+ description: z.ZodOptional<z.ZodString>;
76
+ subagentType: z.ZodOptional<z.ZodString>;
64
77
  }, z.core.$strip>, z.ZodObject<{
65
78
  t: z.ZodLiteral<"turn-end">;
66
79
  status: z.ZodEnum<{
@@ -80,6 +93,27 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
80
93
  }, z.core.$strip>>;
81
94
  }, z.core.$strip>, z.ZodObject<{
82
95
  t: z.ZodLiteral<"stop">;
96
+ status: z.ZodOptional<z.ZodEnum<{
97
+ completed: "completed";
98
+ failed: "failed";
99
+ stopped: "stopped";
100
+ }>>;
101
+ result: z.ZodOptional<z.ZodObject<{
102
+ text: z.ZodString;
103
+ truncated: z.ZodOptional<z.ZodBoolean>;
104
+ }, z.core.$strip>>;
105
+ usage: z.ZodOptional<z.ZodObject<{
106
+ toolUses: z.ZodOptional<z.ZodNumber>;
107
+ totalTokens: z.ZodOptional<z.ZodNumber>;
108
+ durationMs: z.ZodOptional<z.ZodNumber>;
109
+ }, z.core.$strip>>;
110
+ }, z.core.$strip>, z.ZodObject<{
111
+ t: z.ZodLiteral<"progress">;
112
+ toolUses: z.ZodNumber;
113
+ lastTool: z.ZodOptional<z.ZodString>;
114
+ totalTokens: z.ZodOptional<z.ZodNumber>;
115
+ durationMs: z.ZodOptional<z.ZodNumber>;
116
+ summary: z.ZodOptional<z.ZodString>;
83
117
  }, z.core.$strip>], "t">;
84
118
  }, z.core.$strip>;
85
119
  type SessionEnvelope = z.infer<typeof sessionEnvelopeSchema>;
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-DS3i_5LV.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-BKyjG23_.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'node:util';
@@ -1,9 +1,9 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { z } from 'zod';
4
- import { p as pushClipboardViaDaemon } from './index-an09rejO.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-UCYD5Wk3.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-DS3i_5LV.mjs';
6
+ import { l as logger } from './types-BKyjG23_.mjs';
7
7
  import 'chalk';
8
8
  import 'node:os';
9
9
  import 'node:crypto';
@@ -3,9 +3,9 @@
3
3
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
4
4
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
5
5
  var z = require('zod');
6
- var index = require('./index-4YmVbx7j.cjs');
6
+ var index = require('./index-FkXJNwiy.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types-BNGeiP1C.cjs');
8
+ var persistence = require('./types-ClDADuxP.cjs');
9
9
  require('chalk');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -2,10 +2,10 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import { join } from 'node:path';
5
- import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-DS3i_5LV.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-an09rejO.mjs';
7
- import { A as AcpBackend } from './AcpBackend-BV4wSnJ3.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-BEdyyciP.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-BKyjG23_.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-UCYD5Wk3.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-B5RRlzLU.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-ra8iKxdU.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-BNGeiP1C.cjs');
8
- var index = require('./index-4YmVbx7j.cjs');
9
- var AcpBackend = require('./AcpBackend-CnYZFdd0.cjs');
10
- var config = require('./config-CgXitj0f.cjs');
7
+ var persistence = require('./types-ClDADuxP.cjs');
8
+ var index = require('./index-FkXJNwiy.cjs');
9
+ var AcpBackend = require('./AcpBackend-GqveWg8u.cjs');
10
+ var config = require('./config-C4NCw7Dz.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-DS3i_5LV.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-Cyne6Rmg.mjs';
8
- import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-an09rejO.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-BKyjG23_.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-Ij1pI5Ex.mjs';
8
+ import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-UCYD5Wk3.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-BNGeiP1C.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-BPBdrrME.cjs');
10
- var index = require('./index-4YmVbx7j.cjs');
8
+ var persistence = require('./types-ClDADuxP.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-YcrSZwvq.cjs');
10
+ var index = require('./index-FkXJNwiy.cjs');
11
11
  var WebSocket = require('ws');
12
12
  var ed = require('@noble/ed25519');
13
13
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -1,8 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { r as readPersistedSessions, c as configuration } from './types-DS3i_5LV.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-an09rejO.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-BKyjG23_.mjs';
5
+ import { b as sendUserMessage, a as sessionWebUrl } from './index-UCYD5Wk3.mjs';
6
6
  import 'axios';
7
7
  import 'node:util';
8
8
  import 'node:os';
@@ -3,8 +3,8 @@
3
3
  var chalk = require('chalk');
4
4
  var node_fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var persistence = require('./types-BNGeiP1C.cjs');
7
- var index = require('./index-4YmVbx7j.cjs');
6
+ var persistence = require('./types-ClDADuxP.cjs');
7
+ var index = require('./index-FkXJNwiy.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, 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-an09rejO.mjs';
5
- import { l as logger } from './types-DS3i_5LV.mjs';
4
+ import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-UCYD5Wk3.mjs';
5
+ import { l as logger } from './types-BKyjG23_.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-4YmVbx7j.cjs');
7
- var persistence = require('./types-BNGeiP1C.cjs');
6
+ var index = require('./index-FkXJNwiy.cjs');
7
+ var persistence = require('./types-ClDADuxP.cjs');
8
8
  require('node:os');
9
9
  require('node:crypto');
10
10
  require('cross-spawn');