@zonease/happy 0.6.48 → 0.6.49

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-BQORFd9R.mjs → api-DgjBoynq.mjs} +2 -2
  2. package/dist/{api-lxlaOAan.cjs → api-OthK5iIu.cjs} +3 -3
  3. package/dist/{auth-Cch5XGgf.mjs → auth-B1jRZqn6.mjs} +4 -4
  4. package/dist/{auth-DEvweBty.mjs → auth-BCH_VzFY.mjs} +2 -2
  5. package/dist/{auth-DO429YIh.cjs → auth-BpoPI35K.cjs} +2 -2
  6. package/dist/{auth-D3n2c6ef.cjs → auth-jlHlPGoI.cjs} +4 -4
  7. package/dist/{browser-ChToh76t.cjs → browser-BPhM1lYb.cjs} +1 -1
  8. package/dist/{browser-C6JpWqen.mjs → browser-oD4Fhplt.mjs} +1 -1
  9. package/dist/{claudeLocal-D7uEQO2e.mjs → claudeLocal-BgGmploP.mjs} +1 -1
  10. package/dist/{claudeLocal-BRkqm7Dv.cjs → claudeLocal-D1aqQU3U.cjs} +1 -1
  11. package/dist/codex/happyMcpStdioBridge.cjs +8 -1
  12. package/dist/codex/happyMcpStdioBridge.mjs +8 -1
  13. package/dist/{config-oC3LtNiN.mjs → config-DxrAXlTx.mjs} +1 -1
  14. package/dist/{config-D1pd0h7A.cjs → config-L19Onew4.cjs} +1 -1
  15. package/dist/{connect-CyFpNr11.mjs → connect-BhvDYGh7.mjs} +4 -4
  16. package/dist/{connect-OAvNEIm0.cjs → connect-CcSN3IFE.cjs} +4 -4
  17. package/dist/{controlClient-CEliu-dY.mjs → controlClient-BXUvvi9h.mjs} +1 -1
  18. package/dist/{controlClient-BAJAvvWO.cjs → controlClient-DEk3NLK2.cjs} +1 -1
  19. package/dist/{cursorApprovalHook-BWYkdy2I.cjs → cursorApprovalHook-Bg8pIGZk.cjs} +2 -2
  20. package/dist/{cursorApprovalHook-P8q2-Ot5.mjs → cursorApprovalHook-YOYQPiFb.mjs} +2 -2
  21. package/dist/{cursorApprovalServer-DNOUUpbJ.mjs → cursorApprovalServer-CU4HY7HJ.mjs} +1 -1
  22. package/dist/{cursorApprovalServer-VR5ZdRqZ.cjs → cursorApprovalServer-PWI0z_6u.cjs} +1 -1
  23. package/dist/{deviceKeys-CxID9XkJ.mjs → deviceKeys-BghZEVQM.mjs} +2 -2
  24. package/dist/{deviceKeys-CFpY68YY.cjs → deviceKeys-CdzEV43E.cjs} +2 -2
  25. package/dist/{doctor-CrBPDAJR.mjs → doctor-36V4kFd8.mjs} +2 -2
  26. package/dist/{doctor-qquYvrNu.cjs → doctor-BqwlWV1d.cjs} +2 -2
  27. package/dist/{downloadImage-Cqy7ZDq9.cjs → downloadImage-CRORmK1A.cjs} +1 -1
  28. package/dist/{downloadImage-DFwUJ1-t.mjs → downloadImage-qav0UxBl.mjs} +1 -1
  29. package/dist/{enroll-CPhX2YYW.cjs → enroll-Cb0zEeTI.cjs} +3 -3
  30. package/dist/{enroll-BS4x3OUQ.mjs → enroll-DXtOuJIO.mjs} +3 -3
  31. package/dist/{evidence-HQhiWcci.mjs → evidence-P6qtF1Rg.mjs} +1 -1
  32. package/dist/{evidence-mn6vjFpr.cjs → evidence-RbJyaUHb.cjs} +1 -1
  33. package/dist/{formatImageMessage-cI_AEqo1.mjs → formatImageMessage-Biyy3pJR.mjs} +1 -1
  34. package/dist/{formatImageMessage-DFfcusj_.cjs → formatImageMessage-D-tA2oNc.cjs} +1 -1
  35. package/dist/index.cjs +46 -46
  36. package/dist/index.mjs +46 -46
  37. package/dist/{install-Bm5eNojk.cjs → install-B8z_dWSt.cjs} +1 -1
  38. package/dist/{install-Bn2199Kq.mjs → install-BcqdmvrF.mjs} +2 -2
  39. package/dist/{install-tBBR7NUn.cjs → install-C3C0NZfP.cjs} +2 -2
  40. package/dist/{install-sbpQfY_l.mjs → install-CdGqsOnL.mjs} +1 -1
  41. package/dist/lib.cjs +3 -3
  42. package/dist/lib.d.cts +24 -24
  43. package/dist/lib.d.mts +24 -24
  44. package/dist/lib.mjs +3 -3
  45. package/dist/{loadableToolOutput-BzTaDndK.cjs → loadableToolOutput-Bv22WdF2.cjs} +2 -2
  46. package/dist/{loadableToolOutput-DbXbVycg.mjs → loadableToolOutput-DvlJj7PM.mjs} +2 -2
  47. package/dist/{persistence-ACqGUEtH.cjs → persistence-BJVrfFPM.cjs} +1 -1
  48. package/dist/{persistence-YyHJPrEJ.mjs → persistence-CO8Q0Eh6.mjs} +1 -1
  49. package/dist/{push-CICE33Pk.mjs → push-CCHjRbpg.mjs} +6 -6
  50. package/dist/{push-DN6X8puN.cjs → push-Dd-L84fo.cjs} +6 -6
  51. package/dist/{registerKillSessionHandler-BvYc-FOQ.cjs → registerKillSessionHandler-Bdw4uNLH.cjs} +60 -5
  52. package/dist/{registerKillSessionHandler-CaFN7Ti_.mjs → registerKillSessionHandler-OVE8Wm5b.mjs} +60 -5
  53. package/dist/{run-Djrrraug.cjs → run-B5dg8uPo.cjs} +8 -8
  54. package/dist/{run-DEIpQXCf.mjs → run-C-nwXCvH.mjs} +8 -8
  55. package/dist/{runClaude-BuXbk4Hk.mjs → runClaude-CIv33AyB.mjs} +15 -15
  56. package/dist/{runClaude-DEnJA94E.cjs → runClaude-rkxGCTc2.cjs} +16 -16
  57. package/dist/{runCodex-xfey8ybA.cjs → runCodex-4DUH4CWf.cjs} +17 -17
  58. package/dist/{runCodex-DDJ4ld9g.mjs → runCodex-BCn2QxAJ.mjs} +17 -17
  59. package/dist/{runCursor-Ea-0SqPz.mjs → runCursor-PuI6WtK0.mjs} +15 -15
  60. package/dist/{runCursor-HDQXcY5a.cjs → runCursor-tnmFljyu.cjs} +15 -15
  61. package/dist/{runGemini-DNXknLIG.mjs → runGemini-Bxfxy6t6.mjs} +23 -19
  62. package/dist/{runGemini-DupL8lXI.cjs → runGemini-bhDI2ujI.cjs} +23 -19
  63. package/dist/{runOneShot-C3adjQdt.mjs → runOneShot-Cz0qgY3b.mjs} +2 -2
  64. package/dist/{runOneShot-ncBtn_Gm.cjs → runOneShot-DZPmurJy.cjs} +2 -2
  65. package/dist/{serve-DS7_dJ2V.cjs → serve-BCRnyQ4F.cjs} +6 -6
  66. package/dist/{serve-B8J5nW6c.mjs → serve-CoS-cmqV.mjs} +6 -6
  67. package/dist/{session-DqtoNEcE.cjs → session-CaKRQ1bu.cjs} +5 -5
  68. package/dist/{session-DLX5ZdxL.mjs → session-DzpncZby.mjs} +5 -5
  69. package/dist/{sessionKeyCache-BnR0ARqZ.cjs → sessionKeyCache-BOxbaLH3.cjs} +1 -1
  70. package/dist/{sessionKeyCache-D0Y_V05P.mjs → sessionKeyCache-D9_P4Mhm.mjs} +1 -1
  71. package/dist/{sessionList-B20S2H2v.cjs → sessionList-CZ1V-BWl.cjs} +2 -2
  72. package/dist/{sessionList-D1jByB-c.mjs → sessionList-M3ku4NEP.mjs} +2 -2
  73. package/dist/{sessionSummary-HZWtQ6mW.mjs → sessionSummary-C_9HquPy.mjs} +3 -3
  74. package/dist/{sessionSummary-BfkUnQew.cjs → sessionSummary-PRYuMFfS.cjs} +3 -3
  75. package/dist/{setupOfflineReconnection-E5sAFKRm.mjs → setupOfflineReconnection-B1YuEpwl.mjs} +3 -3
  76. package/dist/{setupOfflineReconnection-C8Ll2khg.cjs → setupOfflineReconnection-BHuXHSbt.cjs} +3 -3
  77. package/dist/{spawnHappyCLI-BabByXDO.cjs → spawnHappyCLI-C6Peiy6h.cjs} +1 -1
  78. package/dist/{spawnHappyCLI-iEcKfItK.mjs → spawnHappyCLI-C7Fu7xsF.mjs} +1 -1
  79. package/dist/{ssh-BWLfu_Bu.cjs → ssh-C0ypGPrZ.cjs} +5 -5
  80. package/dist/{ssh-BMawo5IG.mjs → ssh-D7J3y8Sm.mjs} +5 -5
  81. package/dist/{task-JIXYT6Ut.mjs → task-BN2-cCP5.mjs} +6 -6
  82. package/dist/{task-CmzA8KBB.cjs → task-DU_iFaZC.cjs} +6 -6
  83. package/dist/{uninstall-CRICQerq.cjs → uninstall-BnlnB4_5.cjs} +2 -2
  84. package/dist/{uninstall-DE2hMEa8.mjs → uninstall-Ct0m04sQ.mjs} +2 -2
  85. package/dist/{update-DYLwPQB5.cjs → update-CyNRfAss.cjs} +3 -3
  86. package/dist/{update-Bo6YcGpg.mjs → update-GmSUgswj.mjs} +3 -3
  87. package/package.json +1 -1
package/dist/lib.d.cts CHANGED
@@ -312,62 +312,62 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
312
312
  c: z.ZodString;
313
313
  t: z.ZodLiteral<"encrypted">;
314
314
  }, "strip", z.ZodTypeAny, {
315
- c: string;
316
315
  t: "encrypted";
317
- }, {
318
316
  c: string;
317
+ }, {
319
318
  t: "encrypted";
319
+ c: string;
320
320
  }>;
321
321
  createdAt: z.ZodNumber;
322
322
  updatedAt: z.ZodNumber;
323
323
  }, "strip", z.ZodTypeAny, {
324
- id: string;
325
- seq: number;
326
324
  content: {
327
- c: string;
328
325
  t: "encrypted";
326
+ c: string;
329
327
  };
328
+ id: string;
329
+ seq: number;
330
330
  createdAt: number;
331
331
  updatedAt: number;
332
332
  localId?: string | null | undefined;
333
333
  }, {
334
- id: string;
335
- seq: number;
336
334
  content: {
337
- c: string;
338
335
  t: "encrypted";
336
+ c: string;
339
337
  };
338
+ id: string;
339
+ seq: number;
340
340
  createdAt: number;
341
341
  updatedAt: number;
342
342
  localId?: string | null | undefined;
343
343
  }>;
344
344
  }, "strip", z.ZodTypeAny, {
345
- t: "new-message";
346
345
  message: {
347
- id: string;
348
- seq: number;
349
346
  content: {
350
- c: string;
351
347
  t: "encrypted";
348
+ c: string;
352
349
  };
350
+ id: string;
351
+ seq: number;
353
352
  createdAt: number;
354
353
  updatedAt: number;
355
354
  localId?: string | null | undefined;
356
355
  };
356
+ t: "new-message";
357
357
  sid: string;
358
358
  }, {
359
- t: "new-message";
360
359
  message: {
361
- id: string;
362
- seq: number;
363
360
  content: {
364
- c: string;
365
361
  t: "encrypted";
362
+ c: string;
366
363
  };
364
+ id: string;
365
+ seq: number;
367
366
  createdAt: number;
368
367
  updatedAt: number;
369
368
  localId?: string | null | undefined;
370
369
  };
370
+ t: "new-message";
371
371
  sid: string;
372
372
  }>, z.ZodObject<{
373
373
  t: z.ZodLiteral<"update-session">;
@@ -472,18 +472,18 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
472
472
  seq: number;
473
473
  createdAt: number;
474
474
  body: {
475
- t: "new-message";
476
475
  message: {
477
- id: string;
478
- seq: number;
479
476
  content: {
480
- c: string;
481
477
  t: "encrypted";
478
+ c: string;
482
479
  };
480
+ id: string;
481
+ seq: number;
483
482
  createdAt: number;
484
483
  updatedAt: number;
485
484
  localId?: string | null | undefined;
486
485
  };
486
+ t: "new-message";
487
487
  sid: string;
488
488
  } | {
489
489
  t: "update-session";
@@ -515,18 +515,18 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
515
515
  seq: number;
516
516
  createdAt: number;
517
517
  body: {
518
- t: "new-message";
519
518
  message: {
520
- id: string;
521
- seq: number;
522
519
  content: {
523
- c: string;
524
520
  t: "encrypted";
521
+ c: string;
525
522
  };
523
+ id: string;
524
+ seq: number;
526
525
  createdAt: number;
527
526
  updatedAt: number;
528
527
  localId?: string | null | undefined;
529
528
  };
529
+ t: "new-message";
530
530
  sid: string;
531
531
  } | {
532
532
  t: "update-session";
package/dist/lib.d.mts CHANGED
@@ -312,62 +312,62 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
312
312
  c: z.ZodString;
313
313
  t: z.ZodLiteral<"encrypted">;
314
314
  }, "strip", z.ZodTypeAny, {
315
- c: string;
316
315
  t: "encrypted";
317
- }, {
318
316
  c: string;
317
+ }, {
319
318
  t: "encrypted";
319
+ c: string;
320
320
  }>;
321
321
  createdAt: z.ZodNumber;
322
322
  updatedAt: z.ZodNumber;
323
323
  }, "strip", z.ZodTypeAny, {
324
- id: string;
325
- seq: number;
326
324
  content: {
327
- c: string;
328
325
  t: "encrypted";
326
+ c: string;
329
327
  };
328
+ id: string;
329
+ seq: number;
330
330
  createdAt: number;
331
331
  updatedAt: number;
332
332
  localId?: string | null | undefined;
333
333
  }, {
334
- id: string;
335
- seq: number;
336
334
  content: {
337
- c: string;
338
335
  t: "encrypted";
336
+ c: string;
339
337
  };
338
+ id: string;
339
+ seq: number;
340
340
  createdAt: number;
341
341
  updatedAt: number;
342
342
  localId?: string | null | undefined;
343
343
  }>;
344
344
  }, "strip", z.ZodTypeAny, {
345
- t: "new-message";
346
345
  message: {
347
- id: string;
348
- seq: number;
349
346
  content: {
350
- c: string;
351
347
  t: "encrypted";
348
+ c: string;
352
349
  };
350
+ id: string;
351
+ seq: number;
353
352
  createdAt: number;
354
353
  updatedAt: number;
355
354
  localId?: string | null | undefined;
356
355
  };
356
+ t: "new-message";
357
357
  sid: string;
358
358
  }, {
359
- t: "new-message";
360
359
  message: {
361
- id: string;
362
- seq: number;
363
360
  content: {
364
- c: string;
365
361
  t: "encrypted";
362
+ c: string;
366
363
  };
364
+ id: string;
365
+ seq: number;
367
366
  createdAt: number;
368
367
  updatedAt: number;
369
368
  localId?: string | null | undefined;
370
369
  };
370
+ t: "new-message";
371
371
  sid: string;
372
372
  }>, z.ZodObject<{
373
373
  t: z.ZodLiteral<"update-session">;
@@ -472,18 +472,18 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
472
472
  seq: number;
473
473
  createdAt: number;
474
474
  body: {
475
- t: "new-message";
476
475
  message: {
477
- id: string;
478
- seq: number;
479
476
  content: {
480
- c: string;
481
477
  t: "encrypted";
478
+ c: string;
482
479
  };
480
+ id: string;
481
+ seq: number;
483
482
  createdAt: number;
484
483
  updatedAt: number;
485
484
  localId?: string | null | undefined;
486
485
  };
486
+ t: "new-message";
487
487
  sid: string;
488
488
  } | {
489
489
  t: "update-session";
@@ -515,18 +515,18 @@ declare const CoreUpdateContainerSchema: z.ZodObject<{
515
515
  seq: number;
516
516
  createdAt: number;
517
517
  body: {
518
- t: "new-message";
519
518
  message: {
520
- id: string;
521
- seq: number;
522
519
  content: {
523
- c: string;
524
520
  t: "encrypted";
521
+ c: string;
525
522
  };
523
+ id: string;
524
+ seq: number;
526
525
  createdAt: number;
527
526
  updatedAt: number;
528
527
  localId?: string | null | undefined;
529
528
  };
529
+ t: "new-message";
530
530
  sid: string;
531
531
  } | {
532
532
  t: "update-session";
package/dist/lib.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as ApiClient, a as ApiSessionClient } from './api-BQORFd9R.mjs';
2
- export { c as configuration, l as logger } from './persistence-YyHJPrEJ.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient } from './api-DgjBoynq.mjs';
2
+ export { c as configuration, l as logger } from './persistence-CO8Q0Eh6.mjs';
3
3
  export { R as RawJSONLinesSchema } from './types-BoJh4Qfv.mjs';
4
4
  import 'axios';
5
5
  import 'node:events';
@@ -28,6 +28,6 @@ import 'tweetnacl';
28
28
  import '@stablelib/base64';
29
29
  import 'node:readline';
30
30
  import 'expo-server-sdk';
31
- import './sessionKeyCache-D0Y_V05P.mjs';
31
+ import './sessionKeyCache-D9_P4Mhm.mjs';
32
32
  import 'chalk';
33
33
  import 'fs';
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
- var logger = require('./persistence-ACqGUEtH.cjs');
5
- var api = require('./api-lxlaOAan.cjs');
4
+ var logger = require('./persistence-BJVrfFPM.cjs');
5
+ var api = require('./api-OthK5iIu.cjs');
6
6
 
7
7
  class BaseReasoningProcessor {
8
8
  accumulator = "";
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger } from './persistence-YyHJPrEJ.mjs';
3
- import { s as saveToolOutputRecord } from './api-BQORFd9R.mjs';
2
+ import { l as logger } from './persistence-CO8Q0Eh6.mjs';
3
+ import { s as saveToolOutputRecord } from './api-DgjBoynq.mjs';
4
4
 
5
5
  class BaseReasoningProcessor {
6
6
  accumulator = "";
@@ -35,7 +35,7 @@ function isDebug() {
35
35
  }
36
36
 
37
37
  var name = "@zonease/happy";
38
- var version = "0.6.48";
38
+ var version = "0.6.49";
39
39
  var description = "Mobile and Web client for Claude Code, Codex, and Gemini";
40
40
  var author = "ZonEaseTech";
41
41
  var license = "MIT";
@@ -14,7 +14,7 @@ function isDebug() {
14
14
  }
15
15
 
16
16
  var name = "@zonease/happy";
17
- var version = "0.6.48";
17
+ var version = "0.6.49";
18
18
  var description = "Mobile and Web client for Claude Code, Codex, and Gemini";
19
19
  var author = "ZonEaseTech";
20
20
  var license = "MIT";
@@ -1,7 +1,7 @@
1
1
  import { stat, readFile } from 'node:fs/promises';
2
2
  import { io } from 'socket.io-client';
3
- import { c as configuration, e as encodeBase64, f as encrypt, g as decrypt, h as decodeBase64 } from './persistence-YyHJPrEJ.mjs';
4
- import { resolveDeviceForCommand } from './ssh-BMawo5IG.mjs';
3
+ import { c as configuration, e as encodeBase64, f as encrypt, g as decrypt, h as decodeBase64 } from './persistence-CO8Q0Eh6.mjs';
4
+ import { resolveDeviceForCommand } from './ssh-D7J3y8Sm.mjs';
5
5
  import 'node:fs';
6
6
  import 'node:os';
7
7
  import 'node:path';
@@ -10,16 +10,16 @@ import 'node:crypto';
10
10
  import 'tweetnacl';
11
11
  import 'chalk';
12
12
  import 'fs';
13
- import './deviceKeys-CxID9XkJ.mjs';
13
+ import './deviceKeys-BghZEVQM.mjs';
14
14
  import 'axios';
15
- import './auth-DEvweBty.mjs';
15
+ import './auth-BCH_VzFY.mjs';
16
16
  import 'qrcode-terminal';
17
17
  import './time-DgsBLJA_.mjs';
18
- import './browser-C6JpWqen.mjs';
18
+ import './browser-oD4Fhplt.mjs';
19
19
  import 'open';
20
20
  import 'react';
21
21
  import 'ink';
22
- import './controlClient-CEliu-dY.mjs';
22
+ import './controlClient-BXUvvi9h.mjs';
23
23
  import './projectPath-BTBIMB57.mjs';
24
24
  import 'path';
25
25
  import 'url';
@@ -2,8 +2,8 @@
2
2
 
3
3
  var promises = require('node:fs/promises');
4
4
  var socket_ioClient = require('socket.io-client');
5
- var logger = require('./persistence-ACqGUEtH.cjs');
6
- var ssh = require('./ssh-BWLfu_Bu.cjs');
5
+ var logger = require('./persistence-BJVrfFPM.cjs');
6
+ var ssh = require('./ssh-C0ypGPrZ.cjs');
7
7
  require('node:fs');
8
8
  require('node:os');
9
9
  require('node:path');
@@ -12,16 +12,16 @@ require('node:crypto');
12
12
  require('tweetnacl');
13
13
  require('chalk');
14
14
  require('fs');
15
- require('./deviceKeys-CFpY68YY.cjs');
15
+ require('./deviceKeys-CdzEV43E.cjs');
16
16
  require('axios');
17
- require('./auth-DO429YIh.cjs');
17
+ require('./auth-BpoPI35K.cjs');
18
18
  require('qrcode-terminal');
19
19
  require('./time-Bj2HRkKH.cjs');
20
- require('./browser-ChToh76t.cjs');
20
+ require('./browser-BPhM1lYb.cjs');
21
21
  require('open');
22
22
  require('react');
23
23
  require('ink');
24
- require('./controlClient-BAJAvvWO.cjs');
24
+ require('./controlClient-DEk3NLK2.cjs');
25
25
  require('./projectPath-ChLhdOyt.cjs');
26
26
  require('path');
27
27
  require('url');
@@ -7,8 +7,8 @@ var node_http = require('node:http');
7
7
  var streamableHttp_js = require('@modelcontextprotocol/sdk/server/streamableHttp.js');
8
8
  var types_js = require('@modelcontextprotocol/sdk/types.js');
9
9
  var z = require('zod');
10
- var logger = require('./persistence-ACqGUEtH.cjs');
11
- var deviceKeys = require('./deviceKeys-CFpY68YY.cjs');
10
+ var logger = require('./persistence-BJVrfFPM.cjs');
11
+ var deviceKeys = require('./deviceKeys-CdzEV43E.cjs');
12
12
  var axios = require('axios');
13
13
  var promises = require('node:fs/promises');
14
14
  var node_crypto = require('node:crypto');
@@ -18,7 +18,7 @@ require('./index-BeKrqPYR.cjs');
18
18
  var node_child_process = require('node:child_process');
19
19
  require('node:events');
20
20
  require('socket.io-client');
21
- require('./api-lxlaOAan.cjs');
21
+ require('./api-OthK5iIu.cjs');
22
22
  require('tweetnacl');
23
23
  require('ws');
24
24
  require('crypto');
@@ -54,6 +54,14 @@ async function listBugs(credentials, input = {}) {
54
54
  );
55
55
  return response.data;
56
56
  }
57
+ async function getBug(credentials, reference) {
58
+ const bugId = await resolveBugId(credentials, reference);
59
+ const response = await axios.get(
60
+ `${logger.configuration.serverUrl}/v1/bugs/${bugId}`,
61
+ authHeaders(credentials)
62
+ );
63
+ return response.data.bug;
64
+ }
57
65
  async function resolveBugId(credentials, reference) {
58
66
  const trimmed = reference.trim();
59
67
  const displayNumber = trimmed.replace(/^#/, "").match(/^(?:bug-)?(\d+)$/i)?.[1];
@@ -162,6 +170,36 @@ function toToolError(message, details) {
162
170
  isError: true
163
171
  };
164
172
  }
173
+ const asDate = (ms) => new Date(ms).toISOString().slice(0, 10);
174
+ function formatBugDetail(bug) {
175
+ const sections = [
176
+ `${bug.displayId} [${bug.status}] ${bug.visibility}`,
177
+ `${bug.title}`,
178
+ `filed by ${bug.createdByNickname ?? "unknown"}${bug.lastActivityAt ? `, last activity ${asDate(bug.lastActivityAt)}` : ""}`,
179
+ `
180
+ --- description ---
181
+ ${bug.description}`
182
+ ];
183
+ if (bug.attachments.length) {
184
+ sections.push(`
185
+ --- attachments (${bug.attachments.length}) ---
186
+ ${bug.attachments.map((a) => `${a.mimeType} ${a.width ?? "?"}x${a.height ?? "?"} ${a.url}`).join("\n")}`);
187
+ }
188
+ if (bug.comments.length) {
189
+ sections.push(`
190
+ --- comments (${bug.comments.length}) ---
191
+ ${bug.comments.map((c) => [
192
+ `[${asDate(c.createdAt)}] ${c.authorNickname ?? "unknown"}: ${c.body}`,
193
+ ...c.attachments.map((a) => ` + ${a.mimeType} ${a.url}`)
194
+ ].join("\n")).join("\n")}`);
195
+ }
196
+ if (bug.statusHistory.length) {
197
+ sections.push(`
198
+ --- history (${bug.statusHistory.length}) ---
199
+ ${bug.statusHistory.map((h) => `${asDate(h.createdAt)} ${h.fromStatus ? `${h.fromStatus} \u2192 ${h.toStatus}` : h.action} by ${h.actorNickname ?? "unknown"}${h.note ? ` (${h.note})` : ""}`).join("\n")}`);
200
+ }
201
+ return sections.join("\n");
202
+ }
165
203
  function createMcpServer(client, options) {
166
204
  const mcp = new mcp_js.McpServer({
167
205
  name: "Happy MCP",
@@ -342,12 +380,29 @@ ${lines.join("\n")}` : header }] };
342
380
  return toToolError(`Failed to list bugs: ${error instanceof Error ? error.message : String(error)}`);
343
381
  }
344
382
  });
383
+ mcp.registerTool("get_bug", {
384
+ description: "Read one bug in full from the user's Happy bug board: its description, screenshots, every comment and how it moved between states. Use when the user asks about a specific bug, or before editing one so the rewrite keeps what is still true.",
385
+ title: "Get Bug",
386
+ inputSchema: {
387
+ bug: z.z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.')
388
+ }
389
+ }, async (args) => {
390
+ const credentials = await logger.readCredentials();
391
+ if (!credentials) {
392
+ return toToolError("No Happy credentials on this machine.");
393
+ }
394
+ try {
395
+ return { content: [{ type: "text", text: formatBugDetail(await getBug(credentials, args.bug)) }] };
396
+ } catch (error) {
397
+ return toToolError(`Failed to read bug: ${error instanceof Error ? error.message : String(error)}`);
398
+ }
399
+ });
345
400
  mcp.registerTool("edit_bug", {
346
401
  description: "Change a bug already on the user's Happy bug board: rewrite its description, add screenshots to it, or both. Use when the user wants to correct, expand or illustrate an existing bug.",
347
402
  title: "Edit Bug",
348
403
  inputSchema: {
349
404
  bug: z.z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.'),
350
- description: z.z.string().optional().describe("The full replacement description. It replaces the old one outright, so carry over anything still true. Omit to leave the description alone."),
405
+ description: z.z.string().optional().describe("The full replacement description. It replaces the old one outright, so carry over anything still true \u2014 including any [[bug-image:N]] markers, which is where the Nth screenshot appears inline. Drop a marker and that image moves to the end. Omit this field to leave the description alone."),
351
406
  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.")
352
407
  }
353
408
  }, async (args) => {
@@ -387,7 +442,7 @@ ${lines.join("\n")}` : header }] };
387
442
  async function startHappyServer(client) {
388
443
  const transports = /* @__PURE__ */ new Map();
389
444
  const enableOrchestratorTools = prompt.shouldEnableOrchestratorTools();
390
- const toolNames = ["change_title", "preview_html", "device_list", "device_exec", "list_bugs", "submit_bug", "edit_bug", "delete_bug"];
445
+ const toolNames = ["change_title", "preview_html", "device_list", "device_exec", "list_bugs", "get_bug", "submit_bug", "edit_bug", "delete_bug"];
391
446
  const originalConsoleError = console.error;
392
447
  console.error = (...args) => {
393
448
  logger.logger.debug("[happyMCP] console.error:", ...args);
@@ -5,8 +5,8 @@ import { createServer } from 'node:http';
5
5
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
6
6
  import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
7
7
  import { z } from 'zod';
8
- import { c as configuration, l as logger, r as readCredentials } from './persistence-YyHJPrEJ.mjs';
9
- import { l as listDevices, d as deviceExec } from './deviceKeys-CxID9XkJ.mjs';
8
+ import { c as configuration, l as logger, r as readCredentials } from './persistence-CO8Q0Eh6.mjs';
9
+ import { l as listDevices, d as deviceExec } from './deviceKeys-BghZEVQM.mjs';
10
10
  import axios from 'axios';
11
11
  import { stat, readFile } from 'node:fs/promises';
12
12
  import { randomUUID } from 'node:crypto';
@@ -16,7 +16,7 @@ import './index-DTV7drqs.mjs';
16
16
  import { execSync } from 'node:child_process';
17
17
  import 'node:events';
18
18
  import 'socket.io-client';
19
- import './api-BQORFd9R.mjs';
19
+ import './api-DgjBoynq.mjs';
20
20
  import 'tweetnacl';
21
21
  import 'ws';
22
22
  import 'crypto';
@@ -52,6 +52,14 @@ async function listBugs(credentials, input = {}) {
52
52
  );
53
53
  return response.data;
54
54
  }
55
+ async function getBug(credentials, reference) {
56
+ const bugId = await resolveBugId(credentials, reference);
57
+ const response = await axios.get(
58
+ `${configuration.serverUrl}/v1/bugs/${bugId}`,
59
+ authHeaders(credentials)
60
+ );
61
+ return response.data.bug;
62
+ }
55
63
  async function resolveBugId(credentials, reference) {
56
64
  const trimmed = reference.trim();
57
65
  const displayNumber = trimmed.replace(/^#/, "").match(/^(?:bug-)?(\d+)$/i)?.[1];
@@ -160,6 +168,36 @@ function toToolError(message, details) {
160
168
  isError: true
161
169
  };
162
170
  }
171
+ const asDate = (ms) => new Date(ms).toISOString().slice(0, 10);
172
+ function formatBugDetail(bug) {
173
+ const sections = [
174
+ `${bug.displayId} [${bug.status}] ${bug.visibility}`,
175
+ `${bug.title}`,
176
+ `filed by ${bug.createdByNickname ?? "unknown"}${bug.lastActivityAt ? `, last activity ${asDate(bug.lastActivityAt)}` : ""}`,
177
+ `
178
+ --- description ---
179
+ ${bug.description}`
180
+ ];
181
+ if (bug.attachments.length) {
182
+ sections.push(`
183
+ --- attachments (${bug.attachments.length}) ---
184
+ ${bug.attachments.map((a) => `${a.mimeType} ${a.width ?? "?"}x${a.height ?? "?"} ${a.url}`).join("\n")}`);
185
+ }
186
+ if (bug.comments.length) {
187
+ sections.push(`
188
+ --- comments (${bug.comments.length}) ---
189
+ ${bug.comments.map((c) => [
190
+ `[${asDate(c.createdAt)}] ${c.authorNickname ?? "unknown"}: ${c.body}`,
191
+ ...c.attachments.map((a) => ` + ${a.mimeType} ${a.url}`)
192
+ ].join("\n")).join("\n")}`);
193
+ }
194
+ if (bug.statusHistory.length) {
195
+ sections.push(`
196
+ --- history (${bug.statusHistory.length}) ---
197
+ ${bug.statusHistory.map((h) => `${asDate(h.createdAt)} ${h.fromStatus ? `${h.fromStatus} \u2192 ${h.toStatus}` : h.action} by ${h.actorNickname ?? "unknown"}${h.note ? ` (${h.note})` : ""}`).join("\n")}`);
198
+ }
199
+ return sections.join("\n");
200
+ }
163
201
  function createMcpServer(client, options) {
164
202
  const mcp = new McpServer({
165
203
  name: "Happy MCP",
@@ -340,12 +378,29 @@ ${lines.join("\n")}` : header }] };
340
378
  return toToolError(`Failed to list bugs: ${error instanceof Error ? error.message : String(error)}`);
341
379
  }
342
380
  });
381
+ mcp.registerTool("get_bug", {
382
+ description: "Read one bug in full from the user's Happy bug board: its description, screenshots, every comment and how it moved between states. Use when the user asks about a specific bug, or before editing one so the rewrite keeps what is still true.",
383
+ title: "Get Bug",
384
+ inputSchema: {
385
+ bug: z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.')
386
+ }
387
+ }, async (args) => {
388
+ const credentials = await readCredentials();
389
+ if (!credentials) {
390
+ return toToolError("No Happy credentials on this machine.");
391
+ }
392
+ try {
393
+ return { content: [{ type: "text", text: formatBugDetail(await getBug(credentials, args.bug)) }] };
394
+ } catch (error) {
395
+ return toToolError(`Failed to read bug: ${error instanceof Error ? error.message : String(error)}`);
396
+ }
397
+ });
343
398
  mcp.registerTool("edit_bug", {
344
399
  description: "Change a bug already on the user's Happy bug board: rewrite its description, add screenshots to it, or both. Use when the user wants to correct, expand or illustrate an existing bug.",
345
400
  title: "Edit Bug",
346
401
  inputSchema: {
347
402
  bug: z.string().describe('Which bug, as the user refers to it: "BUG-236", "#236" or "236". An internal bug id also works.'),
348
- description: z.string().optional().describe("The full replacement description. It replaces the old one outright, so carry over anything still true. Omit to leave the description alone."),
403
+ description: z.string().optional().describe("The full replacement description. It replaces the old one outright, so carry over anything still true \u2014 including any [[bug-image:N]] markers, which is where the Nth screenshot appears inline. Drop a marker and that image moves to the end. Omit this field to leave the description alone."),
349
404
  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.")
350
405
  }
351
406
  }, async (args) => {
@@ -385,7 +440,7 @@ ${lines.join("\n")}` : header }] };
385
440
  async function startHappyServer(client) {
386
441
  const transports = /* @__PURE__ */ new Map();
387
442
  const enableOrchestratorTools = shouldEnableOrchestratorTools();
388
- const toolNames = ["change_title", "preview_html", "device_list", "device_exec", "list_bugs", "submit_bug", "edit_bug", "delete_bug"];
443
+ const toolNames = ["change_title", "preview_html", "device_list", "device_exec", "list_bugs", "get_bug", "submit_bug", "edit_bug", "delete_bug"];
389
444
  const originalConsoleError = console.error;
390
445
  console.error = (...args) => {
391
446
  logger.debug("[happyMCP] console.error:", ...args);
@@ -3,15 +3,15 @@
3
3
  var fs$1 = require('fs/promises');
4
4
  var os = require('os');
5
5
  var tmp = require('tmp');
6
- var api = require('./api-lxlaOAan.cjs');
7
- var logger = require('./persistence-ACqGUEtH.cjs');
8
- var auth = require('./auth-DO429YIh.cjs');
6
+ var api = require('./api-OthK5iIu.cjs');
7
+ var logger = require('./persistence-BJVrfFPM.cjs');
8
+ var auth = require('./auth-BpoPI35K.cjs');
9
9
  var child_process = require('child_process');
10
- var doctor = require('./doctor-qquYvrNu.cjs');
11
- var spawnHappyCLI = require('./spawnHappyCLI-BabByXDO.cjs');
12
- var controlClient = require('./controlClient-BAJAvvWO.cjs');
13
- var deviceKeys = require('./deviceKeys-CFpY68YY.cjs');
14
- var install = require('./install-Bm5eNojk.cjs');
10
+ var doctor = require('./doctor-BqwlWV1d.cjs');
11
+ var spawnHappyCLI = require('./spawnHappyCLI-C6Peiy6h.cjs');
12
+ var controlClient = require('./controlClient-DEk3NLK2.cjs');
13
+ var deviceKeys = require('./deviceKeys-CdzEV43E.cjs');
14
+ var install = require('./install-B8z_dWSt.cjs');
15
15
  var fastify = require('fastify');
16
16
  var fs = require('node:fs');
17
17
  var promises = require('node:fs/promises');
@@ -1,15 +1,15 @@
1
1
  import fs from 'fs/promises';
2
2
  import os from 'os';
3
3
  import * as tmp from 'tmp';
4
- import { A as ApiClient } from './api-BQORFd9R.mjs';
5
- import { c as configuration, l as logger, p as packageJson, v as acquireDaemonLock, a as readSettings, i as isDebug, e as encodeBase64, x as writeDaemonState, m as readDaemonState, y as releaseDaemonLock, z as validateProfileForAgent, A as getProfileEnvironmentVariables } from './persistence-YyHJPrEJ.mjs';
6
- import { authAndSetupMachineIfNeeded } from './auth-DEvweBty.mjs';
4
+ import { A as ApiClient } from './api-DgjBoynq.mjs';
5
+ import { c as configuration, l as logger, p as packageJson, v as acquireDaemonLock, a as readSettings, i as isDebug, e as encodeBase64, x as writeDaemonState, m as readDaemonState, y as releaseDaemonLock, z as validateProfileForAgent, A as getProfileEnvironmentVariables } from './persistence-CO8Q0Eh6.mjs';
6
+ import { authAndSetupMachineIfNeeded } from './auth-BCH_VzFY.mjs';
7
7
  import { spawn, execSync, exec } from 'child_process';
8
- import { getEnvironmentInfo } from './doctor-CrBPDAJR.mjs';
9
- import { s as spawnHappyCLI } from './spawnHappyCLI-iEcKfItK.mjs';
10
- import { isDaemonRunningCurrentlyInstalledHappyVersion, stopDaemon, cleanupDaemonState } from './controlClient-CEliu-dY.mjs';
11
- import { a as readCachedDeviceKey, d as deviceExec } from './deviceKeys-CxID9XkJ.mjs';
12
- import { P as PLIST_LABEL } from './install-sbpQfY_l.mjs';
8
+ import { getEnvironmentInfo } from './doctor-36V4kFd8.mjs';
9
+ import { s as spawnHappyCLI } from './spawnHappyCLI-C7Fu7xsF.mjs';
10
+ import { isDaemonRunningCurrentlyInstalledHappyVersion, stopDaemon, cleanupDaemonState } from './controlClient-BXUvvi9h.mjs';
11
+ import { a as readCachedDeviceKey, d as deviceExec } from './deviceKeys-BghZEVQM.mjs';
12
+ import { P as PLIST_LABEL } from './install-CdGqsOnL.mjs';
13
13
  import fastify from 'fastify';
14
14
  import { createReadStream } from 'node:fs';
15
15
  import { stat } from 'node:fs/promises';