very-happy-cli 0.2.110 → 0.2.111

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-D0_wbTs6.cjs → AcpBackend-B_olk79F.cjs} +1 -1
  2. package/dist/{AcpBackend-DzZR7TEv.mjs → AcpBackend-CeXVb_s_.mjs} +1 -1
  3. package/dist/{AcpSessionManager-Dcj_iHw8.cjs → AcpSessionManager-uXwWO2Tn.cjs} +1 -1
  4. package/dist/{AcpSessionManager-tWuFWeIF.mjs → AcpSessionManager-vqdqfD1l.mjs} +1 -1
  5. package/dist/{config-CTCGilz_.cjs → config-BR3tkFL_.cjs} +2 -2
  6. package/dist/{config-CTyyVXHj.mjs → config-vGkcq9nM.mjs} +2 -2
  7. package/dist/{index-CvnMiYgh.cjs → index-BOoGJGQc.cjs} +28 -19
  8. package/dist/{index-BW9kDx5m.mjs → index-Bn-xsguz.mjs} +23 -16
  9. package/dist/{index-jYltd-ZW.mjs → index-C-RLk8-e.mjs} +2 -2
  10. package/dist/{index-D-adqB7g.cjs → index-CtBP0Qvc.cjs} +4 -4
  11. package/dist/{index-Brhvj7p0.mjs → index-JAhGeW4_.mjs} +5 -5
  12. package/dist/{index-DW78HyvK.cjs → index-SjthsMid.cjs} +2 -2
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.mjs +2 -2
  15. package/dist/{installTerminalHooks-CJyoR9jp.mjs → installTerminalHooks-ADNcNdnB.mjs} +2 -2
  16. package/dist/{installTerminalHooks-DhQ6k7YD.cjs → installTerminalHooks-FbKaK149.cjs} +2 -2
  17. package/dist/lib.cjs +1 -1
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-BO9-sxMr.mjs → mcp-DHPm_gvL.mjs} +2 -2
  20. package/dist/{mcp-Dr1PegOw.cjs → mcp-DPp-bYNE.cjs} +2 -2
  21. package/dist/{runGemini-CuzqF6Ys.mjs → runGemini-CWWyjQMz.mjs} +4 -4
  22. package/dist/{runGemini-D6Wwfk_0.cjs → runGemini-D5ySpYIZ.cjs} +4 -4
  23. package/dist/{runOpenClaw-B5pkmSTb.mjs → runOpenClaw-Bv4rUTyJ.mjs} +3 -3
  24. package/dist/{runOpenClaw-BYmlS-4Q.cjs → runOpenClaw-Bwrb1LXP.cjs} +3 -3
  25. package/dist/{send-Btz1IZ9U.mjs → send-BlkxFZu4.mjs} +2 -2
  26. package/dist/{send-CuajooZC.cjs → send-DBfSNILO.cjs} +2 -2
  27. package/dist/{sessions-DDwCphTQ.mjs → sessions-1fW8soBM.mjs} +2 -2
  28. package/dist/{sessions-CVUBS3LG.cjs → sessions-CVuEsdRl.cjs} +2 -2
  29. package/dist/{spawn-DcA80_VN.mjs → spawn-BorKN3W2.mjs} +56 -5
  30. package/dist/{spawn-CwS8CPbr.cjs → spawn-D_ZexrY9.cjs} +57 -4
  31. package/dist/{types--t4zLibT.cjs → types-BG_5QKX5.cjs} +8 -8
  32. package/dist/{types-BdO0jg7G.mjs → types-k_ipDb0c.mjs} +7 -7
  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--t4zLibT.cjs');
6
+ var persistence = require('./types-BG_5QKX5.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-BdO0jg7G.mjs';
4
+ import { l as logger, d as contentLogMetadata, e as errorLogMetadata, f as packageJson, g as delay } from './types-k_ipDb0c.mjs';
5
5
 
6
6
  const DEFAULT_TIMEOUTS = {
7
7
  /** Default initialization timeout: 60 seconds */
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var persistence = require('./types--t4zLibT.cjs');
4
+ var persistence = require('./types-BG_5QKX5.cjs');
5
5
 
6
6
  function turnOptions(turnId, time) {
7
7
  return turnId ? { turn: turnId, time } : { time };
@@ -1,5 +1,5 @@
1
1
  import { createId } from '@paralleldrive/cuid2';
2
- import { b as createEnvelope } from './types-BdO0jg7G.mjs';
2
+ import { b as createEnvelope } from './types-k_ipDb0c.mjs';
3
3
 
4
4
  function turnOptions(turnId, time) {
5
5
  return turnId ? { turn: turnId, time } : { time };
@@ -4,8 +4,8 @@ var fs = require('fs');
4
4
  var path = require('path');
5
5
  var os = require('os');
6
6
  var child_process = require('child_process');
7
- var persistence = require('./types--t4zLibT.cjs');
8
- var index = require('./index-CvnMiYgh.cjs');
7
+ var persistence = require('./types-BG_5QKX5.cjs');
8
+ var index = require('./index-BOoGJGQc.cjs');
9
9
  require('axios');
10
10
  require('chalk');
11
11
  require('node:util');
@@ -2,8 +2,8 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { execSync } from 'child_process';
5
- import { l as logger } from './types-BdO0jg7G.mjs';
6
- import { f as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-BW9kDx5m.mjs';
5
+ import { l as logger } from './types-k_ipDb0c.mjs';
6
+ import { g as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './index-Bn-xsguz.mjs';
7
7
  import 'axios';
8
8
  import 'chalk';
9
9
  import '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--t4zLibT.cjs');
6
+ var persistence = require('./types-BG_5QKX5.cjs');
7
7
  var spawn = require('cross-spawn');
8
8
  var path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -191,7 +191,14 @@ async function stopDaemonSession(sessionId) {
191
191
  return result.success || false;
192
192
  }
193
193
  async function spawnDaemonSession(directory, sessionId, opts) {
194
- const result = await daemonPost("/spawn-session", { directory, sessionId, spawnedBy: opts?.spawnedBy });
194
+ const result = await daemonPost("/spawn-session", {
195
+ directory,
196
+ sessionId,
197
+ spawnedBy: opts?.spawnedBy,
198
+ permissionMode: opts?.permissionMode,
199
+ agent: opts?.agent,
200
+ environmentVariables: opts?.environmentVariables
201
+ });
195
202
  return result;
196
203
  }
197
204
  async function notifyDaemonSessionEvent(sessionId, event, spawnedBy) {
@@ -6943,7 +6950,7 @@ function parseJsonObject(text) {
6943
6950
  return null;
6944
6951
  }
6945
6952
  }
6946
- 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-CvnMiYgh.cjs', document.baseURI).href))).resolve(s)) {
6953
+ 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-BOoGJGQc.cjs', document.baseURI).href))).resolve(s)) {
6947
6954
  const platformArch = `${platform}-${arch}`;
6948
6955
  const candidates = [
6949
6956
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -10390,7 +10397,7 @@ function registerSideQuestionHandler(rpc, deps) {
10390
10397
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
10391
10398
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
10392
10399
  const run = deps.run ?? (async (input) => {
10393
- const { query } = await Promise.resolve().then(function () { return require('./index-DW78HyvK.cjs'); });
10400
+ const { query } = await Promise.resolve().then(function () { return require('./index-SjthsMid.cjs'); });
10394
10401
  return runSideQuestion(query, input);
10395
10402
  });
10396
10403
  const slots = /* @__PURE__ */ new Map();
@@ -10492,7 +10499,7 @@ const MAX_TITLE_CHARS = 60;
10492
10499
  const GENERATION_TIMEOUT_MS = 3e4;
10493
10500
  function resolveClaudeBinary() {
10494
10501
  try {
10495
- 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-CvnMiYgh.cjs', document.baseURI).href)));
10502
+ 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-BOoGJGQc.cjs', document.baseURI).href)));
10496
10503
  const utilsPath = path.resolve(path.join(persistence.projectPath(), "scripts", "claude_version_utils.cjs"));
10497
10504
  const { getClaudeCliPath } = require$1(utilsPath);
10498
10505
  const path$1 = getClaudeCliPath();
@@ -12694,9 +12701,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
12694
12701
  };
12695
12702
  }
12696
12703
 
12697
- 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-CvnMiYgh.cjs', document.baseURI).href)));
12704
+ 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-BOoGJGQc.cjs', document.baseURI).href)));
12698
12705
  const __dirname$1 = path.dirname(__filename$1);
12699
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CvnMiYgh.cjs', document.baseURI).href)));
12706
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-BOoGJGQc.cjs', document.baseURI).href)));
12700
12707
  const PRISMA_QUERY_ENGINE_FILES = {
12701
12708
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
12702
12709
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -15320,7 +15327,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15320
15327
  process.exit(0);
15321
15328
  } else if (subcommand === "install-terminal-hooks") {
15322
15329
  try {
15323
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-DhQ6k7YD.cjs'); });
15330
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-FbKaK149.cjs'); });
15324
15331
  const command = parseTerminalHooksArgs(args.slice(1));
15325
15332
  if (command.action === "help") {
15326
15333
  console.log(TERMINAL_HOOKS_HELP);
@@ -15337,7 +15344,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15337
15344
  }
15338
15345
  } else if (subcommand === "spawn") {
15339
15346
  try {
15340
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-CwS8CPbr.cjs'); });
15347
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-D_ZexrY9.cjs'); });
15341
15348
  await handleSpawnCommand(args.slice(1));
15342
15349
  } catch (error) {
15343
15350
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15349,7 +15356,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15349
15356
  return;
15350
15357
  } else if (subcommand === "sessions") {
15351
15358
  try {
15352
- const { handleSessionsCommand } = await Promise.resolve().then(function () { return require('./sessions-CVUBS3LG.cjs'); });
15359
+ const { handleSessionsCommand } = await Promise.resolve().then(function () { return require('./sessions-CVuEsdRl.cjs'); });
15353
15360
  await handleSessionsCommand(args.slice(1));
15354
15361
  } catch (error) {
15355
15362
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15361,7 +15368,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15361
15368
  return;
15362
15369
  } else if (subcommand === "send") {
15363
15370
  try {
15364
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-CuajooZC.cjs'); });
15371
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-DBfSNILO.cjs'); });
15365
15372
  await handleSendCommand(args.slice(1));
15366
15373
  } catch (error) {
15367
15374
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15467,9 +15474,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15467
15474
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
15468
15475
  const projectId = args[3];
15469
15476
  try {
15470
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-CTCGilz_.cjs'); });
15471
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types--t4zLibT.cjs'); }).then(function (n) { return n.persistence; });
15472
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types--t4zLibT.cjs'); }).then(function (n) { return n.api; });
15477
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-BR3tkFL_.cjs'); });
15478
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./types-BG_5QKX5.cjs'); }).then(function (n) { return n.persistence; });
15479
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-BG_5QKX5.cjs'); }).then(function (n) { return n.api; });
15473
15480
  let userEmail = void 0;
15474
15481
  try {
15475
15482
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -15500,7 +15507,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15500
15507
  }
15501
15508
  if (geminiSubcommand === "project" && args[2] === "get") {
15502
15509
  try {
15503
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-CTCGilz_.cjs'); });
15510
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-BR3tkFL_.cjs'); });
15504
15511
  const config = readGeminiLocalConfig();
15505
15512
  if (config.googleCloudProject) {
15506
15513
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -15540,7 +15547,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15540
15547
  process.exit(0);
15541
15548
  }
15542
15549
  try {
15543
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-D6Wwfk_0.cjs'); });
15550
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-D5ySpYIZ.cjs'); });
15544
15551
  let startedBy = void 0;
15545
15552
  for (let i = 1; i < args.length; i++) {
15546
15553
  if (args[i] === "--started-by") {
@@ -15562,7 +15569,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15562
15569
  return;
15563
15570
  } else if (subcommand === "acp") {
15564
15571
  try {
15565
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-D-adqB7g.cjs'); });
15572
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-CtBP0Qvc.cjs'); });
15566
15573
  let startedBy = void 0;
15567
15574
  let verbose = false;
15568
15575
  const acpArgs = [];
@@ -15602,7 +15609,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15602
15609
  return;
15603
15610
  } else if (subcommand === "openclaw") {
15604
15611
  try {
15605
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-BYmlS-4Q.cjs'); });
15612
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-Bwrb1LXP.cjs'); });
15606
15613
  let startedBy = void 0;
15607
15614
  let verbose = false;
15608
15615
  let gatewayUrl;
@@ -15653,7 +15660,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15653
15660
  return;
15654
15661
  } else if (subcommand === "mcp" && args.length === 1) {
15655
15662
  try {
15656
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-Dr1PegOw.cjs'); });
15663
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-DPp-bYNE.cjs'); });
15657
15664
  await handleMcpCommand();
15658
15665
  } catch (error) {
15659
15666
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -16011,6 +16018,7 @@ ${chalk.bold("Examples:")}
16011
16018
  }
16012
16019
  }
16013
16020
 
16021
+ exports.ALLOWED_SPAWN_PERMISSION_MODES = ALLOWED_SPAWN_PERMISSION_MODES;
16014
16022
  exports.BasePermissionHandler = BasePermissionHandler;
16015
16023
  exports.BaseReasoningProcessor = BaseReasoningProcessor;
16016
16024
  exports.CHANGE_TITLE_INSTRUCTION = CHANGE_TITLE_INSTRUCTION;
@@ -16034,6 +16042,7 @@ exports.pushClipboardViaDaemon = pushClipboardViaDaemon;
16034
16042
  exports.query = query;
16035
16043
  exports.readSessionTranscript = readSessionTranscript;
16036
16044
  exports.registerKillSessionHandler = registerKillSessionHandler;
16045
+ exports.sanitizeSpawnPermissionMode = sanitizeSpawnPermissionMode;
16037
16046
  exports.sendUserMessage = sendUserMessage;
16038
16047
  exports.sessionWebUrl = sessionWebUrl;
16039
16048
  exports.setupOfflineReconnection = setupOfflineReconnection;
@@ -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 { o as readDaemonState, l as logger, c as configuration, q as clearDaemonState, s as getProjectPath, p as projectPath, t as initializeSandbox, u as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, v as AsyncLock, x as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, y as hardenPrivateFile, f as packageJson, j as readSettings, z as readCredentials, B as credentialRelayProblem, C as deriveLocalCliUpdateSummary, k as encodeBase64, D as updateSettings, E as encodeBase64Url, F as decodeBase64, G as writeCredentialsLegacy, H as writeCredentialsDataKey, J as readCredentialsForConfiguredRelay, K as encrypt, r as readPersistedSessions, L as isClaudeSessionId, N as getLocalHappyAgentCredentialPath, O as readLocalHappyAgentCredentials, P as decryptWithDataKey, Q as decryptLegacy, S as extractCompleteLines, T as decideBackfill, U as parseTerminalHookPayload, V as tmuxArgs, W as scrubTmuxClientEnv, X as decideMirrorBinding, Y as MIRROR_BACKFILL_LINES_DEFAULT, Z as persistSession, _ as mirrorLineKey, $ as mirrorLocalId, w as writePrivateFileSync, a0 as detectResumeSupport, a1 as detectCLIAvailability, a2 as acquireDaemonLock, a3 as summarizeSpawnSessionForLog, a4 as deletePersistedSessions, a5 as shellescape, a6 as decrypt, a7 as writeDaemonState, A as ApiClient, a8 as writeSettings, a9 as fetchCliUpdateState, aa as resolveCliUpdateCheckInterval, ab as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ac as releaseDaemonLock, i 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, m as ensurePrivateDirectorySync, am as SandboxConfigSchema, b as createEnvelope, an as CodexAppServerClient, ao as getLatestDaemonLog } from './types-BdO0jg7G.mjs';
4
+ import { o as readDaemonState, l as logger, c as configuration, q as clearDaemonState, s as getProjectPath, p as projectPath, t as initializeSandbox, u as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, v as AsyncLock, x as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, y as hardenPrivateFile, f as packageJson, j as readSettings, z as readCredentials, B as credentialRelayProblem, C as deriveLocalCliUpdateSummary, k as encodeBase64, D as updateSettings, E as encodeBase64Url, F as decodeBase64, G as writeCredentialsLegacy, H as writeCredentialsDataKey, J as readCredentialsForConfiguredRelay, K as encrypt, r as readPersistedSessions, L as isClaudeSessionId, N as getLocalHappyAgentCredentialPath, O as readLocalHappyAgentCredentials, P as decryptWithDataKey, Q as decryptLegacy, S as extractCompleteLines, T as decideBackfill, U as parseTerminalHookPayload, V as tmuxArgs, W as scrubTmuxClientEnv, X as decideMirrorBinding, Y as MIRROR_BACKFILL_LINES_DEFAULT, Z as persistSession, _ as mirrorLineKey, $ as mirrorLocalId, w as writePrivateFileSync, a0 as detectResumeSupport, a1 as detectCLIAvailability, a2 as acquireDaemonLock, a3 as summarizeSpawnSessionForLog, a4 as deletePersistedSessions, a5 as shellescape, a6 as decrypt, a7 as writeDaemonState, A as ApiClient, a8 as writeSettings, a9 as fetchCliUpdateState, aa as resolveCliUpdateCheckInterval, ab as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, ac as releaseDaemonLock, i 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, m as ensurePrivateDirectorySync, am as SandboxConfigSchema, b as createEnvelope, an as CodexAppServerClient, ao as getLatestDaemonLog } from './types-k_ipDb0c.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';
@@ -169,7 +169,14 @@ async function stopDaemonSession(sessionId) {
169
169
  return result.success || false;
170
170
  }
171
171
  async function spawnDaemonSession(directory, sessionId, opts) {
172
- const result = await daemonPost("/spawn-session", { directory, sessionId, spawnedBy: opts?.spawnedBy });
172
+ const result = await daemonPost("/spawn-session", {
173
+ directory,
174
+ sessionId,
175
+ spawnedBy: opts?.spawnedBy,
176
+ permissionMode: opts?.permissionMode,
177
+ agent: opts?.agent,
178
+ environmentVariables: opts?.environmentVariables
179
+ });
173
180
  return result;
174
181
  }
175
182
  async function notifyDaemonSessionEvent(sessionId, event, spawnedBy) {
@@ -10368,7 +10375,7 @@ function registerSideQuestionHandler(rpc, deps) {
10368
10375
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
10369
10376
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
10370
10377
  const run = deps.run ?? (async (input) => {
10371
- const { query } = await import('./index-jYltd-ZW.mjs');
10378
+ const { query } = await import('./index-C-RLk8-e.mjs');
10372
10379
  return runSideQuestion(query, input);
10373
10380
  });
10374
10381
  const slots = /* @__PURE__ */ new Map();
@@ -15298,7 +15305,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15298
15305
  process.exit(0);
15299
15306
  } else if (subcommand === "install-terminal-hooks") {
15300
15307
  try {
15301
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-CJyoR9jp.mjs');
15308
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-ADNcNdnB.mjs');
15302
15309
  const command = parseTerminalHooksArgs(args.slice(1));
15303
15310
  if (command.action === "help") {
15304
15311
  console.log(TERMINAL_HOOKS_HELP);
@@ -15315,7 +15322,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15315
15322
  }
15316
15323
  } else if (subcommand === "spawn") {
15317
15324
  try {
15318
- const { handleSpawnCommand } = await import('./spawn-DcA80_VN.mjs');
15325
+ const { handleSpawnCommand } = await import('./spawn-BorKN3W2.mjs');
15319
15326
  await handleSpawnCommand(args.slice(1));
15320
15327
  } catch (error) {
15321
15328
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15327,7 +15334,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15327
15334
  return;
15328
15335
  } else if (subcommand === "sessions") {
15329
15336
  try {
15330
- const { handleSessionsCommand } = await import('./sessions-DDwCphTQ.mjs');
15337
+ const { handleSessionsCommand } = await import('./sessions-1fW8soBM.mjs');
15331
15338
  await handleSessionsCommand(args.slice(1));
15332
15339
  } catch (error) {
15333
15340
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15339,7 +15346,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15339
15346
  return;
15340
15347
  } else if (subcommand === "send") {
15341
15348
  try {
15342
- const { handleSendCommand } = await import('./send-Btz1IZ9U.mjs');
15349
+ const { handleSendCommand } = await import('./send-BlkxFZu4.mjs');
15343
15350
  await handleSendCommand(args.slice(1));
15344
15351
  } catch (error) {
15345
15352
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -15445,9 +15452,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15445
15452
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
15446
15453
  const projectId = args[3];
15447
15454
  try {
15448
- const { saveGoogleCloudProjectToConfig } = await import('./config-CTyyVXHj.mjs');
15449
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-BdO0jg7G.mjs').then(function (n) { return n.ap; });
15450
- const { ApiClient: ApiClient2 } = await import('./types-BdO0jg7G.mjs').then(function (n) { return n.aq; });
15455
+ const { saveGoogleCloudProjectToConfig } = await import('./config-vGkcq9nM.mjs');
15456
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-k_ipDb0c.mjs').then(function (n) { return n.ap; });
15457
+ const { ApiClient: ApiClient2 } = await import('./types-k_ipDb0c.mjs').then(function (n) { return n.aq; });
15451
15458
  let userEmail = void 0;
15452
15459
  try {
15453
15460
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -15478,7 +15485,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15478
15485
  }
15479
15486
  if (geminiSubcommand === "project" && args[2] === "get") {
15480
15487
  try {
15481
- const { readGeminiLocalConfig } = await import('./config-CTyyVXHj.mjs');
15488
+ const { readGeminiLocalConfig } = await import('./config-vGkcq9nM.mjs');
15482
15489
  const config = readGeminiLocalConfig();
15483
15490
  if (config.googleCloudProject) {
15484
15491
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -15518,7 +15525,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15518
15525
  process.exit(0);
15519
15526
  }
15520
15527
  try {
15521
- const { runGemini } = await import('./runGemini-CuzqF6Ys.mjs');
15528
+ const { runGemini } = await import('./runGemini-CWWyjQMz.mjs');
15522
15529
  let startedBy = void 0;
15523
15530
  for (let i = 1; i < args.length; i++) {
15524
15531
  if (args[i] === "--started-by") {
@@ -15540,7 +15547,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15540
15547
  return;
15541
15548
  } else if (subcommand === "acp") {
15542
15549
  try {
15543
- const { runAcp, resolveAcpAgentConfig } = await import('./index-Brhvj7p0.mjs');
15550
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-JAhGeW4_.mjs');
15544
15551
  let startedBy = void 0;
15545
15552
  let verbose = false;
15546
15553
  const acpArgs = [];
@@ -15580,7 +15587,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15580
15587
  return;
15581
15588
  } else if (subcommand === "openclaw") {
15582
15589
  try {
15583
- const { runOpenClaw } = await import('./runOpenClaw-B5pkmSTb.mjs');
15590
+ const { runOpenClaw } = await import('./runOpenClaw-Bv4rUTyJ.mjs');
15584
15591
  let startedBy = void 0;
15585
15592
  let verbose = false;
15586
15593
  let gatewayUrl;
@@ -15631,7 +15638,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
15631
15638
  return;
15632
15639
  } else if (subcommand === "mcp" && args.length === 1) {
15633
15640
  try {
15634
- const { handleMcpCommand } = await import('./mcp-BO9-sxMr.mjs');
15641
+ const { handleMcpCommand } = await import('./mcp-DHPm_gvL.mjs');
15635
15642
  await handleMcpCommand();
15636
15643
  } catch (error) {
15637
15644
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
@@ -15989,4 +15996,4 @@ ${chalk.bold("Examples:")}
15989
15996
  }
15990
15997
  }
15991
15998
 
15992
- export { BasePermissionHandler as B, CHANGE_TITLE_INSTRUCTION as C, DEFAULT_RECENT_LIMIT as D, GEMINI_MODEL_ENV as G, MAX_READ_LIMIT as M, sessionWebUrl as a, sendUserMessage as b, checkIfDaemonRunningAndCleanupStaleState as c, stopSession as d, archiveSession as e, DEFAULT_GEMINI_MODEL as f, initialMachineMetadata as g, createSessionMetadata as h, isValidSpawnOrigin as i, setupOfflineReconnection as j, MessageQueue2 as k, listSessions as l, hashObject as m, notifyDaemonSessionStarted as n, startHappyServer as o, pushClipboardViaDaemon as p, query as q, readSessionTranscript as r, spawnDaemonSession as s, tmuxSupportsSessionEnv as t, registerKillSessionHandler as u, GEMINI_API_KEY_ENV as v, waitForSessionKey as w, GOOGLE_API_KEY_ENV as x, BaseReasoningProcessor as y, MessageBuffer as z };
15999
+ export { ALLOWED_SPAWN_PERMISSION_MODES as A, BasePermissionHandler as B, MessageBuffer as C, DEFAULT_RECENT_LIMIT as D, CHANGE_TITLE_INSTRUCTION as E, GEMINI_MODEL_ENV as G, MAX_READ_LIMIT as M, sessionWebUrl as a, sanitizeSpawnPermissionMode as b, checkIfDaemonRunningAndCleanupStaleState as c, sendUserMessage as d, stopSession as e, archiveSession as f, DEFAULT_GEMINI_MODEL as g, initialMachineMetadata as h, isValidSpawnOrigin as i, createSessionMetadata as j, setupOfflineReconnection as k, listSessions as l, MessageQueue2 as m, notifyDaemonSessionStarted as n, hashObject as o, pushClipboardViaDaemon as p, query as q, readSessionTranscript as r, spawnDaemonSession as s, tmuxSupportsSessionEnv as t, startHappyServer as u, registerKillSessionHandler as v, waitForSessionKey as w, GEMINI_API_KEY_ENV as x, GOOGLE_API_KEY_ENV as y, BaseReasoningProcessor as z };
@@ -1,9 +1,9 @@
1
- import { q as query } from './index-BW9kDx5m.mjs';
1
+ import { q as query } from './index-Bn-xsguz.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-BdO0jg7G.mjs';
6
+ import './types-k_ipDb0c.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-D0_wbTs6.cjs');
4
- var persistence = require('./types--t4zLibT.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-Dcj_iHw8.cjs');
3
+ var AcpBackend = require('./AcpBackend-B_olk79F.cjs');
4
+ var persistence = require('./types-BG_5QKX5.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-uXwWO2Tn.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var index = require('./index-CvnMiYgh.cjs');
8
+ var index = require('./index-BOoGJGQc.cjs');
9
9
  require('node:child_process');
10
10
  require('@agentclientprotocol/sdk');
11
11
  require('axios');
@@ -1,10 +1,10 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-DzZR7TEv.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-DzZR7TEv.mjs';
3
- import { h as connectionState, A as ApiClient, j as readSettings, k as encodeBase64, l as logger, p as projectPath } from './types-BdO0jg7G.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-tWuFWeIF.mjs';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-CeXVb_s_.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-CeXVb_s_.mjs';
3
+ import { h as connectionState, A as ApiClient, j as readSettings, k as encodeBase64, l as logger, p as projectPath } from './types-k_ipDb0c.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-vqdqfD1l.mjs';
5
5
  import { randomUUID } from 'node:crypto';
6
6
  import { join } from 'node:path';
7
- import { g as initialMachineMetadata, h as createSessionMetadata, j as setupOfflineReconnection, n as notifyDaemonSessionStarted, k as MessageQueue2, m as hashObject, o as startHappyServer, u as registerKillSessionHandler, B as BasePermissionHandler } from './index-BW9kDx5m.mjs';
7
+ import { h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, n as notifyDaemonSessionStarted, m as MessageQueue2, o as hashObject, u as startHappyServer, v as registerKillSessionHandler, B as BasePermissionHandler } from './index-Bn-xsguz.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-CvnMiYgh.cjs');
3
+ var index = require('./index-BOoGJGQc.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--t4zLibT.cjs');
8
+ require('./types-BG_5QKX5.cjs');
9
9
  require('axios');
10
10
  require('node:util');
11
11
  require('node:fs');
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-CvnMiYgh.cjs');
5
- require('./types--t4zLibT.cjs');
4
+ require('./index-BOoGJGQc.cjs');
5
+ require('./types-BG_5QKX5.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-BW9kDx5m.mjs';
3
- import './types-BdO0jg7G.mjs';
2
+ import './index-Bn-xsguz.mjs';
3
+ import './types-k_ipDb0c.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:os';
@@ -3,8 +3,8 @@ import { join, resolve } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import chalk from 'chalk';
6
- import { p as projectPath } from './types-BdO0jg7G.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-BW9kDx5m.mjs';
6
+ import { p as projectPath } from './types-k_ipDb0c.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-Bn-xsguz.mjs';
8
8
  import 'axios';
9
9
  import 'node:util';
10
10
  import 'node:fs/promises';
@@ -5,8 +5,8 @@ var path = require('node:path');
5
5
  var os = require('node:os');
6
6
  var node_child_process = require('node:child_process');
7
7
  var chalk = require('chalk');
8
- var persistence = require('./types--t4zLibT.cjs');
9
- var index = require('./index-CvnMiYgh.cjs');
8
+ var persistence = require('./types-BG_5QKX5.cjs');
9
+ var index = require('./index-BOoGJGQc.cjs');
10
10
  require('axios');
11
11
  require('node:util');
12
12
  require('node:fs/promises');
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var persistence = require('./types--t4zLibT.cjs');
3
+ var persistence = require('./types-BG_5QKX5.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('node:util');
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-BdO0jg7G.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-k_ipDb0c.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-BW9kDx5m.mjs';
4
+ import { p as pushClipboardViaDaemon } from './index-Bn-xsguz.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-BdO0jg7G.mjs';
6
+ import { l as logger } from './types-k_ipDb0c.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-CvnMiYgh.cjs');
6
+ var index = require('./index-BOoGJGQc.cjs');
7
7
  var limits = require('./limits-KdWKmwtH.cjs');
8
- var persistence = require('./types--t4zLibT.cjs');
8
+ var persistence = require('./types-BG_5QKX5.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, j as readSettings, e as errorLogMetadata, k as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-BdO0jg7G.mjs';
6
- import { v as GEMINI_API_KEY_ENV, x as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, y as BaseReasoningProcessor, g as initialMachineMetadata, h as createSessionMetadata, j as setupOfflineReconnection, n as notifyDaemonSessionStarted, k as MessageQueue2, m as hashObject, z as MessageBuffer, C as CHANGE_TITLE_INSTRUCTION, u as registerKillSessionHandler, o as startHappyServer } from './index-BW9kDx5m.mjs';
7
- import { A as AcpBackend } from './AcpBackend-DzZR7TEv.mjs';
8
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-CTyyVXHj.mjs';
5
+ import { l as logger, h as connectionState, A as ApiClient, j as readSettings, e as errorLogMetadata, k as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-k_ipDb0c.mjs';
6
+ import { x as GEMINI_API_KEY_ENV, y as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, z as BaseReasoningProcessor, h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, n as notifyDaemonSessionStarted, m as MessageQueue2, o as hashObject, C as MessageBuffer, E as CHANGE_TITLE_INSTRUCTION, v as registerKillSessionHandler, u as startHappyServer } from './index-Bn-xsguz.mjs';
7
+ import { A as AcpBackend } from './AcpBackend-CeXVb_s_.mjs';
8
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-vGkcq9nM.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--t4zLibT.cjs');
8
- var index = require('./index-CvnMiYgh.cjs');
9
- var AcpBackend = require('./AcpBackend-D0_wbTs6.cjs');
10
- var config = require('./config-CTCGilz_.cjs');
7
+ var persistence = require('./types-BG_5QKX5.cjs');
8
+ var index = require('./index-BOoGJGQc.cjs');
9
+ var AcpBackend = require('./AcpBackend-B_olk79F.cjs');
10
+ var config = require('./config-BR3tkFL_.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 { m as ensurePrivateDirectorySync, n as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, j as readSettings, k as encodeBase64, l as logger, c as configuration } from './types-BdO0jg7G.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-tWuFWeIF.mjs';
8
- import { g as initialMachineMetadata, h as createSessionMetadata, j as setupOfflineReconnection, n as notifyDaemonSessionStarted, k as MessageQueue2, u as registerKillSessionHandler } from './index-BW9kDx5m.mjs';
6
+ import { m as ensurePrivateDirectorySync, n as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, j as readSettings, k as encodeBase64, l as logger, c as configuration } from './types-k_ipDb0c.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-vqdqfD1l.mjs';
8
+ import { h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, n as notifyDaemonSessionStarted, m as MessageQueue2, v as registerKillSessionHandler } from './index-Bn-xsguz.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--t4zLibT.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-Dcj_iHw8.cjs');
10
- var index = require('./index-CvnMiYgh.cjs');
8
+ var persistence = require('./types-BG_5QKX5.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-uXwWO2Tn.cjs');
10
+ var index = require('./index-BOoGJGQc.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-BdO0jg7G.mjs';
5
- import { b as sendUserMessage, a as sessionWebUrl } from './index-BW9kDx5m.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './types-k_ipDb0c.mjs';
5
+ import { d as sendUserMessage, a as sessionWebUrl } from './index-Bn-xsguz.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--t4zLibT.cjs');
7
- var index = require('./index-CvnMiYgh.cjs');
6
+ var persistence = require('./types-BG_5QKX5.cjs');
7
+ var index = require('./index-BOoGJGQc.cjs');
8
8
  require('axios');
9
9
  require('node:util');
10
10
  require('node:os');
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
- import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listSessions, r as readSessionTranscript, d as stopSession, e as archiveSession } from './index-BW9kDx5m.mjs';
3
- import { i as isValidSessionId } from './types-BdO0jg7G.mjs';
2
+ import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listSessions, r as readSessionTranscript, e as stopSession, f as archiveSession } from './index-Bn-xsguz.mjs';
3
+ import { i as isValidSessionId } from './types-k_ipDb0c.mjs';
4
4
  import 'node:os';
5
5
  import 'node:crypto';
6
6
  import 'cross-spawn';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var index = require('./index-CvnMiYgh.cjs');
5
- var persistence = require('./types--t4zLibT.cjs');
4
+ var index = require('./index-BOoGJGQc.cjs');
5
+ var persistence = require('./types-BG_5QKX5.cjs');
6
6
  require('node:os');
7
7
  require('node:crypto');
8
8
  require('cross-spawn');
@@ -1,8 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync, statSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, i as isValidSpawnOrigin, w as waitForSessionKey, b as sendUserMessage } from './index-BW9kDx5m.mjs';
5
- import { l as logger } from './types-BdO0jg7G.mjs';
4
+ import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, i as isValidSpawnOrigin, b as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES, w as waitForSessionKey, d as sendUserMessage } from './index-Bn-xsguz.mjs';
5
+ import { l as logger } from './types-k_ipDb0c.mjs';
6
6
  import 'node:os';
7
7
  import 'node:crypto';
8
8
  import 'cross-spawn';
@@ -46,6 +46,14 @@ import 'node:util';
46
46
  import 'url';
47
47
  import 'node-pty';
48
48
 
49
+ const SPAWN_AGENTS = ["claude", "codex", "gemini", "openclaw"];
50
+ function parseEnvAssignment(raw) {
51
+ const eq = raw.indexOf("=");
52
+ if (eq <= 0) throw new Error(`--env expects KEY=VALUE, got: ${raw}`);
53
+ const key = raw.slice(0, eq);
54
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) throw new Error(`--env key is not a valid variable name: ${key}`);
55
+ return [key, raw.slice(eq + 1)];
56
+ }
49
57
  function parseSpawnArgs(args) {
50
58
  const options = { json: false, help: false };
51
59
  for (let i = 0; i < args.length; i++) {
@@ -69,6 +77,25 @@ function parseSpawnArgs(args) {
69
77
  throw new Error("--spawned-by must be 1-24 chars of [a-z0-9] plus - or _, starting with a letter or digit");
70
78
  }
71
79
  options.spawnedBy = value;
80
+ } else if (arg === "--permission-mode") {
81
+ const value = args[++i];
82
+ if (value === void 0) throw new Error("--permission-mode requires a value");
83
+ if (sanitizeSpawnPermissionMode(value) === null) {
84
+ throw new Error(`--permission-mode must be one of: ${ALLOWED_SPAWN_PERMISSION_MODES.join(", ")}`);
85
+ }
86
+ options.permissionMode = value;
87
+ } else if (arg === "--agent") {
88
+ const value = args[++i];
89
+ if (value === void 0) throw new Error("--agent requires a value");
90
+ if (!SPAWN_AGENTS.includes(value)) {
91
+ throw new Error(`--agent must be one of: ${SPAWN_AGENTS.join(", ")}`);
92
+ }
93
+ options.agent = value;
94
+ } else if (arg === "--env") {
95
+ const value = args[++i];
96
+ if (value === void 0) throw new Error("--env requires a value");
97
+ const [key, val] = parseEnvAssignment(value);
98
+ options.env = { ...options.env ?? {}, [key]: val };
72
99
  } else if (arg === "--json") {
73
100
  options.json = true;
74
101
  } else if (arg === "--help" || arg === "-h") {
@@ -87,7 +114,9 @@ function printHelp() {
87
114
  ${chalk.bold("very-happy spawn")} - Spawn a remote session via the local daemon (for automation)
88
115
 
89
116
  ${chalk.bold("Usage:")}
90
- very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>] [--json]
117
+ very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>]
118
+ [--spawned-by <name>] [--permission-mode <mode>]
119
+ [--agent <name>] [--env KEY=VALUE]... [--json]
91
120
 
92
121
  ${chalk.bold("Options:")}
93
122
  --dir, -d <path> Working directory for the new session (required)
@@ -96,6 +125,17 @@ ${chalk.bold("Options:")}
96
125
  --spawned-by <name> Tag the new session with its origin (e.g. tanka).
97
126
  1-24 chars: [a-z0-9] plus - or _. Shows as a chip in
98
127
  the web list and is searchable as #<name>.
128
+ --permission-mode <m> Permission mode for the new session: default,
129
+ acceptEdits, plan, yolo, bypassPermissions.
130
+ WITHOUT this the session runs in 'default' and stops
131
+ at the first un-allowlisted tool waiting for someone
132
+ to approve \u2014 if nothing is watching, it just hangs.
133
+ Unattended dispatchers want bypassPermissions.
134
+ --agent <name> Backend to run: claude (default), codex, gemini,
135
+ openclaw.
136
+ --env KEY=VALUE Extra environment for the session process. Repeatable.
137
+ \${VAR} is expanded against the daemon's environment;
138
+ an unresolved reference fails the spawn.
99
139
  --json Machine-readable output: {"sessionId", "url"}
100
140
  -h, --help Show this help
101
141
 
@@ -161,7 +201,12 @@ async function handleSpawnCommand(args) {
161
201
  process.exit(1);
162
202
  }
163
203
  logger.debug(`[SPAWN CMD] Spawning session in ${directory}`);
164
- const result = await spawnDaemonSession(directory, void 0, { spawnedBy: options.spawnedBy });
204
+ const result = await spawnDaemonSession(directory, void 0, {
205
+ spawnedBy: options.spawnedBy,
206
+ permissionMode: options.permissionMode,
207
+ agent: options.agent,
208
+ environmentVariables: options.env
209
+ });
165
210
  if (result?.error || !result?.success || !result?.sessionId) {
166
211
  const message = result?.error || "Daemon returned no session ID";
167
212
  console.error(chalk.red("Error:"), `Failed to spawn session: ${message}`);
@@ -182,6 +227,12 @@ async function handleSpawnCommand(args) {
182
227
  if (options.spawnedBy !== void 0) {
183
228
  payload.spawnedBy = options.spawnedBy;
184
229
  }
230
+ if (options.permissionMode !== void 0) {
231
+ payload.permissionMode = options.permissionMode;
232
+ }
233
+ if (options.agent !== void 0) {
234
+ payload.agent = options.agent;
235
+ }
185
236
  if (prompt !== void 0) {
186
237
  payload.promptDelivered = promptError === null;
187
238
  }
@@ -204,4 +255,4 @@ async function handleSpawnCommand(args) {
204
255
  process.exit(0);
205
256
  }
206
257
 
207
- export { handleSpawnCommand, parseSpawnArgs, sessionWebUrl };
258
+ export { SPAWN_AGENTS, handleSpawnCommand, parseEnvAssignment, parseSpawnArgs, sessionWebUrl };
@@ -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-CvnMiYgh.cjs');
7
- var persistence = require('./types--t4zLibT.cjs');
6
+ var index = require('./index-BOoGJGQc.cjs');
7
+ var persistence = require('./types-BG_5QKX5.cjs');
8
8
  require('node:os');
9
9
  require('node:crypto');
10
10
  require('cross-spawn');
@@ -48,6 +48,14 @@ require('node:util');
48
48
  require('url');
49
49
  require('node-pty');
50
50
 
51
+ const SPAWN_AGENTS = ["claude", "codex", "gemini", "openclaw"];
52
+ function parseEnvAssignment(raw) {
53
+ const eq = raw.indexOf("=");
54
+ if (eq <= 0) throw new Error(`--env expects KEY=VALUE, got: ${raw}`);
55
+ const key = raw.slice(0, eq);
56
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) throw new Error(`--env key is not a valid variable name: ${key}`);
57
+ return [key, raw.slice(eq + 1)];
58
+ }
51
59
  function parseSpawnArgs(args) {
52
60
  const options = { json: false, help: false };
53
61
  for (let i = 0; i < args.length; i++) {
@@ -71,6 +79,25 @@ function parseSpawnArgs(args) {
71
79
  throw new Error("--spawned-by must be 1-24 chars of [a-z0-9] plus - or _, starting with a letter or digit");
72
80
  }
73
81
  options.spawnedBy = value;
82
+ } else if (arg === "--permission-mode") {
83
+ const value = args[++i];
84
+ if (value === void 0) throw new Error("--permission-mode requires a value");
85
+ if (index.sanitizeSpawnPermissionMode(value) === null) {
86
+ throw new Error(`--permission-mode must be one of: ${index.ALLOWED_SPAWN_PERMISSION_MODES.join(", ")}`);
87
+ }
88
+ options.permissionMode = value;
89
+ } else if (arg === "--agent") {
90
+ const value = args[++i];
91
+ if (value === void 0) throw new Error("--agent requires a value");
92
+ if (!SPAWN_AGENTS.includes(value)) {
93
+ throw new Error(`--agent must be one of: ${SPAWN_AGENTS.join(", ")}`);
94
+ }
95
+ options.agent = value;
96
+ } else if (arg === "--env") {
97
+ const value = args[++i];
98
+ if (value === void 0) throw new Error("--env requires a value");
99
+ const [key, val] = parseEnvAssignment(value);
100
+ options.env = { ...options.env ?? {}, [key]: val };
74
101
  } else if (arg === "--json") {
75
102
  options.json = true;
76
103
  } else if (arg === "--help" || arg === "-h") {
@@ -89,7 +116,9 @@ function printHelp() {
89
116
  ${chalk.bold("very-happy spawn")} - Spawn a remote session via the local daemon (for automation)
90
117
 
91
118
  ${chalk.bold("Usage:")}
92
- very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>] [--json]
119
+ very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>]
120
+ [--spawned-by <name>] [--permission-mode <mode>]
121
+ [--agent <name>] [--env KEY=VALUE]... [--json]
93
122
 
94
123
  ${chalk.bold("Options:")}
95
124
  --dir, -d <path> Working directory for the new session (required)
@@ -98,6 +127,17 @@ ${chalk.bold("Options:")}
98
127
  --spawned-by <name> Tag the new session with its origin (e.g. tanka).
99
128
  1-24 chars: [a-z0-9] plus - or _. Shows as a chip in
100
129
  the web list and is searchable as #<name>.
130
+ --permission-mode <m> Permission mode for the new session: default,
131
+ acceptEdits, plan, yolo, bypassPermissions.
132
+ WITHOUT this the session runs in 'default' and stops
133
+ at the first un-allowlisted tool waiting for someone
134
+ to approve \u2014 if nothing is watching, it just hangs.
135
+ Unattended dispatchers want bypassPermissions.
136
+ --agent <name> Backend to run: claude (default), codex, gemini,
137
+ openclaw.
138
+ --env KEY=VALUE Extra environment for the session process. Repeatable.
139
+ \${VAR} is expanded against the daemon's environment;
140
+ an unresolved reference fails the spawn.
101
141
  --json Machine-readable output: {"sessionId", "url"}
102
142
  -h, --help Show this help
103
143
 
@@ -163,7 +203,12 @@ async function handleSpawnCommand(args) {
163
203
  process.exit(1);
164
204
  }
165
205
  persistence.logger.debug(`[SPAWN CMD] Spawning session in ${directory}`);
166
- const result = await index.spawnDaemonSession(directory, void 0, { spawnedBy: options.spawnedBy });
206
+ const result = await index.spawnDaemonSession(directory, void 0, {
207
+ spawnedBy: options.spawnedBy,
208
+ permissionMode: options.permissionMode,
209
+ agent: options.agent,
210
+ environmentVariables: options.env
211
+ });
167
212
  if (result?.error || !result?.success || !result?.sessionId) {
168
213
  const message = result?.error || "Daemon returned no session ID";
169
214
  console.error(chalk.red("Error:"), `Failed to spawn session: ${message}`);
@@ -184,6 +229,12 @@ async function handleSpawnCommand(args) {
184
229
  if (options.spawnedBy !== void 0) {
185
230
  payload.spawnedBy = options.spawnedBy;
186
231
  }
232
+ if (options.permissionMode !== void 0) {
233
+ payload.permissionMode = options.permissionMode;
234
+ }
235
+ if (options.agent !== void 0) {
236
+ payload.agent = options.agent;
237
+ }
187
238
  if (prompt !== void 0) {
188
239
  payload.promptDelivered = promptError === null;
189
240
  }
@@ -207,5 +258,7 @@ async function handleSpawnCommand(args) {
207
258
  }
208
259
 
209
260
  exports.sessionWebUrl = index.sessionWebUrl;
261
+ exports.SPAWN_AGENTS = SPAWN_AGENTS;
210
262
  exports.handleSpawnCommand = handleSpawnCommand;
263
+ exports.parseEnvAssignment = parseEnvAssignment;
211
264
  exports.parseSpawnArgs = parseSpawnArgs;
@@ -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.110";
54
+ var version = "0.2.111";
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.110",
168
- "very-happy-tools-x64-darwin": "0.2.110",
169
- "very-happy-tools-arm64-linux": "0.2.110",
170
- "very-happy-tools-x64-linux": "0.2.110",
171
- "very-happy-tools-arm64-win32": "0.2.110",
172
- "very-happy-tools-x64-win32": "0.2.110"
167
+ "very-happy-tools-arm64-darwin": "0.2.111",
168
+ "very-happy-tools-x64-darwin": "0.2.111",
169
+ "very-happy-tools-arm64-linux": "0.2.111",
170
+ "very-happy-tools-x64-linux": "0.2.111",
171
+ "very-happy-tools-arm64-win32": "0.2.111",
172
+ "very-happy-tools-x64-win32": "0.2.111"
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--t4zLibT.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-BG_5QKX5.cjs', document.baseURI).href))));
1607
1607
  function projectPath() {
1608
1608
  const path = path$1.resolve(__dirname$1, "..");
1609
1609
  return path;
@@ -29,7 +29,7 @@ import { SandboxManager } from '@anthropic-ai/sandbox-runtime';
29
29
  import { Expo } from 'expo-server-sdk';
30
30
 
31
31
  var name = "very-happy-cli";
32
- var version = "0.2.110";
32
+ var version = "0.2.111";
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.110",
146
- "very-happy-tools-x64-darwin": "0.2.110",
147
- "very-happy-tools-arm64-linux": "0.2.110",
148
- "very-happy-tools-x64-linux": "0.2.110",
149
- "very-happy-tools-arm64-win32": "0.2.110",
150
- "very-happy-tools-x64-win32": "0.2.110"
145
+ "very-happy-tools-arm64-darwin": "0.2.111",
146
+ "very-happy-tools-x64-darwin": "0.2.111",
147
+ "very-happy-tools-arm64-linux": "0.2.111",
148
+ "very-happy-tools-x64-linux": "0.2.111",
149
+ "very-happy-tools-arm64-win32": "0.2.111",
150
+ "very-happy-tools-x64-win32": "0.2.111"
151
151
  };
152
152
  var devDependencies = {
153
153
  "@slopus/happy-wire": "workspace:*",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "very-happy-cli",
3
- "version": "0.2.110",
3
+ "version": "0.2.111",
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.110",
117
- "very-happy-tools-x64-darwin": "0.2.110",
118
- "very-happy-tools-arm64-linux": "0.2.110",
119
- "very-happy-tools-x64-linux": "0.2.110",
120
- "very-happy-tools-arm64-win32": "0.2.110",
121
- "very-happy-tools-x64-win32": "0.2.110"
116
+ "very-happy-tools-arm64-darwin": "0.2.111",
117
+ "very-happy-tools-x64-darwin": "0.2.111",
118
+ "very-happy-tools-arm64-linux": "0.2.111",
119
+ "very-happy-tools-x64-linux": "0.2.111",
120
+ "very-happy-tools-arm64-win32": "0.2.111",
121
+ "very-happy-tools-x64-win32": "0.2.111"
122
122
  },
123
123
  "devDependencies": {
124
124
  "@slopus/happy-wire": "workspace:*",