@zonease/happy 0.6.41 → 0.6.42
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.
- package/dist/{api-XeHlmApX.cjs → api-CIE4_cWd.cjs} +4 -4
- package/dist/{api-K2-jr9ar.mjs → api-Ew6xr81i.mjs} +4 -4
- package/dist/{auth-CjLkoM3m.mjs → auth-BzYevJo2.mjs} +4 -4
- package/dist/{auth-BbvPcnkY.cjs → auth-Dor79zTL.cjs} +4 -4
- package/dist/{auth-BQvEuSs5.cjs → auth-G9fZpVJ2.cjs} +2 -2
- package/dist/{auth-DS8fzlin.mjs → auth-Q2STUNI-.mjs} +2 -2
- package/dist/{browser-C05Ak6RL.mjs → browser-BI7s-V8E.mjs} +1 -1
- package/dist/{browser-C05SP_Tt.cjs → browser-qDIIAL7S.cjs} +1 -1
- package/dist/{claudeLocal-DJNRlHIC.mjs → claudeLocal-Db2tDC4X.mjs} +1 -1
- package/dist/{claudeLocal-CpDhLCcZ.cjs → claudeLocal-f4uBLJaM.cjs} +1 -1
- package/dist/{config-DWWtjKQx.mjs → config-CHjDs8AS.mjs} +1 -1
- package/dist/{config-B0mns9fF.cjs → config-CSBlEik9.cjs} +1 -1
- package/dist/{connect-BxCScVNX.cjs → connect-CJoTliii.cjs} +5 -5
- package/dist/{connect-DXQC1CJe.mjs → connect-O_nA5BOC.mjs} +5 -5
- package/dist/{controlClient-DgELDZgM.cjs → controlClient-CEz_p1zc.cjs} +1 -1
- package/dist/{controlClient-DgjVRN8D.mjs → controlClient-DoS9JqQC.mjs} +1 -1
- package/dist/cursorApprovalHook-B0v1kGa7.mjs +95 -0
- package/dist/cursorApprovalHook-DRAHfTXU.cjs +97 -0
- package/dist/cursorApprovalServer-DzY8yJlI.cjs +167 -0
- package/dist/cursorApprovalServer-JjPkdjGR.mjs +164 -0
- package/dist/{deviceKeys-CejCdWpw.mjs → deviceKeys-B4aqjnE6.mjs} +2 -2
- package/dist/{deviceKeys-BpIAWz13.cjs → deviceKeys-DyUn0bEx.cjs} +2 -2
- package/dist/{doctor-DznasgP3.cjs → doctor-BJSuVRUZ.cjs} +2 -2
- package/dist/{doctor-B-LCMVN9.mjs → doctor-DRnft_5-.mjs} +2 -2
- package/dist/{downloadImage-ia5SzlCV.mjs → downloadImage-BpVF7A79.mjs} +7 -40
- package/dist/{downloadImage-B_ygLAXY.cjs → downloadImage-Cijmufpr.cjs} +5 -39
- package/dist/{enroll-BvfpRUGJ.cjs → enroll-C2gunHdt.cjs} +3 -3
- package/dist/{enroll-HjUqyGnD.mjs → enroll-CysDL6ee.mjs} +3 -3
- package/dist/{evidence-BEQd1dCh.mjs → evidence-DPutCuUr.mjs} +1 -1
- package/dist/{evidence-CVgTjBrq.cjs → evidence-DsQ-h-_W.cjs} +1 -1
- package/dist/{formatImageMessage-DVs57t3x.mjs → formatImageMessage-6aV9YFWr.mjs} +1 -1
- package/dist/{formatImageMessage-CmJTP_hU.cjs → formatImageMessage-BPK_Ivfe.cjs} +1 -1
- package/dist/gitWorktree-C6jLoaMw.cjs +39 -0
- package/dist/gitWorktree-CzJDU2BV.mjs +37 -0
- package/dist/{index-CDTNgfUf.cjs → index-BeKrqPYR.cjs} +25 -1
- package/dist/{index-CPKdvi7J.mjs → index-DTV7drqs.mjs} +25 -1
- package/dist/index.cjs +91 -41
- package/dist/index.mjs +91 -41
- package/dist/{install-UTz_vYvB.mjs → install-BsTA2tZn.mjs} +2 -2
- package/dist/{install-B3mMGISS.mjs → install-DBg0xQ3g.mjs} +1 -1
- package/dist/{install-2Yl_L582.cjs → install-DlOppA-e.cjs} +2 -2
- package/dist/{install-Ck22tYHP.cjs → install-Tyhs6rUp.cjs} +1 -1
- package/dist/lib.cjs +4 -4
- package/dist/lib.d.cts +3 -2
- package/dist/lib.d.mts +3 -2
- package/dist/lib.mjs +4 -4
- package/dist/{loadableToolOutput-4EvraaNY.mjs → loadableToolOutput-2dMPAp4N.mjs} +3 -456
- package/dist/{loadableToolOutput-BZYlaqHn.cjs → loadableToolOutput-DPGTtKJM.cjs} +2 -458
- package/dist/{persistence-DrfN7TzY.cjs → persistence-BcQmjobZ.cjs} +7 -4
- package/dist/{persistence-CIUFyOwz.mjs → persistence-D9tMm6bj.mjs} +7 -4
- package/dist/{push-CCOXCcM_.cjs → push-Cnm6JQMD.cjs} +6 -6
- package/dist/{push-USXj_pv0.mjs → push-Dxsugkes.mjs} +6 -6
- package/dist/{run-Dy6KX6m-.mjs → run-BEflQaQ2.mjs} +12 -9
- package/dist/{run-D3CopmEb.cjs → run-CiPWWhXt.cjs} +12 -9
- package/dist/{runClaude-aHzvx6Ha.cjs → runClaude-BVXsyCHb.cjs} +19 -18
- package/dist/{runClaude-CWux2RDq.mjs → runClaude-sPkSqHWY.mjs} +16 -15
- package/dist/{runCodex-G-Aq531U.cjs → runCodex-BAwhdmSA.cjs} +19 -17
- package/dist/{runCodex-D0ZxSj3O.mjs → runCodex-C4rHkIyw.mjs} +16 -14
- package/dist/runCursor-CD5wC3gA.cjs +578 -0
- package/dist/runCursor-DiHLWMs8.mjs +576 -0
- package/dist/{runGemini-DZC2i6vA.mjs → runGemini-B-93gOqB.mjs} +18 -16
- package/dist/{runGemini-DxGgDAIM.cjs → runGemini-Cto-adir.cjs} +21 -19
- package/dist/{runOneShot-BgT-JNMA.cjs → runOneShot-BfIzE9W4.cjs} +3 -3
- package/dist/{runOneShot-cxlk7VKA.mjs → runOneShot-DGjlYVhR.mjs} +3 -3
- package/dist/{serve-Dr3wPrtK.cjs → serve-CqL6NWDr.cjs} +7 -7
- package/dist/{serve-CKyvJNs0.mjs → serve-ttlqF5jn.mjs} +7 -7
- package/dist/{session-dYzbOo_W.cjs → session-BZhGpQUJ.cjs} +5 -5
- package/dist/{session-vf2ZjFto.mjs → session-Co0REU9e.mjs} +5 -5
- package/dist/{sessionKeyCache-dDquDzn0.cjs → sessionKeyCache-BwFUGgMs.cjs} +1 -1
- package/dist/{sessionKeyCache-D2u3JUys.mjs → sessionKeyCache-pXTjpETo.mjs} +1 -1
- package/dist/{sessionList-C1k2PNg_.mjs → sessionList-DaufR-sA.mjs} +2 -2
- package/dist/{sessionList-DmmtC7uR.cjs → sessionList-fG5uAPzU.cjs} +2 -2
- package/dist/{sessionSummary-DGLoVOxd.cjs → sessionSummary-CjZPt6nr.cjs} +3 -3
- package/dist/{sessionSummary-5a1QtFVS.mjs → sessionSummary-Dv6dPABg.mjs} +3 -3
- package/dist/setupOfflineReconnection-B6coH9QN.cjs +461 -0
- package/dist/setupOfflineReconnection-DW5il97B.mjs +457 -0
- package/dist/{spawnHappyCLI-CarRI4GM.cjs → spawnHappyCLI-Cfu7C1uM.cjs} +1 -1
- package/dist/{spawnHappyCLI-D3EkTFIn.mjs → spawnHappyCLI-DhUeycct.mjs} +1 -1
- package/dist/{ssh-B0hvEYIl.mjs → ssh-8tPIKk-i.mjs} +5 -5
- package/dist/{ssh-CBgVwKsB.cjs → ssh-C4YTSHXL.cjs} +5 -5
- package/dist/{task-CRo6W-3_.mjs → task-CH-oidFy.mjs} +6 -6
- package/dist/{task-CMunPKCV.cjs → task-DFW-PecP.cjs} +6 -6
- package/dist/{uninstall-BALE2up0.mjs → uninstall-CeioRZNI.mjs} +2 -2
- package/dist/{uninstall-BJ3eEGM4.cjs → uninstall-yTSL3X6Y.cjs} +2 -2
- package/dist/{update-Bb3iijy8.cjs → update-Bju28vNP.cjs} +3 -3
- package/dist/{update-BfjtLrhO.mjs → update-Derd2hoX.mjs} +3 -3
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var axios = require('axios');
|
|
4
|
-
var logger = require('./persistence-
|
|
4
|
+
var logger = require('./persistence-BcQmjobZ.cjs');
|
|
5
5
|
var node_events = require('node:events');
|
|
6
6
|
var socket_ioClient = require('socket.io-client');
|
|
7
7
|
var z = require('zod');
|
|
8
|
-
require('./index-
|
|
8
|
+
require('./index-BeKrqPYR.cjs');
|
|
9
9
|
var time = require('./time-Bj2HRkKH.cjs');
|
|
10
10
|
var node_crypto = require('node:crypto');
|
|
11
11
|
var fs = require('node:fs');
|
|
@@ -26,7 +26,7 @@ var tweetnacl = require('tweetnacl');
|
|
|
26
26
|
var base64 = require('@stablelib/base64');
|
|
27
27
|
var node_readline = require('node:readline');
|
|
28
28
|
var expoServerSdk = require('expo-server-sdk');
|
|
29
|
-
var sessionKeyCache = require('./sessionKeyCache-
|
|
29
|
+
var sessionKeyCache = require('./sessionKeyCache-BwFUGgMs.cjs');
|
|
30
30
|
var chalk = require('chalk');
|
|
31
31
|
|
|
32
32
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
@@ -1395,7 +1395,7 @@ function resolveToolsDir() {
|
|
|
1395
1395
|
}
|
|
1396
1396
|
function findToolsDir() {
|
|
1397
1397
|
try {
|
|
1398
|
-
const manifest = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('api-
|
|
1398
|
+
const manifest = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('api-CIE4_cWd.cjs', document.baseURI).href))).resolve(`${toolsPackageName()}/package.json`);
|
|
1399
1399
|
return path.dirname(manifest);
|
|
1400
1400
|
} catch {
|
|
1401
1401
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
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-
|
|
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-D9tMm6bj.mjs';
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
4
|
import { io } from 'socket.io-client';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
-
import './index-
|
|
6
|
+
import './index-DTV7drqs.mjs';
|
|
7
7
|
import { b as backoff, e as exponentialBackoffDelay } from './time-DgsBLJA_.mjs';
|
|
8
8
|
import { randomUUID, createHash } from 'node:crypto';
|
|
9
9
|
import fs, { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync, mkdtempSync, chmodSync, createReadStream, createWriteStream, unlink as unlink$2, rmdirSync } from 'node:fs';
|
|
@@ -24,7 +24,7 @@ import tweetnacl from 'tweetnacl';
|
|
|
24
24
|
import { encode, decode } from '@stablelib/base64';
|
|
25
25
|
import { createInterface } from 'node:readline';
|
|
26
26
|
import { Expo } from 'expo-server-sdk';
|
|
27
|
-
import { c as cacheSessionKey } from './sessionKeyCache-
|
|
27
|
+
import { c as cacheSessionKey } from './sessionKeyCache-pXTjpETo.mjs';
|
|
28
28
|
import chalk from 'chalk';
|
|
29
29
|
|
|
30
30
|
z.object({
|
|
@@ -7456,4 +7456,4 @@ var api = /*#__PURE__*/Object.freeze({
|
|
|
7456
7456
|
ApiClient: ApiClient
|
|
7457
7457
|
});
|
|
7458
7458
|
|
|
7459
|
-
export { ApiClient as A, GeminiSessionWriter as G, InvalidateSync as I, ApiSessionClient as a,
|
|
7459
|
+
export { ApiClient as A, GeminiSessionWriter as G, InvalidateSync as I, ApiSessionClient as a, startOfflineReconnection as b, saveDiffRecords as c, connectionState as d, extractUserText as e, findCodexSessionFile as f, generateStableUuid as g, readGeminiSessionLog as h, isSystemMessage as i, buildResumeContextFromSessionLog as j, AsyncLock as k, findClaudeProjectId as l, api as m, resolveToolsDir as r, saveToolOutputRecord as s };
|
|
@@ -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-
|
|
3
|
-
import { authAndSetupMachineIfNeeded } from './auth-
|
|
2
|
+
import { r as readCredentials, a as readSettings, c as configuration, l as logger, b as clearCredentials, d as clearMachineId } from './persistence-D9tMm6bj.mjs';
|
|
3
|
+
import { authAndSetupMachineIfNeeded } from './auth-Q2STUNI-.mjs';
|
|
4
4
|
import { existsSync, rmSync } from 'node:fs';
|
|
5
5
|
import { createInterface } from 'node:readline';
|
|
6
|
-
import { checkIfDaemonRunningAndCleanupStaleState, stopDaemon } from './controlClient-
|
|
6
|
+
import { checkIfDaemonRunningAndCleanupStaleState, stopDaemon } from './controlClient-DoS9JqQC.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-
|
|
17
|
+
import './browser-BI7s-V8E.mjs';
|
|
18
18
|
import 'open';
|
|
19
19
|
import 'react';
|
|
20
20
|
import 'ink';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
|
-
var logger = require('./persistence-
|
|
5
|
-
var auth = require('./auth-
|
|
4
|
+
var logger = require('./persistence-BcQmjobZ.cjs');
|
|
5
|
+
var auth = require('./auth-G9fZpVJ2.cjs');
|
|
6
6
|
var fs = require('node:fs');
|
|
7
7
|
var node_readline = require('node:readline');
|
|
8
|
-
var controlClient = require('./controlClient-
|
|
8
|
+
var controlClient = require('./controlClient-CEz_p1zc.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-
|
|
19
|
+
require('./browser-qDIIAL7S.cjs');
|
|
20
20
|
require('open');
|
|
21
21
|
require('react');
|
|
22
22
|
require('ink');
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var logger = require('./persistence-
|
|
3
|
+
var logger = require('./persistence-BcQmjobZ.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-
|
|
9
|
+
var browser = require('./browser-qDIIAL7S.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-
|
|
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-D9tMm6bj.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-
|
|
7
|
+
import { o as openBrowser } from './browser-BI7s-V8E.mjs';
|
|
8
8
|
import React, { useState } from 'react';
|
|
9
9
|
import { useInput, Box, Text, render } from 'ink';
|
|
10
10
|
import 'node:fs/promises';
|
|
@@ -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-
|
|
6
|
+
import { l as logger } from './persistence-D9tMm6bj.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';
|
|
@@ -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-
|
|
8
|
+
var logger = require('./persistence-BcQmjobZ.cjs');
|
|
9
9
|
var os = require('node:os');
|
|
10
10
|
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
11
11
|
var prompt = require('./prompt-BTWDZZO0.cjs');
|
|
@@ -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-
|
|
5
|
+
import { l as logger } from './persistence-D9tMm6bj.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-
|
|
7
|
+
var logger = require('./persistence-BcQmjobZ.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-
|
|
8
|
-
var api = require('./api-
|
|
7
|
+
var logger = require('./persistence-BcQmjobZ.cjs');
|
|
8
|
+
var api = require('./api-CIE4_cWd.cjs');
|
|
9
9
|
var http = require('http');
|
|
10
10
|
var crypto = require('crypto');
|
|
11
|
-
var browser = require('./browser-
|
|
11
|
+
var browser = require('./browser-qDIIAL7S.cjs');
|
|
12
12
|
var child_process = require('child_process');
|
|
13
13
|
var util = require('util');
|
|
14
14
|
require('node:fs/promises');
|
|
@@ -21,7 +21,7 @@ require('tweetnacl');
|
|
|
21
21
|
require('axios');
|
|
22
22
|
require('node:events');
|
|
23
23
|
require('socket.io-client');
|
|
24
|
-
require('./index-
|
|
24
|
+
require('./index-BeKrqPYR.cjs');
|
|
25
25
|
require('@paralleldrive/cuid2');
|
|
26
26
|
require('./time-Bj2HRkKH.cjs');
|
|
27
27
|
require('node:child_process');
|
|
@@ -34,7 +34,7 @@ require('ws');
|
|
|
34
34
|
require('@stablelib/base64');
|
|
35
35
|
require('node:readline');
|
|
36
36
|
require('expo-server-sdk');
|
|
37
|
-
require('./sessionKeyCache-
|
|
37
|
+
require('./sessionKeyCache-BwFUGgMs.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-
|
|
6
|
-
import { A as ApiClient } from './api-
|
|
5
|
+
import { r as readCredentials } from './persistence-D9tMm6bj.mjs';
|
|
6
|
+
import { A as ApiClient } from './api-Ew6xr81i.mjs';
|
|
7
7
|
import { createServer } from 'http';
|
|
8
8
|
import { randomBytes, createHash } from 'crypto';
|
|
9
|
-
import { o as openBrowser } from './browser-
|
|
9
|
+
import { o as openBrowser } from './browser-BI7s-V8E.mjs';
|
|
10
10
|
import { exec } from 'child_process';
|
|
11
11
|
import { promisify } from 'util';
|
|
12
12
|
import 'node:fs/promises';
|
|
@@ -19,7 +19,7 @@ import 'tweetnacl';
|
|
|
19
19
|
import 'axios';
|
|
20
20
|
import 'node:events';
|
|
21
21
|
import 'socket.io-client';
|
|
22
|
-
import './index-
|
|
22
|
+
import './index-DTV7drqs.mjs';
|
|
23
23
|
import '@paralleldrive/cuid2';
|
|
24
24
|
import './time-DgsBLJA_.mjs';
|
|
25
25
|
import 'node:child_process';
|
|
@@ -32,7 +32,7 @@ import 'ws';
|
|
|
32
32
|
import '@stablelib/base64';
|
|
33
33
|
import 'node:readline';
|
|
34
34
|
import 'expo-server-sdk';
|
|
35
|
-
import './sessionKeyCache-
|
|
35
|
+
import './sessionKeyCache-pXTjpETo.mjs';
|
|
36
36
|
import 'open';
|
|
37
37
|
|
|
38
38
|
const CLIENT_ID$2 = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { l as logger, m as readDaemonState, n as clearDaemonState } from './persistence-
|
|
1
|
+
import { l as logger, m as readDaemonState, n as clearDaemonState } from './persistence-D9tMm6bj.mjs';
|
|
2
2
|
import { p as projectPath } from './projectPath-BTBIMB57.mjs';
|
|
3
3
|
import { readFileSync } from 'fs';
|
|
4
4
|
import { join } from 'path';
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { A as APPROVAL_ENDPOINT_FILE } from './cursorApprovalServer-JjPkdjGR.mjs';
|
|
4
|
+
import 'node:http';
|
|
5
|
+
import 'node:crypto';
|
|
6
|
+
import 'node:fs/promises';
|
|
7
|
+
import './persistence-D9tMm6bj.mjs';
|
|
8
|
+
import 'node:os';
|
|
9
|
+
import 'zod';
|
|
10
|
+
import 'tweetnacl';
|
|
11
|
+
import 'chalk';
|
|
12
|
+
import 'fs';
|
|
13
|
+
|
|
14
|
+
function readStdin() {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
let data = "";
|
|
17
|
+
process.stdin.setEncoding("utf8");
|
|
18
|
+
process.stdin.on("data", (chunk) => {
|
|
19
|
+
data += chunk;
|
|
20
|
+
});
|
|
21
|
+
process.stdin.on("end", () => resolve(data));
|
|
22
|
+
process.stdin.on("error", () => resolve(data));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function emit(permission, userMessage) {
|
|
26
|
+
const payload = { permission };
|
|
27
|
+
if (userMessage) {
|
|
28
|
+
payload.user_message = userMessage;
|
|
29
|
+
payload.agent_message = userMessage;
|
|
30
|
+
}
|
|
31
|
+
process.stdout.write(`${JSON.stringify(payload)}
|
|
32
|
+
`);
|
|
33
|
+
}
|
|
34
|
+
function findEndpoint(payload) {
|
|
35
|
+
const candidates = [];
|
|
36
|
+
if (typeof payload.cwd === "string") candidates.push(payload.cwd);
|
|
37
|
+
if (Array.isArray(payload.workspace_roots)) {
|
|
38
|
+
for (const root of payload.workspace_roots) {
|
|
39
|
+
if (typeof root === "string") candidates.push(root);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (process.env.CURSOR_PROJECT_DIR) candidates.push(process.env.CURSOR_PROJECT_DIR);
|
|
43
|
+
candidates.push(process.cwd());
|
|
44
|
+
for (const dir of candidates) {
|
|
45
|
+
const file = join(dir, ".cursor", APPROVAL_ENDPOINT_FILE);
|
|
46
|
+
if (!existsSync(file)) continue;
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
49
|
+
if (typeof parsed?.port === "number" && typeof parsed?.token === "string") {
|
|
50
|
+
return { port: parsed.port, token: parsed.token };
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
async function runCursorApprovalHook() {
|
|
58
|
+
const raw = await readStdin();
|
|
59
|
+
let payload = {};
|
|
60
|
+
try {
|
|
61
|
+
payload = JSON.parse(raw);
|
|
62
|
+
} catch {
|
|
63
|
+
}
|
|
64
|
+
const endpoint = findEndpoint(payload);
|
|
65
|
+
if (!endpoint) {
|
|
66
|
+
emit("allow");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(`http://127.0.0.1:${endpoint.port}/approve`, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: { "content-type": "application/json" },
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
token: endpoint.token,
|
|
75
|
+
tool_name: typeof payload.tool_name === "string" ? payload.tool_name : void 0,
|
|
76
|
+
tool_input: payload.tool_input,
|
|
77
|
+
tool_use_id: typeof payload.tool_use_id === "string" ? payload.tool_use_id : void 0
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
emit("deny", "Happy could not reach the approval bridge.");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const result = await response.json();
|
|
85
|
+
if (result.approved === true) {
|
|
86
|
+
emit("allow");
|
|
87
|
+
} else {
|
|
88
|
+
emit("deny", "Denied from Happy.");
|
|
89
|
+
}
|
|
90
|
+
} catch (error) {
|
|
91
|
+
emit("deny", `Happy approval unavailable: ${error instanceof Error ? error.message : "unknown error"}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { runCursorApprovalHook };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('node:fs');
|
|
4
|
+
var path = require('node:path');
|
|
5
|
+
var cursorApprovalServer = require('./cursorApprovalServer-DzY8yJlI.cjs');
|
|
6
|
+
require('node:http');
|
|
7
|
+
require('node:crypto');
|
|
8
|
+
require('node:fs/promises');
|
|
9
|
+
require('./persistence-BcQmjobZ.cjs');
|
|
10
|
+
require('node:os');
|
|
11
|
+
require('zod');
|
|
12
|
+
require('tweetnacl');
|
|
13
|
+
require('chalk');
|
|
14
|
+
require('fs');
|
|
15
|
+
|
|
16
|
+
function readStdin() {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
let data = "";
|
|
19
|
+
process.stdin.setEncoding("utf8");
|
|
20
|
+
process.stdin.on("data", (chunk) => {
|
|
21
|
+
data += chunk;
|
|
22
|
+
});
|
|
23
|
+
process.stdin.on("end", () => resolve(data));
|
|
24
|
+
process.stdin.on("error", () => resolve(data));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function emit(permission, userMessage) {
|
|
28
|
+
const payload = { permission };
|
|
29
|
+
if (userMessage) {
|
|
30
|
+
payload.user_message = userMessage;
|
|
31
|
+
payload.agent_message = userMessage;
|
|
32
|
+
}
|
|
33
|
+
process.stdout.write(`${JSON.stringify(payload)}
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
function findEndpoint(payload) {
|
|
37
|
+
const candidates = [];
|
|
38
|
+
if (typeof payload.cwd === "string") candidates.push(payload.cwd);
|
|
39
|
+
if (Array.isArray(payload.workspace_roots)) {
|
|
40
|
+
for (const root of payload.workspace_roots) {
|
|
41
|
+
if (typeof root === "string") candidates.push(root);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (process.env.CURSOR_PROJECT_DIR) candidates.push(process.env.CURSOR_PROJECT_DIR);
|
|
45
|
+
candidates.push(process.cwd());
|
|
46
|
+
for (const dir of candidates) {
|
|
47
|
+
const file = path.join(dir, ".cursor", cursorApprovalServer.APPROVAL_ENDPOINT_FILE);
|
|
48
|
+
if (!fs.existsSync(file)) continue;
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
51
|
+
if (typeof parsed?.port === "number" && typeof parsed?.token === "string") {
|
|
52
|
+
return { port: parsed.port, token: parsed.token };
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
async function runCursorApprovalHook() {
|
|
60
|
+
const raw = await readStdin();
|
|
61
|
+
let payload = {};
|
|
62
|
+
try {
|
|
63
|
+
payload = JSON.parse(raw);
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
const endpoint = findEndpoint(payload);
|
|
67
|
+
if (!endpoint) {
|
|
68
|
+
emit("allow");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(`http://127.0.0.1:${endpoint.port}/approve`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: { "content-type": "application/json" },
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
token: endpoint.token,
|
|
77
|
+
tool_name: typeof payload.tool_name === "string" ? payload.tool_name : void 0,
|
|
78
|
+
tool_input: payload.tool_input,
|
|
79
|
+
tool_use_id: typeof payload.tool_use_id === "string" ? payload.tool_use_id : void 0
|
|
80
|
+
})
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
emit("deny", "Happy could not reach the approval bridge.");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const result = await response.json();
|
|
87
|
+
if (result.approved === true) {
|
|
88
|
+
emit("allow");
|
|
89
|
+
} else {
|
|
90
|
+
emit("deny", "Denied from Happy.");
|
|
91
|
+
}
|
|
92
|
+
} catch (error) {
|
|
93
|
+
emit("deny", `Happy approval unavailable: ${error instanceof Error ? error.message : "unknown error"}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
exports.runCursorApprovalHook = runCursorApprovalHook;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var node_http = require('node:http');
|
|
4
|
+
var node_crypto = require('node:crypto');
|
|
5
|
+
var promises = require('node:fs/promises');
|
|
6
|
+
var fs = require('node:fs');
|
|
7
|
+
var path = require('node:path');
|
|
8
|
+
var logger = require('./persistence-BcQmjobZ.cjs');
|
|
9
|
+
|
|
10
|
+
const APPROVAL_ENDPOINT_FILE = ".happy-approval.json";
|
|
11
|
+
const HOOKS_FILE = "hooks.json";
|
|
12
|
+
const HOOKS_BACKUP_FILE = "hooks.json.happy-backup";
|
|
13
|
+
const HOOK_TIMEOUT_SECONDS = 900;
|
|
14
|
+
class CursorApprovalBridge {
|
|
15
|
+
cwd;
|
|
16
|
+
handler;
|
|
17
|
+
token = node_crypto.randomUUID();
|
|
18
|
+
server = null;
|
|
19
|
+
port = 0;
|
|
20
|
+
hadExistingHooks = false;
|
|
21
|
+
/** True when .cursor/ did not exist before this session created it. */
|
|
22
|
+
createdCursorDir = false;
|
|
23
|
+
started = false;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.cwd = options.cwd;
|
|
26
|
+
this.handler = options.handler;
|
|
27
|
+
}
|
|
28
|
+
get cursorDir() {
|
|
29
|
+
return path.join(this.cwd, ".cursor");
|
|
30
|
+
}
|
|
31
|
+
async start() {
|
|
32
|
+
await this.listen();
|
|
33
|
+
await this.installHooks();
|
|
34
|
+
this.started = true;
|
|
35
|
+
logger.logger.debug(`[cursor] approval bridge listening on 127.0.0.1:${this.port}`);
|
|
36
|
+
}
|
|
37
|
+
listen() {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
const server = node_http.createServer((req, res) => {
|
|
40
|
+
if (req.method !== "POST" || !req.url?.startsWith("/approve")) {
|
|
41
|
+
res.writeHead(404).end();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let body = "";
|
|
45
|
+
req.on("data", (chunk) => {
|
|
46
|
+
body += chunk;
|
|
47
|
+
});
|
|
48
|
+
req.on("end", () => {
|
|
49
|
+
void this.decide(body).then((approved) => {
|
|
50
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
51
|
+
res.end(JSON.stringify({ approved }));
|
|
52
|
+
}).catch((error) => {
|
|
53
|
+
logger.logger.debug(`[cursor] approval failed: ${error}`);
|
|
54
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
55
|
+
res.end(JSON.stringify({ approved: false }));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
server.listen(0, "127.0.0.1", () => {
|
|
60
|
+
const address = server.address();
|
|
61
|
+
if (address === null || typeof address === "string") {
|
|
62
|
+
reject(new Error("Failed to determine approval server port"));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.port = address.port;
|
|
66
|
+
this.server = server;
|
|
67
|
+
resolve();
|
|
68
|
+
});
|
|
69
|
+
server.on("error", reject);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async decide(rawBody) {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = JSON.parse(rawBody);
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (parsed.token !== this.token) {
|
|
80
|
+
logger.logger.debug("[cursor] rejecting approval request with a bad token");
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const toolName = typeof parsed.tool_name === "string" && parsed.tool_name.length > 0 ? parsed.tool_name : "unknown tool";
|
|
84
|
+
const toolCallId = typeof parsed.tool_use_id === "string" && parsed.tool_use_id.length > 0 ? parsed.tool_use_id : `cursor-${node_crypto.randomUUID()}`;
|
|
85
|
+
return this.handler.requestApproval(toolCallId, toolName, parsed.tool_input ?? {});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Writes .cursor/hooks.json pointing at this CLI. Any file already there is
|
|
89
|
+
* moved aside and restored on stop, so a project with its own hooks is not
|
|
90
|
+
* quietly clobbered.
|
|
91
|
+
*/
|
|
92
|
+
async installHooks() {
|
|
93
|
+
this.createdCursorDir = !fs.existsSync(this.cursorDir);
|
|
94
|
+
await promises.mkdir(this.cursorDir, { recursive: true });
|
|
95
|
+
const hooksPath = path.join(this.cursorDir, HOOKS_FILE);
|
|
96
|
+
if (fs.existsSync(hooksPath)) {
|
|
97
|
+
await promises.rename(hooksPath, path.join(this.cursorDir, HOOKS_BACKUP_FILE));
|
|
98
|
+
this.hadExistingHooks = true;
|
|
99
|
+
logger.logger.debug("[cursor] existing hooks.json moved aside for the session");
|
|
100
|
+
}
|
|
101
|
+
await promises.writeFile(path.join(this.cursorDir, APPROVAL_ENDPOINT_FILE), JSON.stringify({
|
|
102
|
+
port: this.port,
|
|
103
|
+
token: this.token,
|
|
104
|
+
pid: process.pid
|
|
105
|
+
}), "utf8");
|
|
106
|
+
const hookCommand = `${process.execPath} ${process.argv[1]} cursor-approval-hook`;
|
|
107
|
+
await promises.writeFile(hooksPath, JSON.stringify({
|
|
108
|
+
version: 1,
|
|
109
|
+
hooks: {
|
|
110
|
+
// preToolUse covers every tool, including Read, Write and Shell.
|
|
111
|
+
// It only understands allow/deny — never "ask" — and failClosed
|
|
112
|
+
// has to be explicit because hooks fail open by default.
|
|
113
|
+
preToolUse: [
|
|
114
|
+
{ type: "command", command: hookCommand, timeout: HOOK_TIMEOUT_SECONDS, failClosed: true }
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
}, null, 2), "utf8");
|
|
118
|
+
await this.excludeFromGit();
|
|
119
|
+
}
|
|
120
|
+
/** Keep the session's scaffolding out of `git status`. */
|
|
121
|
+
async excludeFromGit() {
|
|
122
|
+
const excludePath = path.join(this.cwd, ".git", "info", "exclude");
|
|
123
|
+
if (!fs.existsSync(excludePath)) return;
|
|
124
|
+
try {
|
|
125
|
+
const current = await promises.readFile(excludePath, "utf8");
|
|
126
|
+
if (current.includes(".cursor/.happy-approval.json")) return;
|
|
127
|
+
await promises.writeFile(
|
|
128
|
+
excludePath,
|
|
129
|
+
`${current}${current.endsWith("\n") ? "" : "\n"}# added by happy cursor session
|
|
130
|
+
.cursor/hooks.json
|
|
131
|
+
.cursor/.happy-approval.json
|
|
132
|
+
`,
|
|
133
|
+
"utf8"
|
|
134
|
+
);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
logger.logger.debug(`[cursor] could not update .git/info/exclude: ${error}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async stop() {
|
|
140
|
+
if (!this.started) return;
|
|
141
|
+
this.started = false;
|
|
142
|
+
try {
|
|
143
|
+
await promises.rm(path.join(this.cursorDir, APPROVAL_ENDPOINT_FILE), { force: true });
|
|
144
|
+
const hooksPath = path.join(this.cursorDir, HOOKS_FILE);
|
|
145
|
+
const backupPath = path.join(this.cursorDir, HOOKS_BACKUP_FILE);
|
|
146
|
+
if (this.hadExistingHooks && fs.existsSync(backupPath)) {
|
|
147
|
+
await promises.rename(backupPath, hooksPath);
|
|
148
|
+
} else {
|
|
149
|
+
await promises.rm(hooksPath, { force: true });
|
|
150
|
+
}
|
|
151
|
+
if (this.createdCursorDir && (await promises.readdir(this.cursorDir)).length === 0) {
|
|
152
|
+
await promises.rmdir(this.cursorDir);
|
|
153
|
+
}
|
|
154
|
+
} catch (error) {
|
|
155
|
+
logger.logger.debug(`[cursor] cleanup of .cursor/ failed: ${error}`);
|
|
156
|
+
}
|
|
157
|
+
await new Promise((resolve) => {
|
|
158
|
+
if (!this.server) return resolve();
|
|
159
|
+
this.server.close(() => resolve());
|
|
160
|
+
this.server = null;
|
|
161
|
+
});
|
|
162
|
+
logger.logger.debug("[cursor] approval bridge stopped");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
exports.APPROVAL_ENDPOINT_FILE = APPROVAL_ENDPOINT_FILE;
|
|
167
|
+
exports.CursorApprovalBridge = CursorApprovalBridge;
|