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.
Files changed (37) hide show
  1. package/dist/{AcpBackend-CfKPvoTU.mjs → AcpBackend-Bk9b823B.mjs} +116 -12
  2. package/dist/{AcpBackend-CauAQpC1.cjs → AcpBackend-p_KNJkHc.cjs} +116 -12
  3. package/dist/{AcpSessionManager-CA6xeET_.cjs → AcpSessionManager-B9FTbpGQ.cjs} +15 -2
  4. package/dist/{AcpSessionManager-BQ6pBRW4.mjs → AcpSessionManager-CDvqVHKf.mjs} +15 -2
  5. package/dist/{config-BpR_CwZu.mjs → config-CIpgmGLR.mjs} +2 -2
  6. package/dist/{config-BoteFn-v.cjs → config-CkUn1dI4.cjs} +2 -2
  7. package/dist/{index-C45xN8s0.mjs → index-B6cpyG_G.mjs} +78 -8
  8. package/dist/{index-D7azxfcs.mjs → index-BUVQf9PI.mjs} +2 -2
  9. package/dist/{index-4jiUeiUz.cjs → index-BXOXRblP.cjs} +513 -47
  10. package/dist/{index-DWmhmji9.cjs → index-BzgtwTxC.cjs} +77 -7
  11. package/dist/{index-lX1UliOs.cjs → index-CxjX8DGz.cjs} +2 -2
  12. package/dist/{index-Dq-eFp89.mjs → index-DIXjhnV1.mjs} +502 -45
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.mjs +2 -2
  15. package/dist/{installTerminalHooks-k3TrBHD0.mjs → installTerminalHooks-BAa6LaQQ.mjs} +2 -2
  16. package/dist/{installTerminalHooks-DnaFkrTF.cjs → installTerminalHooks-lXQa6bQU.cjs} +2 -2
  17. package/dist/lib.cjs +1 -1
  18. package/dist/lib.d.cts +43 -1
  19. package/dist/lib.d.mts +43 -1
  20. package/dist/lib.mjs +1 -1
  21. package/dist/{mcp-DSpEpM_2.cjs → mcp-DMD7FxBI.cjs} +62 -16
  22. package/dist/{mcp-DRePTOap.mjs → mcp-Dwc299mU.mjs} +62 -17
  23. package/dist/{runGemini-_9-a7duU.mjs → runGemini-BaxGXE9w.mjs} +4 -4
  24. package/dist/{runGemini-IWHyBq0A.cjs → runGemini-Bj4Egq7j.cjs} +4 -4
  25. package/dist/{runOpenClaw-0myYIz1U.cjs → runOpenClaw-BJhSvXYy.cjs} +3 -3
  26. package/dist/{runOpenClaw-Boq6LQ9a.mjs → runOpenClaw-BwJhbIKU.mjs} +3 -3
  27. package/dist/{send-CwWvFfay.cjs → send-BWGUkWhi.cjs} +2 -2
  28. package/dist/{send-Cyo6mgMl.mjs → send-DX13svrS.mjs} +2 -2
  29. package/dist/sessions-CGhpBNqn.cjs +322 -0
  30. package/dist/sessions-L7O3ypda.mjs +317 -0
  31. package/dist/{spawn-DQ6FTUK9.cjs → spawn-CbY233Eg.cjs} +6 -7
  32. package/dist/{spawn-CU0DMauA.mjs → spawn-DPDWZdoW.mjs} +3 -4
  33. package/dist/{types-Ds0SiQ1D.mjs → types-BtuOM9lw.mjs} +52 -19
  34. package/dist/{types-C5kEpkcZ.cjs → types-ClvvHves.cjs} +54 -19
  35. package/package.json +7 -7
  36. package/dist/sessions-CbzqYiAy.cjs +0 -204
  37. package/dist/sessions-lvfTH_ql.mjs +0 -200
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var AcpBackend = require('./AcpBackend-CauAQpC1.cjs');
4
- var persistence = require('./types-C5kEpkcZ.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-CA6xeET_.cjs');
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-4jiUeiUz.cjs');
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
- return id.includes("mode") || id.includes("permission") || name.includes("mode") || name.includes("permission");
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 happyServer = await index.startHappyServer(session);
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-4jiUeiUz.cjs');
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-C5kEpkcZ.cjs');
8
+ require('./types-ClvvHves.cjs');
9
9
  require('axios');
10
10
  require('node:util');
11
11
  require('node:fs');