happy-imou-cloud 2.0.19 → 2.0.21

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 (28) hide show
  1. package/dist/{BaseReasoningProcessor-CTaamD5D.cjs → BaseReasoningProcessor-0nj-PMFc.cjs} +3 -3
  2. package/dist/{BaseReasoningProcessor-pY3tfQ0E.mjs → BaseReasoningProcessor-DnVC7liC.mjs} +3 -3
  3. package/dist/{ProviderSelectionHandler-CYs2k-z1.cjs → ProviderSelectionHandler-Bafuy28L.cjs} +2 -2
  4. package/dist/{ProviderSelectionHandler-C8pLBbE4.mjs → ProviderSelectionHandler-R-2r7ItM.mjs} +2 -2
  5. package/dist/{api-B922KGF8.mjs → api-DJe9WP9M.mjs} +77 -4
  6. package/dist/{api-DmpNsXS1.cjs → api-MGlKcEf3.cjs} +78 -3
  7. package/dist/{command-uX614XS4.mjs → command-CfyFnMv2.mjs} +3 -3
  8. package/dist/{command-B4L9Deq_.cjs → command-DAlFmWmr.cjs} +3 -3
  9. package/dist/{index-BkAY8k_1.mjs → index-CHXCgpwi.mjs} +48 -15
  10. package/dist/{index-D0VIxWJC.cjs → index-CgVjDJpt.cjs} +51 -18
  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.d.cts +357 -0
  15. package/dist/lib.d.mts +357 -0
  16. package/dist/lib.mjs +1 -1
  17. package/dist/{persistence-BfGHkCeJ.mjs → persistence-CkP90vEt.mjs} +1 -1
  18. package/dist/{persistence-ZZDZ6dl9.cjs → persistence-DLFUNI9q.cjs} +1 -1
  19. package/dist/{registerKillSessionHandler-DZ1sXUOg.cjs → registerKillSessionHandler-Cs_INk4A.cjs} +356 -3
  20. package/dist/{registerKillSessionHandler-BqeqMcNV.mjs → registerKillSessionHandler-DsHTZDsU.mjs} +354 -4
  21. package/dist/{runClaude-taQoQffg.cjs → runClaude-BGSgcyUp.cjs} +72 -9
  22. package/dist/{runClaude-CVBty_g7.mjs → runClaude-DAQAEmHe.mjs} +72 -9
  23. package/dist/{runCodex-jA1hK-nj.mjs → runCodex-B2UpSn82.mjs} +102 -14
  24. package/dist/{runCodex-JcA8vuC7.cjs → runCodex-earICaxw.cjs} +102 -14
  25. package/dist/{runGemini-BqKLrnid.mjs → runGemini-BBUmH1Qh.mjs} +73 -9
  26. package/dist/{runGemini-DZ0x4eaa.cjs → runGemini-D5RAIaR0.cjs} +73 -9
  27. package/package.json +1 -1
  28. package/scripts/release-smoke.mjs +20 -4
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-D0VIxWJC.cjs');
4
- var api = require('./api-DmpNsXS1.cjs');
5
- var registerKillSessionHandler = require('./registerKillSessionHandler-DZ1sXUOg.cjs');
3
+ var index = require('./index-CgVjDJpt.cjs');
4
+ var api = require('./api-MGlKcEf3.cjs');
5
+ var registerKillSessionHandler = require('./registerKillSessionHandler-Cs_INk4A.cjs');
6
6
  var node_events = require('node:events');
7
7
  var node_crypto = require('node:crypto');
8
8
 
@@ -1,6 +1,6 @@
1
- import { p as publishSessionRegistration } from './index-BkAY8k_1.mjs';
2
- import { s as startOfflineReconnection, c as configuration, i as isAuthenticationRequiredError, l as logger } from './api-B922KGF8.mjs';
3
- import { c as createSessionMetadata } from './registerKillSessionHandler-BqeqMcNV.mjs';
1
+ import { p as publishSessionRegistration } from './index-CHXCgpwi.mjs';
2
+ import { s as startOfflineReconnection, c as configuration, i as isAuthenticationRequiredError, l as logger } from './api-DJe9WP9M.mjs';
3
+ import { c as createSessionMetadata } from './registerKillSessionHandler-DsHTZDsU.mjs';
4
4
  import { EventEmitter } from 'node:events';
5
5
  import { randomUUID } from 'node:crypto';
6
6
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./api-DmpNsXS1.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-DZ1sXUOg.cjs');
3
+ var api = require('./api-MGlKcEf3.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-Cs_INk4A.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-B922KGF8.mjs';
2
- import { g as getPendingInteractionTimeoutMs, I as INTERACTION_SUPERSEDED_ERROR, a as INTERACTION_TIMED_OUT_ERROR } from './registerKillSessionHandler-BqeqMcNV.mjs';
1
+ import { l as logger } from './api-DJe9WP9M.mjs';
2
+ import { g as getPendingInteractionTimeoutMs, I as INTERACTION_SUPERSEDED_ERROR, a as INTERACTION_TIMED_OUT_ERROR } from './registerKillSessionHandler-DsHTZDsU.mjs';
3
3
 
4
4
  async function runModeLoop(opts) {
5
5
  let currentMode = opts.startingMode;
@@ -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.0.19";
19
+ var version = "2.0.21";
20
20
  var description = "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI";
21
21
  var author = "long.zhu";
22
22
  var license = "MIT";
@@ -430,7 +430,7 @@ async function listDaemonLogFiles(limit = 50) {
430
430
  return { file, path: fullPath, modified: stats.mtime };
431
431
  }).sort((a, b) => b.modified.getTime() - a.modified.getTime());
432
432
  try {
433
- const { readDaemonState } = await import('./persistence-BfGHkCeJ.mjs');
433
+ const { readDaemonState } = await import('./persistence-CkP90vEt.mjs');
434
434
  const state = await readDaemonState();
435
435
  if (!state) {
436
436
  return logs;
@@ -564,6 +564,77 @@ function decrypt(key, variant, data) {
564
564
  }
565
565
  }
566
566
 
567
+ const HAPPY_ORG_REPEAT_THRESHOLD = 3;
568
+ const HAPPY_ORG_TURN_REPORT_TAG = "HAPPY_TURN_REPORT";
569
+ const HappyOrgInterventionTypeSchema = z.enum([
570
+ "none",
571
+ "review_needed",
572
+ "blocker",
573
+ "decision_needed"
574
+ ]);
575
+ const HappyOrgTurnStatusSchema = z.enum([
576
+ "task_complete",
577
+ "turn_aborted"
578
+ ]);
579
+ const HappyOrgTaskContextSchema = z.object({
580
+ taskId: z.string().min(1),
581
+ organizationId: z.string().min(1),
582
+ memberAgentId: z.string().min(1),
583
+ supervisorAgentId: z.string().min(1)
584
+ });
585
+ const HappyOrgTaskControlSchema = z.object({
586
+ action: z.enum(["terminate", "reopen"]),
587
+ reason: z.string().min(1).optional().nullable(),
588
+ newContext: z.string().min(1).optional().nullable(),
589
+ newDecision: z.string().min(1).optional().nullable(),
590
+ newResource: z.string().min(1).optional().nullable()
591
+ });
592
+ const HappyOrgMessageMetaSchema = z.object({
593
+ taskContext: HappyOrgTaskContextSchema.optional(),
594
+ control: HappyOrgTaskControlSchema.optional()
595
+ });
596
+ z.object({
597
+ summary: z.string().optional().nullable(),
598
+ interventionType: HappyOrgInterventionTypeSchema.optional().nullable(),
599
+ blockerCode: z.string().optional().nullable(),
600
+ decisionNeeded: z.string().optional().nullable(),
601
+ targetArtifact: z.string().optional().nullable()
602
+ });
603
+ const HappyOrgTurnReportSchema = HappyOrgTaskContextSchema.extend({
604
+ turnStatus: HappyOrgTurnStatusSchema,
605
+ interventionType: HappyOrgInterventionTypeSchema,
606
+ summary: z.string(),
607
+ blockerCode: z.string().nullable(),
608
+ decisionNeeded: z.string().nullable(),
609
+ targetArtifact: z.string().nullable(),
610
+ repeatFingerprint: z.string().nullable()
611
+ });
612
+ const HappyOrgRepeatEntrySchema = z.object({
613
+ count: z.number().int().nonnegative(),
614
+ lastSeenAt: z.number().int().nonnegative()
615
+ });
616
+ const HappyOrgRuntimeStateSchema = z.object({
617
+ status: z.enum(["active", "terminated"]),
618
+ reason: z.string().optional().nullable(),
619
+ terminatedAt: z.number().int().nonnegative().optional(),
620
+ reopenedAt: z.number().int().nonnegative().optional()
621
+ });
622
+ const HappyOrgTaskOwnershipSchema = z.object({
623
+ ownerAgentId: z.string().min(1),
624
+ ownerRunId: z.string().min(1),
625
+ claimedAt: z.number().int().nonnegative()
626
+ });
627
+ z.object({
628
+ taskContext: HappyOrgTaskContextSchema.optional(),
629
+ runtime: HappyOrgRuntimeStateSchema.optional(),
630
+ activeOwner: HappyOrgTaskOwnershipSchema.nullish(),
631
+ repeat: z.object({
632
+ threshold: z.number().int().positive(),
633
+ fingerprints: z.record(z.string(), HappyOrgRepeatEntrySchema)
634
+ }).optional(),
635
+ lastTurnReport: HappyOrgTurnReportSchema.optional()
636
+ });
637
+
567
638
  const SessionRuntimeIndexSchema = z.object({
568
639
  machineId: z.string().nullish(),
569
640
  hostPid: z.number().int().nullish(),
@@ -789,8 +860,9 @@ const MessageMetaSchema = z.object({
789
860
  // Append to system prompt for this message (null = reset)
790
861
  allowedTools: z.array(z.string()).nullable().optional(),
791
862
  // Allowed tools for this message (null = reset)
792
- disallowedTools: z.array(z.string()).nullable().optional()
863
+ disallowedTools: z.array(z.string()).nullable().optional(),
793
864
  // Disallowed tools for this message (null = reset)
865
+ happyOrg: HappyOrgMessageMetaSchema.optional()
794
866
  });
795
867
  z.object({
796
868
  session: z.object({
@@ -2381,6 +2453,7 @@ class ApiSessionClient extends EventEmitter {
2381
2453
  case "task_started":
2382
2454
  case "task_complete":
2383
2455
  case "turn_aborted":
2456
+ case "turn-report":
2384
2457
  return true;
2385
2458
  default:
2386
2459
  return false;
@@ -3540,4 +3613,4 @@ var api = /*#__PURE__*/Object.freeze({
3540
3613
  ApiClient: ApiClient
3541
3614
  });
3542
3615
 
3543
- export { ApiClient as A, HAPPY_CLOUD_DAEMON_PORT as H, SigningBootstrapRequiredError as S, ApiSessionClient as a, connectionState as b, configuration as c, backoff as d, encodeBase64 as e, delay as f, AsyncLock as g, buildAuthenticatedHeaders as h, isAuthenticationRequiredError as i, SIGNING_BOOTSTRAP_REQUIRED_MESSAGE as j, encodeBase64Url as k, logger as l, buildClientHeaders as m, decodeBase64 as n, HeadTailPreviewBuffer as o, packageJson as p, getLatestDaemonLog as q, api as r, startOfflineReconnection as s };
3616
+ export { ApiClient as A, HAPPY_ORG_TURN_REPORT_TAG as H, SigningBootstrapRequiredError as S, ApiSessionClient as a, connectionState as b, configuration as c, HAPPY_ORG_REPEAT_THRESHOLD as d, encodeBase64 as e, backoff as f, delay as g, AsyncLock as h, isAuthenticationRequiredError as i, buildAuthenticatedHeaders as j, SIGNING_BOOTSTRAP_REQUIRED_MESSAGE as k, logger as l, encodeBase64Url as m, buildClientHeaders as n, decodeBase64 as o, packageJson as p, HAPPY_CLOUD_DAEMON_PORT as q, HeadTailPreviewBuffer as r, startOfflineReconnection as s, getLatestDaemonLog as t, api as u };
@@ -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.0.19";
21
+ var version = "2.0.21";
22
22
  var description = "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI";
23
23
  var author = "long.zhu";
24
24
  var license = "MIT";
@@ -432,7 +432,7 @@ async function listDaemonLogFiles(limit = 50) {
432
432
  return { file, path: fullPath, modified: stats.mtime };
433
433
  }).sort((a, b) => b.modified.getTime() - a.modified.getTime());
434
434
  try {
435
- const { readDaemonState } = await Promise.resolve().then(function () { return require('./persistence-ZZDZ6dl9.cjs'); });
435
+ const { readDaemonState } = await Promise.resolve().then(function () { return require('./persistence-DLFUNI9q.cjs'); });
436
436
  const state = await readDaemonState();
437
437
  if (!state) {
438
438
  return logs;
@@ -566,6 +566,77 @@ function decrypt(key, variant, data) {
566
566
  }
567
567
  }
568
568
 
569
+ const HAPPY_ORG_REPEAT_THRESHOLD = 3;
570
+ const HAPPY_ORG_TURN_REPORT_TAG = "HAPPY_TURN_REPORT";
571
+ const HappyOrgInterventionTypeSchema = z.z.enum([
572
+ "none",
573
+ "review_needed",
574
+ "blocker",
575
+ "decision_needed"
576
+ ]);
577
+ const HappyOrgTurnStatusSchema = z.z.enum([
578
+ "task_complete",
579
+ "turn_aborted"
580
+ ]);
581
+ const HappyOrgTaskContextSchema = z.z.object({
582
+ taskId: z.z.string().min(1),
583
+ organizationId: z.z.string().min(1),
584
+ memberAgentId: z.z.string().min(1),
585
+ supervisorAgentId: z.z.string().min(1)
586
+ });
587
+ const HappyOrgTaskControlSchema = z.z.object({
588
+ action: z.z.enum(["terminate", "reopen"]),
589
+ reason: z.z.string().min(1).optional().nullable(),
590
+ newContext: z.z.string().min(1).optional().nullable(),
591
+ newDecision: z.z.string().min(1).optional().nullable(),
592
+ newResource: z.z.string().min(1).optional().nullable()
593
+ });
594
+ const HappyOrgMessageMetaSchema = z.z.object({
595
+ taskContext: HappyOrgTaskContextSchema.optional(),
596
+ control: HappyOrgTaskControlSchema.optional()
597
+ });
598
+ z.z.object({
599
+ summary: z.z.string().optional().nullable(),
600
+ interventionType: HappyOrgInterventionTypeSchema.optional().nullable(),
601
+ blockerCode: z.z.string().optional().nullable(),
602
+ decisionNeeded: z.z.string().optional().nullable(),
603
+ targetArtifact: z.z.string().optional().nullable()
604
+ });
605
+ const HappyOrgTurnReportSchema = HappyOrgTaskContextSchema.extend({
606
+ turnStatus: HappyOrgTurnStatusSchema,
607
+ interventionType: HappyOrgInterventionTypeSchema,
608
+ summary: z.z.string(),
609
+ blockerCode: z.z.string().nullable(),
610
+ decisionNeeded: z.z.string().nullable(),
611
+ targetArtifact: z.z.string().nullable(),
612
+ repeatFingerprint: z.z.string().nullable()
613
+ });
614
+ const HappyOrgRepeatEntrySchema = z.z.object({
615
+ count: z.z.number().int().nonnegative(),
616
+ lastSeenAt: z.z.number().int().nonnegative()
617
+ });
618
+ const HappyOrgRuntimeStateSchema = z.z.object({
619
+ status: z.z.enum(["active", "terminated"]),
620
+ reason: z.z.string().optional().nullable(),
621
+ terminatedAt: z.z.number().int().nonnegative().optional(),
622
+ reopenedAt: z.z.number().int().nonnegative().optional()
623
+ });
624
+ const HappyOrgTaskOwnershipSchema = z.z.object({
625
+ ownerAgentId: z.z.string().min(1),
626
+ ownerRunId: z.z.string().min(1),
627
+ claimedAt: z.z.number().int().nonnegative()
628
+ });
629
+ z.z.object({
630
+ taskContext: HappyOrgTaskContextSchema.optional(),
631
+ runtime: HappyOrgRuntimeStateSchema.optional(),
632
+ activeOwner: HappyOrgTaskOwnershipSchema.nullish(),
633
+ repeat: z.z.object({
634
+ threshold: z.z.number().int().positive(),
635
+ fingerprints: z.z.record(z.z.string(), HappyOrgRepeatEntrySchema)
636
+ }).optional(),
637
+ lastTurnReport: HappyOrgTurnReportSchema.optional()
638
+ });
639
+
569
640
  const SessionRuntimeIndexSchema = z.z.object({
570
641
  machineId: z.z.string().nullish(),
571
642
  hostPid: z.z.number().int().nullish(),
@@ -791,8 +862,9 @@ const MessageMetaSchema = z.z.object({
791
862
  // Append to system prompt for this message (null = reset)
792
863
  allowedTools: z.z.array(z.z.string()).nullable().optional(),
793
864
  // Allowed tools for this message (null = reset)
794
- disallowedTools: z.z.array(z.z.string()).nullable().optional()
865
+ disallowedTools: z.z.array(z.z.string()).nullable().optional(),
795
866
  // Disallowed tools for this message (null = reset)
867
+ happyOrg: HappyOrgMessageMetaSchema.optional()
796
868
  });
797
869
  z.z.object({
798
870
  session: z.z.object({
@@ -2383,6 +2455,7 @@ class ApiSessionClient extends node_events.EventEmitter {
2383
2455
  case "task_started":
2384
2456
  case "task_complete":
2385
2457
  case "turn_aborted":
2458
+ case "turn-report":
2386
2459
  return true;
2387
2460
  default:
2388
2461
  return false;
@@ -3546,6 +3619,8 @@ exports.ApiClient = ApiClient;
3546
3619
  exports.ApiSessionClient = ApiSessionClient;
3547
3620
  exports.AsyncLock = AsyncLock;
3548
3621
  exports.HAPPY_CLOUD_DAEMON_PORT = HAPPY_CLOUD_DAEMON_PORT;
3622
+ exports.HAPPY_ORG_REPEAT_THRESHOLD = HAPPY_ORG_REPEAT_THRESHOLD;
3623
+ exports.HAPPY_ORG_TURN_REPORT_TAG = HAPPY_ORG_TURN_REPORT_TAG;
3549
3624
  exports.HeadTailPreviewBuffer = HeadTailPreviewBuffer;
3550
3625
  exports.SIGNING_BOOTSTRAP_REQUIRED_MESSAGE = SIGNING_BOOTSTRAP_REQUIRED_MESSAGE;
3551
3626
  exports.SigningBootstrapRequiredError = SigningBootstrapRequiredError;
@@ -1,6 +1,6 @@
1
- import { c as createDefaultRuntimeShell } from './index-BkAY8k_1.mjs';
1
+ import { c as createDefaultRuntimeShell } from './index-CHXCgpwi.mjs';
2
2
  import 'chalk';
3
- import './api-B922KGF8.mjs';
3
+ import './api-DJe9WP9M.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-BfGHkCeJ.mjs';
19
+ import './persistence-CkP90vEt.mjs';
20
20
  import 'node:fs/promises';
21
21
  import 'os';
22
22
  import 'tmp';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-D0VIxWJC.cjs');
3
+ var index = require('./index-CgVjDJpt.cjs');
4
4
  require('chalk');
5
- require('./api-DmpNsXS1.cjs');
5
+ require('./api-MGlKcEf3.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-ZZDZ6dl9.cjs');
21
+ require('./persistence-DLFUNI9q.cjs');
22
22
  require('node:fs/promises');
23
23
  require('os');
24
24
  require('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, h as buildAuthenticatedHeaders, S as SigningBootstrapRequiredError, j as SIGNING_BOOTSTRAP_REQUIRED_MESSAGE, k as encodeBase64Url, f as delay, m as buildClientHeaders, n as decodeBase64, H as HAPPY_CLOUD_DAEMON_PORT, p as packageJson, A as ApiClient, o as HeadTailPreviewBuffer, q as getLatestDaemonLog } from './api-B922KGF8.mjs';
3
- import { writeCredentialsLegacy, writeCredentialsDataKey, readCredentials, readSettings, updateSettings, readDaemonState, clearDaemonState, acquireDaemonLock, writeDaemonState, releaseDaemonLock, validateProfileForAgent, getProfileEnvironmentVariables, clearCredentials, clearMachineId } from './persistence-BfGHkCeJ.mjs';
2
+ import { l as logger, e as encodeBase64, c as configuration, j as buildAuthenticatedHeaders, S as SigningBootstrapRequiredError, k as SIGNING_BOOTSTRAP_REQUIRED_MESSAGE, m as encodeBase64Url, g as delay, n as buildClientHeaders, o as decodeBase64, q as HAPPY_CLOUD_DAEMON_PORT, p as packageJson, A as ApiClient, r as HeadTailPreviewBuffer, t as getLatestDaemonLog } from './api-DJe9WP9M.mjs';
3
+ import { writeCredentialsLegacy, writeCredentialsDataKey, readCredentials, readSettings, updateSettings, readDaemonState, clearDaemonState, acquireDaemonLock, writeDaemonState, releaseDaemonLock, validateProfileForAgent, getProfileEnvironmentVariables, clearCredentials, clearMachineId } from './persistence-CkP90vEt.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, { homedir } from 'os';
@@ -5210,6 +5210,12 @@ function renderToolOutput(accumulator) {
5210
5210
  }
5211
5211
  return accumulator.preview.render("tool output");
5212
5212
  }
5213
+ function formatToolCallTimeoutLimit(timeoutMs) {
5214
+ if (timeoutMs < 1e3) {
5215
+ return `${timeoutMs}ms`;
5216
+ }
5217
+ return `${(timeoutMs / 1e3).toFixed(Number.isInteger(timeoutMs / 1e3) ? 0 : 1)}s`;
5218
+ }
5213
5219
  function isRecord$1(value) {
5214
5220
  return typeof value === "object" && value !== null && !Array.isArray(value);
5215
5221
  }
@@ -5405,14 +5411,36 @@ function startToolCall(toolCallId, toolKind, update, ctx, source) {
5405
5411
  if (!ctx.toolCallTimeouts.has(toolCallId)) {
5406
5412
  const timeout = setTimeout(() => {
5407
5413
  const duration = formatDuration(ctx.toolCallStartTimes.get(toolCallId));
5408
- logger.debug(`[AcpBackend] \u23F1\uFE0F Tool call TIMEOUT (from ${source}): ${toolCallId} (${toolKind}) after ${(timeoutMs / 1e3).toFixed(0)}s - Duration: ${duration}, removing from active set`);
5414
+ const timeoutLabel = formatToolCallTimeoutLimit(timeoutMs);
5415
+ const timeoutDetail = `Tool call ${realToolName} timed out after ${timeoutLabel}`;
5416
+ logger.debug(`[AcpBackend] \u23F1\uFE0F Tool call TIMEOUT (from ${source}): ${toolCallId} (${toolKind}) after ${timeoutLabel} - Duration: ${duration}, failing current turn`);
5409
5417
  ctx.activeToolCalls.delete(toolCallId);
5410
5418
  ctx.toolCallStartTimes.delete(toolCallId);
5411
5419
  ctx.toolCallTimeouts.delete(toolCallId);
5412
- if (ctx.activeToolCalls.size === 0) {
5413
- logger.debug("[AcpBackend] No more active tool calls after timeout, emitting idle status");
5414
- ctx.emitIdleStatus();
5415
- }
5420
+ ctx.clearIdleTimeout();
5421
+ const streamedOutput = renderToolOutput(ctx.toolCallOutputs.get(toolCallId));
5422
+ ctx.toolCallOutputs.delete(toolCallId);
5423
+ ctx.emit({
5424
+ type: "tool-result",
5425
+ toolName: realToolName,
5426
+ result: streamedOutput ? {
5427
+ stdout: streamedOutput,
5428
+ error: timeoutDetail,
5429
+ status: "failed",
5430
+ timedOut: true
5431
+ } : {
5432
+ error: timeoutDetail,
5433
+ status: "failed",
5434
+ timedOut: true
5435
+ },
5436
+ callId: toolCallId
5437
+ });
5438
+ ctx.emit({
5439
+ type: "status",
5440
+ status: "error",
5441
+ detail: timeoutDetail
5442
+ });
5443
+ ctx.failPendingResponseWait(new Error(timeoutDetail));
5416
5444
  }, timeoutMs);
5417
5445
  ctx.toolCallTimeouts.set(toolCallId, timeout);
5418
5446
  logger.debug(`[AcpBackend] \u23F1\uFE0F Set timeout for ${toolCallId}: ${(timeoutMs / 1e3).toFixed(0)}s${isInvestigation ? " (investigation tool)" : ""}`);
@@ -6681,6 +6709,7 @@ ${recentStderrExcerpt}`);
6681
6709
  toolCallCountSincePrompt: this.toolCallCountSincePrompt,
6682
6710
  emit: (msg) => this.emit(msg),
6683
6711
  emitIdleStatus: () => this.emitIdleStatus(),
6712
+ failPendingResponseWait: (error) => this.failPendingResponseWait(error),
6684
6713
  clearIdleTimeout: () => {
6685
6714
  if (this.idleTimeout) {
6686
6715
  clearTimeout(this.idleTimeout);
@@ -7443,6 +7472,9 @@ function dedupePaths(paths, platform) {
7443
7472
  }
7444
7473
  return unique;
7445
7474
  }
7475
+ function getPathDelimiter(platform) {
7476
+ return platform === "win32" ? ";" : ":";
7477
+ }
7446
7478
  function resolveCodexShimPath({
7447
7479
  platform = process.platform,
7448
7480
  exists = existsSync,
@@ -7520,6 +7552,7 @@ function resolveBundledCodexToolPathDirs(options = {}) {
7520
7552
  }
7521
7553
  function buildCodexAcpEnv(overrides = {}, options = {}) {
7522
7554
  const platform = options.platform ?? process.platform;
7555
+ const pathDelimiter = getPathDelimiter(platform);
7523
7556
  const env = {
7524
7557
  ...process.env,
7525
7558
  ...overrides
@@ -7527,14 +7560,14 @@ function buildCodexAcpEnv(overrides = {}, options = {}) {
7527
7560
  const pathKey = resolvePathEnvKey(env);
7528
7561
  const alternatePathKey = pathKey === "PATH" ? "Path" : "PATH";
7529
7562
  const currentPathValue = env[pathKey] ?? env[alternatePathKey] ?? "";
7530
- const currentPathEntries = currentPathValue.split(delimiter).filter(Boolean);
7563
+ const currentPathEntries = currentPathValue.split(pathDelimiter).filter(Boolean);
7531
7564
  const codexToolDirs = resolveBundledCodexToolPathDirs(options);
7532
7565
  const mergedPathEntries = dedupePaths(
7533
7566
  [...codexToolDirs, ...currentPathEntries],
7534
7567
  platform
7535
7568
  );
7536
7569
  if (mergedPathEntries.length > 0) {
7537
- env[pathKey] = mergedPathEntries.join(delimiter);
7570
+ env[pathKey] = mergedPathEntries.join(pathDelimiter);
7538
7571
  }
7539
7572
  delete env[alternatePathKey];
7540
7573
  const stringEnvEntries = [];
@@ -8941,11 +8974,11 @@ var launch = /*#__PURE__*/Object.freeze({
8941
8974
 
8942
8975
  const unifiedProviderExecutors = {
8943
8976
  claude: async (opts) => {
8944
- const { runClaude } = await import('./runClaude-CVBty_g7.mjs');
8977
+ const { runClaude } = await import('./runClaude-DAQAEmHe.mjs');
8945
8978
  await runClaude(opts.credentials, opts.claudeOptions ?? {});
8946
8979
  },
8947
8980
  codex: async (opts) => {
8948
- const { runCodex } = await import('./runCodex-jA1hK-nj.mjs');
8981
+ const { runCodex } = await import('./runCodex-B2UpSn82.mjs');
8949
8982
  await runCodex({
8950
8983
  credentials: opts.credentials,
8951
8984
  startedBy: opts.startedBy,
@@ -8954,7 +8987,7 @@ const unifiedProviderExecutors = {
8954
8987
  });
8955
8988
  },
8956
8989
  gemini: async (opts) => {
8957
- const { runGemini } = await import('./runGemini-BqKLrnid.mjs');
8990
+ const { runGemini } = await import('./runGemini-BBUmH1Qh.mjs');
8958
8991
  await runGemini({
8959
8992
  credentials: opts.credentials,
8960
8993
  startedBy: opts.startedBy
@@ -9030,7 +9063,7 @@ function shouldRunMainClaudeFlow(opts) {
9030
9063
  return;
9031
9064
  } else if (subcommand === "runtime") {
9032
9065
  if (args[1] === "providers") {
9033
- const { renderRuntimeProviders } = await import('./command-uX614XS4.mjs');
9066
+ const { renderRuntimeProviders } = await import('./command-CfyFnMv2.mjs');
9034
9067
  console.log(renderRuntimeProviders());
9035
9068
  return;
9036
9069
  }
@@ -9208,8 +9241,8 @@ function shouldRunMainClaudeFlow(opts) {
9208
9241
  const projectId = args[3];
9209
9242
  try {
9210
9243
  const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return config; });
9211
- const { readCredentials: readCredentials2 } = await import('./persistence-BfGHkCeJ.mjs');
9212
- const { ApiClient: ApiClient2 } = await import('./api-B922KGF8.mjs').then(function (n) { return n.r; });
9244
+ const { readCredentials: readCredentials2 } = await import('./persistence-CkP90vEt.mjs');
9245
+ const { ApiClient: ApiClient2 } = await import('./api-DJe9WP9M.mjs').then(function (n) { return n.u; });
9213
9246
  let userEmail = void 0;
9214
9247
  try {
9215
9248
  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-DmpNsXS1.cjs');
5
- var persistence = require('./persistence-ZZDZ6dl9.cjs');
4
+ var api = require('./api-MGlKcEf3.cjs');
5
+ var persistence = require('./persistence-DLFUNI9q.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-D0VIxWJC.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-CgVjDJpt.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-D0VIxWJC.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-CgVjDJpt.cjs', document.baseURI).href))));
699
699
  function projectPath() {
700
700
  const path = path$1.resolve(__dirname$2, "..");
701
701
  return path;
@@ -5232,6 +5232,12 @@ function renderToolOutput(accumulator) {
5232
5232
  }
5233
5233
  return accumulator.preview.render("tool output");
5234
5234
  }
5235
+ function formatToolCallTimeoutLimit(timeoutMs) {
5236
+ if (timeoutMs < 1e3) {
5237
+ return `${timeoutMs}ms`;
5238
+ }
5239
+ return `${(timeoutMs / 1e3).toFixed(Number.isInteger(timeoutMs / 1e3) ? 0 : 1)}s`;
5240
+ }
5235
5241
  function isRecord$1(value) {
5236
5242
  return typeof value === "object" && value !== null && !Array.isArray(value);
5237
5243
  }
@@ -5427,14 +5433,36 @@ function startToolCall(toolCallId, toolKind, update, ctx, source) {
5427
5433
  if (!ctx.toolCallTimeouts.has(toolCallId)) {
5428
5434
  const timeout = setTimeout(() => {
5429
5435
  const duration = formatDuration(ctx.toolCallStartTimes.get(toolCallId));
5430
- api.logger.debug(`[AcpBackend] \u23F1\uFE0F Tool call TIMEOUT (from ${source}): ${toolCallId} (${toolKind}) after ${(timeoutMs / 1e3).toFixed(0)}s - Duration: ${duration}, removing from active set`);
5436
+ const timeoutLabel = formatToolCallTimeoutLimit(timeoutMs);
5437
+ const timeoutDetail = `Tool call ${realToolName} timed out after ${timeoutLabel}`;
5438
+ api.logger.debug(`[AcpBackend] \u23F1\uFE0F Tool call TIMEOUT (from ${source}): ${toolCallId} (${toolKind}) after ${timeoutLabel} - Duration: ${duration}, failing current turn`);
5431
5439
  ctx.activeToolCalls.delete(toolCallId);
5432
5440
  ctx.toolCallStartTimes.delete(toolCallId);
5433
5441
  ctx.toolCallTimeouts.delete(toolCallId);
5434
- if (ctx.activeToolCalls.size === 0) {
5435
- api.logger.debug("[AcpBackend] No more active tool calls after timeout, emitting idle status");
5436
- ctx.emitIdleStatus();
5437
- }
5442
+ ctx.clearIdleTimeout();
5443
+ const streamedOutput = renderToolOutput(ctx.toolCallOutputs.get(toolCallId));
5444
+ ctx.toolCallOutputs.delete(toolCallId);
5445
+ ctx.emit({
5446
+ type: "tool-result",
5447
+ toolName: realToolName,
5448
+ result: streamedOutput ? {
5449
+ stdout: streamedOutput,
5450
+ error: timeoutDetail,
5451
+ status: "failed",
5452
+ timedOut: true
5453
+ } : {
5454
+ error: timeoutDetail,
5455
+ status: "failed",
5456
+ timedOut: true
5457
+ },
5458
+ callId: toolCallId
5459
+ });
5460
+ ctx.emit({
5461
+ type: "status",
5462
+ status: "error",
5463
+ detail: timeoutDetail
5464
+ });
5465
+ ctx.failPendingResponseWait(new Error(timeoutDetail));
5438
5466
  }, timeoutMs);
5439
5467
  ctx.toolCallTimeouts.set(toolCallId, timeout);
5440
5468
  api.logger.debug(`[AcpBackend] \u23F1\uFE0F Set timeout for ${toolCallId}: ${(timeoutMs / 1e3).toFixed(0)}s${isInvestigation ? " (investigation tool)" : ""}`);
@@ -6703,6 +6731,7 @@ ${recentStderrExcerpt}`);
6703
6731
  toolCallCountSincePrompt: this.toolCallCountSincePrompt,
6704
6732
  emit: (msg) => this.emit(msg),
6705
6733
  emitIdleStatus: () => this.emitIdleStatus(),
6734
+ failPendingResponseWait: (error) => this.failPendingResponseWait(error),
6706
6735
  clearIdleTimeout: () => {
6707
6736
  if (this.idleTimeout) {
6708
6737
  clearTimeout(this.idleTimeout);
@@ -7465,6 +7494,9 @@ function dedupePaths(paths, platform) {
7465
7494
  }
7466
7495
  return unique;
7467
7496
  }
7497
+ function getPathDelimiter(platform) {
7498
+ return platform === "win32" ? ";" : ":";
7499
+ }
7468
7500
  function resolveCodexShimPath({
7469
7501
  platform = process.platform,
7470
7502
  exists = fs.existsSync,
@@ -7542,6 +7574,7 @@ function resolveBundledCodexToolPathDirs(options = {}) {
7542
7574
  }
7543
7575
  function buildCodexAcpEnv(overrides = {}, options = {}) {
7544
7576
  const platform = options.platform ?? process.platform;
7577
+ const pathDelimiter = getPathDelimiter(platform);
7545
7578
  const env = {
7546
7579
  ...process.env,
7547
7580
  ...overrides
@@ -7549,14 +7582,14 @@ function buildCodexAcpEnv(overrides = {}, options = {}) {
7549
7582
  const pathKey = resolvePathEnvKey(env);
7550
7583
  const alternatePathKey = pathKey === "PATH" ? "Path" : "PATH";
7551
7584
  const currentPathValue = env[pathKey] ?? env[alternatePathKey] ?? "";
7552
- const currentPathEntries = currentPathValue.split(path.delimiter).filter(Boolean);
7585
+ const currentPathEntries = currentPathValue.split(pathDelimiter).filter(Boolean);
7553
7586
  const codexToolDirs = resolveBundledCodexToolPathDirs(options);
7554
7587
  const mergedPathEntries = dedupePaths(
7555
7588
  [...codexToolDirs, ...currentPathEntries],
7556
7589
  platform
7557
7590
  );
7558
7591
  if (mergedPathEntries.length > 0) {
7559
- env[pathKey] = mergedPathEntries.join(path.delimiter);
7592
+ env[pathKey] = mergedPathEntries.join(pathDelimiter);
7560
7593
  }
7561
7594
  delete env[alternatePathKey];
7562
7595
  const stringEnvEntries = [];
@@ -7712,7 +7745,7 @@ class AbortError extends Error {
7712
7745
  }
7713
7746
  }
7714
7747
 
7715
- 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-D0VIxWJC.cjs', document.baseURI).href)));
7748
+ 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-CgVjDJpt.cjs', document.baseURI).href)));
7716
7749
  const __dirname$1 = path.join(__filename$1, "..");
7717
7750
  function getGlobalClaudeVersion() {
7718
7751
  try {
@@ -8963,11 +8996,11 @@ var launch = /*#__PURE__*/Object.freeze({
8963
8996
 
8964
8997
  const unifiedProviderExecutors = {
8965
8998
  claude: async (opts) => {
8966
- const { runClaude } = await Promise.resolve().then(function () { return require('./runClaude-taQoQffg.cjs'); });
8999
+ const { runClaude } = await Promise.resolve().then(function () { return require('./runClaude-BGSgcyUp.cjs'); });
8967
9000
  await runClaude(opts.credentials, opts.claudeOptions ?? {});
8968
9001
  },
8969
9002
  codex: async (opts) => {
8970
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-JcA8vuC7.cjs'); });
9003
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-earICaxw.cjs'); });
8971
9004
  await runCodex({
8972
9005
  credentials: opts.credentials,
8973
9006
  startedBy: opts.startedBy,
@@ -8976,7 +9009,7 @@ const unifiedProviderExecutors = {
8976
9009
  });
8977
9010
  },
8978
9011
  gemini: async (opts) => {
8979
- const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-DZ0x4eaa.cjs'); });
9012
+ const { runGemini } = await Promise.resolve().then(function () { return require('./runGemini-D5RAIaR0.cjs'); });
8980
9013
  await runGemini({
8981
9014
  credentials: opts.credentials,
8982
9015
  startedBy: opts.startedBy
@@ -9052,7 +9085,7 @@ function shouldRunMainClaudeFlow(opts) {
9052
9085
  return;
9053
9086
  } else if (subcommand === "runtime") {
9054
9087
  if (args[1] === "providers") {
9055
- const { renderRuntimeProviders } = await Promise.resolve().then(function () { return require('./command-B4L9Deq_.cjs'); });
9088
+ const { renderRuntimeProviders } = await Promise.resolve().then(function () { return require('./command-DAlFmWmr.cjs'); });
9056
9089
  console.log(renderRuntimeProviders());
9057
9090
  return;
9058
9091
  }
@@ -9230,8 +9263,8 @@ function shouldRunMainClaudeFlow(opts) {
9230
9263
  const projectId = args[3];
9231
9264
  try {
9232
9265
  const { saveGoogleCloudProjectToConfig } = await Promise.resolve().then(function () { return config; });
9233
- const { readCredentials: readCredentials2 } = await Promise.resolve().then(function () { return require('./persistence-ZZDZ6dl9.cjs'); });
9234
- const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./api-DmpNsXS1.cjs'); }).then(function (n) { return n.api; });
9266
+ const { readCredentials: readCredentials2 } = await Promise.resolve().then(function () { return require('./persistence-DLFUNI9q.cjs'); });
9267
+ const { ApiClient: ApiClient2 } = await Promise.resolve().then(function () { return require('./api-MGlKcEf3.cjs'); }).then(function (n) { return n.api; });
9235
9268
  let userEmail = void 0;
9236
9269
  try {
9237
9270
  const credentials = await readCredentials2();