happy-imou-cloud 2.1.9 → 2.1.10

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 (25) hide show
  1. package/dist/{BaseReasoningProcessor-DV6TAtd7.cjs → BaseReasoningProcessor-8GjgD9Nk.cjs} +2 -2
  2. package/dist/{BaseReasoningProcessor-CgEO6Vh-.mjs → BaseReasoningProcessor-DbV-vhFy.mjs} +2 -2
  3. package/dist/{ProviderSelectionHandler-C6ILAmE3.cjs → ProviderSelectionHandler-DWeq9rG2.cjs} +2 -2
  4. package/dist/{ProviderSelectionHandler-dczuX21U.mjs → ProviderSelectionHandler-DXgu2zND.mjs} +2 -2
  5. package/dist/{api-CfmTDha2.cjs → api-8p1d7M3Z.cjs} +2 -2
  6. package/dist/{api-CfHYTLZX.mjs → api-Dp5_DJo0.mjs} +2 -2
  7. package/dist/{command-Bw2XKjA9.cjs → command-BtjeL-Z7.cjs} +3 -3
  8. package/dist/{command-B0HfYWYW.mjs → command-DRtgCMGi.mjs} +3 -3
  9. package/dist/{index-BKjWLXkN.mjs → index-C_MTvw5p.mjs} +65 -9
  10. package/dist/{index-C3bSe5_d.cjs → index-Dz1Zo1-d.cjs} +68 -12
  11. package/dist/index.cjs +3 -3
  12. package/dist/index.mjs +3 -3
  13. package/dist/lib.cjs +1 -1
  14. package/dist/lib.mjs +1 -1
  15. package/dist/{persistence-Db4p7gsX.cjs → persistence-De7JoaQp.cjs} +1 -1
  16. package/dist/{persistence-Nun5c360.mjs → persistence-Ds1cKgQ_.mjs} +1 -1
  17. package/dist/{registerKillSessionHandler-C1S9ytML.mjs → registerKillSessionHandler-Bqd1W5ZT.mjs} +3 -3
  18. package/dist/{registerKillSessionHandler-FIQEW2Rx.cjs → registerKillSessionHandler-DL07DW1o.cjs} +3 -3
  19. package/dist/{runClaude-ClXU2LZA.mjs → runClaude-BtMjqmaI.mjs} +5 -5
  20. package/dist/{runClaude-Dxye_oZf.cjs → runClaude-DF_hjle_.cjs} +5 -5
  21. package/dist/{runCodex-CXu7_Wgk.mjs → runCodex-CxtZTXtC.mjs} +6 -6
  22. package/dist/{runCodex-IaL6Vqwc.cjs → runCodex-MtvDLX7s.cjs} +6 -6
  23. package/dist/{runGemini-BgcZcZsv.cjs → runGemini-Bf8tmYeU.cjs} +5 -5
  24. package/dist/{runGemini-BlJjRWN1.mjs → runGemini-CmRPi60L.mjs} +5 -5
  25. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C3bSe5_d.cjs');
4
- var api = require('./api-CfmTDha2.cjs');
3
+ var index = require('./index-Dz1Zo1-d.cjs');
4
+ var api = require('./api-8p1d7M3Z.cjs');
5
5
  var node_events = require('node:events');
6
6
  var node_crypto = require('node:crypto');
7
7
 
@@ -1,5 +1,5 @@
1
- import { a as createSessionMetadata, p as publishSessionRegistration } from './index-BKjWLXkN.mjs';
2
- import { s as startOfflineReconnection, c as configuration, i as isAuthenticationRequiredError, l as logger } from './api-CfHYTLZX.mjs';
1
+ import { a as createSessionMetadata, p as publishSessionRegistration } from './index-C_MTvw5p.mjs';
2
+ import { s as startOfflineReconnection, c as configuration, i as isAuthenticationRequiredError, l as logger } from './api-Dp5_DJo0.mjs';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import { randomUUID } from 'node:crypto';
5
5
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./api-CfmTDha2.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
3
+ var api = require('./api-8p1d7M3Z.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-DL07DW1o.cjs');
5
5
 
6
6
  async function runModeLoop(opts) {
7
7
  let currentMode = opts.startingMode;
@@ -1,5 +1,5 @@
1
- import { l as logger } from './api-CfHYTLZX.mjs';
2
- import { g as getPendingInteractionTimeoutMs, I as INTERACTION_SUPERSEDED_ERROR, a as INTERACTION_TIMED_OUT_ERROR } from './registerKillSessionHandler-C1S9ytML.mjs';
1
+ import { l as logger } from './api-Dp5_DJo0.mjs';
2
+ import { g as getPendingInteractionTimeoutMs, I as INTERACTION_SUPERSEDED_ERROR, a as INTERACTION_TIMED_OUT_ERROR } from './registerKillSessionHandler-Bqd1W5ZT.mjs';
3
3
 
4
4
  async function runModeLoop(opts) {
5
5
  let currentMode = opts.startingMode;
@@ -18,7 +18,7 @@ var node_child_process = require('node:child_process');
18
18
  var expoServerSdk = require('expo-server-sdk');
19
19
 
20
20
  var name = "happy-imou-cloud";
21
- var version = "2.1.9";
21
+ var version = "2.1.10";
22
22
  var description = "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI";
23
23
  var author = "long.zhu";
24
24
  var license = "MIT";
@@ -433,7 +433,7 @@ async function listDaemonLogFiles(limit = 50) {
433
433
  return { file, path: fullPath, modified: stats.mtime };
434
434
  }).sort((a, b) => b.modified.getTime() - a.modified.getTime());
435
435
  try {
436
- const { readDaemonState } = await Promise.resolve().then(function () { return require('./persistence-Db4p7gsX.cjs'); });
436
+ const { readDaemonState } = await Promise.resolve().then(function () { return require('./persistence-De7JoaQp.cjs'); });
437
437
  const state = await readDaemonState();
438
438
  if (!state) {
439
439
  return logs;
@@ -16,7 +16,7 @@ import { spawn } from 'node:child_process';
16
16
  import { Expo } from 'expo-server-sdk';
17
17
 
18
18
  var name = "happy-imou-cloud";
19
- var version = "2.1.9";
19
+ var version = "2.1.10";
20
20
  var description = "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI";
21
21
  var author = "long.zhu";
22
22
  var license = "MIT";
@@ -431,7 +431,7 @@ async function listDaemonLogFiles(limit = 50) {
431
431
  return { file, path: fullPath, modified: stats.mtime };
432
432
  }).sort((a, b) => b.modified.getTime() - a.modified.getTime());
433
433
  try {
434
- const { readDaemonState } = await import('./persistence-Nun5c360.mjs');
434
+ const { readDaemonState } = await import('./persistence-Ds1cKgQ_.mjs');
435
435
  const state = await readDaemonState();
436
436
  if (!state) {
437
437
  return logs;
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C3bSe5_d.cjs');
3
+ var index = require('./index-Dz1Zo1-d.cjs');
4
4
  require('chalk');
5
- require('./api-CfmTDha2.cjs');
5
+ require('./api-8p1d7M3Z.cjs');
6
6
  require('axios');
7
7
  require('fs');
8
8
  require('node:fs');
@@ -18,7 +18,7 @@ require('crypto');
18
18
  require('path');
19
19
  require('node:child_process');
20
20
  require('expo-server-sdk');
21
- require('./persistence-Db4p7gsX.cjs');
21
+ require('./persistence-De7JoaQp.cjs');
22
22
  require('node:fs/promises');
23
23
  require('os');
24
24
  require('tmp');
@@ -1,6 +1,6 @@
1
- import { c as createDefaultRuntimeShell } from './index-BKjWLXkN.mjs';
1
+ import { c as createDefaultRuntimeShell } from './index-C_MTvw5p.mjs';
2
2
  import 'chalk';
3
- import './api-CfHYTLZX.mjs';
3
+ import './api-Dp5_DJo0.mjs';
4
4
  import 'axios';
5
5
  import 'fs';
6
6
  import 'node:fs';
@@ -16,7 +16,7 @@ import 'crypto';
16
16
  import 'path';
17
17
  import 'node:child_process';
18
18
  import 'expo-server-sdk';
19
- import './persistence-Nun5c360.mjs';
19
+ import './persistence-Ds1cKgQ_.mjs';
20
20
  import 'node:fs/promises';
21
21
  import 'os';
22
22
  import 'tmp';
@@ -1,6 +1,6 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
- import { l as logger, e as encodeBase64, c as configuration, k as buildAuthenticatedHeaders, S as SigningBootstrapRequiredError, m as SIGNING_BOOTSTRAP_REQUIRED_MESSAGE, n as encodeBase64Url, h as delay, o as buildClientHeaders, p as decodeBase64, q as HAPPY_CLOUD_DAEMON_PORT, r as packageJson, A as ApiClient, t as HeadTailPreviewBuffer, u as getLatestDaemonLog } from './api-CfHYTLZX.mjs';
3
- import { writeCredentialsLegacy, writeCredentialsDataKey, readCredentials, readSettings, updateSettings, readDaemonState, clearDaemonState, acquireDaemonLock, writeDaemonState, releaseDaemonLock, validateProfileForAgent, getProfileEnvironmentVariables, clearCredentials, clearMachineId } from './persistence-Nun5c360.mjs';
2
+ import { l as logger, e as encodeBase64, c as configuration, k as buildAuthenticatedHeaders, S as SigningBootstrapRequiredError, m as SIGNING_BOOTSTRAP_REQUIRED_MESSAGE, n as encodeBase64Url, h as delay, o as buildClientHeaders, p as decodeBase64, q as HAPPY_CLOUD_DAEMON_PORT, r as packageJson, A as ApiClient, t as HeadTailPreviewBuffer, u as getLatestDaemonLog } from './api-Dp5_DJo0.mjs';
3
+ import { writeCredentialsLegacy, writeCredentialsDataKey, readCredentials, readSettings, updateSettings, readDaemonState, clearDaemonState, acquireDaemonLock, writeDaemonState, releaseDaemonLock, validateProfileForAgent, getProfileEnvironmentVariables, clearCredentials, clearMachineId } from './persistence-Ds1cKgQ_.mjs';
4
4
  import { z } from 'zod';
5
5
  import fs, { writeFile as writeFile$1, rename, unlink as unlink$1 } from 'fs/promises';
6
6
  import os$1, { homedir } from 'os';
@@ -5880,6 +5880,25 @@ function formatToolCallTimeoutLimit(timeoutMs) {
5880
5880
  function isRecord$1(value) {
5881
5881
  return typeof value === "object" && value !== null && !Array.isArray(value);
5882
5882
  }
5883
+ function extractNestedToolContentText(value) {
5884
+ if (typeof value === "string") {
5885
+ return value.length > 0 ? value : null;
5886
+ }
5887
+ if (Array.isArray(value)) {
5888
+ const parts = value.map((item) => extractNestedToolContentText(item)).filter((item) => Boolean(item));
5889
+ return parts.length > 0 ? parts.join("") : null;
5890
+ }
5891
+ if (!isRecord$1(value)) {
5892
+ return null;
5893
+ }
5894
+ if (typeof value.text === "string" && value.text.length > 0) {
5895
+ return value.text;
5896
+ }
5897
+ if ("content" in value) {
5898
+ return extractNestedToolContentText(value.content);
5899
+ }
5900
+ return null;
5901
+ }
5883
5902
  function hasMeaningfulContent(value) {
5884
5903
  if (value === null || value === void 0) {
5885
5904
  return false;
@@ -5940,11 +5959,19 @@ function extractToolOutputChunk(content) {
5940
5959
  continue;
5941
5960
  }
5942
5961
  const value = content[key];
5962
+ const nestedText2 = extractNestedToolContentText(value);
5963
+ if (nestedText2 && nestedText2.length > 0) {
5964
+ return nestedText2;
5965
+ }
5943
5966
  const formatted2 = typeof value === "string" ? value : formatDisplayMessage(value);
5944
5967
  if (formatted2.length > 0) {
5945
5968
  return formatted2;
5946
5969
  }
5947
5970
  }
5971
+ const nestedText = extractNestedToolContentText(content);
5972
+ if (nestedText && nestedText.length > 0) {
5973
+ return nestedText;
5974
+ }
5948
5975
  const formatted = formatDisplayMessage(content);
5949
5976
  return formatted.length > 0 ? formatted : null;
5950
5977
  }
@@ -9180,6 +9207,35 @@ function normalizeClaudeBackendError(error) {
9180
9207
  function isRecord(value) {
9181
9208
  return typeof value === "object" && value !== null && !Array.isArray(value);
9182
9209
  }
9210
+ function extractClaudeToolResultText(value) {
9211
+ if (typeof value === "string") {
9212
+ return value.length > 0 ? value : null;
9213
+ }
9214
+ if (Array.isArray(value)) {
9215
+ const parts = value.map((item) => extractClaudeToolResultText(item)).filter((item) => Boolean(item));
9216
+ return parts.length > 0 ? parts.join("") : null;
9217
+ }
9218
+ if (!isRecord(value)) {
9219
+ return null;
9220
+ }
9221
+ if (typeof value.text === "string" && value.text.length > 0) {
9222
+ return value.text;
9223
+ }
9224
+ if ("content" in value) {
9225
+ return extractClaudeToolResultText(value.content);
9226
+ }
9227
+ return null;
9228
+ }
9229
+ function normalizeClaudeToolResultContent(value) {
9230
+ if (typeof value === "string") {
9231
+ return value;
9232
+ }
9233
+ const extractedText = extractClaudeToolResultText(value);
9234
+ if (extractedText) {
9235
+ return extractedText;
9236
+ }
9237
+ return value;
9238
+ }
9183
9239
  function createTimeoutError(timeoutMs) {
9184
9240
  return new Error(`Claude response did not complete within ${timeoutMs}ms`);
9185
9241
  }
@@ -9478,7 +9534,7 @@ class ClaudeCodeBackend {
9478
9534
  this.emit({
9479
9535
  type: "tool-result",
9480
9536
  toolName,
9481
- result: block.content,
9537
+ result: normalizeClaudeToolResultContent(block.content),
9482
9538
  callId: block.tool_use_id
9483
9539
  });
9484
9540
  if (toolName === "Bash" && isRecord(message.tool_use_result)) {
@@ -9839,11 +9895,11 @@ var launch = /*#__PURE__*/Object.freeze({
9839
9895
 
9840
9896
  const unifiedProviderExecutors = {
9841
9897
  claude: async (opts) => {
9842
- const { runClaude } = await import('./runClaude-ClXU2LZA.mjs');
9898
+ const { runClaude } = await import('./runClaude-BtMjqmaI.mjs');
9843
9899
  await runClaude(opts.credentials, opts.claudeOptions ?? {});
9844
9900
  },
9845
9901
  codex: async (opts) => {
9846
- const { runCodex } = await import('./runCodex-CXu7_Wgk.mjs');
9902
+ const { runCodex } = await import('./runCodex-CxtZTXtC.mjs');
9847
9903
  await runCodex({
9848
9904
  credentials: opts.credentials,
9849
9905
  startedBy: opts.startedBy,
@@ -9852,7 +9908,7 @@ const unifiedProviderExecutors = {
9852
9908
  });
9853
9909
  },
9854
9910
  gemini: async (opts) => {
9855
- const { runGemini } = await import('./runGemini-BlJjRWN1.mjs');
9911
+ const { runGemini } = await import('./runGemini-CmRPi60L.mjs');
9856
9912
  await runGemini({
9857
9913
  credentials: opts.credentials,
9858
9914
  startedBy: opts.startedBy
@@ -9935,7 +9991,7 @@ function shouldRunMainClaudeFlow(opts) {
9935
9991
  return;
9936
9992
  } else if (subcommand === "runtime") {
9937
9993
  if (args[1] === "providers") {
9938
- const { renderRuntimeProviders } = await import('./command-B0HfYWYW.mjs');
9994
+ const { renderRuntimeProviders } = await import('./command-DRtgCMGi.mjs');
9939
9995
  console.log(renderRuntimeProviders());
9940
9996
  return;
9941
9997
  }
@@ -10113,8 +10169,8 @@ function shouldRunMainClaudeFlow(opts) {
10113
10169
  const projectId = args[3];
10114
10170
  try {
10115
10171
  const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return config; });
10116
- const { readCredentials: readCredentials2 } = await import('./persistence-Nun5c360.mjs');
10117
- const { ApiClient: ApiClient2 } = await import('./api-CfHYTLZX.mjs').then(function (n) { return n.v; });
10172
+ const { readCredentials: readCredentials2 } = await import('./persistence-Ds1cKgQ_.mjs');
10173
+ const { ApiClient: ApiClient2 } = await import('./api-Dp5_DJo0.mjs').then(function (n) { return n.v; });
10118
10174
  let userEmail = void 0;
10119
10175
  try {
10120
10176
  const credentials = await readCredentials2();
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var api = require('./api-CfmTDha2.cjs');
5
- var persistence = require('./persistence-Db4p7gsX.cjs');
4
+ var api = require('./api-8p1d7M3Z.cjs');
5
+ var persistence = require('./persistence-De7JoaQp.cjs');
6
6
  var z = require('zod');
7
7
  var fs$2 = require('fs/promises');
8
8
  var os$1 = require('os');
@@ -72,7 +72,7 @@ async function openBrowser(url) {
72
72
  }
73
73
  }
74
74
 
75
- 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-C3bSe5_d.cjs', document.baseURI).href)));
75
+ 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-Dz1Zo1-d.cjs', document.baseURI).href)));
76
76
  const QRCode = require$1("qrcode-terminal/vendor/QRCode");
77
77
  const QRErrorCorrectLevel = require$1("qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel");
78
78
  const pendingTempFiles = /* @__PURE__ */ new Set();
@@ -695,7 +695,7 @@ function setupCleanupHandlers() {
695
695
  });
696
696
  }
697
697
 
698
- const __dirname$2 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-C3bSe5_d.cjs', document.baseURI).href))));
698
+ const __dirname$2 = path$1.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-Dz1Zo1-d.cjs', document.baseURI).href))));
699
699
  function projectPath() {
700
700
  const path = path$1.resolve(__dirname$2, "..");
701
701
  return path;
@@ -5902,6 +5902,25 @@ function formatToolCallTimeoutLimit(timeoutMs) {
5902
5902
  function isRecord$1(value) {
5903
5903
  return typeof value === "object" && value !== null && !Array.isArray(value);
5904
5904
  }
5905
+ function extractNestedToolContentText(value) {
5906
+ if (typeof value === "string") {
5907
+ return value.length > 0 ? value : null;
5908
+ }
5909
+ if (Array.isArray(value)) {
5910
+ const parts = value.map((item) => extractNestedToolContentText(item)).filter((item) => Boolean(item));
5911
+ return parts.length > 0 ? parts.join("") : null;
5912
+ }
5913
+ if (!isRecord$1(value)) {
5914
+ return null;
5915
+ }
5916
+ if (typeof value.text === "string" && value.text.length > 0) {
5917
+ return value.text;
5918
+ }
5919
+ if ("content" in value) {
5920
+ return extractNestedToolContentText(value.content);
5921
+ }
5922
+ return null;
5923
+ }
5905
5924
  function hasMeaningfulContent(value) {
5906
5925
  if (value === null || value === void 0) {
5907
5926
  return false;
@@ -5962,11 +5981,19 @@ function extractToolOutputChunk(content) {
5962
5981
  continue;
5963
5982
  }
5964
5983
  const value = content[key];
5984
+ const nestedText2 = extractNestedToolContentText(value);
5985
+ if (nestedText2 && nestedText2.length > 0) {
5986
+ return nestedText2;
5987
+ }
5965
5988
  const formatted2 = typeof value === "string" ? value : formatDisplayMessage(value);
5966
5989
  if (formatted2.length > 0) {
5967
5990
  return formatted2;
5968
5991
  }
5969
5992
  }
5993
+ const nestedText = extractNestedToolContentText(content);
5994
+ if (nestedText && nestedText.length > 0) {
5995
+ return nestedText;
5996
+ }
5970
5997
  const formatted = formatDisplayMessage(content);
5971
5998
  return formatted.length > 0 ? formatted : null;
5972
5999
  }
@@ -8591,7 +8618,7 @@ class AbortError extends Error {
8591
8618
  }
8592
8619
  }
8593
8620
 
8594
- 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-C3bSe5_d.cjs', document.baseURI).href)));
8621
+ 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-Dz1Zo1-d.cjs', document.baseURI).href)));
8595
8622
  const __dirname$1 = path.join(__filename$1, "..");
8596
8623
  function getGlobalClaudeVersion() {
8597
8624
  try {
@@ -9202,6 +9229,35 @@ function normalizeClaudeBackendError(error) {
9202
9229
  function isRecord(value) {
9203
9230
  return typeof value === "object" && value !== null && !Array.isArray(value);
9204
9231
  }
9232
+ function extractClaudeToolResultText(value) {
9233
+ if (typeof value === "string") {
9234
+ return value.length > 0 ? value : null;
9235
+ }
9236
+ if (Array.isArray(value)) {
9237
+ const parts = value.map((item) => extractClaudeToolResultText(item)).filter((item) => Boolean(item));
9238
+ return parts.length > 0 ? parts.join("") : null;
9239
+ }
9240
+ if (!isRecord(value)) {
9241
+ return null;
9242
+ }
9243
+ if (typeof value.text === "string" && value.text.length > 0) {
9244
+ return value.text;
9245
+ }
9246
+ if ("content" in value) {
9247
+ return extractClaudeToolResultText(value.content);
9248
+ }
9249
+ return null;
9250
+ }
9251
+ function normalizeClaudeToolResultContent(value) {
9252
+ if (typeof value === "string") {
9253
+ return value;
9254
+ }
9255
+ const extractedText = extractClaudeToolResultText(value);
9256
+ if (extractedText) {
9257
+ return extractedText;
9258
+ }
9259
+ return value;
9260
+ }
9205
9261
  function createTimeoutError(timeoutMs) {
9206
9262
  return new Error(`Claude response did not complete within ${timeoutMs}ms`);
9207
9263
  }
@@ -9500,7 +9556,7 @@ class ClaudeCodeBackend {
9500
9556
  this.emit({
9501
9557
  type: "tool-result",
9502
9558
  toolName,
9503
- result: block.content,
9559
+ result: normalizeClaudeToolResultContent(block.content),
9504
9560
  callId: block.tool_use_id
9505
9561
  });
9506
9562
  if (toolName === "Bash" && isRecord(message.tool_use_result)) {
@@ -9861,11 +9917,11 @@ var launch = /*#__PURE__*/Object.freeze({
9861
9917
 
9862
9918
  const unifiedProviderExecutors = {
9863
9919
  claude: async (opts) => {
9864
- const { runClaude } = await Promise.resolve().then(function () { return require('./runClaude-Dxye_oZf.cjs'); });
9920
+ const { runClaude } = await Promise.resolve().then(function () { return require('./runClaude-DF_hjle_.cjs'); });
9865
9921
  await runClaude(opts.credentials, opts.claudeOptions ?? {});
9866
9922
  },
9867
9923
  codex: async (opts) => {
9868
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-IaL6Vqwc.cjs'); });
9924
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-MtvDLX7s.cjs'); });
9869
9925
  await runCodex({
9870
9926
  credentials: opts.credentials,
9871
9927
  startedBy: opts.startedBy,
@@ -9874,7 +9930,7 @@ const unifiedProviderExecutors = {
9874
9930
  });
9875
9931
  },
9876
9932
  gemini: async (opts) => {
9877
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-BgcZcZsv.cjs'); });
9933
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-Bf8tmYeU.cjs'); });
9878
9934
  await runGemini({
9879
9935
  credentials: opts.credentials,
9880
9936
  startedBy: opts.startedBy
@@ -9957,7 +10013,7 @@ function shouldRunMainClaudeFlow(opts) {
9957
10013
  return;
9958
10014
  } else if (subcommand === "runtime") {
9959
10015
  if (args[1] === "providers") {
9960
- const { renderRuntimeProviders } = await Promise.resolve().then(function () { return require('./command-Bw2XKjA9.cjs'); });
10016
+ const { renderRuntimeProviders } = await Promise.resolve().then(function () { return require('./command-BtjeL-Z7.cjs'); });
9961
10017
  console.log(renderRuntimeProviders());
9962
10018
  return;
9963
10019
  }
@@ -10135,8 +10191,8 @@ function shouldRunMainClaudeFlow(opts) {
10135
10191
  const projectId = args[3];
10136
10192
  try {
10137
10193
  const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return config; });
10138
- const { readCredentials: readCredentials2 } = await Promise.resolve().then(function () { return require('./persistence-Db4p7gsX.cjs'); });
10139
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./api-CfmTDha2.cjs'); }).then(function (n) { return n.api; });
10194
+ const { readCredentials: readCredentials2 } = await Promise.resolve().then(function () { return require('./persistence-De7JoaQp.cjs'); });
10195
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./api-8p1d7M3Z.cjs'); }).then(function (n) { return n.api; });
10140
10196
  let userEmail = void 0;
10141
10197
  try {
10142
10198
  const credentials = await readCredentials2();
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./api-CfmTDha2.cjs');
5
- require('./persistence-Db4p7gsX.cjs');
4
+ require('./api-8p1d7M3Z.cjs');
5
+ require('./persistence-De7JoaQp.cjs');
6
6
  require('zod');
7
- require('./index-C3bSe5_d.cjs');
7
+ require('./index-Dz1Zo1-d.cjs');
8
8
  require('node:child_process');
9
9
  require('node:fs');
10
10
  require('cross-spawn');
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './api-CfHYTLZX.mjs';
3
- import './persistence-Nun5c360.mjs';
2
+ import './api-Dp5_DJo0.mjs';
3
+ import './persistence-Ds1cKgQ_.mjs';
4
4
  import 'zod';
5
- import './index-BKjWLXkN.mjs';
5
+ import './index-C_MTvw5p.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:fs';
8
8
  import 'cross-spawn';
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./api-CfmTDha2.cjs');
3
+ var api = require('./api-8p1d7M3Z.cjs');
4
4
  var types = require('./types-DVk3crez.cjs');
5
5
  require('axios');
6
6
  require('chalk');
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, c as configuration, l as logger } from './api-CfHYTLZX.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, c as configuration, l as logger } from './api-Dp5_DJo0.mjs';
2
2
  export { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
3
3
  import 'axios';
4
4
  import 'chalk';
@@ -3,7 +3,7 @@
3
3
  var promises = require('node:fs/promises');
4
4
  var fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var api = require('./api-CfmTDha2.cjs');
6
+ var api = require('./api-8p1d7M3Z.cjs');
7
7
  var z = require('zod');
8
8
  require('axios');
9
9
  require('chalk');
@@ -1,7 +1,7 @@
1
1
  import { unlink, readFile, mkdir, open, stat, writeFile, rename } from 'node:fs/promises';
2
2
  import { existsSync, unlinkSync, readdirSync, constants, writeFileSync, readFileSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
- import { c as configuration, l as logger, e as encodeBase64 } from './api-CfHYTLZX.mjs';
4
+ import { c as configuration, l as logger, e as encodeBase64 } from './api-Dp5_DJo0.mjs';
5
5
  import * as z from 'zod';
6
6
  import 'axios';
7
7
  import 'chalk';
@@ -1,7 +1,7 @@
1
- import { k as initialMachineMetadata, R as RuntimeShell, l as resolveCanonicalToolNameV2, f as formatDisplayMessage } from './index-BKjWLXkN.mjs';
2
- import { readSettings } from './persistence-Nun5c360.mjs';
1
+ import { k as initialMachineMetadata, R as RuntimeShell, l as resolveCanonicalToolNameV2, f as formatDisplayMessage } from './index-C_MTvw5p.mjs';
2
+ import { readSettings } from './persistence-Ds1cKgQ_.mjs';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { H as HAPPY_ORG_TURN_REPORT_TAG, d as HAPPY_ORG_SUMMARY_MAX_LENGTH, f as HAPPY_ORG_REPEAT_THRESHOLD, l as logger } from './api-CfHYTLZX.mjs';
4
+ import { H as HAPPY_ORG_TURN_REPORT_TAG, d as HAPPY_ORG_SUMMARY_MAX_LENGTH, f as HAPPY_ORG_REPEAT_THRESHOLD, l as logger } from './api-Dp5_DJo0.mjs';
5
5
  import { createHash } from 'crypto';
6
6
  import 'axios';
7
7
  import 'node:events';
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C3bSe5_d.cjs');
4
- var persistence = require('./persistence-Db4p7gsX.cjs');
3
+ var index = require('./index-Dz1Zo1-d.cjs');
4
+ var persistence = require('./persistence-De7JoaQp.cjs');
5
5
  var node_crypto = require('node:crypto');
6
- var api = require('./api-CfmTDha2.cjs');
6
+ var api = require('./api-8p1d7M3Z.cjs');
7
7
  var crypto = require('crypto');
8
8
  require('axios');
9
9
  require('node:events');
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger, g as backoff, h as delay, j as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-CfHYTLZX.mjs';
2
+ import { l as logger, g as backoff, h as delay, j as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-Dp5_DJo0.mjs';
3
3
  import 'cross-spawn';
4
4
  import '@agentclientprotocol/sdk';
5
- import { m as getProjectPath, F as Future, n as claudeLocal, E as ExitCodeError, o as trimIdent, q as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, u as claudeCheckSession, w as projectPath, x as mapToClaudeMode, P as PushableAsyncIterable, y as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, z as getEnvironmentInfo, a as createSessionMetadata, B as startCaffeinate, b as closeProviderSession } from './index-BKjWLXkN.mjs';
5
+ import { m as getProjectPath, F as Future, n as claudeLocal, E as ExitCodeError, o as trimIdent, q as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, u as claudeCheckSession, w as projectPath, x as mapToClaudeMode, P as PushableAsyncIterable, y as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, z as getEnvironmentInfo, a as createSessionMetadata, B as startCaffeinate, b as closeProviderSession } from './index-C_MTvw5p.mjs';
6
6
  import 'ps-list';
7
7
  import 'fs';
8
8
  import 'path';
@@ -13,7 +13,7 @@ import { dirname, basename, join, resolve } from 'node:path';
13
13
  import { homedir } from 'node:os';
14
14
  import { execSync } from 'node:child_process';
15
15
  import 'node:readline';
16
- import './persistence-Nun5c360.mjs';
16
+ import './persistence-Ds1cKgQ_.mjs';
17
17
  import { readFile } from 'node:fs/promises';
18
18
  import { stat, watch, access } from 'fs/promises';
19
19
  import 'crypto';
@@ -24,9 +24,9 @@ import 'tweetnacl';
24
24
  import 'open';
25
25
  import React, { useState, useRef, useEffect, useCallback } from 'react';
26
26
  import { useStdout, useInput, Box, Text, render } from 'ink';
27
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-dczuX21U.mjs';
27
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DXgu2zND.mjs';
28
28
  import { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
29
- import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, k as forwardAgentMessageToProviderSession, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler } from './registerKillSessionHandler-C1S9ytML.mjs';
29
+ import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, k as forwardAgentMessageToProviderSession, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler } from './registerKillSessionHandler-Bqd1W5ZT.mjs';
30
30
  import 'socket.io-client';
31
31
  import 'expo-server-sdk';
32
32
  import { isDeepStrictEqual } from 'node:util';
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
- var api = require('./api-CfmTDha2.cjs');
4
+ var api = require('./api-8p1d7M3Z.cjs');
5
5
  require('cross-spawn');
6
6
  require('@agentclientprotocol/sdk');
7
- var index = require('./index-C3bSe5_d.cjs');
7
+ var index = require('./index-Dz1Zo1-d.cjs');
8
8
  require('ps-list');
9
9
  require('fs');
10
10
  require('path');
@@ -15,7 +15,7 @@ var path = require('node:path');
15
15
  var os = require('node:os');
16
16
  var node_child_process = require('node:child_process');
17
17
  require('node:readline');
18
- require('./persistence-Db4p7gsX.cjs');
18
+ require('./persistence-De7JoaQp.cjs');
19
19
  var promises = require('node:fs/promises');
20
20
  var fs = require('fs/promises');
21
21
  require('crypto');
@@ -26,9 +26,9 @@ require('tweetnacl');
26
26
  require('open');
27
27
  var React = require('react');
28
28
  var ink = require('ink');
29
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-C6ILAmE3.cjs');
29
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-DWeq9rG2.cjs');
30
30
  var types = require('./types-DVk3crez.cjs');
31
- var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
31
+ var registerKillSessionHandler = require('./registerKillSessionHandler-DL07DW1o.cjs');
32
32
  require('socket.io-client');
33
33
  require('expo-server-sdk');
34
34
  var node_util = require('node:util');
@@ -1,6 +1,6 @@
1
- import { l as logger, b as connectionState, A as ApiClient } from './api-CfHYTLZX.mjs';
2
- import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, c as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-C1S9ytML.mjs';
3
- import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-BKjWLXkN.mjs';
1
+ import { l as logger, b as connectionState, A as ApiClient } from './api-Dp5_DJo0.mjs';
2
+ import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, c as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-Bqd1W5ZT.mjs';
3
+ import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-C_MTvw5p.mjs';
4
4
  import 'cross-spawn';
5
5
  import '@agentclientprotocol/sdk';
6
6
  import { randomUUID } from 'node:crypto';
@@ -14,7 +14,7 @@ import 'node:path';
14
14
  import 'node:os';
15
15
  import 'node:child_process';
16
16
  import 'node:readline';
17
- import './persistence-Nun5c360.mjs';
17
+ import './persistence-Ds1cKgQ_.mjs';
18
18
  import 'node:fs/promises';
19
19
  import 'fs/promises';
20
20
  import 'crypto';
@@ -25,8 +25,8 @@ import 'tweetnacl';
25
25
  import 'open';
26
26
  import React, { useState, useRef, useEffect, useCallback } from 'react';
27
27
  import { useStdout, useInput, Box, Text, render } from 'ink';
28
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-dczuX21U.mjs';
29
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CgEO6Vh-.mjs';
28
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DXgu2zND.mjs';
29
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DbV-vhFy.mjs';
30
30
  import 'zod';
31
31
  import 'socket.io-client';
32
32
  import 'expo-server-sdk';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./api-CfmTDha2.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
5
- var index = require('./index-C3bSe5_d.cjs');
3
+ var api = require('./api-8p1d7M3Z.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-DL07DW1o.cjs');
5
+ var index = require('./index-Dz1Zo1-d.cjs');
6
6
  require('cross-spawn');
7
7
  require('@agentclientprotocol/sdk');
8
8
  var node_crypto = require('node:crypto');
@@ -16,7 +16,7 @@ require('node:path');
16
16
  require('node:os');
17
17
  require('node:child_process');
18
18
  require('node:readline');
19
- require('./persistence-Db4p7gsX.cjs');
19
+ require('./persistence-De7JoaQp.cjs');
20
20
  require('node:fs/promises');
21
21
  require('fs/promises');
22
22
  require('crypto');
@@ -27,8 +27,8 @@ require('tweetnacl');
27
27
  require('open');
28
28
  var React = require('react');
29
29
  var ink = require('ink');
30
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-C6ILAmE3.cjs');
31
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-DV6TAtd7.cjs');
30
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-DWeq9rG2.cjs');
31
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-8GjgD9Nk.cjs');
32
32
  require('zod');
33
33
  require('socket.io-client');
34
34
  require('expo-server-sdk');
@@ -3,10 +3,10 @@
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
- var api = require('./api-CfmTDha2.cjs');
7
- var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
8
- var index = require('./index-C3bSe5_d.cjs');
9
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-DV6TAtd7.cjs');
6
+ var api = require('./api-8p1d7M3Z.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-DL07DW1o.cjs');
8
+ var index = require('./index-Dz1Zo1-d.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-8GjgD9Nk.cjs');
10
10
  require('cross-spawn');
11
11
  require('@agentclientprotocol/sdk');
12
12
  require('ps-list');
@@ -17,7 +17,7 @@ require('node:child_process');
17
17
  require('node:readline');
18
18
  require('tweetnacl');
19
19
  require('axios');
20
- require('./persistence-Db4p7gsX.cjs');
20
+ require('./persistence-De7JoaQp.cjs');
21
21
  require('open');
22
22
  require('chalk');
23
23
  require('fs');
@@ -1,10 +1,10 @@
1
1
  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
- import { l as logger, b as connectionState, A as ApiClient } from './api-CfHYTLZX.mjs';
5
- import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-C1S9ytML.mjs';
6
- import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-BKjWLXkN.mjs';
7
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CgEO6Vh-.mjs';
4
+ import { l as logger, b as connectionState, A as ApiClient } from './api-Dp5_DJo0.mjs';
5
+ import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-Bqd1W5ZT.mjs';
6
+ import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-C_MTvw5p.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DbV-vhFy.mjs';
8
8
  import 'cross-spawn';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'ps-list';
@@ -15,7 +15,7 @@ import 'node:child_process';
15
15
  import 'node:readline';
16
16
  import 'tweetnacl';
17
17
  import 'axios';
18
- import './persistence-Nun5c360.mjs';
18
+ import './persistence-Ds1cKgQ_.mjs';
19
19
  import 'open';
20
20
  import 'chalk';
21
21
  import 'fs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.1.9",
3
+ "version": "2.1.10",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",