very-happy-cli 0.2.116 → 0.2.118
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-CfKPvoTU.mjs → AcpBackend-Bk9b823B.mjs} +116 -12
- package/dist/{AcpBackend-CauAQpC1.cjs → AcpBackend-p_KNJkHc.cjs} +116 -12
- package/dist/{AcpSessionManager-CA6xeET_.cjs → AcpSessionManager-B9FTbpGQ.cjs} +15 -2
- package/dist/{AcpSessionManager-BQ6pBRW4.mjs → AcpSessionManager-CDvqVHKf.mjs} +15 -2
- package/dist/{config-BpR_CwZu.mjs → config-CIpgmGLR.mjs} +2 -2
- package/dist/{config-BoteFn-v.cjs → config-CkUn1dI4.cjs} +2 -2
- package/dist/{index-C45xN8s0.mjs → index-B6cpyG_G.mjs} +78 -8
- package/dist/{index-D7azxfcs.mjs → index-BUVQf9PI.mjs} +2 -2
- package/dist/{index-4jiUeiUz.cjs → index-BXOXRblP.cjs} +513 -47
- package/dist/{index-DWmhmji9.cjs → index-BzgtwTxC.cjs} +77 -7
- package/dist/{index-lX1UliOs.cjs → index-CxjX8DGz.cjs} +2 -2
- package/dist/{index-Dq-eFp89.mjs → index-DIXjhnV1.mjs} +502 -45
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{installTerminalHooks-k3TrBHD0.mjs → installTerminalHooks-BAa6LaQQ.mjs} +2 -2
- package/dist/{installTerminalHooks-DnaFkrTF.cjs → installTerminalHooks-lXQa6bQU.cjs} +2 -2
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +43 -1
- package/dist/lib.d.mts +43 -1
- package/dist/lib.mjs +1 -1
- package/dist/{mcp-DSpEpM_2.cjs → mcp-DMD7FxBI.cjs} +62 -16
- package/dist/{mcp-DRePTOap.mjs → mcp-Dwc299mU.mjs} +62 -17
- package/dist/{runGemini-_9-a7duU.mjs → runGemini-BaxGXE9w.mjs} +4 -4
- package/dist/{runGemini-IWHyBq0A.cjs → runGemini-Bj4Egq7j.cjs} +4 -4
- package/dist/{runOpenClaw-0myYIz1U.cjs → runOpenClaw-BJhSvXYy.cjs} +3 -3
- package/dist/{runOpenClaw-Boq6LQ9a.mjs → runOpenClaw-BwJhbIKU.mjs} +3 -3
- package/dist/{send-CwWvFfay.cjs → send-BWGUkWhi.cjs} +2 -2
- package/dist/{send-Cyo6mgMl.mjs → send-DX13svrS.mjs} +2 -2
- package/dist/sessions-CGhpBNqn.cjs +322 -0
- package/dist/sessions-L7O3ypda.mjs +317 -0
- package/dist/{spawn-DQ6FTUK9.cjs → spawn-CbY233Eg.cjs} +6 -7
- package/dist/{spawn-CU0DMauA.mjs → spawn-DPDWZdoW.mjs} +3 -4
- package/dist/{types-Ds0SiQ1D.mjs → types-BtuOM9lw.mjs} +52 -19
- package/dist/{types-C5kEpkcZ.cjs → types-ClvvHves.cjs} +54 -19
- package/package.json +7 -7
- package/dist/sessions-CbzqYiAy.cjs +0 -204
- package/dist/sessions-lvfTH_ql.mjs +0 -200
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var AcpBackend = require('./AcpBackend-
|
|
4
|
-
var persistence = require('./types-
|
|
5
|
-
var AcpSessionManager = require('./AcpSessionManager-
|
|
3
|
+
var AcpBackend = require('./AcpBackend-p_KNJkHc.cjs');
|
|
4
|
+
var persistence = require('./types-ClvvHves.cjs');
|
|
5
|
+
var AcpSessionManager = require('./AcpSessionManager-B9FTbpGQ.cjs');
|
|
6
6
|
var node_crypto = require('node:crypto');
|
|
7
7
|
var path = require('node:path');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-BXOXRblP.cjs');
|
|
9
9
|
require('node:child_process');
|
|
10
10
|
require('@agentclientprotocol/sdk');
|
|
11
11
|
require('axios');
|
|
@@ -484,12 +484,16 @@ function extractConfigSelector(configOptions, category) {
|
|
|
484
484
|
if (option.category === category) {
|
|
485
485
|
return true;
|
|
486
486
|
}
|
|
487
|
+
if (option.category) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
487
490
|
const id = normalizeComparable(option.id);
|
|
488
491
|
const name = normalizeComparable(option.name);
|
|
489
492
|
if (category === "model") {
|
|
490
493
|
return id.includes("model") || name.includes("model");
|
|
491
494
|
}
|
|
492
|
-
|
|
495
|
+
const mentionsMode = (value) => value.includes("permission") || value.includes("mode") && !value.includes("model");
|
|
496
|
+
return mentionsMode(id) || mentionsMode(name);
|
|
493
497
|
};
|
|
494
498
|
for (const option of configOptions) {
|
|
495
499
|
if (option.type !== "select" || !optionMatchesCategory(option)) {
|
|
@@ -644,7 +648,27 @@ async function runAcp(opts) {
|
|
|
644
648
|
let sawSlashCommands = false;
|
|
645
649
|
let sawModes = false;
|
|
646
650
|
let sawModels = false;
|
|
647
|
-
const
|
|
651
|
+
const initialPermissionMode = opts.permissionMode ?? "default";
|
|
652
|
+
let fileBackedModeActive = false;
|
|
653
|
+
const permissionModeIsFileBacked = () => opts.agentName === "pi" || !modeSelector && !legacyModes;
|
|
654
|
+
let fileBackedPermissionMode = null;
|
|
655
|
+
const publishFileBackedPermissionMode = (mode) => {
|
|
656
|
+
if (fileBackedPermissionMode === mode) {
|
|
657
|
+
return true;
|
|
658
|
+
}
|
|
659
|
+
try {
|
|
660
|
+
index.writeSessionModeFile(session.sessionId, mode);
|
|
661
|
+
} catch (error) {
|
|
662
|
+
persistence.logger.debug(`[${opts.agentName}] Failed to write session mode file:`, error);
|
|
663
|
+
return false;
|
|
664
|
+
}
|
|
665
|
+
fileBackedPermissionMode = mode;
|
|
666
|
+
session.updateMetadata((currentMetadata) => ({ ...currentMetadata, permissionMode: mode }));
|
|
667
|
+
persistence.logger.debug(`[${opts.agentName}] Published file-backed permission mode: ${mode}`);
|
|
668
|
+
return true;
|
|
669
|
+
};
|
|
670
|
+
const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
|
|
671
|
+
const happyServer = await index.startHappyServer(session, { assistant: isAssistantVariant });
|
|
648
672
|
const mcpServers = {
|
|
649
673
|
happy: {
|
|
650
674
|
command: path.join(persistence.projectPath(), "bin", "happy-mcp.mjs"),
|
|
@@ -656,6 +680,11 @@ async function runAcp(opts) {
|
|
|
656
680
|
cwd: process.cwd(),
|
|
657
681
|
command: opts.command,
|
|
658
682
|
args: opts.args,
|
|
683
|
+
env: {
|
|
684
|
+
HAPPY_MCP_URL: happyServer.url,
|
|
685
|
+
HAPPY_SESSION_ID: session.sessionId,
|
|
686
|
+
HAPPY_PERMISSION_MODE: initialPermissionMode
|
|
687
|
+
},
|
|
659
688
|
mcpServers,
|
|
660
689
|
permissionHandler,
|
|
661
690
|
transportHandler: new AcpBackend.DefaultTransport(opts.agentName),
|
|
@@ -709,6 +738,15 @@ async function runAcp(opts) {
|
|
|
709
738
|
if (!requestedMode) {
|
|
710
739
|
return;
|
|
711
740
|
}
|
|
741
|
+
if (permissionModeIsFileBacked()) {
|
|
742
|
+
const mode = index.normalizeAcpPermissionMode(requestedMode);
|
|
743
|
+
if (!mode) {
|
|
744
|
+
persistence.logger.debug(`[${opts.agentName}] Ignoring unknown file-backed permission mode request: ${requestedMode}`);
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
publishFileBackedPermissionMode(mode);
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
712
750
|
if (modeSelector) {
|
|
713
751
|
const resolved = resolveRequestedCode(modeSelector.options, requestedMode);
|
|
714
752
|
if (!resolved) {
|
|
@@ -906,6 +944,7 @@ async function runAcp(opts) {
|
|
|
906
944
|
clearPendingTurn();
|
|
907
945
|
}
|
|
908
946
|
if (msg.status === "error" || msg.status === "stopped") {
|
|
947
|
+
if (msg.status === "error") opts.onBackendError?.(msg.detail);
|
|
909
948
|
stopRunnerFromBackendStatus(msg.status, msg.detail);
|
|
910
949
|
}
|
|
911
950
|
}
|
|
@@ -919,10 +958,12 @@ async function runAcp(opts) {
|
|
|
919
958
|
sendEnvelopes(sessionManager.mapMessage(msg));
|
|
920
959
|
};
|
|
921
960
|
backend.onMessage(onBackendMessage);
|
|
961
|
+
const titleGenerator = new index.TitleGenerator(session);
|
|
922
962
|
session.onUserMessage((message) => {
|
|
923
963
|
if (!message.content.text) {
|
|
924
964
|
return;
|
|
925
965
|
}
|
|
966
|
+
titleGenerator.maybeGenerate(message.content.text);
|
|
926
967
|
if (typeof message.meta?.permissionMode === "string") {
|
|
927
968
|
currentPermissionMode = message.meta.permissionMode;
|
|
928
969
|
persistence.logger.debug(`[${opts.agentName}] Requested ACP permission mode: ${currentPermissionMode}`);
|
|
@@ -954,6 +995,22 @@ async function runAcp(opts) {
|
|
|
954
995
|
}
|
|
955
996
|
}
|
|
956
997
|
session.rpcHandlerManager.registerHandler("abort", handleAbort);
|
|
998
|
+
session.rpcHandlerManager.registerHandler(
|
|
999
|
+
"set-permission-mode",
|
|
1000
|
+
async (request) => {
|
|
1001
|
+
if (!fileBackedModeActive) {
|
|
1002
|
+
throw new Error(`${opts.agentName} does not support live permission mode changes`);
|
|
1003
|
+
}
|
|
1004
|
+
const mode = typeof request?.mode === "string" ? index.normalizeAcpPermissionMode(request.mode) : null;
|
|
1005
|
+
if (!mode) {
|
|
1006
|
+
throw new Error("Invalid permission mode");
|
|
1007
|
+
}
|
|
1008
|
+
if (!publishFileBackedPermissionMode(mode)) {
|
|
1009
|
+
throw new Error("Failed to write session mode file");
|
|
1010
|
+
}
|
|
1011
|
+
return { mode };
|
|
1012
|
+
}
|
|
1013
|
+
);
|
|
957
1014
|
index.registerKillSessionHandler(session.rpcHandlerManager, async () => {
|
|
958
1015
|
shouldExit = true;
|
|
959
1016
|
messageQueue.close();
|
|
@@ -963,6 +1020,10 @@ async function runAcp(opts) {
|
|
|
963
1020
|
try {
|
|
964
1021
|
const started = await backend.startSession();
|
|
965
1022
|
acpSessionId = started.sessionId;
|
|
1023
|
+
if (permissionModeIsFileBacked()) {
|
|
1024
|
+
fileBackedModeActive = true;
|
|
1025
|
+
publishFileBackedPermissionMode(initialPermissionMode);
|
|
1026
|
+
}
|
|
966
1027
|
if (verbose) {
|
|
967
1028
|
if (!sawSlashCommands) {
|
|
968
1029
|
logAcp("muted", `Outgoing slash commands from ${opts.agentName}: not reported yet`);
|
|
@@ -1025,6 +1086,13 @@ async function runAcp(opts) {
|
|
|
1025
1086
|
}
|
|
1026
1087
|
backend.offMessage?.(onBackendMessage);
|
|
1027
1088
|
await backend.dispose();
|
|
1089
|
+
if (fileBackedPermissionMode) {
|
|
1090
|
+
try {
|
|
1091
|
+
index.removeSessionModeFile(session.sessionId);
|
|
1092
|
+
} catch (error) {
|
|
1093
|
+
persistence.logger.debug(`[${opts.agentName}] Failed to remove session mode file:`, error);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1028
1096
|
try {
|
|
1029
1097
|
happyServer.stop();
|
|
1030
1098
|
} catch (error) {
|
|
@@ -1047,9 +1115,11 @@ async function runAcp(opts) {
|
|
|
1047
1115
|
}
|
|
1048
1116
|
}
|
|
1049
1117
|
|
|
1118
|
+
const PI_ACP_COMMAND = "pi-acp";
|
|
1050
1119
|
const KNOWN_ACP_AGENTS = {
|
|
1051
1120
|
gemini: { command: "gemini", args: ["--experimental-acp"] },
|
|
1052
|
-
opencode: { command: "opencode", args: ["acp"] }
|
|
1121
|
+
opencode: { command: "opencode", args: ["acp"] },
|
|
1122
|
+
pi: { command: PI_ACP_COMMAND, args: [] }
|
|
1053
1123
|
};
|
|
1054
1124
|
function resolveAcpAgentConfig(cliArgs) {
|
|
1055
1125
|
if (cliArgs.length === 0) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-BXOXRblP.cjs');
|
|
4
4
|
var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
|
|
5
5
|
require('chalk');
|
|
6
6
|
require('node:os');
|
|
7
7
|
require('node:crypto');
|
|
8
|
-
require('./types-
|
|
8
|
+
require('./types-ClvvHves.cjs');
|
|
9
9
|
require('axios');
|
|
10
10
|
require('node:util');
|
|
11
11
|
require('node:fs');
|