@zonease/happy 0.6.57 → 0.6.59

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 (87) hide show
  1. package/dist/{api-jNSgtz8Y.cjs → api-BG2RAjkO.cjs} +12 -12
  2. package/dist/{api-CKGCwsUf.mjs → api-HZrygx1q.mjs} +11 -11
  3. package/dist/{auth-ZUnqSqKY.mjs → auth-DDEwY8Jy.mjs} +4 -4
  4. package/dist/{auth-BUQLBefw.cjs → auth-Dg6EEOCt.cjs} +2 -2
  5. package/dist/{auth-CFcrX0sP.mjs → auth-Zz5zVHUV.mjs} +2 -2
  6. package/dist/{auth-CsU0d6gM.cjs → auth-p14fkl1d.cjs} +4 -4
  7. package/dist/{browser-eziH4OAA.mjs → browser-DCrf3ygy.mjs} +1 -1
  8. package/dist/{browser-BA-Yc9JO.cjs → browser-D_wJ75MR.cjs} +1 -1
  9. package/dist/{claudeLocal-FQ_thOHX.cjs → claudeLocal-C9wQHOXV.cjs} +1 -1
  10. package/dist/{claudeLocal-CBalcsEQ.mjs → claudeLocal-DGUX6P50.mjs} +1 -1
  11. package/dist/codex/happyMcpStdioBridge.cjs +9 -0
  12. package/dist/codex/happyMcpStdioBridge.mjs +9 -0
  13. package/dist/{config-DaQJWbRZ.mjs → config-Cl6s_O_e.mjs} +1 -1
  14. package/dist/{config-CECX_zGu.cjs → config-TXeGmo6s.cjs} +1 -1
  15. package/dist/{connect-Bs0ChOpi.cjs → connect-BBmlI4p-.cjs} +4 -4
  16. package/dist/{connect-DDKq78R-.mjs → connect-mvmGAopY.mjs} +4 -4
  17. package/dist/{controlClient-B70-61t0.cjs → controlClient-B-S8DIbA.cjs} +1 -1
  18. package/dist/{controlClient-jullf1ow.mjs → controlClient-D4CJAjZ0.mjs} +1 -1
  19. package/dist/{cursorApprovalHook-Czq1DjVU.cjs → cursorApprovalHook-CJOqRJyL.cjs} +2 -2
  20. package/dist/{cursorApprovalHook-O8j9S8An.mjs → cursorApprovalHook-Mby6AxPg.mjs} +2 -2
  21. package/dist/{cursorApprovalServer-Cqsy8ohH.cjs → cursorApprovalServer-BZ0Vvg6Y.cjs} +1 -1
  22. package/dist/{cursorApprovalServer-nbHwu4ru.mjs → cursorApprovalServer-ByoqzkYG.mjs} +1 -1
  23. package/dist/{deviceKeys-YeZD2zQo.cjs → deviceKeys-C5Edjyl3.cjs} +2 -2
  24. package/dist/{deviceKeys-su95gdc-.mjs → deviceKeys-da7ga8lw.mjs} +2 -2
  25. package/dist/{doctor-Brqp2e3O.mjs → doctor-C4CcCE02.mjs} +2 -2
  26. package/dist/{doctor-DbfxSKDV.cjs → doctor-DQTATJe_.cjs} +2 -2
  27. package/dist/{downloadImage-K-xFB9jG.mjs → downloadImage-B7bdBnnK.mjs} +1 -1
  28. package/dist/{downloadImage-CyrKKnfC.cjs → downloadImage-B9tLkIFw.cjs} +1 -1
  29. package/dist/{enroll-CMH2pLy0.cjs → enroll-BJ1bu7-w.cjs} +3 -3
  30. package/dist/{enroll-Ck7f6V22.mjs → enroll-CQAWspgW.mjs} +3 -3
  31. package/dist/{evidence-CMz-atyb.mjs → evidence-CarHGKU5.mjs} +1 -1
  32. package/dist/{evidence-yOULEvRk.cjs → evidence-jK1KF7TR.cjs} +1 -1
  33. package/dist/{formatImageMessage-tdlJeRPD.mjs → formatImageMessage-C2w0PWZj.mjs} +1 -1
  34. package/dist/{formatImageMessage-DSsQTvO3.cjs → formatImageMessage-IWJYpk7u.cjs} +1 -1
  35. package/dist/index.cjs +46 -46
  36. package/dist/index.mjs +46 -46
  37. package/dist/{install-DKZjMcR2.cjs → install-BGem9Z2X.cjs} +1 -1
  38. package/dist/{install-CpTmSd4l.mjs → install-C2esF25v.mjs} +2 -2
  39. package/dist/{install-BL0173KN.mjs → install-CIRxyFto.mjs} +1 -1
  40. package/dist/{install-BNR9inWv.cjs → install-C_3pUXgi.cjs} +2 -2
  41. package/dist/lib.cjs +3 -3
  42. package/dist/lib.mjs +3 -3
  43. package/dist/{loadableToolOutput-BxFrugLw.cjs → loadableToolOutput-BRmM7N0K.cjs} +2 -2
  44. package/dist/{loadableToolOutput-BRRL6yS-.mjs → loadableToolOutput-CRm7BfJg.mjs} +2 -2
  45. package/dist/{persistence-BirvtFep.mjs → persistence-BzKMZIHM.mjs} +1 -1
  46. package/dist/{persistence-DoY9jKDN.cjs → persistence-DvE2ntuA.cjs} +1 -1
  47. package/dist/{push-B325YQUT.mjs → push-CRE6Skre.mjs} +6 -6
  48. package/dist/{push-teAS18QK.cjs → push-shZiE6y8.cjs} +6 -6
  49. package/dist/{registerKillSessionHandler-CTSkaRVu.mjs → registerKillSessionHandler-BoxoOCAA.mjs} +62 -7
  50. package/dist/{registerKillSessionHandler-CEvWEzOm.cjs → registerKillSessionHandler-CPgmR55e.cjs} +62 -7
  51. package/dist/{run-D38D-G8z.cjs → run-B9O5pEqU.cjs} +9 -9
  52. package/dist/{run-DNfj0j_h.mjs → run-BXrYCINi.mjs} +9 -9
  53. package/dist/{runClaude-C54Y-vby.mjs → runClaude-DHRLL3Uu.mjs} +16 -16
  54. package/dist/{runClaude-ChIbxtFs.cjs → runClaude-DXuhr1Jq.cjs} +17 -17
  55. package/dist/{runCodex-DKL7LL-d.cjs → runCodex-CNrjOtcu.cjs} +16 -16
  56. package/dist/{runCodex-Bt6DgaY6.mjs → runCodex-YsWbHFie.mjs} +16 -16
  57. package/dist/{runCursor-_ZZmpyjD.mjs → runCursor-B3eVFOvR.mjs} +15 -15
  58. package/dist/{runCursor-CzBFzit8.cjs → runCursor-BMC5UWOt.cjs} +15 -15
  59. package/dist/{runGemini-B2IY0bg7.cjs → runGemini-a8vqips4.cjs} +22 -18
  60. package/dist/{runGemini-COkJ59pz.mjs → runGemini-rASRefPq.mjs} +22 -18
  61. package/dist/{runOneShot-Bt5mWMh4.mjs → runOneShot-BstUhZ0z.mjs} +2 -2
  62. package/dist/{runOneShot-DApUG4Jw.cjs → runOneShot-DMuQ7_R6.cjs} +2 -2
  63. package/dist/{serve-rMs5fvxH.cjs → serve-lh8Pq9-v.cjs} +7 -7
  64. package/dist/{serve-CzQSwmyU.mjs → serve-tuMsUwvp.mjs} +7 -7
  65. package/dist/{session-C9z-9F__.cjs → session-BugsItAN.cjs} +6 -6
  66. package/dist/{session-CJu83tzU.mjs → session-C_3P0fO4.mjs} +6 -6
  67. package/dist/{sessionDecrypt-R6Ee4mFr.mjs → sessionDecrypt-3GUwpCOp.mjs} +3 -3
  68. package/dist/{sessionDecrypt-DlajL7Fn.cjs → sessionDecrypt-DTeehztY.cjs} +3 -3
  69. package/dist/{sessionKeyCache-Ci9NA8Nn.mjs → sessionKeyCache-CKGNcvtt.mjs} +1 -1
  70. package/dist/{sessionKeyCache-CRINEKrH.cjs → sessionKeyCache-Cjj99FBb.cjs} +1 -1
  71. package/dist/{sessionList-Bh8eF10P.mjs → sessionList-BIF-5Kc6.mjs} +2 -2
  72. package/dist/{sessionList-DXPTa2ix.cjs → sessionList-CYdcIUpj.cjs} +2 -2
  73. package/dist/{sessionSummary-Cs-_4S3j.cjs → sessionSummary-CPuqTKQA.cjs} +2 -2
  74. package/dist/{sessionSummary-CcdMMHfv.mjs → sessionSummary-TDsXBqVe.mjs} +2 -2
  75. package/dist/{setupOfflineReconnection-DV3FASIY.mjs → setupOfflineReconnection-BiTQ4c4E.mjs} +3 -3
  76. package/dist/{setupOfflineReconnection-BmbFrBPc.cjs → setupOfflineReconnection-DKWIq7tY.cjs} +3 -3
  77. package/dist/{spawnHappyCLI-CilqRN5U.cjs → spawnHappyCLI-BSQwBkJB.cjs} +1 -1
  78. package/dist/{spawnHappyCLI-CSkTkB4n.mjs → spawnHappyCLI-BcOtnZGp.mjs} +1 -1
  79. package/dist/{ssh-CgYdGAzd.mjs → ssh-CM1qQF8X.mjs} +5 -5
  80. package/dist/{ssh-CrxTSwPb.cjs → ssh-D_j65FnH.cjs} +5 -5
  81. package/dist/{task-BJro3dR3.mjs → task-D5RREnTv.mjs} +7 -7
  82. package/dist/{task-GLv6BSQA.cjs → task-_pvj9bB8.cjs} +7 -7
  83. package/dist/{uninstall-CyoWDMHw.cjs → uninstall-D7ROiaFM.cjs} +2 -2
  84. package/dist/{uninstall-CKmjUaMr.mjs → uninstall-ca5Toz-a.mjs} +2 -2
  85. package/dist/{update-BxE93-s7.mjs → update-CM4kwlt7.mjs} +3 -3
  86. package/dist/{update-AqCJSfVL.cjs → update-DW1fNs7b.cjs} +3 -3
  87. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var axios = require('axios');
4
- var logger = require('./persistence-DoY9jKDN.cjs');
4
+ var logger = require('./persistence-DvE2ntuA.cjs');
5
5
  var node_events = require('node:events');
6
6
  var socket_ioClient = require('socket.io-client');
7
7
  var z = require('zod');
@@ -26,7 +26,7 @@ var crypto = require('crypto');
26
26
  var tweetnacl = require('tweetnacl');
27
27
  var base64 = require('@stablelib/base64');
28
28
  var expoServerSdk = require('expo-server-sdk');
29
- var sessionKeyCache = require('./sessionKeyCache-CRINEKrH.cjs');
29
+ var sessionKeyCache = require('./sessionKeyCache-Cjj99FBb.cjs');
30
30
  var chalk = require('chalk');
31
31
 
32
32
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -1407,7 +1407,7 @@ function resolveToolsDir() {
1407
1407
  }
1408
1408
  function findToolsDir() {
1409
1409
  try {
1410
- const manifest = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('api-jNSgtz8Y.cjs', document.baseURI).href))).resolve(`${toolsPackageName()}/package.json`);
1410
+ const manifest = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('api-BG2RAjkO.cjs', document.baseURI).href))).resolve(`${toolsPackageName()}/package.json`);
1411
1411
  return path.dirname(manifest);
1412
1412
  } catch {
1413
1413
  }
@@ -2875,6 +2875,10 @@ class ApiSessionClient extends node_events.EventEmitter {
2875
2875
  logger.logger.debug("[SOCKET] [UPDATE] [ERROR] No body in update!");
2876
2876
  return;
2877
2877
  }
2878
+ if (data.body.t === "new-message" && data.body.sid !== this.sessionId || data.body.t === "update-session" && data.body.id !== this.sessionId) {
2879
+ logger.logger.debug(`[SOCKET] Ignoring ${data.body.t} for another session`);
2880
+ return;
2881
+ }
2878
2882
  if (data.body.t === "new-message" && data.body.message.content.t === "encrypted") {
2879
2883
  const body = logger.decrypt(this.encryptionKey, this.encryptionVariant, logger.decodeBase64(data.body.message.content.c));
2880
2884
  logger.logger.debugLargeJson("[SOCKET] [UPDATE] Received update:", body);
@@ -3644,11 +3648,9 @@ class ApiSessionClient extends node_events.EventEmitter {
3644
3648
  this.metadataVersion = answer.version;
3645
3649
  this.syncedModel = this.metadata?.model?.trim() || null;
3646
3650
  } else if (answer.result === "version-mismatch") {
3647
- if (answer.version > this.metadataVersion) {
3648
- this.metadataVersion = answer.version;
3649
- this.metadata = adoptServerSessionMetadata(this.metadata, logger.decrypt(this.encryptionKey, this.encryptionVariant, logger.decodeBase64(answer.metadata)));
3650
- this.syncedModel = this.metadata?.model?.trim() || null;
3651
- }
3651
+ this.metadataVersion = answer.version;
3652
+ this.metadata = adoptServerSessionMetadata(this.metadata, logger.decrypt(this.encryptionKey, this.encryptionVariant, logger.decodeBase64(answer.metadata)));
3653
+ this.syncedModel = this.metadata?.model?.trim() || null;
3652
3654
  throw new Error("Metadata version mismatch");
3653
3655
  } else if (answer.result === "error") ;
3654
3656
  });
@@ -3669,10 +3671,8 @@ class ApiSessionClient extends node_events.EventEmitter {
3669
3671
  this.agentStateVersion = answer.version;
3670
3672
  logger.logger.debug("Agent state updated", this.agentState);
3671
3673
  } else if (answer.result === "version-mismatch") {
3672
- if (answer.version > this.agentStateVersion) {
3673
- this.agentStateVersion = answer.version;
3674
- this.agentState = answer.agentState ? logger.decrypt(this.encryptionKey, this.encryptionVariant, logger.decodeBase64(answer.agentState)) : null;
3675
- }
3674
+ this.agentStateVersion = answer.version;
3675
+ this.agentState = answer.agentState ? logger.decrypt(this.encryptionKey, this.encryptionVariant, logger.decodeBase64(answer.agentState)) : null;
3676
3676
  throw new Error("Agent state version mismatch");
3677
3677
  } else if (answer.result === "error") ;
3678
3678
  });
@@ -1,5 +1,5 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import axios from 'axios';
2
- import { l as logger, c as configuration, e as encodeBase64, f as encrypt, g as decrypt, h as decodeBase64, i as isDebug, B as encryptLegacy, a as readSettings, C as getRandomBytes, D as libsodiumEncryptForPublicKey } from './persistence-BirvtFep.mjs';
2
+ import { l as logger, c as configuration, e as encodeBase64, f as encrypt, g as decrypt, h as decodeBase64, i as isDebug, B as encryptLegacy, a as readSettings, C as getRandomBytes, D as libsodiumEncryptForPublicKey } from './persistence-BzKMZIHM.mjs';
3
3
  import { EventEmitter } from 'node:events';
4
4
  import { io } from 'socket.io-client';
5
5
  import { z } from 'zod';
@@ -24,7 +24,7 @@ import { randomUUID as randomUUID$1 } from 'crypto';
24
24
  import tweetnacl from 'tweetnacl';
25
25
  import { encode, decode } from '@stablelib/base64';
26
26
  import { Expo } from 'expo-server-sdk';
27
- import { c as cacheSessionKey } from './sessionKeyCache-Ci9NA8Nn.mjs';
27
+ import { c as cacheSessionKey } from './sessionKeyCache-CKGNcvtt.mjs';
28
28
  import chalk from 'chalk';
29
29
 
30
30
  z.object({
@@ -2872,6 +2872,10 @@ class ApiSessionClient extends EventEmitter {
2872
2872
  logger.debug("[SOCKET] [UPDATE] [ERROR] No body in update!");
2873
2873
  return;
2874
2874
  }
2875
+ if (data.body.t === "new-message" && data.body.sid !== this.sessionId || data.body.t === "update-session" && data.body.id !== this.sessionId) {
2876
+ logger.debug(`[SOCKET] Ignoring ${data.body.t} for another session`);
2877
+ return;
2878
+ }
2875
2879
  if (data.body.t === "new-message" && data.body.message.content.t === "encrypted") {
2876
2880
  const body = decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(data.body.message.content.c));
2877
2881
  logger.debugLargeJson("[SOCKET] [UPDATE] Received update:", body);
@@ -3641,11 +3645,9 @@ class ApiSessionClient extends EventEmitter {
3641
3645
  this.metadataVersion = answer.version;
3642
3646
  this.syncedModel = this.metadata?.model?.trim() || null;
3643
3647
  } else if (answer.result === "version-mismatch") {
3644
- if (answer.version > this.metadataVersion) {
3645
- this.metadataVersion = answer.version;
3646
- this.metadata = adoptServerSessionMetadata(this.metadata, decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(answer.metadata)));
3647
- this.syncedModel = this.metadata?.model?.trim() || null;
3648
- }
3648
+ this.metadataVersion = answer.version;
3649
+ this.metadata = adoptServerSessionMetadata(this.metadata, decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(answer.metadata)));
3650
+ this.syncedModel = this.metadata?.model?.trim() || null;
3649
3651
  throw new Error("Metadata version mismatch");
3650
3652
  } else if (answer.result === "error") ;
3651
3653
  });
@@ -3666,10 +3668,8 @@ class ApiSessionClient extends EventEmitter {
3666
3668
  this.agentStateVersion = answer.version;
3667
3669
  logger.debug("Agent state updated", this.agentState);
3668
3670
  } else if (answer.result === "version-mismatch") {
3669
- if (answer.version > this.agentStateVersion) {
3670
- this.agentStateVersion = answer.version;
3671
- this.agentState = answer.agentState ? decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(answer.agentState)) : null;
3672
- }
3671
+ this.agentStateVersion = answer.version;
3672
+ this.agentState = answer.agentState ? decrypt(this.encryptionKey, this.encryptionVariant, decodeBase64(answer.agentState)) : null;
3673
3673
  throw new Error("Agent state version mismatch");
3674
3674
  } else if (answer.result === "error") ;
3675
3675
  });
@@ -1,9 +1,9 @@
1
1
  import chalk from 'chalk';
2
- import { r as readCredentials, a as readSettings, c as configuration, l as logger, b as clearCredentials, d as clearMachineId } from './persistence-BirvtFep.mjs';
3
- import { authAndSetupMachineIfNeeded } from './auth-CFcrX0sP.mjs';
2
+ import { r as readCredentials, a as readSettings, c as configuration, l as logger, b as clearCredentials, d as clearMachineId } from './persistence-BzKMZIHM.mjs';
3
+ import { authAndSetupMachineIfNeeded } from './auth-Zz5zVHUV.mjs';
4
4
  import { existsSync, rmSync } from 'node:fs';
5
5
  import { createInterface } from 'node:readline';
6
- import { checkIfDaemonRunningAndCleanupStaleState, stopDaemon } from './controlClient-jullf1ow.mjs';
6
+ import { checkIfDaemonRunningAndCleanupStaleState, stopDaemon } from './controlClient-D4CJAjZ0.mjs';
7
7
  import os from 'node:os';
8
8
  import 'node:fs/promises';
9
9
  import 'node:path';
@@ -14,7 +14,7 @@ import 'fs';
14
14
  import 'axios';
15
15
  import 'qrcode-terminal';
16
16
  import './time-DgsBLJA_.mjs';
17
- import './browser-eziH4OAA.mjs';
17
+ import './browser-DCrf3ygy.mjs';
18
18
  import 'open';
19
19
  import 'react';
20
20
  import 'ink';
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./persistence-DoY9jKDN.cjs');
3
+ var logger = require('./persistence-DvE2ntuA.cjs');
4
4
  var node_crypto = require('node:crypto');
5
5
  var tweetnacl = require('tweetnacl');
6
6
  var axios = require('axios');
7
7
  var qrcode = require('qrcode-terminal');
8
8
  var time = require('./time-Bj2HRkKH.cjs');
9
- var browser = require('./browser-BA-Yc9JO.cjs');
9
+ var browser = require('./browser-D_wJ75MR.cjs');
10
10
  var React = require('react');
11
11
  var ink = require('ink');
12
12
  require('node:fs/promises');
@@ -1,10 +1,10 @@
1
- import { e as encodeBase64, c as configuration, l as logger, r as readCredentials, u as updateSettings, i as isDebug, s as encodeBase64Url, h as decodeBase64, t as writeCredentialsLegacy, w as writeCredentialsDataKey } from './persistence-BirvtFep.mjs';
1
+ import { e as encodeBase64, c as configuration, l as logger, r as readCredentials, u as updateSettings, i as isDebug, s as encodeBase64Url, h as decodeBase64, t as writeCredentialsLegacy, w as writeCredentialsDataKey } from './persistence-BzKMZIHM.mjs';
2
2
  import { randomBytes, randomUUID } from 'node:crypto';
3
3
  import tweetnacl from 'tweetnacl';
4
4
  import axios from 'axios';
5
5
  import qrcode from 'qrcode-terminal';
6
6
  import { d as delay } from './time-DgsBLJA_.mjs';
7
- import { o as openBrowser } from './browser-eziH4OAA.mjs';
7
+ import { o as openBrowser } from './browser-DCrf3ygy.mjs';
8
8
  import React, { useState } from 'react';
9
9
  import { useInput, Box, Text, render } from 'ink';
10
10
  import 'node:fs/promises';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var logger = require('./persistence-DoY9jKDN.cjs');
5
- var auth = require('./auth-BUQLBefw.cjs');
4
+ var logger = require('./persistence-DvE2ntuA.cjs');
5
+ var auth = require('./auth-Dg6EEOCt.cjs');
6
6
  var fs = require('node:fs');
7
7
  var node_readline = require('node:readline');
8
- var controlClient = require('./controlClient-B70-61t0.cjs');
8
+ var controlClient = require('./controlClient-B-S8DIbA.cjs');
9
9
  var os = require('node:os');
10
10
  require('node:fs/promises');
11
11
  require('node:path');
@@ -16,7 +16,7 @@ require('fs');
16
16
  require('axios');
17
17
  require('qrcode-terminal');
18
18
  require('./time-Bj2HRkKH.cjs');
19
- require('./browser-BA-Yc9JO.cjs');
19
+ require('./browser-D_wJ75MR.cjs');
20
20
  require('open');
21
21
  require('react');
22
22
  require('ink');
@@ -1,5 +1,5 @@
1
1
  import open from 'open';
2
- import { l as logger } from './persistence-BirvtFep.mjs';
2
+ import { l as logger } from './persistence-BzKMZIHM.mjs';
3
3
 
4
4
  async function openBrowser(url) {
5
5
  try {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var open = require('open');
4
- var logger = require('./persistence-DoY9jKDN.cjs');
4
+ var logger = require('./persistence-DvE2ntuA.cjs');
5
5
 
6
6
  async function openBrowser(url) {
7
7
  try {
@@ -5,7 +5,7 @@ var path = require('node:path');
5
5
  var node_readline = require('node:readline');
6
6
  var fs = require('node:fs');
7
7
  var node_crypto = require('node:crypto');
8
- var logger = require('./persistence-DoY9jKDN.cjs');
8
+ var logger = require('./persistence-DvE2ntuA.cjs');
9
9
  var os = require('node:os');
10
10
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
11
11
  var prompt = require('./prompt-BTWDZZO0.cjs');
@@ -3,7 +3,7 @@ import { resolve, join } from 'node:path';
3
3
  import { createInterface } from 'node:readline';
4
4
  import { existsSync, readFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { l as logger } from './persistence-BirvtFep.mjs';
6
+ import { l as logger } from './persistence-BzKMZIHM.mjs';
7
7
  import { homedir } from 'node:os';
8
8
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
9
9
  import { g as getBaseSystemPrompt } from './prompt-BsAZsPbo.mjs';
@@ -111,6 +111,15 @@ async function main() {
111
111
  images: z.z.array(z.z.string()).optional().describe("Absolute paths to screenshots on this machine, added to any already on the bug. JPEG and PNG only, 10 per bug in total, 20MB each.")
112
112
  }
113
113
  });
114
+ registerForwardedTool("comment_bug", {
115
+ description: "Post a comment under a bug on the user's Happy bug board. Everyone following the bug is notified (Feishu), which an edit to the description does not do. Use it to report a result \u2014 a retest that passed or failed, a fix that shipped, a question for the reporter \u2014 instead of appending it to the description.",
116
+ title: "Comment on Bug",
117
+ inputSchema: {
118
+ bug: z.z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.'),
119
+ body: z.z.string().describe("The comment text. To place a screenshot inside it, put [[bug-image:N]] where the Nth entry of images should appear; images left unplaced follow the text."),
120
+ images: z.z.array(z.z.string()).optional().describe("Absolute paths to screenshots on this machine, in the order the [[bug-image:N]] markers refer to them. JPEG and PNG only, up to 10, 20MB each.")
121
+ }
122
+ });
114
123
  registerForwardedTool("set_bug_status", {
115
124
  description: "Move a bug on the user's Happy bug board to another status: close it once a fix is verified, put it back in progress, send it to verification, or return it to pending. Use whenever the user says a bug is fixed, verified, closed, reopened, or should go back to someone.",
116
125
  title: "Set Bug Status",
@@ -109,6 +109,15 @@ async function main() {
109
109
  images: z.array(z.string()).optional().describe("Absolute paths to screenshots on this machine, added to any already on the bug. JPEG and PNG only, 10 per bug in total, 20MB each.")
110
110
  }
111
111
  });
112
+ registerForwardedTool("comment_bug", {
113
+ description: "Post a comment under a bug on the user's Happy bug board. Everyone following the bug is notified (Feishu), which an edit to the description does not do. Use it to report a result \u2014 a retest that passed or failed, a fix that shipped, a question for the reporter \u2014 instead of appending it to the description.",
114
+ title: "Comment on Bug",
115
+ inputSchema: {
116
+ bug: z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.'),
117
+ body: z.string().describe("The comment text. To place a screenshot inside it, put [[bug-image:N]] where the Nth entry of images should appear; images left unplaced follow the text."),
118
+ images: z.array(z.string()).optional().describe("Absolute paths to screenshots on this machine, in the order the [[bug-image:N]] markers refer to them. JPEG and PNG only, up to 10, 20MB each.")
119
+ }
120
+ });
112
121
  registerForwardedTool("set_bug_status", {
113
122
  description: "Move a bug on the user's Happy bug board to another status: close it once a fix is verified, put it back in progress, send it to verification, or return it to pending. Use whenever the user says a bug is fixed, verified, closed, reopened, or should go back to someone.",
114
123
  title: "Set Bug Status",
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { execSync } from 'child_process';
5
- import { l as logger } from './persistence-BirvtFep.mjs';
5
+ import { l as logger } from './persistence-BzKMZIHM.mjs';
6
6
  import { D as DEFAULT_GEMINI_MODEL, G as GEMINI_MODEL_ENV } from './constants-pmXZGibX.mjs';
7
7
  import 'node:fs/promises';
8
8
  import 'node:fs';
@@ -4,7 +4,7 @@ var fs = require('fs');
4
4
  var path = require('path');
5
5
  var os = require('os');
6
6
  var child_process = require('child_process');
7
- var logger = require('./persistence-DoY9jKDN.cjs');
7
+ var logger = require('./persistence-DvE2ntuA.cjs');
8
8
  var constants = require('./constants-E_UWYTo3.cjs');
9
9
  require('node:fs/promises');
10
10
  require('node:fs');
@@ -4,11 +4,11 @@ var chalk = require('chalk');
4
4
  var fs = require('fs');
5
5
  var os = require('os');
6
6
  var path = require('path');
7
- var logger = require('./persistence-DoY9jKDN.cjs');
8
- var api = require('./api-jNSgtz8Y.cjs');
7
+ var logger = require('./persistence-DvE2ntuA.cjs');
8
+ var api = require('./api-BG2RAjkO.cjs');
9
9
  var http = require('http');
10
10
  var crypto = require('crypto');
11
- var browser = require('./browser-BA-Yc9JO.cjs');
11
+ var browser = require('./browser-D_wJ75MR.cjs');
12
12
  var child_process = require('child_process');
13
13
  var util = require('util');
14
14
  require('node:fs/promises');
@@ -34,7 +34,7 @@ require('node:module');
34
34
  require('ws');
35
35
  require('@stablelib/base64');
36
36
  require('expo-server-sdk');
37
- require('./sessionKeyCache-CRINEKrH.cjs');
37
+ require('./sessionKeyCache-Cjj99FBb.cjs');
38
38
  require('open');
39
39
 
40
40
  const CLIENT_ID$2 = "app_EMoamEEZ73f0CkXaXp7hrann";
@@ -2,11 +2,11 @@ import chalk from 'chalk';
2
2
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
3
3
  import { homedir } from 'os';
4
4
  import { join } from 'path';
5
- import { r as readCredentials } from './persistence-BirvtFep.mjs';
6
- import { A as ApiClient } from './api-CKGCwsUf.mjs';
5
+ import { r as readCredentials } from './persistence-BzKMZIHM.mjs';
6
+ import { A as ApiClient } from './api-HZrygx1q.mjs';
7
7
  import { createServer } from 'http';
8
8
  import { randomBytes, createHash } from 'crypto';
9
- import { o as openBrowser } from './browser-eziH4OAA.mjs';
9
+ import { o as openBrowser } from './browser-DCrf3ygy.mjs';
10
10
  import { exec } from 'child_process';
11
11
  import { promisify } from 'util';
12
12
  import 'node:fs/promises';
@@ -32,7 +32,7 @@ import 'node:module';
32
32
  import 'ws';
33
33
  import '@stablelib/base64';
34
34
  import 'expo-server-sdk';
35
- import './sessionKeyCache-Ci9NA8Nn.mjs';
35
+ import './sessionKeyCache-CKGNcvtt.mjs';
36
36
  import 'open';
37
37
 
38
38
  const CLIENT_ID$2 = "app_EMoamEEZ73f0CkXaXp7hrann";
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./persistence-DoY9jKDN.cjs');
3
+ var logger = require('./persistence-DvE2ntuA.cjs');
4
4
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
5
5
  var fs = require('fs');
6
6
  var path = require('path');
@@ -1,4 +1,4 @@
1
- import { l as logger, m as readDaemonState, n as clearDaemonState } from './persistence-BirvtFep.mjs';
1
+ import { l as logger, m as readDaemonState, n as clearDaemonState } from './persistence-BzKMZIHM.mjs';
2
2
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
3
3
  import { readFileSync } from 'fs';
4
4
  import { join } from 'path';
@@ -2,12 +2,12 @@
2
2
 
3
3
  var fs = require('node:fs');
4
4
  var path = require('node:path');
5
- var cursorApprovalServer = require('./cursorApprovalServer-Cqsy8ohH.cjs');
5
+ var cursorApprovalServer = require('./cursorApprovalServer-BZ0Vvg6Y.cjs');
6
6
  require('node:http');
7
7
  require('node:crypto');
8
8
  require('node:fs/promises');
9
9
  require('node:os');
10
- require('./persistence-DoY9jKDN.cjs');
10
+ require('./persistence-DvE2ntuA.cjs');
11
11
  require('zod');
12
12
  require('tweetnacl');
13
13
  require('chalk');
@@ -1,11 +1,11 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { a as approvalRegistryDir, A as APPROVAL_ENDPOINT_FILE } from './cursorApprovalServer-nbHwu4ru.mjs';
3
+ import { a as approvalRegistryDir, A as APPROVAL_ENDPOINT_FILE } from './cursorApprovalServer-ByoqzkYG.mjs';
4
4
  import 'node:http';
5
5
  import 'node:crypto';
6
6
  import 'node:fs/promises';
7
7
  import 'node:os';
8
- import './persistence-BirvtFep.mjs';
8
+ import './persistence-BzKMZIHM.mjs';
9
9
  import 'zod';
10
10
  import 'tweetnacl';
11
11
  import 'chalk';
@@ -6,7 +6,7 @@ var promises = require('node:fs/promises');
6
6
  var fs = require('node:fs');
7
7
  var path = require('node:path');
8
8
  var os = require('node:os');
9
- var logger = require('./persistence-DoY9jKDN.cjs');
9
+ var logger = require('./persistence-DvE2ntuA.cjs');
10
10
 
11
11
  const TOOL_NAME_MAP = {
12
12
  read: "Read",
@@ -4,7 +4,7 @@ import { mkdir, writeFile, rename, readFile, rm, readdir, rmdir } from 'node:fs/
4
4
  import { existsSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
- import { l as logger } from './persistence-BirvtFep.mjs';
7
+ import { l as logger } from './persistence-BzKMZIHM.mjs';
8
8
 
9
9
  const TOOL_NAME_MAP = {
10
10
  read: "Read",
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var axios = require('axios');
4
- var logger = require('./persistence-DoY9jKDN.cjs');
5
- var auth = require('./auth-BUQLBefw.cjs');
4
+ var logger = require('./persistence-DvE2ntuA.cjs');
5
+ var auth = require('./auth-Dg6EEOCt.cjs');
6
6
  var tweetnacl = require('tweetnacl');
7
7
  var fs = require('node:fs');
8
8
  var promises = require('node:fs/promises');
@@ -1,6 +1,6 @@
1
1
  import axios from 'axios';
2
- import { h as decodeBase64, e as encodeBase64, f as encrypt, g as decrypt, c as configuration } from './persistence-BirvtFep.mjs';
3
- import { decryptWithEphemeralKey } from './auth-CFcrX0sP.mjs';
2
+ import { h as decodeBase64, e as encodeBase64, f as encrypt, g as decrypt, c as configuration } from './persistence-BzKMZIHM.mjs';
3
+ import { decryptWithEphemeralKey } from './auth-Zz5zVHUV.mjs';
4
4
  import tweetnacl from 'tweetnacl';
5
5
  import { existsSync } from 'node:fs';
6
6
  import { writeFile, mkdir, readFile } from 'node:fs/promises';
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
- import { p as packageJson, c as configuration, a as readSettings, r as readCredentials, m as readDaemonState } from './persistence-BirvtFep.mjs';
3
- import { checkIfDaemonRunningAndCleanupStaleState } from './controlClient-jullf1ow.mjs';
2
+ import { p as packageJson, c as configuration, a as readSettings, r as readCredentials, m as readDaemonState } from './persistence-BzKMZIHM.mjs';
3
+ import { checkIfDaemonRunningAndCleanupStaleState } from './controlClient-D4CJAjZ0.mjs';
4
4
  import { findAllHappyProcesses } from './doctor-ON7pN5G5.mjs';
5
5
  import { existsSync, readdirSync, statSync } from 'node:fs';
6
6
  import { join } from 'node:path';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var logger = require('./persistence-DoY9jKDN.cjs');
5
- var controlClient = require('./controlClient-B70-61t0.cjs');
4
+ var logger = require('./persistence-DvE2ntuA.cjs');
5
+ var controlClient = require('./controlClient-B-S8DIbA.cjs');
6
6
  var doctor = require('./doctor-C08m5Z9f.cjs');
7
7
  var fs = require('node:fs');
8
8
  var path = require('node:path');
@@ -1,4 +1,4 @@
1
- import { l as logger } from './persistence-BirvtFep.mjs';
1
+ import { l as logger } from './persistence-BzKMZIHM.mjs';
2
2
  import { createHash } from 'crypto';
3
3
  import axios from 'axios';
4
4
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./persistence-DoY9jKDN.cjs');
3
+ var logger = require('./persistence-DvE2ntuA.cjs');
4
4
  var crypto = require('crypto');
5
5
  var axios = require('axios');
6
6
 
@@ -3,8 +3,8 @@
3
3
  var axios = require('axios');
4
4
  var tweetnacl = require('tweetnacl');
5
5
  var node_crypto = require('node:crypto');
6
- var logger = require('./persistence-DoY9jKDN.cjs');
7
- var auth = require('./auth-BUQLBefw.cjs');
6
+ var logger = require('./persistence-DvE2ntuA.cjs');
7
+ var auth = require('./auth-Dg6EEOCt.cjs');
8
8
  require('node:fs/promises');
9
9
  require('node:fs');
10
10
  require('node:os');
@@ -14,7 +14,7 @@ require('chalk');
14
14
  require('fs');
15
15
  require('qrcode-terminal');
16
16
  require('./time-Bj2HRkKH.cjs');
17
- require('./browser-BA-Yc9JO.cjs');
17
+ require('./browser-D_wJ75MR.cjs');
18
18
  require('open');
19
19
  require('react');
20
20
  require('ink');
@@ -1,8 +1,8 @@
1
1
  import axios from 'axios';
2
2
  import tweetnacl from 'tweetnacl';
3
3
  import { createHmac, randomBytes } from 'node:crypto';
4
- import { r as readCredentials, c as configuration, h as decodeBase64, u as updateSettings, w as writeCredentialsDataKey, q as libsodiumPublicKeyFromSecretKey } from './persistence-BirvtFep.mjs';
5
- import { decryptWithEphemeralKey } from './auth-CFcrX0sP.mjs';
4
+ import { r as readCredentials, c as configuration, h as decodeBase64, u as updateSettings, w as writeCredentialsDataKey, q as libsodiumPublicKeyFromSecretKey } from './persistence-BzKMZIHM.mjs';
5
+ import { decryptWithEphemeralKey } from './auth-Zz5zVHUV.mjs';
6
6
  import 'node:fs/promises';
7
7
  import 'node:fs';
8
8
  import 'node:os';
@@ -12,7 +12,7 @@ import 'chalk';
12
12
  import 'fs';
13
13
  import 'qrcode-terminal';
14
14
  import './time-DgsBLJA_.mjs';
15
- import './browser-eziH4OAA.mjs';
15
+ import './browser-DCrf3ygy.mjs';
16
16
  import 'open';
17
17
  import 'react';
18
18
  import 'ink';
@@ -3,7 +3,7 @@ import { constants } from 'node:fs';
3
3
  import { mkdir, appendFile, access, readFile } from 'node:fs/promises';
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import { basename, dirname, resolve } from 'node:path';
6
- import { c as configuration } from './persistence-BirvtFep.mjs';
6
+ import { c as configuration } from './persistence-BzKMZIHM.mjs';
7
7
  import { r as renderEvidenceReport, i as inferEvidenceKind } from './workflowReports-Dd8-4-8f.mjs';
8
8
  import { p as parseWorkflowArgs, s as stringFlag, b as booleanFlag, a as printOrWriteOutput } from './workflowCommon-B0d01Y_a.mjs';
9
9
  import 'node:os';
@@ -5,7 +5,7 @@ var fs = require('node:fs');
5
5
  var promises = require('node:fs/promises');
6
6
  var node_crypto = require('node:crypto');
7
7
  var path = require('node:path');
8
- var logger = require('./persistence-DoY9jKDN.cjs');
8
+ var logger = require('./persistence-DvE2ntuA.cjs');
9
9
  var workflowReports = require('./workflowReports-BEWuQesA.cjs');
10
10
  var workflowCommon = require('./workflowCommon-Bl568-rt.cjs');
11
11
  require('node:os');
@@ -1,4 +1,4 @@
1
- import { d as downloadImage } from './downloadImage-K-xFB9jG.mjs';
1
+ import { d as downloadImage } from './downloadImage-B7bdBnnK.mjs';
2
2
 
3
3
  async function formatMessageForClaude(text, images) {
4
4
  const content = [];
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var downloadImage = require('./downloadImage-CyrKKnfC.cjs');
3
+ var downloadImage = require('./downloadImage-B9tLkIFw.cjs');
4
4
 
5
5
  async function formatMessageForClaude(text, images) {
6
6
  const content = [];