@zhigang1992/happy-cli 0.13.2 → 0.13.3

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-DZXtUKJF.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;
@@ -6995,7 +7019,7 @@ async function handleConnectVendor(vendor, displayName) {
6995
7019
  return;
6996
7020
  } else if (subcommand === "codex") {
6997
7021
  try {
6998
- const { runCodex } = await import('./runCodex-C6yOfirQ.mjs');
7022
+ const { runCodex } = await import('./runCodex-BoWqgEZr.mjs');
6999
7023
  let startedBy = void 0;
7000
7024
  for (let i = 1; i < args.length; i++) {
7001
7025
  if (args[i] === "--started-by") {
@@ -7040,7 +7064,7 @@ async function handleConnectVendor(vendor, displayName) {
7040
7064
  } else if (subcommand === "list") {
7041
7065
  try {
7042
7066
  const { credentials } = await authAndSetupMachineIfNeeded();
7043
- const { listSessions } = await import('./list-CrgHUL0f.mjs');
7067
+ const { listSessions } = await import('./list-D6wuSw1y.mjs');
7044
7068
  let sessionId;
7045
7069
  let titleFilter;
7046
7070
  let recentMsgs;
@@ -7142,7 +7166,7 @@ Examples:
7142
7166
  process.exit(1);
7143
7167
  }
7144
7168
  const { credentials } = await authAndSetupMachineIfNeeded();
7145
- const { promptSession } = await import('./prompt-DQg5bz0P.mjs');
7169
+ const { promptSession } = await import('./prompt-BooOOWHe.mjs');
7146
7170
  await promptSession(credentials, sessionId, promptText, timeoutMinutes ?? void 0);
7147
7171
  } catch (error) {
7148
7172
  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--5a-fy9g.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-DSexnLgz.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;
@@ -7018,7 +7042,7 @@ async function handleConnectVendor(vendor, displayName) {
7018
7042
  return;
7019
7043
  } else if (subcommand === "codex") {
7020
7044
  try {
7021
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-wtcLFv8_.cjs'); });
7045
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-_wtZQXU0.cjs'); });
7022
7046
  let startedBy = void 0;
7023
7047
  for (let i = 1; i < args.length; i++) {
7024
7048
  if (args[i] === "--started-by") {
@@ -7063,7 +7087,7 @@ async function handleConnectVendor(vendor, displayName) {
7063
7087
  } else if (subcommand === "list") {
7064
7088
  try {
7065
7089
  const { credentials } = await authAndSetupMachineIfNeeded();
7066
- const { listSessions } = await Promise.resolve().then(function () { return require('./list-DTZJgObu.cjs'); });
7090
+ const { listSessions } = await Promise.resolve().then(function () { return require('./list-BPpLshMx.cjs'); });
7067
7091
  let sessionId;
7068
7092
  let titleFilter;
7069
7093
  let recentMsgs;
@@ -7165,7 +7189,7 @@ Examples:
7165
7189
  process.exit(1);
7166
7190
  }
7167
7191
  const { credentials } = await authAndSetupMachineIfNeeded();
7168
- const { promptSession } = await Promise.resolve().then(function () { return require('./prompt-DA5MCiiO.cjs'); });
7192
+ const { promptSession } = await Promise.resolve().then(function () { return require('./prompt-CaJKwSsH.cjs'); });
7169
7193
  await promptSession(credentials, sessionId, promptText, timeoutMinutes ?? void 0);
7170
7194
  } catch (error) {
7171
7195
  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-DSexnLgz.cjs');
5
+ require('./types--5a-fy9g.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-CK4J-T-v.mjs';
3
+ import './types-DZXtUKJF.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--5a-fy9g.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('fs');
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-DZXtUKJF.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'fs';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-Cd6JAaoe.cjs');
3
+ var types = require('./types--5a-fy9g.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, 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-DZXtUKJF.mjs';
2
2
  import axios from 'axios';
3
3
  import { existsSync, readdirSync, statSync, readFileSync } from 'fs';
4
4
  import { join } from '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-DZXtUKJF.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--5a-fy9g.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-DZXtUKJF.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-CK4J-T-v.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--5a-fy9g.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-DSexnLgz.cjs');
13
13
  var os = require('node:os');
14
14
  var node_path = require('node:path');
15
15
  var fs = require('node:fs');
@@ -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.3";
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--5a-fy9g.cjs', document.baseURI).href))));
1154
1154
  function projectPath() {
1155
1155
  const path$1 = path.resolve(__dirname$1, "..");
1156
1156
  return path$1;
@@ -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.3";
24
24
  var description = "Mobile and Web client for Claude Code and Codex";
25
25
  var author = "Kirill Dubovitskiy";
26
26
  var license = "MIT";
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.3",
4
4
  "description": "Mobile and Web client for Claude Code and Codex",
5
5
  "author": "Kirill Dubovitskiy",
6
6
  "license": "MIT",