@zhigang1992/happy-cli 0.13.2 → 0.13.4

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.
@@ -1,7 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import os$1, { homedir } from 'node:os';
3
3
  import { randomUUID, randomBytes, createHmac } from 'node:crypto';
4
- import { l as logger, p as projectPath, j as backoff, k as delay, R as RawJSONLinesSchema, m as AsyncLock, c as configuration, n as readDaemonState, o as clearDaemonState, i as packageJson, r as readSettings, q as readCredentials, g as encodeBase64, u as updateSettings, s as encodeBase64Url, d as decodeBase64, w as writeCredentialsLegacy, t as writeCredentialsDataKey, v as acquireDaemonLock, x as writeDaemonState, A as ApiClient, y as releaseDaemonLock, z as authChallenge, B as clearCredentials, C as clearMachineId, D as getLatestDaemonLog } from './types-DTrmDfm5.mjs';
4
+ import { l as logger, p as projectPath, j as backoff, k as delay, R as RawJSONLinesSchema, m as AsyncLock, c as configuration, n as readDaemonState, o as clearDaemonState, i as packageJson, r as readSettings, q as readCredentials, g as encodeBase64, u as updateSettings, s as encodeBase64Url, d as decodeBase64, w as writeCredentialsLegacy, t as writeCredentialsDataKey, v as acquireDaemonLock, x as writeDaemonState, A as ApiClient, y as releaseDaemonLock, z as authChallenge, B as clearCredentials, C as clearMachineId, D as getLatestDaemonLog } from './types-BUeYxLoB.mjs';
5
5
  import { spawn, execSync, exec as exec$1, execFileSync } from 'node:child_process';
6
6
  import { resolve, join, extname, basename as basename$1 } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -2076,6 +2076,9 @@ Echo message: ${echoMessage}` : "");
2076
2076
  });
2077
2077
  let waitingForNextMessage = false;
2078
2078
  let messagePusherStopped = false;
2079
+ if (opts.onQueryCreated) {
2080
+ opts.onQueryCreated(response, () => waitingForNextMessage);
2081
+ }
2079
2082
  const messagePusherTask = (async () => {
2080
2083
  try {
2081
2084
  while (!messagePusherStopped) {
@@ -3058,6 +3061,8 @@ async function claudeRemoteLauncher(session) {
3058
3061
  let abortController = null;
3059
3062
  let abortFuture = null;
3060
3063
  let abortRequested = false;
3064
+ let currentQuery = null;
3065
+ let isSessionIdle = null;
3061
3066
  async function abort() {
3062
3067
  if (abortController && !abortController.signal.aborted) {
3063
3068
  abortController.abort();
@@ -3066,6 +3071,18 @@ async function claudeRemoteLauncher(session) {
3066
3071
  }
3067
3072
  async function doAbort() {
3068
3073
  logger.debug("[remote]: doAbort");
3074
+ const idle = isSessionIdle?.() ?? true;
3075
+ if (!idle && currentQuery) {
3076
+ logger.debug("[remote]: Session is busy, attempting interrupt first");
3077
+ try {
3078
+ await currentQuery.interrupt();
3079
+ logger.debug("[remote]: Interrupt sent successfully");
3080
+ return;
3081
+ } catch (e) {
3082
+ logger.debug("[remote]: Interrupt failed, falling back to full abort", e);
3083
+ }
3084
+ }
3085
+ logger.debug("[remote]: Session is idle or interrupt failed, performing full abort");
3069
3086
  abortRequested = true;
3070
3087
  await abort();
3071
3088
  }
@@ -3288,7 +3305,12 @@ async function claudeRemoteLauncher(session) {
3288
3305
  session.client.sendSessionEvent({ type: "message", message: trimmed });
3289
3306
  }
3290
3307
  },
3291
- signal: abortController.signal
3308
+ signal: abortController.signal,
3309
+ onQueryCreated: (query, isIdle) => {
3310
+ currentQuery = query;
3311
+ isSessionIdle = isIdle;
3312
+ logger.debug("[remote]: Query created, interrupt support enabled");
3313
+ }
3292
3314
  });
3293
3315
  session.consumeOneTimeFlags();
3294
3316
  if (abortRequested && abortController.signal.aborted) {
@@ -3336,6 +3358,8 @@ async function claudeRemoteLauncher(session) {
3336
3358
  abortController = null;
3337
3359
  abortFuture?.resolve(void 0);
3338
3360
  abortFuture = null;
3361
+ currentQuery = null;
3362
+ isSessionIdle = null;
3339
3363
  logger.debug("[remote]: launch done");
3340
3364
  permissionHandler.reset();
3341
3365
  modeHash = null;
@@ -5109,7 +5133,9 @@ async function startDaemon() {
5109
5133
  "--started-by",
5110
5134
  "daemon",
5111
5135
  // Add --resume flag if resuming from a previous Claude session
5112
- ...options.resumeClaudeSessionId ? ["--resume", options.resumeClaudeSessionId] : []
5136
+ ...options.resumeClaudeSessionId ? ["--resume", options.resumeClaudeSessionId] : [],
5137
+ // Add --fork-session flag to create a new session ID when resuming
5138
+ ...options.forkSession ? ["--fork-session"] : []
5113
5139
  ];
5114
5140
  const happyProcess = spawnHappyCLI(args, {
5115
5141
  cwd: directory,
@@ -6995,7 +7021,7 @@ async function handleConnectVendor(vendor, displayName) {
6995
7021
  return;
6996
7022
  } else if (subcommand === "codex") {
6997
7023
  try {
6998
- const { runCodex } = await import('./runCodex-C6yOfirQ.mjs');
7024
+ const { runCodex } = await import('./runCodex-BJaAstnJ.mjs');
6999
7025
  let startedBy = void 0;
7000
7026
  for (let i = 1; i < args.length; i++) {
7001
7027
  if (args[i] === "--started-by") {
@@ -7040,7 +7066,7 @@ async function handleConnectVendor(vendor, displayName) {
7040
7066
  } else if (subcommand === "list") {
7041
7067
  try {
7042
7068
  const { credentials } = await authAndSetupMachineIfNeeded();
7043
- const { listSessions } = await import('./list-CrgHUL0f.mjs');
7069
+ const { listSessions } = await import('./list-DF7IVJD4.mjs');
7044
7070
  let sessionId;
7045
7071
  let titleFilter;
7046
7072
  let recentMsgs;
@@ -7142,7 +7168,7 @@ Examples:
7142
7168
  process.exit(1);
7143
7169
  }
7144
7170
  const { credentials } = await authAndSetupMachineIfNeeded();
7145
- const { promptSession } = await import('./prompt-DQg5bz0P.mjs');
7171
+ const { promptSession } = await import('./prompt-D2BswByO.mjs');
7146
7172
  await promptSession(credentials, sessionId, promptText, timeoutMinutes ?? void 0);
7147
7173
  } catch (error) {
7148
7174
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -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 types = require('./types-Cd6JAaoe.cjs');
6
+ var types = require('./types-CSnGRdLP.cjs');
7
7
  var node_child_process = require('node:child_process');
8
8
  var node_path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -1184,7 +1184,7 @@ class AbortError extends Error {
1184
1184
  }
1185
1185
  }
1186
1186
 
1187
- 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-DgAw_5N1.cjs', document.baseURI).href)));
1187
+ 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-BdNIt5w7.cjs', document.baseURI).href)));
1188
1188
  const __dirname$1 = node_path.join(__filename$1, "..");
1189
1189
  function getGlobalClaudeVersion() {
1190
1190
  try {
@@ -2099,6 +2099,9 @@ Echo message: ${echoMessage}` : "");
2099
2099
  });
2100
2100
  let waitingForNextMessage = false;
2101
2101
  let messagePusherStopped = false;
2102
+ if (opts.onQueryCreated) {
2103
+ opts.onQueryCreated(response, () => waitingForNextMessage);
2104
+ }
2102
2105
  const messagePusherTask = (async () => {
2103
2106
  try {
2104
2107
  while (!messagePusherStopped) {
@@ -3081,6 +3084,8 @@ async function claudeRemoteLauncher(session) {
3081
3084
  let abortController = null;
3082
3085
  let abortFuture = null;
3083
3086
  let abortRequested = false;
3087
+ let currentQuery = null;
3088
+ let isSessionIdle = null;
3084
3089
  async function abort() {
3085
3090
  if (abortController && !abortController.signal.aborted) {
3086
3091
  abortController.abort();
@@ -3089,6 +3094,18 @@ async function claudeRemoteLauncher(session) {
3089
3094
  }
3090
3095
  async function doAbort() {
3091
3096
  types.logger.debug("[remote]: doAbort");
3097
+ const idle = isSessionIdle?.() ?? true;
3098
+ if (!idle && currentQuery) {
3099
+ types.logger.debug("[remote]: Session is busy, attempting interrupt first");
3100
+ try {
3101
+ await currentQuery.interrupt();
3102
+ types.logger.debug("[remote]: Interrupt sent successfully");
3103
+ return;
3104
+ } catch (e) {
3105
+ types.logger.debug("[remote]: Interrupt failed, falling back to full abort", e);
3106
+ }
3107
+ }
3108
+ types.logger.debug("[remote]: Session is idle or interrupt failed, performing full abort");
3092
3109
  abortRequested = true;
3093
3110
  await abort();
3094
3111
  }
@@ -3311,7 +3328,12 @@ async function claudeRemoteLauncher(session) {
3311
3328
  session.client.sendSessionEvent({ type: "message", message: trimmed });
3312
3329
  }
3313
3330
  },
3314
- signal: abortController.signal
3331
+ signal: abortController.signal,
3332
+ onQueryCreated: (query, isIdle) => {
3333
+ currentQuery = query;
3334
+ isSessionIdle = isIdle;
3335
+ types.logger.debug("[remote]: Query created, interrupt support enabled");
3336
+ }
3315
3337
  });
3316
3338
  session.consumeOneTimeFlags();
3317
3339
  if (abortRequested && abortController.signal.aborted) {
@@ -3359,6 +3381,8 @@ async function claudeRemoteLauncher(session) {
3359
3381
  abortController = null;
3360
3382
  abortFuture?.resolve(void 0);
3361
3383
  abortFuture = null;
3384
+ currentQuery = null;
3385
+ isSessionIdle = null;
3362
3386
  types.logger.debug("[remote]: launch done");
3363
3387
  permissionHandler.reset();
3364
3388
  modeHash = null;
@@ -5132,7 +5156,9 @@ async function startDaemon() {
5132
5156
  "--started-by",
5133
5157
  "daemon",
5134
5158
  // Add --resume flag if resuming from a previous Claude session
5135
- ...options.resumeClaudeSessionId ? ["--resume", options.resumeClaudeSessionId] : []
5159
+ ...options.resumeClaudeSessionId ? ["--resume", options.resumeClaudeSessionId] : [],
5160
+ // Add --fork-session flag to create a new session ID when resuming
5161
+ ...options.forkSession ? ["--fork-session"] : []
5136
5162
  ];
5137
5163
  const happyProcess = spawnHappyCLI(args, {
5138
5164
  cwd: directory,
@@ -7018,7 +7044,7 @@ async function handleConnectVendor(vendor, displayName) {
7018
7044
  return;
7019
7045
  } else if (subcommand === "codex") {
7020
7046
  try {
7021
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-wtcLFv8_.cjs'); });
7047
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-DKfT8c0k.cjs'); });
7022
7048
  let startedBy = void 0;
7023
7049
  for (let i = 1; i < args.length; i++) {
7024
7050
  if (args[i] === "--started-by") {
@@ -7063,7 +7089,7 @@ async function handleConnectVendor(vendor, displayName) {
7063
7089
  } else if (subcommand === "list") {
7064
7090
  try {
7065
7091
  const { credentials } = await authAndSetupMachineIfNeeded();
7066
- const { listSessions } = await Promise.resolve().then(function () { return require('./list-DTZJgObu.cjs'); });
7092
+ const { listSessions } = await Promise.resolve().then(function () { return require('./list-DQpBq7_O.cjs'); });
7067
7093
  let sessionId;
7068
7094
  let titleFilter;
7069
7095
  let recentMsgs;
@@ -7165,7 +7191,7 @@ Examples:
7165
7191
  process.exit(1);
7166
7192
  }
7167
7193
  const { credentials } = await authAndSetupMachineIfNeeded();
7168
- const { promptSession } = await Promise.resolve().then(function () { return require('./prompt-DA5MCiiO.cjs'); });
7194
+ const { promptSession } = await Promise.resolve().then(function () { return require('./prompt-Di73cj93.cjs'); });
7169
7195
  await promptSession(credentials, sessionId, promptText, timeoutMinutes ?? void 0);
7170
7196
  } catch (error) {
7171
7197
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-DgAw_5N1.cjs');
5
- require('./types-Cd6JAaoe.cjs');
4
+ require('./index-BdNIt5w7.cjs');
5
+ require('./types-CSnGRdLP.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-Uj38Af20.mjs';
3
- import './types-DTrmDfm5.mjs';
2
+ import './index-B2EGBeeU.mjs';
3
+ import './types-BUeYxLoB.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:os';
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-Cd6JAaoe.cjs');
3
+ var types = require('./types-CSnGRdLP.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('fs');
package/dist/lib.d.cts CHANGED
@@ -768,6 +768,8 @@ interface SpawnSessionOptions {
768
768
  agent?: 'claude' | 'codex';
769
769
  token?: string;
770
770
  resumeClaudeSessionId?: string;
771
+ /** When resuming, create a new session ID instead of reusing the original */
772
+ forkSession?: boolean;
771
773
  /** Environment variables to pass to the spawned session */
772
774
  environmentVariables?: Record<string, string>;
773
775
  }
package/dist/lib.d.mts CHANGED
@@ -768,6 +768,8 @@ interface SpawnSessionOptions {
768
768
  agent?: 'claude' | 'codex';
769
769
  token?: string;
770
770
  resumeClaudeSessionId?: string;
771
+ /** When resuming, create a new session ID instead of reusing the original */
772
+ forkSession?: boolean;
771
773
  /** Environment variables to pass to the spawned session */
772
774
  environmentVariables?: Record<string, string>;
773
775
  }
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-DTrmDfm5.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-BUeYxLoB.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'fs';
@@ -1,4 +1,4 @@
1
- import { c as configuration, l as logger, d as decodeBase64, b as decrypt, f as formatTimeAgo, e as libsodiumDecryptFromPublicKey } from './types-DTrmDfm5.mjs';
1
+ import { c as configuration, l as logger, d as decodeBase64, b as decrypt, f as formatTimeAgo, e as libsodiumDecryptFromPublicKey } from './types-BUeYxLoB.mjs';
2
2
  import axios from 'axios';
3
3
  import { existsSync, readdirSync, statSync, readFileSync } from 'fs';
4
4
  import { join } from 'path';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-Cd6JAaoe.cjs');
3
+ var types = require('./types-CSnGRdLP.cjs');
4
4
  var axios = require('axios');
5
5
  var fs = require('fs');
6
6
  var path = require('path');
@@ -1,4 +1,4 @@
1
- import { c as configuration, b as decrypt, d as decodeBase64, l as logger, g as encodeBase64, h as encrypt } from './types-DTrmDfm5.mjs';
1
+ import { c as configuration, b as decrypt, d as decodeBase64, l as logger, g as encodeBase64, h as encrypt } from './types-BUeYxLoB.mjs';
2
2
  import axios from 'axios';
3
3
  import { io } from 'socket.io-client';
4
4
  import 'chalk';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-Cd6JAaoe.cjs');
3
+ var types = require('./types-CSnGRdLP.cjs');
4
4
  var axios = require('axios');
5
5
  var socket_ioClient = require('socket.io-client');
6
6
  require('chalk');
@@ -1,13 +1,13 @@
1
1
  import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
- import { l as logger, A as ApiClient, r as readSettings, p as projectPath, c as configuration, i as packageJson } from './types-DTrmDfm5.mjs';
3
+ import { l as logger, A as ApiClient, r as readSettings, p as projectPath, c as configuration, i as packageJson } from './types-BUeYxLoB.mjs';
4
4
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
5
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
6
6
  import { z } from 'zod';
7
7
  import { ElicitRequestSchema } from '@modelcontextprotocol/sdk/types.js';
8
8
  import { execSync } from 'child_process';
9
9
  import { randomUUID } from 'node:crypto';
10
- import { i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, r as registerKillSessionHandler, a as MessageBuffer, s as startHappyServer, t as trimIdent, b as stopCaffeinate } from './index-Uj38Af20.mjs';
10
+ import { i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, r as registerKillSessionHandler, a as MessageBuffer, s as startHappyServer, t as trimIdent, b as stopCaffeinate } from './index-B2EGBeeU.mjs';
11
11
  import os from 'node:os';
12
12
  import { resolve, join } from 'node:path';
13
13
  import fs from 'node:fs';
@@ -2,14 +2,14 @@
2
2
 
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
- var types = require('./types-Cd6JAaoe.cjs');
5
+ var types = require('./types-CSnGRdLP.cjs');
6
6
  var index_js = require('@modelcontextprotocol/sdk/client/index.js');
7
7
  var stdio_js = require('@modelcontextprotocol/sdk/client/stdio.js');
8
8
  var z = require('zod');
9
9
  var types_js = require('@modelcontextprotocol/sdk/types.js');
10
10
  var child_process = require('child_process');
11
11
  var node_crypto = require('node:crypto');
12
- var index = require('./index-DgAw_5N1.cjs');
12
+ var index = require('./index-BdNIt5w7.cjs');
13
13
  var os = require('node:os');
14
14
  var node_path = require('node:path');
15
15
  var fs = require('node:fs');
@@ -20,7 +20,7 @@ import { fileURLToPath } from 'url';
20
20
  import { Expo } from 'expo-server-sdk';
21
21
 
22
22
  var name = "@zhigang1992/happy-cli";
23
- var version = "0.13.2";
23
+ var version = "0.13.4";
24
24
  var description = "Mobile and Web client for Claude Code and Codex";
25
25
  var author = "Kirill Dubovitskiy";
26
26
  var license = "MIT";
@@ -1893,12 +1893,12 @@ class ApiMachineClient {
1893
1893
  requestShutdown
1894
1894
  }) {
1895
1895
  this.rpcHandlerManager.registerHandler("spawn-happy-session", async (params) => {
1896
- const { directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, environmentVariables } = params || {};
1896
+ const { directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, forkSession, environmentVariables } = params || {};
1897
1897
  logger.debug(`[API MACHINE] Spawning session with params: ${JSON.stringify(params)}`);
1898
1898
  if (!directory) {
1899
1899
  throw new Error("Directory is required");
1900
1900
  }
1901
- const result = await spawnSession({ directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, environmentVariables });
1901
+ const result = await spawnSession({ directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, forkSession, environmentVariables });
1902
1902
  switch (result.type) {
1903
1903
  case "success":
1904
1904
  logger.debug(`[API MACHINE] Spawned session ${result.sessionId}`);
@@ -41,7 +41,7 @@ function _interopNamespaceDefault(e) {
41
41
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
42
42
 
43
43
  var name = "@zhigang1992/happy-cli";
44
- var version = "0.13.2";
44
+ var version = "0.13.4";
45
45
  var description = "Mobile and Web client for Claude Code and Codex";
46
46
  var author = "Kirill Dubovitskiy";
47
47
  var license = "MIT";
@@ -1150,7 +1150,7 @@ class RpcHandlerManager {
1150
1150
  }
1151
1151
  }
1152
1152
 
1153
- const __dirname$1 = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-Cd6JAaoe.cjs', document.baseURI).href))));
1153
+ const __dirname$1 = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-CSnGRdLP.cjs', document.baseURI).href))));
1154
1154
  function projectPath() {
1155
1155
  const path$1 = path.resolve(__dirname$1, "..");
1156
1156
  return path$1;
@@ -1914,12 +1914,12 @@ class ApiMachineClient {
1914
1914
  requestShutdown
1915
1915
  }) {
1916
1916
  this.rpcHandlerManager.registerHandler("spawn-happy-session", async (params) => {
1917
- const { directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, environmentVariables } = params || {};
1917
+ const { directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, forkSession, environmentVariables } = params || {};
1918
1918
  logger.debug(`[API MACHINE] Spawning session with params: ${JSON.stringify(params)}`);
1919
1919
  if (!directory) {
1920
1920
  throw new Error("Directory is required");
1921
1921
  }
1922
- const result = await spawnSession({ directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, environmentVariables });
1922
+ const result = await spawnSession({ directory, sessionId, machineId, approvedNewDirectoryCreation, agent, token, resumeClaudeSessionId, forkSession, environmentVariables });
1923
1923
  switch (result.type) {
1924
1924
  case "success":
1925
1925
  logger.debug(`[API MACHINE] Spawned session ${result.sessionId}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhigang1992/happy-cli",
3
- "version": "0.13.2",
3
+ "version": "0.13.4",
4
4
  "description": "Mobile and Web client for Claude Code and Codex",
5
5
  "author": "Kirill Dubovitskiy",
6
6
  "license": "MIT",