very-happy-cli 0.2.90 → 0.2.91
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/{AcpBackend-BV4wSnJ3.mjs → AcpBackend-B5RRlzLU.mjs} +1 -1
- package/dist/{AcpBackend-CnYZFdd0.cjs → AcpBackend-GqveWg8u.cjs} +1 -1
- package/dist/{AcpSessionManager-Cyne6Rmg.mjs → AcpSessionManager-Ij1pI5Ex.mjs} +1 -1
- package/dist/{AcpSessionManager-BPBdrrME.cjs → AcpSessionManager-YcrSZwvq.cjs} +1 -1
- package/dist/{config-CgXitj0f.cjs → config-C4NCw7Dz.cjs} +2 -2
- package/dist/{config-BEdyyciP.mjs → config-ra8iKxdU.mjs} +2 -2
- package/dist/{index-B1wTVXjt.cjs → index-C1HIm7NY.cjs} +4 -4
- package/dist/{index-Dfu5uvjk.mjs → index-CB5H7YI6.mjs} +5 -5
- package/dist/{index-4YmVbx7j.cjs → index-FkXJNwiy.cjs} +87 -31
- package/dist/{index-an09rejO.mjs → index-UCYD5Wk3.mjs} +84 -28
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{installTerminalHooks-DDpVxk8-.cjs → installTerminalHooks-CoK5wNcA.cjs} +2 -2
- package/dist/{installTerminalHooks-C-OgZr5k.mjs → installTerminalHooks-TkkGzzbI.mjs} +2 -2
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +34 -0
- package/dist/lib.d.mts +34 -0
- package/dist/lib.mjs +1 -1
- package/dist/{mcp-Du-N0qlK.mjs → mcp-C3MiqObi.mjs} +2 -2
- package/dist/{mcp-B6Nq-RUL.cjs → mcp-DcRvswVI.cjs} +2 -2
- package/dist/{runGemini-DBr_TiTL.mjs → runGemini-BbC0uwUj.mjs} +4 -4
- package/dist/{runGemini-ChG7cGMC.cjs → runGemini-Dnvd2gWq.cjs} +4 -4
- package/dist/{runOpenClaw-Cbde8t92.mjs → runOpenClaw--nbqTW3K.mjs} +3 -3
- package/dist/{runOpenClaw-D2jtVgpC.cjs → runOpenClaw-CnuTBNQW.cjs} +3 -3
- package/dist/{send-BHliX59m.mjs → send-9nJxn09Y.mjs} +2 -2
- package/dist/{send-Bjen1TUE.cjs → send-DkKOPatx.cjs} +2 -2
- package/dist/{spawn-JxaPHAoP.mjs → spawn-CRW4ioms.mjs} +2 -2
- package/dist/{spawn-CH1Rq-LW.cjs → spawn-DE7WhS8Y.cjs} +2 -2
- package/dist/{types-DS3i_5LV.mjs → types-BKyjG23_.mjs} +251 -15
- package/dist/{types-BNGeiP1C.cjs → types-ClDADuxP.cjs} +252 -16
- package/package.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
|
|
2
2
|
import os, { homedir } from 'node:os';
|
|
3
3
|
import { randomUUID, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
|
|
4
|
-
import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as getLocalHappyAgentCredentialPath, L as readLocalHappyAgentCredentials, N as decryptWithDataKey, O as decryptLegacy, P as extractCompleteLines, Q as decideBackfill, S as parseTerminalHookPayload, T as tmuxArgs, U as scrubTmuxClientEnv, V as decideMirrorBinding, W as persistSession, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as mirrorLineKey, Z as mirrorLocalId, _ as detectResumeSupport, $ as detectCLIAvailability, a0 as acquireDaemonLock, a1 as summarizeSpawnSessionForLog, a2 as deletePersistedSessions, a3 as decrypt, a4 as writeDaemonState, A as ApiClient, a5 as fetchCliUpdateState, a6 as resolveCliUpdateCheckInterval, a7 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a8 as releaseDaemonLock, a9 as isValidSessionId, aa as listVhTerminals, ab as isValidTerminalId, ac as readVhTerminal, ad as sendToVhTerminal, h as connectionState, ae as startOfflineReconnection, af as clearCredentials, ag as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ah as SandboxConfigSchema, b as createEnvelope, ai as CodexAppServerClient, aj as getLatestDaemonLog } from './types-
|
|
4
|
+
import { n as readDaemonState, l as logger, c as configuration, o as clearDaemonState, q as getProjectPath, p as projectPath, s as initializeSandbox, t as wrapCommand, d as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, g as delay, u as AsyncLock, v as ensurePrivateDirectory, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, x as hardenPrivateFile, f as packageJson, i as readSettings, y as readCredentials, z as credentialRelayProblem, B as deriveLocalCliUpdateSummary, j as encodeBase64, C as updateSettings, D as encodeBase64Url, E as decodeBase64, F as writeCredentialsLegacy, G as writeCredentialsDataKey, H as readCredentialsForConfiguredRelay, J as encrypt, r as readPersistedSessions, K as getLocalHappyAgentCredentialPath, L as readLocalHappyAgentCredentials, N as decryptWithDataKey, O as decryptLegacy, P as extractCompleteLines, Q as decideBackfill, S as parseTerminalHookPayload, T as tmuxArgs, U as scrubTmuxClientEnv, V as decideMirrorBinding, W as persistSession, X as MIRROR_BACKFILL_LINES_DEFAULT, Y as mirrorLineKey, Z as mirrorLocalId, _ as detectResumeSupport, $ as detectCLIAvailability, a0 as acquireDaemonLock, a1 as summarizeSpawnSessionForLog, a2 as deletePersistedSessions, a3 as decrypt, a4 as writeDaemonState, A as ApiClient, a5 as fetchCliUpdateState, a6 as resolveCliUpdateCheckInterval, a7 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a8 as releaseDaemonLock, a9 as isValidSessionId, aa as listVhTerminals, ab as isValidTerminalId, ac as readVhTerminal, ad as sendToVhTerminal, h as connectionState, ae as startOfflineReconnection, af as clearCredentials, ag as clearMachineId, k as ensurePrivateDirectorySync, w as writePrivateFileSync, ah as SandboxConfigSchema, b as createEnvelope, ai as CodexAppServerClient, aj as getLatestDaemonLog } from './types-BKyjG23_.mjs';
|
|
5
5
|
import spawn$1, { spawn } from 'cross-spawn';
|
|
6
6
|
import path, { join, resolve, basename, isAbsolute, normalize, sep, dirname } from 'node:path';
|
|
7
7
|
import { createInterface } from 'node:readline';
|
|
@@ -1633,6 +1633,12 @@ function resolveRemoteClaudePermissionMode(currentMode, incomingMode, sandboxEna
|
|
|
1633
1633
|
}
|
|
1634
1634
|
return nextMode;
|
|
1635
1635
|
}
|
|
1636
|
+
function reconcilePublishedPermissionMode(input) {
|
|
1637
|
+
if (!input.effective) return null;
|
|
1638
|
+
const mismatch = input.effective !== input.intent;
|
|
1639
|
+
if (input.effective === input.published) return mismatch ? { publish: input.effective, mismatch } : null;
|
|
1640
|
+
return { publish: input.effective, mismatch };
|
|
1641
|
+
}
|
|
1636
1642
|
|
|
1637
1643
|
function parseCompact(message) {
|
|
1638
1644
|
const trimmed = message.trim();
|
|
@@ -1962,7 +1968,12 @@ async function claudeRemote(opts) {
|
|
|
1962
1968
|
mcpServers: systemInit.mcp_servers?.map((s) => ({ name: s.name, status: s.status })),
|
|
1963
1969
|
skills: systemInit.skills,
|
|
1964
1970
|
model: systemInit.model,
|
|
1965
|
-
modelIsDefault: initial.mode.model == null
|
|
1971
|
+
modelIsDefault: initial.mode.model == null,
|
|
1972
|
+
// The SDK's own verdict on the mode it will enforce —
|
|
1973
|
+
// settings (permissions.deny/ask/defaultMode/
|
|
1974
|
+
// disableBypassPermissionsMode) can override what we
|
|
1975
|
+
// asked for. runClaude publishes THIS, not our intent.
|
|
1976
|
+
permissionMode: systemInit.permissionMode
|
|
1966
1977
|
});
|
|
1967
1978
|
}
|
|
1968
1979
|
if (systemInit.session_id) {
|
|
@@ -1980,6 +1991,10 @@ async function claudeRemote(opts) {
|
|
|
1980
1991
|
if (message.type === "result") {
|
|
1981
1992
|
updateThinking(false);
|
|
1982
1993
|
logger.debug("[claudeRemote] Result received");
|
|
1994
|
+
const denials = message.permission_denials;
|
|
1995
|
+
if (denials && denials.length > 0) {
|
|
1996
|
+
logger.warn(`[claudeRemote] ${denials.length} tool call(s) auto-denied by Claude Code policy: ${denials.map((d) => d.tool_name ?? "?").join(", ")}`);
|
|
1997
|
+
}
|
|
1983
1998
|
if (isCompactCommand) {
|
|
1984
1999
|
const compactSucceeded = message.subtype === "success";
|
|
1985
2000
|
logger.debug(`[claudeRemote] Compaction ${compactSucceeded ? "completed" : "failed"}`);
|
|
@@ -2190,16 +2205,9 @@ class PermissionHandler {
|
|
|
2190
2205
|
}
|
|
2191
2206
|
} else {
|
|
2192
2207
|
if (response.approved && response.mode) {
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
this.permissionMode = response.mode;
|
|
2197
|
-
this.onModeChangedCallback?.(response.mode);
|
|
2198
|
-
} catch (err) {
|
|
2199
|
-
const reason = `Failed to switch permission mode: ${err instanceof Error ? err.message : String(err)}`;
|
|
2200
|
-
pending.resolve({ behavior: "deny", message: reason });
|
|
2201
|
-
return { ...response, approved: false, reason };
|
|
2202
|
-
}
|
|
2208
|
+
this.permissionMode = response.mode;
|
|
2209
|
+
this.deferredPermissionMode = response.mode;
|
|
2210
|
+
this.onModeChangedCallback?.(response.mode);
|
|
2203
2211
|
}
|
|
2204
2212
|
if (response.approved && !pending.suggestions?.length && response.allowTools?.length) {
|
|
2205
2213
|
response.allowTools.forEach((tool) => {
|
|
@@ -2540,6 +2548,17 @@ class PermissionHandler {
|
|
|
2540
2548
|
}
|
|
2541
2549
|
}
|
|
2542
2550
|
|
|
2551
|
+
function rewriteQueuedPermissionMode(queue, hasher, permissionMode) {
|
|
2552
|
+
let rewritten = 0;
|
|
2553
|
+
for (const item of queue) {
|
|
2554
|
+
if (item.mode.permissionMode === permissionMode) continue;
|
|
2555
|
+
item.mode = { ...item.mode, permissionMode };
|
|
2556
|
+
item.modeHash = hasher(item.mode);
|
|
2557
|
+
rewritten += 1;
|
|
2558
|
+
}
|
|
2559
|
+
return rewritten;
|
|
2560
|
+
}
|
|
2561
|
+
|
|
2543
2562
|
function formatClaudeMessageForInk(message, messageBuffer, onAssistantResult) {
|
|
2544
2563
|
logger.debugLargeJson("[CLAUDE INK] Message from remote mode:", message);
|
|
2545
2564
|
switch (message.type) {
|
|
@@ -2794,7 +2813,13 @@ class SDKToLogConverter {
|
|
|
2794
2813
|
type: "user",
|
|
2795
2814
|
message: userMsg.message,
|
|
2796
2815
|
...userMsg.parent_tool_use_id ? { parent_tool_use_id: userMsg.parent_tool_use_id } : {},
|
|
2797
|
-
...meta ? { isMeta: true } : {}
|
|
2816
|
+
...meta ? { isMeta: true } : {},
|
|
2817
|
+
// B-260-P2: structured tool output (Agent/Task final report +
|
|
2818
|
+
// run totals, or the `async_launched` stub marker) and the
|
|
2819
|
+
// message origin (task-notification). Both are consumed by
|
|
2820
|
+
// sessionProtocolMapper; the raw-line schema is passthrough.
|
|
2821
|
+
...userMsg.tool_use_result !== void 0 ? { tool_use_result: userMsg.tool_use_result } : {},
|
|
2822
|
+
...userMsg.origin ? { origin: userMsg.origin } : {}
|
|
2798
2823
|
};
|
|
2799
2824
|
if (Array.isArray(userMsg.message.content)) {
|
|
2800
2825
|
for (const content of userMsg.message.content) {
|
|
@@ -3305,7 +3330,7 @@ function createTurnSteeringController() {
|
|
|
3305
3330
|
};
|
|
3306
3331
|
}
|
|
3307
3332
|
|
|
3308
|
-
async function claudeRemoteLauncher(session, onPermissionModeChange) {
|
|
3333
|
+
async function claudeRemoteLauncher(session, onPermissionModeChange, onEffectivePermissionMode) {
|
|
3309
3334
|
logger.debug("[claudeRemoteLauncher] Starting remote launcher");
|
|
3310
3335
|
const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
|
|
3311
3336
|
logger.debug(`[claudeRemoteLauncher] TTY available: ${hasTTY}`);
|
|
@@ -3539,6 +3564,10 @@ async function claudeRemoteLauncher(session, onPermissionModeChange) {
|
|
|
3539
3564
|
mode = { ...mode, permissionMode: nextMode };
|
|
3540
3565
|
modeHash = session.queue.modeHasher(mode);
|
|
3541
3566
|
}
|
|
3567
|
+
rewriteQueuedPermissionMode(session.queue.queue, session.queue.modeHasher, nextMode);
|
|
3568
|
+
if (pending) {
|
|
3569
|
+
pending = { ...pending, mode: { ...pending.mode, permissionMode: nextMode } };
|
|
3570
|
+
}
|
|
3542
3571
|
onPermissionModeChange?.(nextMode);
|
|
3543
3572
|
return nextMode;
|
|
3544
3573
|
};
|
|
@@ -3611,6 +3640,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange) {
|
|
|
3611
3640
|
skillCount: metadata.skills?.length ?? 0
|
|
3612
3641
|
});
|
|
3613
3642
|
session.client.updateMetadata((currentMetadata) => applyClaudeSdkMetadata(currentMetadata, metadata));
|
|
3643
|
+
if (metadata.permissionMode) onEffectivePermissionMode?.(metadata.permissionMode);
|
|
3614
3644
|
},
|
|
3615
3645
|
onQueryReady: (q) => {
|
|
3616
3646
|
turnSteering.setInterrupt(q.interrupt);
|
|
@@ -3788,7 +3818,7 @@ async function loop(opts) {
|
|
|
3788
3818
|
break;
|
|
3789
3819
|
}
|
|
3790
3820
|
case "remote": {
|
|
3791
|
-
const reason = await claudeRemoteLauncher(session, opts.onPermissionModeChange);
|
|
3821
|
+
const reason = await claudeRemoteLauncher(session, opts.onPermissionModeChange, opts.onEffectivePermissionMode);
|
|
3792
3822
|
switch (reason) {
|
|
3793
3823
|
case "exit":
|
|
3794
3824
|
return 0;
|
|
@@ -9386,7 +9416,11 @@ async function runClaude(credentials, options = {}) {
|
|
|
9386
9416
|
...meta,
|
|
9387
9417
|
lifecycleState: "running",
|
|
9388
9418
|
archivedBy: void 0,
|
|
9389
|
-
queueCancellation: true
|
|
9419
|
+
queueCancellation: true,
|
|
9420
|
+
// B-262 batch 2 (B5): a reconnected process re-publishes the mode
|
|
9421
|
+
// IT enforces; the server copy may still carry the previous
|
|
9422
|
+
// process's value.
|
|
9423
|
+
permissionMode: mapToClaudeMode(initialPermissionMode ?? "default")
|
|
9390
9424
|
}));
|
|
9391
9425
|
}
|
|
9392
9426
|
const forkClaudeSessionId = process.env.HAPPY_FORK_CLAUDE_SESSION_ID;
|
|
@@ -9526,6 +9560,22 @@ async function runClaude(credentials, options = {}) {
|
|
|
9526
9560
|
publishedPermissionMode = published;
|
|
9527
9561
|
session.updateMetadata((meta) => ({ ...meta, permissionMode: published }));
|
|
9528
9562
|
};
|
|
9563
|
+
const publishEffectivePermissionMode = (effective) => {
|
|
9564
|
+
const decision = reconcilePublishedPermissionMode({
|
|
9565
|
+
intent: mapToClaudeMode(currentPermissionMode ?? "default"),
|
|
9566
|
+
published: publishedPermissionMode,
|
|
9567
|
+
effective
|
|
9568
|
+
});
|
|
9569
|
+
if (!decision) return;
|
|
9570
|
+
if (decision.mismatch) {
|
|
9571
|
+
logger.warn(`[loop] Claude Code enforces permission mode '${effective}' but this process asked for '${mapToClaudeMode(currentPermissionMode ?? "default")}' \u2014 check ~/.claude settings (permissions.deny/ask/defaultMode/disableBypassPermissionsMode). Publishing the effective mode.`);
|
|
9572
|
+
}
|
|
9573
|
+
if (decision.publish !== publishedPermissionMode) {
|
|
9574
|
+
publishedPermissionMode = decision.publish;
|
|
9575
|
+
session.updateMetadata((meta) => ({ ...meta, permissionMode: decision.publish }));
|
|
9576
|
+
}
|
|
9577
|
+
};
|
|
9578
|
+
let lastExplicitModeSwitchAt = 0;
|
|
9529
9579
|
let currentModel = options.model ?? DEFAULT_CLAUDE_MODEL;
|
|
9530
9580
|
let currentFallbackModel = void 0;
|
|
9531
9581
|
let currentCustomSystemPrompt = void 0;
|
|
@@ -9570,7 +9620,11 @@ async function runClaude(credentials, options = {}) {
|
|
|
9570
9620
|
}
|
|
9571
9621
|
const attachmentsForThisMessage = await session.drainAttachmentsForUserMessage();
|
|
9572
9622
|
let messagePermissionMode = currentPermissionMode;
|
|
9573
|
-
|
|
9623
|
+
const messageCreatedAt = message.createdAt;
|
|
9624
|
+
const staleModeSnapshot = message.meta?.permissionMode !== void 0 && typeof messageCreatedAt === "number" && messageCreatedAt < lastExplicitModeSwitchAt;
|
|
9625
|
+
if (staleModeSnapshot) {
|
|
9626
|
+
logger.debug(`[loop] Ignoring stale meta.permissionMode=${message.meta?.permissionMode} (message ${messageCreatedAt} predates explicit switch ${lastExplicitModeSwitchAt}); keeping ${currentPermissionMode}`);
|
|
9627
|
+
} else if (message.meta?.permissionMode) {
|
|
9574
9628
|
const previousPermissionMode = currentPermissionMode;
|
|
9575
9629
|
messagePermissionMode = resolveRemoteClaudePermissionMode(
|
|
9576
9630
|
currentPermissionMode,
|
|
@@ -9834,9 +9888,11 @@ async function runClaude(credentials, options = {}) {
|
|
|
9834
9888
|
},
|
|
9835
9889
|
onAbort: resetCurrentModeDefaults,
|
|
9836
9890
|
onPermissionModeChange: (mode) => {
|
|
9891
|
+
lastExplicitModeSwitchAt = Date.now();
|
|
9837
9892
|
publishPermissionMode(mode);
|
|
9838
9893
|
logger.debug(`[loop] Permission mode updated from session RPC / approval to: ${mode}`);
|
|
9839
9894
|
},
|
|
9895
|
+
onEffectivePermissionMode: (mode) => publishEffectivePermissionMode(mode),
|
|
9840
9896
|
mcpServers: {
|
|
9841
9897
|
"happy": {
|
|
9842
9898
|
type: "http",
|
|
@@ -13593,7 +13649,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13593
13649
|
process.exit(0);
|
|
13594
13650
|
} else if (subcommand === "install-terminal-hooks") {
|
|
13595
13651
|
try {
|
|
13596
|
-
const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-
|
|
13652
|
+
const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-TkkGzzbI.mjs');
|
|
13597
13653
|
const command = parseTerminalHooksArgs(args.slice(1));
|
|
13598
13654
|
if (command.action === "help") {
|
|
13599
13655
|
console.log(TERMINAL_HOOKS_HELP);
|
|
@@ -13610,7 +13666,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13610
13666
|
}
|
|
13611
13667
|
} else if (subcommand === "spawn") {
|
|
13612
13668
|
try {
|
|
13613
|
-
const { handleSpawnCommand } = await import('./spawn-
|
|
13669
|
+
const { handleSpawnCommand } = await import('./spawn-CRW4ioms.mjs');
|
|
13614
13670
|
await handleSpawnCommand(args.slice(1));
|
|
13615
13671
|
} catch (error) {
|
|
13616
13672
|
console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
|
|
@@ -13622,7 +13678,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13622
13678
|
return;
|
|
13623
13679
|
} else if (subcommand === "send") {
|
|
13624
13680
|
try {
|
|
13625
|
-
const { handleSendCommand } = await import('./send-
|
|
13681
|
+
const { handleSendCommand } = await import('./send-9nJxn09Y.mjs');
|
|
13626
13682
|
await handleSendCommand(args.slice(1));
|
|
13627
13683
|
} catch (error) {
|
|
13628
13684
|
console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
|
|
@@ -13728,9 +13784,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13728
13784
|
if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
|
|
13729
13785
|
const projectId = args[3];
|
|
13730
13786
|
try {
|
|
13731
|
-
const { saveGoogleCloudProjectToConfig } = await import('./config-
|
|
13732
|
-
const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-
|
|
13733
|
-
const { ApiClient: ApiClient2 } = await import('./types-
|
|
13787
|
+
const { saveGoogleCloudProjectToConfig } = await import('./config-ra8iKxdU.mjs');
|
|
13788
|
+
const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./types-BKyjG23_.mjs').then(function (n) { return n.ak; });
|
|
13789
|
+
const { ApiClient: ApiClient2 } = await import('./types-BKyjG23_.mjs').then(function (n) { return n.al; });
|
|
13734
13790
|
let userEmail = void 0;
|
|
13735
13791
|
try {
|
|
13736
13792
|
const credentials = await readCredentialsForConfiguredRelay2();
|
|
@@ -13761,7 +13817,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13761
13817
|
}
|
|
13762
13818
|
if (geminiSubcommand === "project" && args[2] === "get") {
|
|
13763
13819
|
try {
|
|
13764
|
-
const { readGeminiLocalConfig } = await import('./config-
|
|
13820
|
+
const { readGeminiLocalConfig } = await import('./config-ra8iKxdU.mjs');
|
|
13765
13821
|
const config = readGeminiLocalConfig();
|
|
13766
13822
|
if (config.googleCloudProject) {
|
|
13767
13823
|
console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
|
|
@@ -13801,7 +13857,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13801
13857
|
process.exit(0);
|
|
13802
13858
|
}
|
|
13803
13859
|
try {
|
|
13804
|
-
const { runGemini } = await import('./runGemini-
|
|
13860
|
+
const { runGemini } = await import('./runGemini-BbC0uwUj.mjs');
|
|
13805
13861
|
let startedBy = void 0;
|
|
13806
13862
|
for (let i = 1; i < args.length; i++) {
|
|
13807
13863
|
if (args[i] === "--started-by") {
|
|
@@ -13823,7 +13879,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13823
13879
|
return;
|
|
13824
13880
|
} else if (subcommand === "acp") {
|
|
13825
13881
|
try {
|
|
13826
|
-
const { runAcp, resolveAcpAgentConfig } = await import('./index-
|
|
13882
|
+
const { runAcp, resolveAcpAgentConfig } = await import('./index-CB5H7YI6.mjs');
|
|
13827
13883
|
let startedBy = void 0;
|
|
13828
13884
|
let verbose = false;
|
|
13829
13885
|
const acpArgs = [];
|
|
@@ -13863,7 +13919,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13863
13919
|
return;
|
|
13864
13920
|
} else if (subcommand === "openclaw") {
|
|
13865
13921
|
try {
|
|
13866
|
-
const { runOpenClaw } = await import('./runOpenClaw
|
|
13922
|
+
const { runOpenClaw } = await import('./runOpenClaw--nbqTW3K.mjs');
|
|
13867
13923
|
let startedBy = void 0;
|
|
13868
13924
|
let verbose = false;
|
|
13869
13925
|
let gatewayUrl;
|
|
@@ -13914,7 +13970,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
|
|
|
13914
13970
|
return;
|
|
13915
13971
|
} else if (subcommand === "mcp" && args.length === 1) {
|
|
13916
13972
|
try {
|
|
13917
|
-
const { handleMcpCommand } = await import('./mcp-
|
|
13973
|
+
const { handleMcpCommand } = await import('./mcp-C3MiqObi.mjs');
|
|
13918
13974
|
await handleMcpCommand();
|
|
13919
13975
|
} catch (error) {
|
|
13920
13976
|
process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
|
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -5,8 +5,8 @@ var path = require('node:path');
|
|
|
5
5
|
var os = require('node:os');
|
|
6
6
|
var node_child_process = require('node:child_process');
|
|
7
7
|
var chalk = require('chalk');
|
|
8
|
-
var persistence = require('./types-
|
|
9
|
-
var index = require('./index-
|
|
8
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
9
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
10
10
|
require('axios');
|
|
11
11
|
require('node:util');
|
|
12
12
|
require('node:fs/promises');
|
|
@@ -3,8 +3,8 @@ import { join, resolve } from 'node:path';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { spawnSync } from 'node:child_process';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import { p as projectPath } from './types-
|
|
7
|
-
import { t as tmuxSupportsSessionEnv } from './index-
|
|
6
|
+
import { p as projectPath } from './types-BKyjG23_.mjs';
|
|
7
|
+
import { t as tmuxSupportsSessionEnv } from './index-UCYD5Wk3.mjs';
|
|
8
8
|
import 'axios';
|
|
9
9
|
import 'node:util';
|
|
10
10
|
import 'node:fs/promises';
|
package/dist/lib.cjs
CHANGED
package/dist/lib.d.cts
CHANGED
|
@@ -45,6 +45,17 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
45
45
|
}, z.core.$strip>, z.ZodObject<{
|
|
46
46
|
t: z.ZodLiteral<"tool-call-end">;
|
|
47
47
|
call: z.ZodString;
|
|
48
|
+
result: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
text: z.ZodString;
|
|
50
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
51
|
+
isError: z.ZodOptional<z.ZodBoolean>;
|
|
52
|
+
stats: z.ZodOptional<z.ZodObject<{
|
|
53
|
+
toolUses: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
55
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
56
|
+
toolStats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
}, z.core.$strip>>;
|
|
48
59
|
}, z.core.$strip>, z.ZodObject<{
|
|
49
60
|
t: z.ZodLiteral<"file">;
|
|
50
61
|
ref: z.ZodString;
|
|
@@ -61,6 +72,8 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
61
72
|
}, z.core.$strip>, z.ZodObject<{
|
|
62
73
|
t: z.ZodLiteral<"start">;
|
|
63
74
|
title: z.ZodOptional<z.ZodString>;
|
|
75
|
+
description: z.ZodOptional<z.ZodString>;
|
|
76
|
+
subagentType: z.ZodOptional<z.ZodString>;
|
|
64
77
|
}, z.core.$strip>, z.ZodObject<{
|
|
65
78
|
t: z.ZodLiteral<"turn-end">;
|
|
66
79
|
status: z.ZodEnum<{
|
|
@@ -80,6 +93,27 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
80
93
|
}, z.core.$strip>>;
|
|
81
94
|
}, z.core.$strip>, z.ZodObject<{
|
|
82
95
|
t: z.ZodLiteral<"stop">;
|
|
96
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
97
|
+
completed: "completed";
|
|
98
|
+
failed: "failed";
|
|
99
|
+
stopped: "stopped";
|
|
100
|
+
}>>;
|
|
101
|
+
result: z.ZodOptional<z.ZodObject<{
|
|
102
|
+
text: z.ZodString;
|
|
103
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
104
|
+
}, z.core.$strip>>;
|
|
105
|
+
usage: z.ZodOptional<z.ZodObject<{
|
|
106
|
+
toolUses: z.ZodOptional<z.ZodNumber>;
|
|
107
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
108
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
109
|
+
}, z.core.$strip>>;
|
|
110
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
111
|
+
t: z.ZodLiteral<"progress">;
|
|
112
|
+
toolUses: z.ZodNumber;
|
|
113
|
+
lastTool: z.ZodOptional<z.ZodString>;
|
|
114
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
115
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
116
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
83
117
|
}, z.core.$strip>], "t">;
|
|
84
118
|
}, z.core.$strip>;
|
|
85
119
|
type SessionEnvelope = z.infer<typeof sessionEnvelopeSchema>;
|
package/dist/lib.d.mts
CHANGED
|
@@ -45,6 +45,17 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
45
45
|
}, z.core.$strip>, z.ZodObject<{
|
|
46
46
|
t: z.ZodLiteral<"tool-call-end">;
|
|
47
47
|
call: z.ZodString;
|
|
48
|
+
result: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
text: z.ZodString;
|
|
50
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
51
|
+
isError: z.ZodOptional<z.ZodBoolean>;
|
|
52
|
+
stats: z.ZodOptional<z.ZodObject<{
|
|
53
|
+
toolUses: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
55
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
56
|
+
toolStats: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
}, z.core.$strip>>;
|
|
48
59
|
}, z.core.$strip>, z.ZodObject<{
|
|
49
60
|
t: z.ZodLiteral<"file">;
|
|
50
61
|
ref: z.ZodString;
|
|
@@ -61,6 +72,8 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
61
72
|
}, z.core.$strip>, z.ZodObject<{
|
|
62
73
|
t: z.ZodLiteral<"start">;
|
|
63
74
|
title: z.ZodOptional<z.ZodString>;
|
|
75
|
+
description: z.ZodOptional<z.ZodString>;
|
|
76
|
+
subagentType: z.ZodOptional<z.ZodString>;
|
|
64
77
|
}, z.core.$strip>, z.ZodObject<{
|
|
65
78
|
t: z.ZodLiteral<"turn-end">;
|
|
66
79
|
status: z.ZodEnum<{
|
|
@@ -80,6 +93,27 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
|
|
|
80
93
|
}, z.core.$strip>>;
|
|
81
94
|
}, z.core.$strip>, z.ZodObject<{
|
|
82
95
|
t: z.ZodLiteral<"stop">;
|
|
96
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
97
|
+
completed: "completed";
|
|
98
|
+
failed: "failed";
|
|
99
|
+
stopped: "stopped";
|
|
100
|
+
}>>;
|
|
101
|
+
result: z.ZodOptional<z.ZodObject<{
|
|
102
|
+
text: z.ZodString;
|
|
103
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
104
|
+
}, z.core.$strip>>;
|
|
105
|
+
usage: z.ZodOptional<z.ZodObject<{
|
|
106
|
+
toolUses: z.ZodOptional<z.ZodNumber>;
|
|
107
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
108
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
109
|
+
}, z.core.$strip>>;
|
|
110
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
111
|
+
t: z.ZodLiteral<"progress">;
|
|
112
|
+
toolUses: z.ZodNumber;
|
|
113
|
+
lastTool: z.ZodOptional<z.ZodString>;
|
|
114
|
+
totalTokens: z.ZodOptional<z.ZodNumber>;
|
|
115
|
+
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
116
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
83
117
|
}, z.core.$strip>], "t">;
|
|
84
118
|
}, z.core.$strip>;
|
|
85
119
|
type SessionEnvelope = z.infer<typeof sessionEnvelopeSchema>;
|
package/dist/lib.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-
|
|
1
|
+
export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-BKyjG23_.mjs';
|
|
2
2
|
import 'axios';
|
|
3
3
|
import 'chalk';
|
|
4
4
|
import 'node:util';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { p as pushClipboardViaDaemon } from './index-
|
|
4
|
+
import { p as pushClipboardViaDaemon } from './index-UCYD5Wk3.mjs';
|
|
5
5
|
import { C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, c as CLIPBOARD_MAX_BYTES } from './limits-CwFb5S2b.mjs';
|
|
6
|
-
import { l as logger } from './types-
|
|
6
|
+
import { l as logger } from './types-BKyjG23_.mjs';
|
|
7
7
|
import 'chalk';
|
|
8
8
|
import 'node:os';
|
|
9
9
|
import 'node:crypto';
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
4
4
|
var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
5
5
|
var z = require('zod');
|
|
6
|
-
var index = require('./index-
|
|
6
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
7
7
|
var limits = require('./limits-KdWKmwtH.cjs');
|
|
8
|
-
var persistence = require('./types-
|
|
8
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
9
9
|
require('chalk');
|
|
10
10
|
require('node:os');
|
|
11
11
|
require('node:crypto');
|
|
@@ -2,10 +2,10 @@ import { useStdout, useInput, Box, Text, render } from 'ink';
|
|
|
2
2
|
import React, { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-
|
|
6
|
-
import { g as GEMINI_API_KEY_ENV, j as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, k as BaseReasoningProcessor, i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, l as MessageBuffer, C as CHANGE_TITLE_INSTRUCTION, r as registerKillSessionHandler, f as startHappyServer } from './index-
|
|
7
|
-
import { A as AcpBackend } from './AcpBackend-
|
|
8
|
-
import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-
|
|
5
|
+
import { l as logger, h as connectionState, A as ApiClient, i as readSettings, e as errorLogMetadata, j as encodeBase64, p as projectPath, d as contentLogMetadata } from './types-BKyjG23_.mjs';
|
|
6
|
+
import { g as GEMINI_API_KEY_ENV, j as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, k as BaseReasoningProcessor, i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, l as MessageBuffer, C as CHANGE_TITLE_INSTRUCTION, r as registerKillSessionHandler, f as startHappyServer } from './index-UCYD5Wk3.mjs';
|
|
7
|
+
import { A as AcpBackend } from './AcpBackend-B5RRlzLU.mjs';
|
|
8
|
+
import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-ra8iKxdU.mjs';
|
|
9
9
|
import 'axios';
|
|
10
10
|
import 'chalk';
|
|
11
11
|
import 'node:util';
|
|
@@ -4,10 +4,10 @@ var ink = require('ink');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var node_crypto = require('node:crypto');
|
|
6
6
|
var path = require('node:path');
|
|
7
|
-
var persistence = require('./types-
|
|
8
|
-
var index = require('./index-
|
|
9
|
-
var AcpBackend = require('./AcpBackend-
|
|
10
|
-
var config = require('./config-
|
|
7
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
8
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
9
|
+
var AcpBackend = require('./AcpBackend-GqveWg8u.cjs');
|
|
10
|
+
var config = require('./config-C4NCw7Dz.cjs');
|
|
11
11
|
require('axios');
|
|
12
12
|
require('chalk');
|
|
13
13
|
require('node:util');
|
|
@@ -3,9 +3,9 @@ import { execFileSync } from 'node:child_process';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { existsSync, readFileSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { k as ensurePrivateDirectorySync, m as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, c as configuration } from './types-
|
|
7
|
-
import { A as AcpSessionManager } from './AcpSessionManager-
|
|
8
|
-
import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-
|
|
6
|
+
import { k as ensurePrivateDirectorySync, m as hardenPrivateFileSync, w as writePrivateFileSync, e as errorLogMetadata, d as contentLogMetadata, h as connectionState, A as ApiClient, i as readSettings, j as encodeBase64, l as logger, c as configuration } from './types-BKyjG23_.mjs';
|
|
7
|
+
import { A as AcpSessionManager } from './AcpSessionManager-Ij1pI5Ex.mjs';
|
|
8
|
+
import { i as initialMachineMetadata, d as createSessionMetadata, e as setupOfflineReconnection, n as notifyDaemonSessionStarted, M as MessageQueue2, r as registerKillSessionHandler } from './index-UCYD5Wk3.mjs';
|
|
9
9
|
import WebSocket from 'ws';
|
|
10
10
|
import * as ed from '@noble/ed25519';
|
|
11
11
|
import { sha512 } from '@noble/hashes/sha2.js';
|
|
@@ -5,9 +5,9 @@ var node_child_process = require('node:child_process');
|
|
|
5
5
|
var os = require('node:os');
|
|
6
6
|
var node_fs = require('node:fs');
|
|
7
7
|
var path = require('node:path');
|
|
8
|
-
var persistence = require('./types-
|
|
9
|
-
var AcpSessionManager = require('./AcpSessionManager-
|
|
10
|
-
var index = require('./index-
|
|
8
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
9
|
+
var AcpSessionManager = require('./AcpSessionManager-YcrSZwvq.cjs');
|
|
10
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
11
11
|
var WebSocket = require('ws');
|
|
12
12
|
var ed = require('@noble/ed25519');
|
|
13
13
|
var sha2_js = require('@noble/hashes/sha2.js');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { r as readPersistedSessions, c as configuration } from './types-
|
|
5
|
-
import { b as sendUserMessage, a as sessionWebUrl } from './index-
|
|
4
|
+
import { r as readPersistedSessions, c as configuration } from './types-BKyjG23_.mjs';
|
|
5
|
+
import { b as sendUserMessage, a as sessionWebUrl } from './index-UCYD5Wk3.mjs';
|
|
6
6
|
import 'axios';
|
|
7
7
|
import 'node:util';
|
|
8
8
|
import 'node:os';
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var persistence = require('./types-
|
|
7
|
-
var index = require('./index-
|
|
6
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
7
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
8
8
|
require('axios');
|
|
9
9
|
require('node:util');
|
|
10
10
|
require('node:os');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { readFileSync, statSync } from 'node:fs';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-
|
|
5
|
-
import { l as logger } from './types-
|
|
4
|
+
import { c as checkIfDaemonRunningAndCleanupStaleState, s as spawnDaemonSession, a as sessionWebUrl, w as waitForSessionKey, b as sendUserMessage } from './index-UCYD5Wk3.mjs';
|
|
5
|
+
import { l as logger } from './types-BKyjG23_.mjs';
|
|
6
6
|
import 'node:os';
|
|
7
7
|
import 'node:crypto';
|
|
8
8
|
import 'cross-spawn';
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
4
|
var node_fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var persistence = require('./types-
|
|
6
|
+
var index = require('./index-FkXJNwiy.cjs');
|
|
7
|
+
var persistence = require('./types-ClDADuxP.cjs');
|
|
8
8
|
require('node:os');
|
|
9
9
|
require('node:crypto');
|
|
10
10
|
require('cross-spawn');
|