very-happy-cli 0.2.148 → 0.2.150

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 (49) hide show
  1. package/dist/{AcpBackend-CrcdMnL6.mjs → AcpBackend-C-dhGJgd.mjs} +2 -2
  2. package/dist/{AcpBackend-BrM-mcjR.cjs → AcpBackend-CXawaWWx.cjs} +2 -2
  3. package/dist/{AcpSessionManager-DIafxIVU.mjs → AcpSessionManager-DKOtSqJc.mjs} +1 -1
  4. package/dist/{AcpSessionManager-CKhv-rBo.cjs → AcpSessionManager-TrwEZR7y.cjs} +1 -1
  5. package/dist/{agentGuidance-gzl2qRkG.cjs → agentGuidance-Dla-BXO8.cjs} +1 -1
  6. package/dist/{agentGuidance-CR7rOQUF.mjs → agentGuidance-DrfhtVP1.mjs} +1 -1
  7. package/dist/{agentHome-CQrd95jc.mjs → agentHome-Dm-Wjs38.mjs} +2 -2
  8. package/dist/{agentHome-Qh6SWyHx.cjs → agentHome-rylNIkix.cjs} +2 -2
  9. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  10. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  11. package/dist/{config-CFSD65_X.cjs → config-CgPu2wtS.cjs} +4 -4
  12. package/dist/{config-DkCS4663.mjs → config-Dhu6LU0h.mjs} +4 -4
  13. package/dist/{index-eLVXOce3.mjs → index-BsYH1sjV.mjs} +4 -4
  14. package/dist/{index-Cobfu9V_.mjs → index-CpNYvMTJ.mjs} +196 -66
  15. package/dist/{index-C4JoaSCO.mjs → index-CzpooENj.mjs} +8 -8
  16. package/dist/{index-x5-N7ElS.cjs → index-DEVkDRas.cjs} +7 -7
  17. package/dist/{index-C_hZVtR-.cjs → index-DvfCUuDK.cjs} +4 -4
  18. package/dist/{index-C1OeYxxj.cjs → index-K6mUS0jF.cjs} +194 -64
  19. package/dist/index.cjs +4 -4
  20. package/dist/index.mjs +4 -4
  21. package/dist/{installTerminalHooks-D9pIHXxU.mjs → installTerminalHooks-BF_tmw9V.mjs} +4 -4
  22. package/dist/{installTerminalHooks-CuqhiAo9.cjs → installTerminalHooks-NIbsQ1wi.cjs} +4 -4
  23. package/dist/lib.cjs +2 -2
  24. package/dist/lib.mjs +2 -2
  25. package/dist/{limits-D364Cpe3.cjs → limits-Dyma1REp.cjs} +8 -8
  26. package/dist/{limits-BfYfA7tt.mjs → limits-FThmm7WR.mjs} +8 -8
  27. package/dist/{mcp-DTXsdDwc.mjs → mcp-DzydgXpf.mjs} +4 -4
  28. package/dist/{mcp-B5ojE8_m.cjs → mcp-_TVUSg8W.cjs} +4 -4
  29. package/dist/{piRuntime-BWEgqBHm.mjs → piRuntime-ACOhil6t.mjs} +2 -2
  30. package/dist/{piRuntime-CbSaG74b.cjs → piRuntime-CSAiJk0X.cjs} +2 -2
  31. package/dist/{piTerminal-CnS3TF7M.mjs → piTerminal-BlE4vbvZ.mjs} +6 -6
  32. package/dist/{piTerminal-Bzremid-.cjs → piTerminal-DHxGB3Ic.cjs} +6 -6
  33. package/dist/{runGemini-Ci6ULPA7.cjs → runGemini-BMYCU16c.cjs} +6 -6
  34. package/dist/{runGemini-C13-aRss.mjs → runGemini-D5IV1MoF.mjs} +6 -6
  35. package/dist/{runOpenClaw-D4ABejEy.mjs → runOpenClaw-CWPXrKMJ.mjs} +5 -5
  36. package/dist/{runOpenClaw-D2DW9Umc.cjs → runOpenClaw-Qs4eFtcS.cjs} +5 -5
  37. package/dist/{send-D-9_jOIS.mjs → send-Dv0km8UI.mjs} +4 -4
  38. package/dist/{send-1hJXKzeP.cjs → send-qXWGilm8.cjs} +4 -4
  39. package/dist/{sessions-DOrymTYB.cjs → sessions-CpIdDhH7.cjs} +4 -4
  40. package/dist/{sessions-C9VwpMKY.mjs → sessions-DoULfKui.mjs} +4 -4
  41. package/dist/{spawn-C4uID9JX.mjs → spawn-DQuOmUP7.mjs} +4 -4
  42. package/dist/{spawn-B1IlltVe.cjs → spawn-DqzG1bTH.cjs} +4 -4
  43. package/dist/{teams-CCv46ebr.mjs → teams-4mhNh5cj.mjs} +4 -4
  44. package/dist/{teams-xIRGgxwJ.cjs → teams-ByEgUzsH.cjs} +4 -4
  45. package/dist/{todo-5QemH15n.mjs → todo-C9IAUf0K.mjs} +3 -3
  46. package/dist/{todo-DrsOEfYU.cjs → todo-D7SDXL0c.cjs} +3 -3
  47. package/dist/{types-CXF6tULJ.mjs → types-BD542hb1.mjs} +4 -3
  48. package/dist/{types-IU5nGuaQ.cjs → types-D2Gkpe0N.cjs} +4 -3
  49. package/package.json +8 -8
@@ -3,14 +3,14 @@
3
3
  var chalk = require('chalk');
4
4
  var os = require('node:os');
5
5
  var node_crypto = require('node:crypto');
6
- var index = require('./types-IU5nGuaQ.cjs');
7
- var persistence = require('./limits-D364Cpe3.cjs');
6
+ var index = require('./types-D2Gkpe0N.cjs');
7
+ var persistence = require('./limits-Dyma1REp.cjs');
8
8
  var spawn = require('cross-spawn');
9
9
  var path = require('node:path');
10
10
  var node_readline = require('node:readline');
11
11
  var node_fs = require('node:fs');
12
12
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
13
- var agentGuidance = require('./agentGuidance-gzl2qRkG.cjs');
13
+ var agentGuidance = require('./agentGuidance-Dla-BXO8.cjs');
14
14
  var promises = require('node:fs/promises');
15
15
  var fs = require('fs/promises');
16
16
  var ink = require('ink');
@@ -5126,6 +5126,61 @@ function shareSafeEnvironmentInfo(env = process.env, runtime = process) {
5126
5126
  };
5127
5127
  }
5128
5128
 
5129
+ const NPM_SAFE_ARG = /^[A-Za-z0-9@=.,+/_-]+$/;
5130
+ function globalPrefixForPackage(packageDir) {
5131
+ if (!path.isAbsolute(packageDir)) return null;
5132
+ const dir = path.resolve(packageDir);
5133
+ const nodeModules = path.dirname(dir);
5134
+ const lib = path.dirname(nodeModules);
5135
+ const prefix = path.dirname(lib);
5136
+ if (path.basename(dir) !== "very-happy-cli" || path.basename(nodeModules) !== "node_modules" || path.basename(lib) !== "lib") return null;
5137
+ if (prefix === lib || path.resolve(prefix) === "/" || !NPM_SAFE_ARG.test(prefix)) return null;
5138
+ return prefix;
5139
+ }
5140
+ function packageDirForBin(realBin) {
5141
+ const packageDir = path.dirname(path.dirname(realBin));
5142
+ return path.basename(path.dirname(realBin)) === "bin" && path.basename(packageDir) === "very-happy-cli" ? packageDir : null;
5143
+ }
5144
+ function installLocationWarnings(facts, version) {
5145
+ const warnings = [];
5146
+ const running = path.resolve(facts.runningPackageDir);
5147
+ const packages = [...new Set(facts.onPath.map(packageDirForBin).filter((dir) => Boolean(dir)).map((dir) => path.resolve(dir)))];
5148
+ if (packages.length > 1) {
5149
+ warnings.push(`Found ${packages.length} very-happy installs on PATH (first one wins): ${packages.join(", ")}. Updating one does not update the others; remove the ones you do not use.`);
5150
+ }
5151
+ if (packages[0] && packages[0] !== running) {
5152
+ warnings.push(`The very-happy command runs ${packages[0]}, but this CLI runs from ${running}.`);
5153
+ }
5154
+ const prefix = globalPrefixForPackage(running);
5155
+ if (prefix && facts.npmGlobalPrefix && path.resolve(facts.npmGlobalPrefix) !== path.resolve(prefix)) {
5156
+ const target = version ? `very-happy-cli@${version}` : "very-happy-cli@latest";
5157
+ warnings.push(`npm install -g writes to ${facts.npmGlobalPrefix}, but this CLI runs from ${prefix}; a plain update will not take effect. Update with: npm install -g --prefix ${prefix} --allow-scripts=very-happy-cli,node-pty ${target} && very-happy daemon start`);
5158
+ }
5159
+ return warnings;
5160
+ }
5161
+ function gatherInstallLocationFacts(runningPackageDir, env = process.env) {
5162
+ if (process.platform === "win32") return null;
5163
+ const onPath = [];
5164
+ for (const dir of (env.PATH ?? "").split(path.delimiter)) {
5165
+ if (!dir) continue;
5166
+ try {
5167
+ const candidate = path.join(dir, "very-happy");
5168
+ if (!node_fs.statSync(candidate).isFile()) continue;
5169
+ const real = node_fs.realpathSync(candidate);
5170
+ if (!onPath.includes(real)) onPath.push(real);
5171
+ } catch {
5172
+ }
5173
+ }
5174
+ let npmGlobalPrefix = null;
5175
+ try {
5176
+ const result = node_child_process.spawnSync("npm", ["prefix", "-g"], { encoding: "utf8", timeout: 5e3, env });
5177
+ const out = result.status === 0 ? result.stdout.trim() : "";
5178
+ npmGlobalPrefix = out && path.isAbsolute(out) && !out.includes("\n") ? out : null;
5179
+ } catch {
5180
+ }
5181
+ return { runningPackageDir, onPath, npmGlobalPrefix };
5182
+ }
5183
+
5129
5184
  function printCliUpdateStatus(state) {
5130
5185
  const installed = persistence.configuration.currentCliVersion;
5131
5186
  const running = state?.startedWithCliVersion ?? null;
@@ -5143,6 +5198,10 @@ function printCliUpdateStatus(state) {
5143
5198
  console.log(chalk.yellow(" \u25B3 A newer CLI is available."));
5144
5199
  }
5145
5200
  if (summary.installCommand) console.log(` Update: ${summary.installCommand}`);
5201
+ const facts = gatherInstallLocationFacts(projectPath.projectPath());
5202
+ for (const warning of facts ? installLocationWarnings(facts, state?.cliUpdate?.recommendedVersion ?? void 0) : []) {
5203
+ console.log(chalk.yellow(` \u26A0 ${warning}`));
5204
+ }
5146
5205
  }
5147
5206
  function getEnvironmentInfo() {
5148
5207
  return shareSafeEnvironmentInfo();
@@ -5335,8 +5394,8 @@ ${typeLabels[type] || type}:`));
5335
5394
  }
5336
5395
  console.log(chalk.gray(" An external claude command is only needed for native terminal/mirror use."));
5337
5396
  try {
5338
- const { resolveAgentHomesForCli } = await Promise.resolve().then(function () { return require('./agentHome-Qh6SWyHx.cjs'); });
5339
- const { describeAgentHome } = await Promise.resolve().then(function () { return require('./types-IU5nGuaQ.cjs'); }).then(function (n) { return n.index; });
5397
+ const { resolveAgentHomesForCli } = await Promise.resolve().then(function () { return require('./agentHome-rylNIkix.cjs'); });
5398
+ const { describeAgentHome } = await Promise.resolve().then(function () { return require('./types-D2Gkpe0N.cjs'); }).then(function (n) { return n.index; });
5340
5399
  const homes = await resolveAgentHomesForCli();
5341
5400
  console.log(chalk.green(`\u2713 Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}`));
5342
5401
  console.log(chalk.green(`\u2713 Codex home: ${describeAgentHome(homes.codexHome)}`));
@@ -7639,8 +7698,8 @@ function serialTask(task) {
7639
7698
  };
7640
7699
  }
7641
7700
 
7642
- function autoUpdateInstallArgs(version) {
7643
- return ["i", "-g", "--allow-scripts=very-happy-cli,node-pty", `very-happy-cli@${version}`];
7701
+ function autoUpdateInstallArgs(version, prefix) {
7702
+ return ["i", "-g", ...prefix ? [`--prefix=${prefix}`] : [], "--allow-scripts=very-happy-cli,node-pty", `very-happy-cli@${version}`];
7644
7703
  }
7645
7704
 
7646
7705
  const processDefaults = {
@@ -7700,7 +7759,34 @@ const runNpmProcess = (args, deps = processDefaults) => new Promise((resolveResu
7700
7759
  child.on("close", (code) => done({ code: timedOut ? null : code, stdout, stderr, terminationConfirmed: !timedOut || treeKilled }));
7701
7760
  });
7702
7761
  const runNpm = (args) => runNpmProcess(args);
7703
- const defaults = { npm: runNpm, fs: { lstat: promises.lstat, readlink: promises.readlink, unlink: promises.unlink, rm: promises.rm, readFile: promises.readFile, symlink: promises.symlink }, platform: process.platform };
7762
+ const defaults = {
7763
+ npm: runNpm,
7764
+ fs: { lstat: promises.lstat, readlink: promises.readlink, unlink: promises.unlink, rm: promises.rm, readFile: promises.readFile, symlink: promises.symlink, access: promises.access },
7765
+ platform: process.platform,
7766
+ runningPackageDir: projectPath.projectPath()
7767
+ };
7768
+ async function runningVersion(deps) {
7769
+ if (!deps.runningPackageDir) return null;
7770
+ try {
7771
+ const manifest = JSON.parse(await deps.fs.readFile(path.join(deps.runningPackageDir, "package.json"), "utf8"));
7772
+ return manifest?.name === "very-happy-cli" && typeof manifest.version === "string" ? manifest.version : null;
7773
+ } catch {
7774
+ return null;
7775
+ }
7776
+ }
7777
+ async function verifyRunningCopy(code, version, deps) {
7778
+ if (code !== 0 || !deps.runningPackageDir) return code;
7779
+ return await runningVersion(deps) === version ? 0 : { failed: "installed_elsewhere" };
7780
+ }
7781
+ async function writable(path, deps) {
7782
+ if (!deps.fs.access) return true;
7783
+ try {
7784
+ await deps.fs.access(path, promises.constants.W_OK);
7785
+ return true;
7786
+ } catch (error) {
7787
+ return error.code === "ENOENT";
7788
+ }
7789
+ }
7704
7790
  function ownedCliLink(link, target, packageDir) {
7705
7791
  const resolved = path.resolve(path.dirname(link), target);
7706
7792
  return resolved.startsWith(path.join(packageDir, "bin") + path.sep);
@@ -7708,14 +7794,27 @@ function ownedCliLink(link, target, packageDir) {
7708
7794
  async function installCliSafely(version, deps = defaults) {
7709
7795
  const parsed = index.parseExactVersion(version);
7710
7796
  if (!parsed) throw new Error("Invalid exact CLI version");
7711
- const args = autoUpdateInstallArgs(parsed.exact);
7712
7797
  if (deps.platform === "win32") {
7713
- const result2 = await deps.npm(args);
7714
- return result2.terminationConfirmed === false ? "blocked" : result2.code;
7798
+ const result2 = await deps.npm(autoUpdateInstallArgs(parsed.exact));
7799
+ return result2.terminationConfirmed === false ? "blocked" : verifyRunningCopy(result2.code, parsed.exact, deps);
7800
+ }
7801
+ let pinnedPrefix;
7802
+ if (deps.runningPackageDir) {
7803
+ const running = globalPrefixForPackage(deps.runningPackageDir);
7804
+ const runningStat = running ? await deps.fs.lstat(deps.runningPackageDir).catch(() => null) : null;
7805
+ if (!running || !runningStat?.isDirectory() || runningStat.isSymbolicLink() || !await runningVersion(deps)) {
7806
+ return { manual: "install_location_unverified" };
7807
+ }
7808
+ for (const path$1 of [path.dirname(deps.runningPackageDir), deps.runningPackageDir, path.join(running, "bin")]) {
7809
+ if (!await writable(path$1, deps)) return { manual: "install_location_not_writable" };
7810
+ }
7811
+ pinnedPrefix = running;
7715
7812
  }
7716
- const rootResult = await deps.npm(["root", "-g"]);
7813
+ const prefixArgs = pinnedPrefix ? [`--prefix=${pinnedPrefix}`] : [];
7814
+ const args = autoUpdateInstallArgs(parsed.exact, pinnedPrefix);
7815
+ const rootResult = await deps.npm(["root", "-g", ...prefixArgs]);
7717
7816
  if (rootResult.terminationConfirmed === false) return "blocked";
7718
- const prefixResult = await deps.npm(["prefix", "-g"]);
7817
+ const prefixResult = await deps.npm(["prefix", "-g", ...prefixArgs]);
7719
7818
  if (prefixResult.terminationConfirmed === false) return "blocked";
7720
7819
  const root = rootResult.stdout.trim();
7721
7820
  const prefix = prefixResult.stdout.trim();
@@ -7724,6 +7823,9 @@ async function installCliSafely(version, deps = defaults) {
7724
7823
  }
7725
7824
  if (path.resolve(root) !== path.resolve(prefix, "lib/node_modules")) throw new Error("Unexpected npm root/prefix relationship");
7726
7825
  const packageDir = path.join(root, "very-happy-cli");
7826
+ if (deps.runningPackageDir && path.resolve(packageDir) !== path.resolve(deps.runningPackageDir)) {
7827
+ return { manual: "install_location_unverified" };
7828
+ }
7727
7829
  const packageStat = await deps.fs.lstat(packageDir).catch((error) => {
7728
7830
  if (error.code === "ENOENT") return null;
7729
7831
  throw error;
@@ -7758,7 +7860,7 @@ async function installCliSafely(version, deps = defaults) {
7758
7860
  return "blocked";
7759
7861
  }
7760
7862
  result = first.code;
7761
- if (first.code === 0 || first.code === null) return first.code;
7863
+ if (first.code === 0 || first.code === null) return await verifyRunningCopy(first.code, parsed.exact, deps);
7762
7864
  if (!/\b(?:EEXIST|ENOTEMPTY)\b/.test(first.stderr ?? "")) return first.code;
7763
7865
  const failedStat = await deps.fs.lstat(packageDir).catch((error) => {
7764
7866
  if (error.code === "ENOENT") return null;
@@ -7774,7 +7876,7 @@ async function installCliSafely(version, deps = defaults) {
7774
7876
  safeToRestore = false;
7775
7877
  return "blocked";
7776
7878
  }
7777
- return result;
7879
+ return await verifyRunningCopy(result, parsed.exact, deps);
7778
7880
  } finally {
7779
7881
  if (result !== 0 && safeToRestore) {
7780
7882
  for (const { link, target } of ownLinks) {
@@ -7810,7 +7912,7 @@ function createUpdateController(deps) {
7810
7912
  async function evaluate() {
7811
7913
  if (!policy || running) return;
7812
7914
  const target = manualVersion ?? policy.autoUpdateVersion ?? null;
7813
- if (outcome?.version === target && ["failed", "installed"].includes(outcome.state)) {
7915
+ if (outcome?.version === target && ["failed", "installed", "manual_required"].includes(outcome.state)) {
7814
7916
  const fingerprint = JSON.stringify([policy.checkedAt, outcome.state, outcome.version, outcome.detail, manualVersion]);
7815
7917
  if (fingerprint !== lastPublished) {
7816
7918
  lastPublished = fingerprint;
@@ -7848,6 +7950,11 @@ function createUpdateController(deps) {
7848
7950
  publish("installing", target);
7849
7951
  try {
7850
7952
  const code = await deps.install(target);
7953
+ if (code && typeof code === "object") {
7954
+ if ("manual" in code) publish("manual_required", target, code.manual);
7955
+ else publish("failed", target, code.failed);
7956
+ return;
7957
+ }
7851
7958
  blocked = code === "blocked";
7852
7959
  publish(
7853
7960
  blocked ? "manual_required" : code === 0 ? "installed" : "failed",
@@ -8016,7 +8123,7 @@ function parseJsonObject(text) {
8016
8123
  return null;
8017
8124
  }
8018
8125
  }
8019
- 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-C1OeYxxj.cjs', document.baseURI).href))).resolve(s)) {
8126
+ 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-K6mUS0jF.cjs', document.baseURI).href))).resolve(s)) {
8020
8127
  const platformArch = `${platform}-${arch}`;
8021
8128
  const candidates = [
8022
8129
  `@anthropic-ai/claude-agent-sdk-${platformArch}/claude`,
@@ -12492,7 +12599,7 @@ function registerSideQuestionHandler(rpc, deps) {
12492
12599
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
12493
12600
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
12494
12601
  const fork = deps.run ?? (async (input) => {
12495
- const { query } = await Promise.resolve().then(function () { return require('./index-C_hZVtR-.cjs'); });
12602
+ const { query } = await Promise.resolve().then(function () { return require('./index-DvfCUuDK.cjs'); });
12496
12603
  return runSideQuestion(query, input);
12497
12604
  });
12498
12605
  const run = async (input, live) => {
@@ -12611,7 +12718,7 @@ const MAX_TITLE_CHARS = 60;
12611
12718
  const GENERATION_TIMEOUT_MS = 3e4;
12612
12719
  function resolveClaudeBinary() {
12613
12720
  try {
12614
- 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-C1OeYxxj.cjs', document.baseURI).href)));
12721
+ 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-K6mUS0jF.cjs', document.baseURI).href)));
12615
12722
  const utilsPath = path.resolve(path.join(projectPath.projectPath(), "scripts", "claude_version_utils.cjs"));
12616
12723
  const { getClaudeCliPath } = require$1(utilsPath);
12617
12724
  const path$1 = getClaudeCliPath();
@@ -13072,7 +13179,7 @@ async function runClaude(credentials, options = {}) {
13072
13179
  // a brand-new session cannot pick a PDF until after sending once.
13073
13180
  attachmentKinds: [...CLAUDE_ATTACHMENT_KINDS],
13074
13181
  queueCancellation: true,
13075
- capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1"],
13182
+ capabilities: ["claude-steer-v1", "claude-live-permission-v1", "claude-live-permission-v2", "claude-btw-v1", "claude-runtime-controls-v1", "claude-opus-5-5-v1"],
13076
13183
  // Effective mode this process enforces. Kept current by
13077
13184
  // publishPermissionMode below; the web renders it instead of guessing.
13078
13185
  permissionMode: mapToClaudeMode(initialPermissionMode ?? "default"),
@@ -14840,9 +14947,9 @@ function resolveLocalSignupBootstrap(configuredMode, configuredInviteCodes, gene
14840
14947
  };
14841
14948
  }
14842
14949
 
14843
- 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-C1OeYxxj.cjs', document.baseURI).href)));
14950
+ 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-K6mUS0jF.cjs', document.baseURI).href)));
14844
14951
  const __dirname$1 = path.dirname(__filename$1);
14845
- const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-C1OeYxxj.cjs', document.baseURI).href)));
14952
+ const require_ = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-K6mUS0jF.cjs', document.baseURI).href)));
14846
14953
  const PRISMA_QUERY_ENGINE_FILES = {
14847
14954
  "arm64-darwin": "libquery_engine-darwin-arm64.dylib.node",
14848
14955
  "x64-darwin": "libquery_engine-darwin.dylib.node",
@@ -16585,6 +16692,43 @@ function resolveCodexExecutionPolicy(permissionMode, sandboxManagedByHappy) {
16585
16692
  return { approvalPolicy, sandbox };
16586
16693
  }
16587
16694
 
16695
+ function unsupportedEffortReason(catalog, model, effort) {
16696
+ if (!effort) return null;
16697
+ const selected = catalog.find((entry) => model ? entry.model === model : entry.isDefault);
16698
+ if (!selected) return null;
16699
+ if (selected.supportedReasoningEfforts.some((option) => option.reasoningEffort === effort)) return null;
16700
+ return `Reasoning effort "${effort}" is not supported by ${model ?? "the default model"}. Choose a supported level.`;
16701
+ }
16702
+
16703
+ function readableCodexErrorText(text) {
16704
+ const trimmed = text.trim();
16705
+ if (!trimmed.startsWith("{")) return trimmed;
16706
+ try {
16707
+ const body = JSON.parse(trimmed);
16708
+ const inner = typeof body.error === "object" && body.error ? body.error.message : void 0;
16709
+ const message = typeof inner === "string" && inner.trim() ? inner : typeof body.error === "string" && body.error.trim() ? body.error : typeof body.message === "string" && body.message.trim() ? body.message : null;
16710
+ return message ? message.trim() : trimmed;
16711
+ } catch {
16712
+ return trimmed;
16713
+ }
16714
+ }
16715
+ function describeCodexFailure(msg) {
16716
+ const hasFailure = msg?.status === "failed" || msg?.error !== void 0 && msg?.error !== null;
16717
+ if (!hasFailure) return null;
16718
+ const err = msg.error;
16719
+ if (typeof err === "string" && err.length > 0) return readableCodexErrorText(err);
16720
+ if (err && typeof err === "object" && typeof err.message === "string" && err.message.length > 0) {
16721
+ return readableCodexErrorText(err.message);
16722
+ }
16723
+ return "Unknown error";
16724
+ }
16725
+ const TRANSPORT_LOSS = /^Codex process (exited|disconnected)\b|stdin not writable| timed out after \d+ms/;
16726
+ function describeThrownTurnError(error) {
16727
+ const message = error instanceof Error ? error.message : typeof error === "string" ? error : "";
16728
+ if (!message.trim() || TRANSPORT_LOSS.test(message)) return null;
16729
+ return readableCodexErrorText(message);
16730
+ }
16731
+
16588
16732
  async function resumeExistingThread(opts) {
16589
16733
  try {
16590
16734
  const resumedThread = await opts.client.resumeThread({
@@ -16803,16 +16947,6 @@ function safeCodexErrorMetadata(value) {
16803
16947
  };
16804
16948
  }
16805
16949
 
16806
- function describeCodexFailure(msg) {
16807
- const hasFailure = msg?.status === "failed" || msg?.error !== void 0 && msg?.error !== null;
16808
- if (!hasFailure) return null;
16809
- const err = msg.error;
16810
- if (typeof err === "string" && err.length > 0) return err;
16811
- if (err && typeof err === "object" && typeof err.message === "string" && err.message.length > 0) {
16812
- return err.message;
16813
- }
16814
- return "Unknown error";
16815
- }
16816
16950
  const DEFAULT_CODEX_MODEL = "gpt-5.5";
16817
16951
  const DEFAULT_CODEX_EFFORT = "medium";
16818
16952
  async function runCodex(opts) {
@@ -16974,15 +17108,6 @@ async function runCodex(opts) {
16974
17108
  "yolo"
16975
17109
  ];
16976
17110
  let discoveredModels = [];
16977
- const VALID_REMOTE_EFFORTS = [
16978
- "none",
16979
- "minimal",
16980
- "low",
16981
- "medium",
16982
- "high",
16983
- "xhigh",
16984
- "max"
16985
- ];
16986
17111
  registerAgentAttachmentDownloads(session);
16987
17112
  let userMessageDelivery = Promise.resolve();
16988
17113
  session.onUserMessage((message) => {
@@ -17477,10 +17602,9 @@ async function runCodex(opts) {
17477
17602
  message.mode.permissionMode,
17478
17603
  sandboxManagedByHappy
17479
17604
  );
17480
- const selectedModel = discoveredModels.find((model) => message.mode.model ? model.model === message.mode.model : model.isDefault);
17481
- const supportedEfforts = selectedModel?.supportedReasoningEfforts.map((option) => option.reasoningEffort) ?? VALID_REMOTE_EFFORTS;
17482
- if (message.mode.effort && !supportedEfforts.includes(message.mode.effort)) {
17483
- throw new Error(`Reasoning effort "${message.mode.effort}" is not supported by ${message.mode.model ?? "the default model"}. Choose a supported level.`);
17605
+ const effortRefusal = unsupportedEffortReason(discoveredModels, message.mode.model, message.mode.effort);
17606
+ if (effortRefusal) {
17607
+ throw new Error(effortRefusal);
17484
17608
  }
17485
17609
  if (!client.hasActiveThread()) {
17486
17610
  const startedThread = await client.startThread({
@@ -17524,8 +17648,14 @@ async function runCodex(opts) {
17524
17648
  }
17525
17649
  } catch (error) {
17526
17650
  persistence.logger.warn("Error in codex session", safeCodexErrorMetadata(error));
17527
- messageBuffer.addMessage("Process exited unexpectedly", "status");
17528
- session.sendSessionEvent({ type: "message", message: "Process exited unexpectedly" });
17651
+ const reason = describeThrownTurnError(error);
17652
+ if (reason) {
17653
+ messageBuffer.addMessage(`Task failed: ${reason}`, "status");
17654
+ session.sendSessionEvent({ type: "message", message: `Codex error: ${reason}` });
17655
+ } else {
17656
+ messageBuffer.addMessage("Process exited unexpectedly", "status");
17657
+ session.sendSessionEvent({ type: "message", message: "Process exited unexpectedly" });
17658
+ }
17529
17659
  } finally {
17530
17660
  permissionHandler.reset();
17531
17661
  reasoningProcessor.abort();
@@ -17757,7 +17887,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17757
17887
  return;
17758
17888
  } else if (subcommand === "install-terminal-hooks") {
17759
17889
  try {
17760
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-CuqhiAo9.cjs'); });
17890
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await Promise.resolve().then(function () { return require('./installTerminalHooks-NIbsQ1wi.cjs'); });
17761
17891
  const command = parseTerminalHooksArgs(args.slice(1));
17762
17892
  if (command.action === "help") {
17763
17893
  console.log(TERMINAL_HOOKS_HELP);
@@ -17774,7 +17904,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17774
17904
  }
17775
17905
  } else if (subcommand === "agent-home") {
17776
17906
  try {
17777
- const { parseAgentHomeArgs, runAgentHomeCommand } = await Promise.resolve().then(function () { return require('./agentHome-Qh6SWyHx.cjs'); });
17907
+ const { parseAgentHomeArgs, runAgentHomeCommand } = await Promise.resolve().then(function () { return require('./agentHome-rylNIkix.cjs'); });
17778
17908
  await runAgentHomeCommand(parseAgentHomeArgs(args.slice(1)));
17779
17909
  process.exit(0);
17780
17910
  } catch (error) {
@@ -17783,7 +17913,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17783
17913
  }
17784
17914
  } else if (subcommand === "spawn") {
17785
17915
  try {
17786
- const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-B1IlltVe.cjs'); });
17916
+ const { handleSpawnCommand } = await Promise.resolve().then(function () { return require('./spawn-DqzG1bTH.cjs'); });
17787
17917
  await handleSpawnCommand(args.slice(1));
17788
17918
  } catch (error) {
17789
17919
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17795,7 +17925,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17795
17925
  return;
17796
17926
  } else if (subcommand === "sessions") {
17797
17927
  try {
17798
- const { handleSessionsCommand } = await Promise.resolve().then(function () { return require('./sessions-DOrymTYB.cjs'); });
17928
+ const { handleSessionsCommand } = await Promise.resolve().then(function () { return require('./sessions-CpIdDhH7.cjs'); });
17799
17929
  await handleSessionsCommand(args.slice(1));
17800
17930
  } catch (error) {
17801
17931
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17807,7 +17937,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17807
17937
  return;
17808
17938
  } else if (subcommand === "send") {
17809
17939
  try {
17810
- const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-1hJXKzeP.cjs'); });
17940
+ const { handleSendCommand } = await Promise.resolve().then(function () { return require('./send-qXWGilm8.cjs'); });
17811
17941
  await handleSendCommand(args.slice(1));
17812
17942
  } catch (error) {
17813
17943
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17913,9 +18043,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17913
18043
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
17914
18044
  const projectId = args[3];
17915
18045
  try {
17916
- const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-CFSD65_X.cjs'); });
17917
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./limits-D364Cpe3.cjs'); }).then(function (n) { return n.persistence; });
17918
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-IU5nGuaQ.cjs'); }).then(function (n) { return n.api; });
18046
+ const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return require('./config-CgPu2wtS.cjs'); });
18047
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await Promise.resolve().then(function () { return require('./limits-Dyma1REp.cjs'); }).then(function (n) { return n.persistence; });
18048
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./types-D2Gkpe0N.cjs'); }).then(function (n) { return n.api; });
17919
18049
  let userEmail = void 0;
17920
18050
  try {
17921
18051
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -17946,7 +18076,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17946
18076
  }
17947
18077
  if (geminiSubcommand === "project" && args[2] === "get") {
17948
18078
  try {
17949
- const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-CFSD65_X.cjs'); });
18079
+ const { readGeminiLocalConfig } = await Promise.resolve().then(function () { return require('./config-CgPu2wtS.cjs'); });
17950
18080
  const config = readGeminiLocalConfig();
17951
18081
  if (config.googleCloudProject) {
17952
18082
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -17986,7 +18116,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17986
18116
  process.exit(0);
17987
18117
  }
17988
18118
  try {
17989
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Ci6ULPA7.cjs'); });
18119
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-BMYCU16c.cjs'); });
17990
18120
  let startedBy = void 0;
17991
18121
  for (let i = 1; i < args.length; i++) {
17992
18122
  if (args[i] === "--started-by") {
@@ -18009,7 +18139,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18009
18139
  } else if (subcommand === "pi") {
18010
18140
  if (args[1] === "--terminal") {
18011
18141
  try {
18012
- const { runPiTerminal } = await Promise.resolve().then(function () { return require('./piTerminal-Bzremid-.cjs'); });
18142
+ const { runPiTerminal } = await Promise.resolve().then(function () { return require('./piTerminal-DHxGB3Ic.cjs'); });
18013
18143
  process.exitCode = await runPiTerminal(args.slice(2));
18014
18144
  } catch (error) {
18015
18145
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -18026,7 +18156,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18026
18156
  }
18027
18157
  };
18028
18158
  try {
18029
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-x5-N7ElS.cjs'); });
18159
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-DEVkDRas.cjs'); });
18030
18160
  const parsed = parsePiRunnerArgs(args.slice(1));
18031
18161
  const resolved = resolveAcpAgentConfig(["pi", ...parsed.passthrough]);
18032
18162
  const { credentials } = await authAndSetupMachineIfNeeded();
@@ -18054,7 +18184,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18054
18184
  return;
18055
18185
  } else if (subcommand === "acp") {
18056
18186
  try {
18057
- const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-x5-N7ElS.cjs'); });
18187
+ const { runAcp, resolveAcpAgentConfig } = await Promise.resolve().then(function () { return require('./index-DEVkDRas.cjs'); });
18058
18188
  let startedBy = void 0;
18059
18189
  let verbose = false;
18060
18190
  const acpArgs = [];
@@ -18094,7 +18224,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18094
18224
  return;
18095
18225
  } else if (subcommand === "openclaw") {
18096
18226
  try {
18097
- const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-D2DW9Umc.cjs'); });
18227
+ const { runOpenClaw } = await Promise.resolve().then(function () { return require('./runOpenClaw-Qs4eFtcS.cjs'); });
18098
18228
  let startedBy = void 0;
18099
18229
  let verbose = false;
18100
18230
  let gatewayUrl;
@@ -18145,7 +18275,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18145
18275
  return;
18146
18276
  } else if (subcommand === "todo") {
18147
18277
  try {
18148
- const { handleTodoCommand } = await Promise.resolve().then(function () { return require('./todo-DrsOEfYU.cjs'); });
18278
+ const { handleTodoCommand } = await Promise.resolve().then(function () { return require('./todo-D7SDXL0c.cjs'); });
18149
18279
  await handleTodoCommand(args.slice(1));
18150
18280
  } catch (error) {
18151
18281
  console.error(JSON.stringify({ error: error instanceof Error ? error.message : "Todo command failed" }));
@@ -18154,7 +18284,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18154
18284
  return;
18155
18285
  } else if (subcommand === "teams") {
18156
18286
  try {
18157
- const { handleTeamsCommand } = await Promise.resolve().then(function () { return require('./teams-xIRGgxwJ.cjs'); });
18287
+ const { handleTeamsCommand } = await Promise.resolve().then(function () { return require('./teams-ByEgUzsH.cjs'); });
18158
18288
  await handleTeamsCommand(args.slice(1));
18159
18289
  } catch (error) {
18160
18290
  console.error(error instanceof Error ? error.message : "Teams command failed");
@@ -18163,7 +18293,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
18163
18293
  return;
18164
18294
  } else if (subcommand === "mcp" && (args.length === 1 || args.length === 2 && args[1] === "--terminal-tools")) {
18165
18295
  try {
18166
- const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-B5ojE8_m.cjs'); });
18296
+ const { handleMcpCommand } = await Promise.resolve().then(function () { return require('./mcp-_TVUSg8W.cjs'); });
18167
18297
  await handleMcpCommand(args[1] === "--terminal-tools");
18168
18298
  } catch (error) {
18169
18299
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-C1OeYxxj.cjs');
5
- require('./limits-D364Cpe3.cjs');
4
+ require('./index-K6mUS0jF.cjs');
5
+ require('./limits-Dyma1REp.cjs');
6
6
  require('zod');
7
- require('./types-IU5nGuaQ.cjs');
7
+ require('./types-D2Gkpe0N.cjs');
8
8
  require('node:child_process');
9
9
  require('node:os');
10
10
  require('node:crypto');
@@ -15,7 +15,7 @@ require('node:fs');
15
15
  require('./projectPath-ChLhdOyt.cjs');
16
16
  require('path');
17
17
  require('url');
18
- require('./agentGuidance-gzl2qRkG.cjs');
18
+ require('./agentGuidance-Dla-BXO8.cjs');
19
19
  require('node:fs/promises');
20
20
  require('fs/promises');
21
21
  require('ink');
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './index-Cobfu9V_.mjs';
3
- import './limits-BfYfA7tt.mjs';
2
+ import './index-CpNYvMTJ.mjs';
3
+ import './limits-FThmm7WR.mjs';
4
4
  import 'zod';
5
- import './types-CXF6tULJ.mjs';
5
+ import './types-BD542hb1.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:os';
8
8
  import 'node:crypto';
@@ -13,7 +13,7 @@ import 'node:fs';
13
13
  import './projectPath-CSpqWdxp.mjs';
14
14
  import 'path';
15
15
  import 'url';
16
- import './agentGuidance-CR7rOQUF.mjs';
16
+ import './agentGuidance-DrfhtVP1.mjs';
17
17
  import 'node:fs/promises';
18
18
  import 'fs/promises';
19
19
  import 'ink';
@@ -4,13 +4,13 @@ import { homedir } from 'node:os';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import chalk from 'chalk';
6
6
  import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-Cobfu9V_.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-CpNYvMTJ.mjs';
8
8
  import 'path';
9
9
  import 'url';
10
10
  import 'node:crypto';
11
- import './types-CXF6tULJ.mjs';
11
+ import './types-BD542hb1.mjs';
12
12
  import 'axios';
13
- import './limits-BfYfA7tt.mjs';
13
+ import './limits-FThmm7WR.mjs';
14
14
  import 'node:fs/promises';
15
15
  import 'zod';
16
16
  import 'tweetnacl';
@@ -29,7 +29,7 @@ import 'fs';
29
29
  import 'node:readline';
30
30
  import '@anthropic-ai/sandbox-runtime';
31
31
  import 'expo-server-sdk';
32
- import './agentGuidance-CR7rOQUF.mjs';
32
+ import './agentGuidance-DrfhtVP1.mjs';
33
33
  import 'ink';
34
34
  import 'react';
35
35
  import '@anthropic-ai/claude-agent-sdk';
@@ -6,13 +6,13 @@ var os = require('node:os');
6
6
  var node_child_process = require('node:child_process');
7
7
  var chalk = require('chalk');
8
8
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
9
- var index = require('./index-C1OeYxxj.cjs');
9
+ var index = require('./index-K6mUS0jF.cjs');
10
10
  require('path');
11
11
  require('url');
12
12
  require('node:crypto');
13
- require('./types-IU5nGuaQ.cjs');
13
+ require('./types-D2Gkpe0N.cjs');
14
14
  require('axios');
15
- require('./limits-D364Cpe3.cjs');
15
+ require('./limits-Dyma1REp.cjs');
16
16
  require('node:fs/promises');
17
17
  require('zod');
18
18
  require('tweetnacl');
@@ -31,7 +31,7 @@ require('fs');
31
31
  require('node:readline');
32
32
  require('@anthropic-ai/sandbox-runtime');
33
33
  require('expo-server-sdk');
34
- require('./agentGuidance-gzl2qRkG.cjs');
34
+ require('./agentGuidance-Dla-BXO8.cjs');
35
35
  require('ink');
36
36
  require('react');
37
37
  require('@anthropic-ai/claude-agent-sdk');
package/dist/lib.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./types-IU5nGuaQ.cjs');
4
- var persistence = require('./limits-D364Cpe3.cjs');
3
+ var index = require('./types-D2Gkpe0N.cjs');
4
+ var persistence = require('./limits-Dyma1REp.cjs');
5
5
  require('axios');
6
6
  require('node:events');
7
7
  require('socket.io-client');
package/dist/lib.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-CXF6tULJ.mjs';
2
- export { c as configuration, l as logger } from './limits-BfYfA7tt.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-BD542hb1.mjs';
2
+ export { c as configuration, l as logger } from './limits-FThmm7WR.mjs';
3
3
  import 'axios';
4
4
  import 'node:events';
5
5
  import 'socket.io-client';