very-happy-cli 0.2.141 → 0.2.142

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 (57) hide show
  1. package/dist/{AcpBackend-CWmjboOm.mjs → AcpBackend-D2LqY2to.mjs} +2 -2
  2. package/dist/{AcpBackend-CnWSwaHk.cjs → AcpBackend-DJsqfgjD.cjs} +2 -2
  3. package/dist/{AcpSessionManager-Dxt78rPO.cjs → AcpSessionManager-CTfDxziP.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CtXoi6PN.mjs → AcpSessionManager-CdeM5KD9.mjs} +1 -1
  5. package/dist/{agentGuidance-B9ENxSaS.cjs → agentGuidance-Bi8iBjy3.cjs} +1 -1
  6. package/dist/{agentGuidance-Do7cQka3.mjs → agentGuidance-Cz8QVcX3.mjs} +1 -1
  7. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  8. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  9. package/dist/{config-Dn7nAHcA.cjs → config-BIbYBmTd.cjs} +5 -4
  10. package/dist/{config-DY57frJF.mjs → config-ZsBeq10u.mjs} +5 -4
  11. package/dist/{index-3STVDtNO.cjs → index-BPTPrjhL.cjs} +12 -40
  12. package/dist/{index-BSVgut_Y.cjs → index-Bom8mTuS.cjs} +5 -4
  13. package/dist/{index-DhfgAB8K.mjs → index-CNARLBax.mjs} +5 -4
  14. package/dist/{index-ChWePQEd.cjs → index-CSQZhQ0C.cjs} +180 -128
  15. package/dist/{index-Dz6FgNFg.mjs → index-CY0zmhIp.mjs} +11 -39
  16. package/dist/{index-C55sW8E9.mjs → index-CYFendNf.mjs} +161 -110
  17. package/dist/index.cjs +7 -6
  18. package/dist/index.mjs +7 -6
  19. package/dist/installPiTools-BKnXjrVu.cjs +82 -0
  20. package/dist/installPiTools-C-Lxv4Bt.mjs +77 -0
  21. package/dist/{installTerminalHooks-zmtIrf3E.mjs → installTerminalHooks-BPJu2WVz.mjs} +8 -7
  22. package/dist/{installTerminalHooks--jkP17uE.cjs → installTerminalHooks-DA7SyFYW.cjs} +9 -8
  23. package/dist/lib.cjs +3 -2
  24. package/dist/lib.d.cts +6 -1
  25. package/dist/lib.d.mts +6 -1
  26. package/dist/lib.mjs +3 -2
  27. package/dist/{limits-DbLWXlJm.cjs → limits-B3hngubn.cjs} +29 -10
  28. package/dist/{limits-DT5Yk_UH.mjs → limits-CHsz3Ba-.mjs} +29 -11
  29. package/dist/{mcp-Bzy-X9kI.mjs → mcp-BkWBRWFe.mjs} +28 -14
  30. package/dist/{mcp-kE0n1dBF.cjs → mcp-ySrfNOYl.cjs} +29 -15
  31. package/dist/piExtension.d.mts +17 -0
  32. package/dist/piExtension.mjs +84 -0
  33. package/dist/piRuntime-DBLUyXFr.mjs +37 -0
  34. package/dist/piRuntime-uX0WHVr4.cjs +39 -0
  35. package/dist/piTerminal-Bc3jSCnY.mjs +129 -0
  36. package/dist/piTerminal-DNr3hkzY.cjs +132 -0
  37. package/dist/projectPath-CSpqWdxp.mjs +10 -0
  38. package/dist/projectPath-ChLhdOyt.cjs +13 -0
  39. package/dist/{runGemini-CxUz95A1.cjs → runGemini-eJ08cXk7.cjs} +9 -8
  40. package/dist/{runGemini-BmdhYEzM.mjs → runGemini-rgFHTnG7.mjs} +8 -7
  41. package/dist/{runOpenClaw-RLIFJx61.cjs → runOpenClaw-D0LVzxqM.cjs} +6 -5
  42. package/dist/{runOpenClaw-CYpO3Vv8.mjs → runOpenClaw-GjLWwjas.mjs} +6 -5
  43. package/dist/{send-BGcCrMUT.cjs → send-Bg2oqt7f.cjs} +5 -4
  44. package/dist/{send-DT04hV8o.mjs → send-DV8liaRN.mjs} +5 -4
  45. package/dist/{sessions-Jt9lrcrG.cjs → sessions-DPimBZ8H.cjs} +7 -6
  46. package/dist/{sessions-DDWTq2AG.mjs → sessions-JiL4aJkC.mjs} +7 -6
  47. package/dist/{spawn-CdZgvthE.cjs → spawn-COOcUwkG.cjs} +5 -4
  48. package/dist/{spawn-Ca0A70dX.mjs → spawn-CnMk3LFG.mjs} +5 -4
  49. package/dist/{teams-DfVwVZ4x.cjs → teams-DSQgHBLE.cjs} +5 -4
  50. package/dist/{teams-CzK1zg0m.mjs → teams-uHZcdX9j.mjs} +5 -4
  51. package/dist/terminalToolContext-CFeGeaNm.mjs +7 -0
  52. package/dist/terminalToolContext-DoV9Gs7K.cjs +9 -0
  53. package/dist/{todo-D9nFaYpQ.cjs → todo-DeauuUd6.cjs} +4 -3
  54. package/dist/{todo-4WhOom8k.mjs → todo-oHWNpEx_.mjs} +4 -3
  55. package/dist/{types-CLosaeZT.mjs → types-Dnoxgb7G.mjs} +30 -13
  56. package/dist/{types-Bk3W89Z3.cjs → types-Xd_LJRJN.cjs} +31 -15
  57. package/package.json +11 -7
@@ -1,14 +1,16 @@
1
- import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-CWmjboOm.mjs';
2
- export { a as DEFAULT_IDLE_TIMEOUT_MS, b as DEFAULT_TOOL_CALL_TIMEOUT_MS, e as extractErrorDetail, f as formatDuration, c as formatDurationMinutes, h as handleAgentMessageChunk, d as handleAgentThoughtChunk, g as handleLegacyMessageChunk, i as handlePlanUpdate, j as handleThinkingUpdate, k as handleToolCall, l as handleToolCallUpdate, p as parseArgsFromContent } from './AcpBackend-CWmjboOm.mjs';
3
- import { c as configuration, g as readSettings, i as encodeBase64, l as logger } from './limits-DT5Yk_UH.mjs';
4
- import { A as AcpSessionManager } from './AcpSessionManager-CtXoi6PN.mjs';
5
- import { k as connectionState, A as ApiClient, n as notifyDaemonSessionStarted, p as projectPath, l as BUILTIN_TODO_DISCOVERY } from './types-CLosaeZT.mjs';
6
- import { P as PI_TEAMS_EXTENSION, j as initialMachineMetadata, k as createSessionMetadata, m as setupOfflineReconnection, p as StreamRelay, n as MessageQueue2, u as hashObject, v as startHappyServer, x as registerAgentAttachmentDownloads, y as TitleGenerator, o as registerKillSessionHandler, C as CLAUDE_ATTACHMENT_KINDS, z as stageClaudeAttachments, B as appendStagedAttachmentsToPrompt, E as BasePermissionHandler, F as writeSessionModeFile, H as normalizeAcpPermissionMode, I as removeSessionModeFile } from './index-C55sW8E9.mjs';
7
- import { mkdir, chmod, writeFile, rename } from 'node:fs/promises';
1
+ import { D as DefaultTransport, A as AcpBackend } from './AcpBackend-D2LqY2to.mjs';
2
+ export { a as DEFAULT_IDLE_TIMEOUT_MS, b as DEFAULT_TOOL_CALL_TIMEOUT_MS, e as extractErrorDetail, f as formatDuration, c as formatDurationMinutes, h as handleAgentMessageChunk, d as handleAgentThoughtChunk, g as handleLegacyMessageChunk, i as handlePlanUpdate, j as handleThinkingUpdate, k as handleToolCall, l as handleToolCallUpdate, p as parseArgsFromContent } from './AcpBackend-D2LqY2to.mjs';
3
+ import { f as readSettings, g as encodeBase64, l as logger, c as configuration } from './limits-CHsz3Ba-.mjs';
4
+ import { A as AcpSessionManager } from './AcpSessionManager-CdeM5KD9.mjs';
5
+ import { h as connectionState, A as ApiClient, n as notifyDaemonSessionStarted, j as BUILTIN_TODO_DISCOVERY } from './types-Dnoxgb7G.mjs';
6
+ import { k as initialMachineMetadata, m as createSessionMetadata, n as setupOfflineReconnection, o as StreamRelay, p as MessageQueue2, u as hashObject, v as startHappyServer, x as registerAgentAttachmentDownloads, T as TitleGenerator, y as registerKillSessionHandler, C as CLAUDE_ATTACHMENT_KINDS, z as stageClaudeAttachments, B as appendStagedAttachmentsToPrompt, E as BasePermissionHandler, F as writeSessionModeFile, H as normalizeAcpPermissionMode, I as removeSessionModeFile } from './index-CYFendNf.mjs';
7
+ import { p as preparePiTeamsRuntime } from './piRuntime-DBLUyXFr.mjs';
8
8
  import { randomUUID } from 'node:crypto';
9
9
  import { join } from 'node:path';
10
+ import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
10
11
  import 'node:child_process';
11
12
  import '@agentclientprotocol/sdk';
13
+ import 'node:fs/promises';
12
14
  import 'node:fs';
13
15
  import 'node:os';
14
16
  import 'zod';
@@ -25,14 +27,13 @@ import 'fs/promises';
25
27
  import 'crypto';
26
28
  import 'path';
27
29
  import 'cross-spawn';
28
- import 'url';
29
30
  import 'os';
30
31
  import 'node-pty';
31
32
  import 'fs';
32
33
  import 'node:readline';
33
34
  import '@anthropic-ai/sandbox-runtime';
34
35
  import 'expo-server-sdk';
35
- import './agentGuidance-Do7cQka3.mjs';
36
+ import './agentGuidance-Cz8QVcX3.mjs';
36
37
  import 'ink';
37
38
  import 'react';
38
39
  import '@anthropic-ai/claude-agent-sdk';
@@ -49,6 +50,7 @@ import 'http';
49
50
  import 'inquirer';
50
51
  import 'node:url';
51
52
  import 'node:readline/promises';
53
+ import 'url';
52
54
 
53
55
  function createAcpBackend(options) {
54
56
  const backendOptions = {
@@ -64,36 +66,6 @@ function createAcpBackend(options) {
64
66
  return new AcpBackend(backendOptions);
65
67
  }
66
68
 
67
- async function publish(path, content, mode) {
68
- const temporary = `${path}.${randomUUID()}.new`;
69
- await writeFile(temporary, content, { mode, flag: "wx" });
70
- await rename(temporary, path);
71
- }
72
- async function preparePiTeamsRuntime() {
73
- const directory = join(configuration.happyHomeDir, "teams", "pi-runtime");
74
- await mkdir(directory, { recursive: true, mode: 448 });
75
- const extension = join(directory, "very-happy-teams.mjs");
76
- await publish(extension, PI_TEAMS_EXTENSION, 384);
77
- const launcher = join(directory, "pi-teams.mjs");
78
- const script = `#!${process.execPath}
79
- import { spawn } from 'node:child_process';
80
- const child = spawn(process.env.VH_TEAM_PI_COMMAND || 'pi', ['--extension', ${JSON.stringify(extension)}, ...process.argv.slice(2)], {stdio:'inherit',env:process.env,shell:process.platform==='win32'});
81
- child.on('error',()=>{process.stderr.write('Very Happy could not launch pi\\n');process.exitCode=1});
82
- child.on('exit',(code)=>{process.exitCode=code ?? 1});
83
- for(const signal of ['SIGINT','SIGTERM'])process.on(signal,()=>child.kill(signal));
84
- `;
85
- await publish(launcher, script, 448);
86
- await chmod(launcher, 448);
87
- let command = launcher;
88
- if (process.platform === "win32") {
89
- command = join(directory, "pi-teams.cmd");
90
- await publish(command, `@echo off\r
91
- "${process.execPath}" "${launcher}" %*\r
92
- `, 448);
93
- }
94
- return { PI_ACP_PI_COMMAND: command, VH_TEAM_PI_COMMAND: (process.env.PI_ACP_PI_COMMAND === command ? process.env.VH_TEAM_PI_COMMAND : process.env.PI_ACP_PI_COMMAND) || "pi" };
95
- }
96
-
97
69
  const SUPPORTED_CATEGORIES = /* @__PURE__ */ new Set(["mode", "model", "thought_level"]);
98
70
  function isRecord$1(value) {
99
71
  return !!value && typeof value === "object";
@@ -1,13 +1,14 @@
1
1
  import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(import.meta.url);import chalk from 'chalk';
2
2
  import os, { homedir, userInfo, tmpdir } from 'node:os';
3
3
  import { randomUUID, randomInt, randomBytes, createHash as createHash$1, timingSafeEqual } from 'node:crypto';
4
- import { o as notifyDaemonSessionEvent, q as getProjectPath, l as BUILTIN_TODO_DISCOVERY, p as projectPath, r as initializeSandbox, w as wrapCommand, j as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, m as delay, t as AsyncLock, S as STREAM_DELTA_MAX_CHARS, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, u as notifyDaemonClaudeAuthFailed, v as commandOnPath, c as checkIfDaemonRunningAndCleanupStaleState, x as deriveLocalCliUpdateSummary, y as AGENT_VERSION_SOURCES, z as isClaudeSessionId, C as getLocalHappyAgentCredentialPath, D as readLocalHappyAgentCredentials, E as parseExactVersion, F as compareExactVersions, G as extractCompleteLines, H as decideBackfill, J as parseTerminalHookPayload, K as tmuxArgs, L as scrubTmuxClientEnv, N as decideMirrorBinding, O as MIRROR_BACKFILL_LINES_DEFAULT, P as mirrorLineKey, Q as mirrorLocalId, T as listDaemonSessions, U as stopDaemonSession, V as detectCLIAvailability, W as detectResumeSupport, X as isDaemonRunningCurrentlyInstalledHappyVersion, Y as stopDaemon, Z as TurnActivityTracker, _ as summarizeSpawnSessionForLog, $ as shellescape, A as ApiClient, a0 as fetchCliUpdateState, a1 as resolveCliUpdateCheckInterval, a2 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a3 as cleanupDaemonState, i as isValidSessionId, s as spawnDaemonSession, a4 as listVhTerminals, a5 as isValidTerminalId, a6 as readVhTerminal, a7 as sendToVhTerminal, a8 as ContextUsageSchema, a9 as TITLE_PROMPT_PREFIX, aa as BOARD_ANALYZER_PROMPT_PREFIX, k as connectionState, ab as startOfflineReconnection, n as notifyDaemonSessionStarted, d as createEnvelope, ac as CodexAppServerClient } from './types-CLosaeZT.mjs';
5
- import { l as logger, D as ensurePrivateDirectory, E as hardenPrivateFile, c as configuration, p as packageJson, g as readSettings, F as readCredentials, u as credentialRelayProblem, o as readDaemonState, i as encodeBase64, G as readSettingsOutcome, H as updateSettings, I as encodeBase64Url, m as decodeBase64, J as writeCredentialsLegacy, K as writeCredentialsDataKey, d as readCredentialsForConfiguredRelay, j as encrypt, r as readPersistedSessions, w as writePrivateFileSync, L as decryptWithDataKey, M as decryptLegacy, N as persistSession, k as decrypt, f as ensurePrivateDirectorySync, O as acquireDaemonLock, P as deletePersistedSessions, Q as writeDaemonState, R as writeSettings, S as releaseDaemonLock, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES, T as clearCredentials, U as clearMachineId, V as SandboxConfigSchema, W as getLatestDaemonLog } from './limits-DT5Yk_UH.mjs';
4
+ import { o as notifyDaemonSessionEvent, q as getProjectPath, j as BUILTIN_TODO_DISCOVERY, r as initializeSandbox, w as wrapCommand, l as contentLogMetadata, I as InvalidateSync, R as RawJSONLinesSchema, m as delay, t as AsyncLock, S as STREAM_DELTA_MAX_CHARS, M as MAX_CHAT_ATTACHMENT_SOURCE_BYTES, u as notifyDaemonClaudeAuthFailed, v as commandOnPath, c as checkIfDaemonRunningAndCleanupStaleState, x as deriveLocalCliUpdateSummary, y as AGENT_VERSION_SOURCES, z as isClaudeSessionId, C as getLocalHappyAgentCredentialPath, D as readLocalHappyAgentCredentials, E as parseExactVersion, F as compareExactVersions, G as extractCompleteLines, H as decideBackfill, J as parseTerminalHookPayload, K as tmuxArgs, L as scrubTmuxClientEnv, N as decideMirrorBinding, O as MIRROR_BACKFILL_LINES_DEFAULT, P as mirrorLineKey, Q as mirrorLocalId, T as listDaemonSessions, U as stopDaemonSession, V as detectCLIAvailability, W as detectResumeSupport, X as isDaemonRunningCurrentlyInstalledHappyVersion, Y as stopDaemon, Z as TurnActivityTracker, _ as summarizeSpawnSessionForLog, $ as shellescape, A as ApiClient, a0 as fetchCliUpdateState, a1 as resolveCliUpdateCheckInterval, a2 as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS, a3 as cleanupDaemonState, i as isValidSessionId, s as spawnDaemonSession, a4 as listVhTerminals, a5 as isValidTerminalId, a6 as readVhTerminal, a7 as sendToVhTerminal, a8 as ContextUsageSchema, a9 as TITLE_PROMPT_PREFIX, aa as BOARD_ANALYZER_PROMPT_PREFIX, h as connectionState, ab as startOfflineReconnection, n as notifyDaemonSessionStarted, d as createEnvelope, ac as CodexAppServerClient } from './types-Dnoxgb7G.mjs';
5
+ import { l as logger, E as ensurePrivateDirectory, F as hardenPrivateFile, c as configuration, p as packageJson, f as readSettings, G as readCredentials, v as credentialRelayProblem, o as readDaemonState, g as encodeBase64, H as readSettingsOutcome, I as updateSettings, J as encodeBase64Url, m as decodeBase64, K as writeCredentialsLegacy, L as writeCredentialsDataKey, d as readCredentialsForConfiguredRelay, j as encrypt, r as readPersistedSessions, w as writePrivateFileSync, M as decryptWithDataKey, N as decryptLegacy, O as persistSession, k as decrypt, h as ensurePrivateDirectorySync, P as acquireDaemonLock, Q as deletePersistedSessions, R as writeDaemonState, S as writeSettings, T as releaseDaemonLock, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES, U as clearCredentials, V as clearMachineId, W as SandboxConfigSchema, X as getLatestDaemonLog } from './limits-CHsz3Ba-.mjs';
6
6
  import spawn$1, { spawn } from 'cross-spawn';
7
- import path, { join, resolve, basename, isAbsolute, dirname, sep, delimiter, normalize } from 'node:path';
7
+ import path, { join, resolve, basename, isAbsolute, sep, dirname, delimiter, normalize } from 'node:path';
8
8
  import { createInterface } from 'node:readline';
9
9
  import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, unlinkSync, renameSync, writeFileSync, accessSync, constants, openSync, fsyncSync, closeSync, rmSync as rmSync$1, chmodSync as chmodSync$1 } from 'node:fs';
10
- import { f as trimIdent, A as AGENT_GUIDANCE, t as teamScopePath, T as TeamConnectionPreflightError, e as createTeamsClient, P as PREVIEW_TOOL_NAME, R as REPORT_PROGRESS_TOOL_NAME, g as TEAM_TOOL_NAMES, r as registerTeamsTools, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, h as REPORT_PROGRESS_TOOL_TITLE, i as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-Do7cQka3.mjs';
10
+ import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
11
+ import { f as trimIdent, A as AGENT_GUIDANCE, t as teamScopePath, T as TeamConnectionPreflightError, e as createTeamsClient, P as PREVIEW_TOOL_NAME, R as REPORT_PROGRESS_TOOL_NAME, g as TEAM_TOOL_NAMES, r as registerTeamsTools, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION, h as REPORT_PROGRESS_TOOL_TITLE, i as REPORT_PROGRESS_TOOL_DESCRIPTION } from './agentGuidance-Cz8QVcX3.mjs';
11
12
  import { readFile, writeFile, rename, unlink, mkdir, symlink, rm, readlink, lstat, stat, open as open$1, appendFile } from 'node:fs/promises';
12
13
  import fs, { watch, access } from 'fs/promises';
13
14
  import { useStdout, useInput, Box, Text, render } from 'ink';
@@ -6082,6 +6083,83 @@ function isAuthorizedDaemonControlRequest(authorization, controlToken) {
6082
6083
  return configuredTokenIsUsable && timingSafeEqual(expectedDigest, candidateDigest);
6083
6084
  }
6084
6085
 
6086
+ const DENIED_HOME_DIRS = [
6087
+ ".secrets",
6088
+ ".ssh",
6089
+ ".gnupg",
6090
+ ".aws",
6091
+ ".kube",
6092
+ ".config/rbw"
6093
+ ];
6094
+ const DENIED_HOME_FILES = [
6095
+ ".claude.json",
6096
+ ".claude/.credentials.json",
6097
+ ".netrc",
6098
+ ".pgpass"
6099
+ ];
6100
+ const DENIED_BASENAME_PATTERNS = [
6101
+ /^\.env$/i,
6102
+ /^\.env\./i,
6103
+ /\.env$/i,
6104
+ /\.pem$/i,
6105
+ /\.key$/i,
6106
+ /\.p12$/i,
6107
+ /\.pfx$/i,
6108
+ /^id_(rsa|dsa|ecdsa|ed25519)$/i,
6109
+ /^\.htpasswd$/i
6110
+ ];
6111
+ const DENIED_PATH_SUFFIXES = [
6112
+ `${sep}.git${sep}config`
6113
+ ];
6114
+ function expandHome(input, home) {
6115
+ if (input === "~") return home;
6116
+ if (input.startsWith(`~${sep}`) || input.startsWith("~/")) {
6117
+ return resolve(home, input.slice(2));
6118
+ }
6119
+ return input;
6120
+ }
6121
+ function basenameOf(p) {
6122
+ const parts = p.split(sep);
6123
+ return parts[parts.length - 1] ?? "";
6124
+ }
6125
+ function isUnder(child, parent) {
6126
+ return child === parent || child.startsWith(parent.endsWith(sep) ? parent : parent + sep);
6127
+ }
6128
+ function checkPreviewPath(input, opts) {
6129
+ const home = homedir();
6130
+ const cwd = process.cwd();
6131
+ if (typeof input !== "string" || !input.trim()) {
6132
+ return { resolved: "", deniedReason: "path must be a non-empty string" };
6133
+ }
6134
+ if (input.includes("\0")) {
6135
+ return { resolved: "", deniedReason: "path contains a NUL byte" };
6136
+ }
6137
+ const expanded = expandHome(input.trim(), home);
6138
+ const resolved = isAbsolute(expanded) ? resolve(expanded) : resolve(cwd, expanded);
6139
+ for (const dir of DENIED_HOME_DIRS) {
6140
+ if (isUnder(resolved, resolve(home, dir))) {
6141
+ return { resolved, deniedReason: `refusing to preview anything under ~/${dir} (credential material)` };
6142
+ }
6143
+ }
6144
+ for (const file of DENIED_HOME_FILES) {
6145
+ if (resolved === resolve(home, file)) {
6146
+ return { resolved, deniedReason: `refusing to preview ~/${file} (credential material)` };
6147
+ }
6148
+ }
6149
+ const base = basenameOf(resolved);
6150
+ for (const pattern of DENIED_BASENAME_PATTERNS) {
6151
+ if (pattern.test(base)) {
6152
+ return { resolved, deniedReason: `refusing to preview "${base}" (looks like credential material)` };
6153
+ }
6154
+ }
6155
+ for (const suffix of DENIED_PATH_SUFFIXES) {
6156
+ if (resolved.endsWith(suffix)) {
6157
+ return { resolved, deniedReason: `refusing to preview ${suffix} (may contain credentials)` };
6158
+ }
6159
+ }
6160
+ return { resolved, deniedReason: null };
6161
+ }
6162
+
6085
6163
  function startDaemonControlServer({
6086
6164
  controlToken,
6087
6165
  getChildren,
@@ -6093,6 +6171,7 @@ function startDaemonControlServer({
6093
6171
  onClaudeAuthFailed,
6094
6172
  onSessionTurnEvent,
6095
6173
  pushClipboard,
6174
+ pushFilePreview,
6096
6175
  onTerminalHook,
6097
6176
  setTerminalTitle
6098
6177
  }) {
@@ -6307,7 +6386,8 @@ function startDaemonControlServer({
6307
6386
  typed.post("/clipboard", {
6308
6387
  schema: {
6309
6388
  body: z.object({
6310
- text: z.string()
6389
+ text: z.string(),
6390
+ terminalId: z.string().regex(/^[a-zA-Z0-9_-]{1,64}$/).optional()
6311
6391
  }),
6312
6392
  response: {
6313
6393
  200: z.object({
@@ -6319,9 +6399,25 @@ function startDaemonControlServer({
6319
6399
  }
6320
6400
  }
6321
6401
  }, async (request) => {
6322
- const { text } = request.body;
6402
+ const { text, terminalId } = request.body;
6323
6403
  logger.debug(`[CONTROL SERVER] Clipboard push request (${text.length} chars)`);
6324
- return pushClipboard(text);
6404
+ return terminalId ? pushClipboard(text, terminalId) : pushClipboard(text);
6405
+ });
6406
+ typed.post("/file-preview", {
6407
+ schema: {
6408
+ body: z.object({
6409
+ terminalId: z.string().regex(/^[a-zA-Z0-9_-]{1,64}$/),
6410
+ path: z.string().min(1),
6411
+ mode: z.enum(["file", "diff"]).optional()
6412
+ }),
6413
+ response: { 200: z.object({ delivered: z.boolean(), error: z.string().optional() }) }
6414
+ }
6415
+ }, async (request) => {
6416
+ const { terminalId, path, mode } = request.body;
6417
+ const verdict = checkPreviewPath(path);
6418
+ if (verdict.deniedReason) return { delivered: false, error: verdict.deniedReason };
6419
+ if (!pushFilePreview) return { delivered: false, error: "daemon is still starting up" };
6420
+ return pushFilePreview(terminalId, verdict.resolved, mode ?? "file");
6325
6421
  });
6326
6422
  typed.post("/terminal-title", {
6327
6423
  schema: {
@@ -9044,14 +9140,15 @@ On restart inspect authoritative state and messages before taking new actions. D
9044
9140
  `;
9045
9141
  const PI_TEAMS_EXTENSION = `// Managed by Very Happy Agent Teams.
9046
9142
  export default async function(pi) {
9047
- const endpoint = process.env.HAPPY_MCP_URL;
9143
+ const managed = !!process.env.HAPPY_MCP_URL;
9144
+ const endpoint = process.env.HAPPY_MCP_URL || process.env.HAPPY_TERMINAL_MCP_URL;
9048
9145
  if (!endpoint) return;
9049
9146
  const url = new URL(endpoint);
9050
9147
  if (!['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname) || url.protocol !== 'http:') throw new Error('Very Happy MCP must be local');
9051
9148
  const {readFile} = await import('node:fs/promises');
9052
9149
  const {join} = await import('node:path');
9053
9150
  const {homedir} = await import('node:os');
9054
- const contextEndpoint = process.env.HAPPY_CONTEXT_USAGE_URL;
9151
+ const contextEndpoint = managed && process.env.HAPPY_CONTEXT_USAGE_URL;
9055
9152
  if (contextEndpoint) {
9056
9153
  const target = new URL(contextEndpoint);
9057
9154
  if (target.origin !== url.origin || !target.pathname.startsWith('/runtime-context/')) throw new Error('Very Happy context must be local');
@@ -9069,7 +9166,7 @@ export default async function(pi) {
9069
9166
  });
9070
9167
  }
9071
9168
  }
9072
- pi.on('tool_call', async (event, ctx) => {
9169
+ if (managed) pi.on('tool_call', async (event, ctx) => {
9073
9170
  let mode = process.env.HAPPY_PERMISSION_MODE || 'default';
9074
9171
  const sid = process.env.HAPPY_SESSION_ID;
9075
9172
  if (sid && /^[a-zA-Z0-9_-]+$/.test(sid)) {
@@ -9108,7 +9205,11 @@ export default async function(pi) {
9108
9205
  const available = await rpc('tools/list', {});
9109
9206
  for (const tool of available.tools || []) {
9110
9207
  pi.registerTool({name:tool.name,label:tool.name,description:tool.description || tool.name,parameters:tool.inputSchema,
9111
- async execute(_id, args) { const result = await rpc('tools/call', {name:tool.name,arguments:args}); return {content:result.content,details:{isError:!!result.isError}}; }
9208
+ async execute(_id, args) {
9209
+ const result = await rpc('tools/call', {name:tool.name,arguments:args});
9210
+ if (result.isError) throw new Error((result.content || []).filter(block => block.type === 'text').map(block => block.text).join('\\n') || 'Very Happy tool failed');
9211
+ return {content:result.content,details:{isError:false}};
9212
+ }
9112
9213
  });
9113
9214
  }
9114
9215
  }
@@ -10984,11 +11085,15 @@ async function startDaemon() {
10984
11085
  onSessionStateEvent,
10985
11086
  onClaudeAuthFailed: (sessionId) => claudeAuthServiceRef?.signalAuthFailed(sessionId),
10986
11087
  onSessionTurnEvent: (sessionId, event) => turnActivity.apply(sessionId, event),
10987
- pushClipboard: (text) => {
11088
+ pushClipboard: (text, terminalId) => {
10988
11089
  if (!apiMachineRef) {
10989
11090
  return { delivered: false, truncated: false, totalBytes: 0, error: "daemon is still starting up" };
10990
11091
  }
10991
- return apiMachineRef.pushClipboard(text);
11092
+ return apiMachineRef.pushClipboard(text, terminalId);
11093
+ },
11094
+ pushFilePreview: (terminalId, path, mode) => {
11095
+ if (!apiMachineRef) return { delivered: false, error: "daemon is still starting up" };
11096
+ return apiMachineRef.pushFilePreview(terminalId, path, mode);
10992
11097
  },
10993
11098
  onTerminalHook: (body) => {
10994
11099
  mirrorManagerRef?.handleHookPayload(body);
@@ -11725,83 +11830,6 @@ function normalizeProgress(value) {
11725
11830
  return flat.length > PROGRESS_MAX_CHARS$1 ? flat.slice(0, PROGRESS_MAX_CHARS$1) : flat;
11726
11831
  }
11727
11832
 
11728
- const DENIED_HOME_DIRS = [
11729
- ".secrets",
11730
- ".ssh",
11731
- ".gnupg",
11732
- ".aws",
11733
- ".kube",
11734
- ".config/rbw"
11735
- ];
11736
- const DENIED_HOME_FILES = [
11737
- ".claude.json",
11738
- ".claude/.credentials.json",
11739
- ".netrc",
11740
- ".pgpass"
11741
- ];
11742
- const DENIED_BASENAME_PATTERNS = [
11743
- /^\.env$/i,
11744
- /^\.env\./i,
11745
- /\.env$/i,
11746
- /\.pem$/i,
11747
- /\.key$/i,
11748
- /\.p12$/i,
11749
- /\.pfx$/i,
11750
- /^id_(rsa|dsa|ecdsa|ed25519)$/i,
11751
- /^\.htpasswd$/i
11752
- ];
11753
- const DENIED_PATH_SUFFIXES = [
11754
- `${sep}.git${sep}config`
11755
- ];
11756
- function expandHome(input, home) {
11757
- if (input === "~") return home;
11758
- if (input.startsWith(`~${sep}`) || input.startsWith("~/")) {
11759
- return resolve(home, input.slice(2));
11760
- }
11761
- return input;
11762
- }
11763
- function basenameOf(p) {
11764
- const parts = p.split(sep);
11765
- return parts[parts.length - 1] ?? "";
11766
- }
11767
- function isUnder(child, parent) {
11768
- return child === parent || child.startsWith(parent.endsWith(sep) ? parent : parent + sep);
11769
- }
11770
- function checkPreviewPath(input, opts) {
11771
- const home = homedir();
11772
- const cwd = process.cwd();
11773
- if (typeof input !== "string" || !input.trim()) {
11774
- return { resolved: "", deniedReason: "path must be a non-empty string" };
11775
- }
11776
- if (input.includes("\0")) {
11777
- return { resolved: "", deniedReason: "path contains a NUL byte" };
11778
- }
11779
- const expanded = expandHome(input.trim(), home);
11780
- const resolved = isAbsolute(expanded) ? resolve(expanded) : resolve(cwd, expanded);
11781
- for (const dir of DENIED_HOME_DIRS) {
11782
- if (isUnder(resolved, resolve(home, dir))) {
11783
- return { resolved, deniedReason: `refusing to preview anything under ~/${dir} (credential material)` };
11784
- }
11785
- }
11786
- for (const file of DENIED_HOME_FILES) {
11787
- if (resolved === resolve(home, file)) {
11788
- return { resolved, deniedReason: `refusing to preview ~/${file} (credential material)` };
11789
- }
11790
- }
11791
- const base = basenameOf(resolved);
11792
- for (const pattern of DENIED_BASENAME_PATTERNS) {
11793
- if (pattern.test(base)) {
11794
- return { resolved, deniedReason: `refusing to preview "${base}" (looks like credential material)` };
11795
- }
11796
- }
11797
- for (const suffix of DENIED_PATH_SUFFIXES) {
11798
- if (resolved.endsWith(suffix)) {
11799
- return { resolved, deniedReason: `refusing to preview ${suffix} (may contain credentials)` };
11800
- }
11801
- }
11802
- return { resolved, deniedReason: null };
11803
- }
11804
-
11805
11833
  function createMcpServer(handlers, options, sessionId) {
11806
11834
  const mcp = new McpServer({
11807
11835
  name: "Very Happy Tools",
@@ -11853,7 +11881,7 @@ function createMcpServer(handlers, options, sessionId) {
11853
11881
  return {
11854
11882
  content: [{
11855
11883
  type: "text",
11856
- text: `Sent to the user's clipboard on their currently open device(s)${note}. If the page was not focused, they may need to tap a confirmation button.`
11884
+ text: `Queued a clipboard request for the user's open Very Happy device(s)${note}. This does not confirm that a browser wrote the clipboard; the user may need to tap a confirmation button.`
11857
11885
  }],
11858
11886
  isError: false
11859
11887
  };
@@ -12322,7 +12350,7 @@ function registerSideQuestionHandler(rpc, deps) {
12322
12350
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
12323
12351
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
12324
12352
  const run = deps.run ?? (async (input) => {
12325
- const { query } = await import('./index-DhfgAB8K.mjs');
12353
+ const { query } = await import('./index-CNARLBax.mjs');
12326
12354
  return runSideQuestion(query, input);
12327
12355
  });
12328
12356
  const slots = /* @__PURE__ */ new Map();
@@ -17556,9 +17584,18 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17556
17584
  } else if (subcommand === "bye") {
17557
17585
  console.log("Bye!");
17558
17586
  process.exit(0);
17587
+ } else if (subcommand === "install-pi-tools") {
17588
+ try {
17589
+ const { handleInstallPiTools } = await import('./installPiTools-C-Lxv4Bt.mjs');
17590
+ await handleInstallPiTools(args.slice(1));
17591
+ } catch (error) {
17592
+ console.error(error instanceof Error ? error.message : "Pi tools installation failed");
17593
+ process.exitCode = 1;
17594
+ }
17595
+ return;
17559
17596
  } else if (subcommand === "install-terminal-hooks") {
17560
17597
  try {
17561
- const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-zmtIrf3E.mjs');
17598
+ const { installTerminalHooks, parseTerminalHooksArgs, TERMINAL_HOOKS_HELP } = await import('./installTerminalHooks-BPJu2WVz.mjs');
17562
17599
  const command = parseTerminalHooksArgs(args.slice(1));
17563
17600
  if (command.action === "help") {
17564
17601
  console.log(TERMINAL_HOOKS_HELP);
@@ -17575,7 +17612,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17575
17612
  }
17576
17613
  } else if (subcommand === "spawn") {
17577
17614
  try {
17578
- const { handleSpawnCommand } = await import('./spawn-Ca0A70dX.mjs');
17615
+ const { handleSpawnCommand } = await import('./spawn-CnMk3LFG.mjs');
17579
17616
  await handleSpawnCommand(args.slice(1));
17580
17617
  } catch (error) {
17581
17618
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17587,7 +17624,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17587
17624
  return;
17588
17625
  } else if (subcommand === "sessions") {
17589
17626
  try {
17590
- const { handleSessionsCommand } = await import('./sessions-DDWTq2AG.mjs');
17627
+ const { handleSessionsCommand } = await import('./sessions-JiL4aJkC.mjs');
17591
17628
  await handleSessionsCommand(args.slice(1));
17592
17629
  } catch (error) {
17593
17630
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17599,7 +17636,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17599
17636
  return;
17600
17637
  } else if (subcommand === "send") {
17601
17638
  try {
17602
- const { handleSendCommand } = await import('./send-DT04hV8o.mjs');
17639
+ const { handleSendCommand } = await import('./send-DV8liaRN.mjs');
17603
17640
  await handleSendCommand(args.slice(1));
17604
17641
  } catch (error) {
17605
17642
  console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
@@ -17705,9 +17742,9 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17705
17742
  if (geminiSubcommand === "project" && args[2] === "set" && args[3]) {
17706
17743
  const projectId = args[3];
17707
17744
  try {
17708
- const { saveGoogleCloudProjectToConfig } = await import('./config-DY57frJF.mjs');
17709
- const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./limits-DT5Yk_UH.mjs').then(function (n) { return n.X; });
17710
- const { ApiClient: ApiClient2 } = await import('./types-CLosaeZT.mjs').then(function (n) { return n.ad; });
17745
+ const { saveGoogleCloudProjectToConfig } = await import('./config-ZsBeq10u.mjs');
17746
+ const { readCredentialsForConfiguredRelay: readCredentialsForConfiguredRelay2 } = await import('./limits-CHsz3Ba-.mjs').then(function (n) { return n.Y; });
17747
+ const { ApiClient: ApiClient2 } = await import('./types-Dnoxgb7G.mjs').then(function (n) { return n.ad; });
17711
17748
  let userEmail = void 0;
17712
17749
  try {
17713
17750
  const credentials = await readCredentialsForConfiguredRelay2();
@@ -17738,7 +17775,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17738
17775
  }
17739
17776
  if (geminiSubcommand === "project" && args[2] === "get") {
17740
17777
  try {
17741
- const { readGeminiLocalConfig } = await import('./config-DY57frJF.mjs');
17778
+ const { readGeminiLocalConfig } = await import('./config-ZsBeq10u.mjs');
17742
17779
  const config = readGeminiLocalConfig();
17743
17780
  if (config.googleCloudProject) {
17744
17781
  console.log(`Current Google Cloud Project: ${config.googleCloudProject}`);
@@ -17778,7 +17815,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17778
17815
  process.exit(0);
17779
17816
  }
17780
17817
  try {
17781
- const { runGemini } = await import('./runGemini-BmdhYEzM.mjs');
17818
+ const { runGemini } = await import('./runGemini-rgFHTnG7.mjs');
17782
17819
  let startedBy = void 0;
17783
17820
  for (let i = 1; i < args.length; i++) {
17784
17821
  if (args[i] === "--started-by") {
@@ -17799,6 +17836,16 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17799
17836
  }
17800
17837
  return;
17801
17838
  } else if (subcommand === "pi") {
17839
+ if (args[1] === "--terminal") {
17840
+ try {
17841
+ const { runPiTerminal } = await import('./piTerminal-Bc3jSCnY.mjs');
17842
+ process.exitCode = await runPiTerminal(args.slice(2));
17843
+ } catch (error) {
17844
+ console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
17845
+ process.exitCode = 1;
17846
+ }
17847
+ return;
17848
+ }
17802
17849
  let hintPrinted = false;
17803
17850
  const printHint = (detail) => {
17804
17851
  const hint = piAdapterMissingHint(detail);
@@ -17808,7 +17855,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17808
17855
  }
17809
17856
  };
17810
17857
  try {
17811
- const { runAcp, resolveAcpAgentConfig } = await import('./index-Dz6FgNFg.mjs');
17858
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-CY0zmhIp.mjs');
17812
17859
  const parsed = parsePiRunnerArgs(args.slice(1));
17813
17860
  const resolved = resolveAcpAgentConfig(["pi", ...parsed.passthrough]);
17814
17861
  const { credentials } = await authAndSetupMachineIfNeeded();
@@ -17836,7 +17883,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17836
17883
  return;
17837
17884
  } else if (subcommand === "acp") {
17838
17885
  try {
17839
- const { runAcp, resolveAcpAgentConfig } = await import('./index-Dz6FgNFg.mjs');
17886
+ const { runAcp, resolveAcpAgentConfig } = await import('./index-CY0zmhIp.mjs');
17840
17887
  let startedBy = void 0;
17841
17888
  let verbose = false;
17842
17889
  const acpArgs = [];
@@ -17876,7 +17923,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17876
17923
  return;
17877
17924
  } else if (subcommand === "openclaw") {
17878
17925
  try {
17879
- const { runOpenClaw } = await import('./runOpenClaw-CYpO3Vv8.mjs');
17926
+ const { runOpenClaw } = await import('./runOpenClaw-GjLWwjas.mjs');
17880
17927
  let startedBy = void 0;
17881
17928
  let verbose = false;
17882
17929
  let gatewayUrl;
@@ -17927,7 +17974,7 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17927
17974
  return;
17928
17975
  } else if (subcommand === "todo") {
17929
17976
  try {
17930
- const { handleTodoCommand } = await import('./todo-4WhOom8k.mjs');
17977
+ const { handleTodoCommand } = await import('./todo-oHWNpEx_.mjs');
17931
17978
  await handleTodoCommand(args.slice(1));
17932
17979
  } catch (error) {
17933
17980
  console.error(JSON.stringify({ error: error instanceof Error ? error.message : "Todo command failed" }));
@@ -17936,17 +17983,17 @@ Conversation history is preserved on the server, but in-flight tool calls are in
17936
17983
  return;
17937
17984
  } else if (subcommand === "teams") {
17938
17985
  try {
17939
- const { handleTeamsCommand } = await import('./teams-CzK1zg0m.mjs');
17986
+ const { handleTeamsCommand } = await import('./teams-uHZcdX9j.mjs');
17940
17987
  await handleTeamsCommand(args.slice(1));
17941
17988
  } catch (error) {
17942
17989
  console.error(error instanceof Error ? error.message : "Teams command failed");
17943
17990
  process.exitCode = 1;
17944
17991
  }
17945
17992
  return;
17946
- } else if (subcommand === "mcp" && args.length === 1) {
17993
+ } else if (subcommand === "mcp" && (args.length === 1 || args.length === 2 && args[1] === "--terminal-tools")) {
17947
17994
  try {
17948
- const { handleMcpCommand } = await import('./mcp-Bzy-X9kI.mjs');
17949
- await handleMcpCommand();
17995
+ const { handleMcpCommand } = await import('./mcp-BkWBRWFe.mjs');
17996
+ await handleMcpCommand(args[1] === "--terminal-tools");
17950
17997
  } catch (error) {
17951
17998
  process.stderr.write(`[very-happy mcp] Fatal: ${error instanceof Error ? error.message : String(error)}
17952
17999
  `);
@@ -18166,6 +18213,10 @@ ${chalk.bold("Usage:")}
18166
18213
  very-happy codex Start Codex mode
18167
18214
  very-happy gemini Start Gemini mode (ACP)
18168
18215
  very-happy pi Start pi mode (ACP via the pi-acp adapter)
18216
+ very-happy pi --terminal Run native pi with title, clipboard and preview tools
18217
+ inside a Very Happy terminal
18218
+ very-happy install-pi-tools Install tools for directly launched pi sessions
18219
+ (add --remove to uninstall)
18169
18220
  very-happy acp Start a generic ACP-compatible agent
18170
18221
  very-happy openclaw Connect through a configured OpenClaw gateway
18171
18222
  very-happy install-terminal-hooks
@@ -18307,4 +18358,4 @@ ${chalk.bold("Examples:")}
18307
18358
  }
18308
18359
  }
18309
18360
 
18310
- export { ALLOWED_SPAWN_PERMISSION_MODES as A, appendStagedAttachmentsToPrompt as B, CLAUDE_ATTACHMENT_KINDS as C, DEFAULT_RECENT_LIMIT as D, BasePermissionHandler as E, writeSessionModeFile as F, GEMINI_MODEL_ENV as G, normalizeAcpPermissionMode as H, removeSessionModeFile as I, GEMINI_API_KEY_ENV as J, GOOGLE_API_KEY_ENV as K, BaseReasoningProcessor as L, MAX_READ_LIMIT as M, MessageBuffer as N, CHANGE_TITLE_INSTRUCTION as O, PI_TEAMS_EXTENSION as P, SPAWN_AGENTS as S, TEAM_SKILL as T, sanitizeSpawnPermissionMode as a, sendUserMessage as b, listSessions as c, stopSession as d, resolvePermissionRequest as e, archiveSession as f, DEFAULT_GEMINI_MODEL as g, registerAssistantSessionTools as h, isValidSpawnOrigin as i, initialMachineMetadata as j, createSessionMetadata as k, listAccountSessions as l, setupOfflineReconnection as m, MessageQueue2 as n, registerKillSessionHandler as o, StreamRelay as p, query as q, readSessionTranscript as r, sessionWebUrl as s, tmuxSupportsSessionEnv as t, hashObject as u, startHappyServer as v, waitForSessionKey as w, registerAgentAttachmentDownloads as x, TitleGenerator as y, stageClaudeAttachments as z };
18361
+ export { ALLOWED_SPAWN_PERMISSION_MODES as A, appendStagedAttachmentsToPrompt as B, CLAUDE_ATTACHMENT_KINDS as C, DEFAULT_RECENT_LIMIT as D, BasePermissionHandler as E, writeSessionModeFile as F, GEMINI_MODEL_ENV as G, normalizeAcpPermissionMode as H, removeSessionModeFile as I, TEAM_SKILL as J, GEMINI_API_KEY_ENV as K, GOOGLE_API_KEY_ENV as L, MAX_READ_LIMIT as M, BaseReasoningProcessor as N, MessageBuffer as O, PI_TEAMS_EXTENSION as P, CHANGE_TITLE_INSTRUCTION as Q, SPAWN_AGENTS as S, TitleGenerator as T, sanitizeSpawnPermissionMode as a, sendUserMessage as b, listSessions as c, stopSession as d, resolvePermissionRequest as e, archiveSession as f, DEFAULT_GEMINI_MODEL as g, checkPreviewPath as h, isValidSpawnOrigin as i, registerAssistantSessionTools as j, initialMachineMetadata as k, listAccountSessions as l, createSessionMetadata as m, setupOfflineReconnection as n, StreamRelay as o, MessageQueue2 as p, query as q, readSessionTranscript as r, sessionWebUrl as s, tmuxSupportsSessionEnv as t, hashObject as u, startHappyServer as v, waitForSessionKey as w, registerAgentAttachmentDownloads as x, registerKillSessionHandler as y, stageClaudeAttachments as z };
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-ChWePQEd.cjs');
5
- require('./limits-DbLWXlJm.cjs');
4
+ require('./index-CSQZhQ0C.cjs');
5
+ require('./limits-B3hngubn.cjs');
6
6
  require('zod');
7
- require('./types-Bk3W89Z3.cjs');
7
+ require('./types-Xd_LJRJN.cjs');
8
8
  require('node:child_process');
9
9
  require('node:os');
10
10
  require('node:crypto');
@@ -12,7 +12,10 @@ require('cross-spawn');
12
12
  require('node:path');
13
13
  require('node:readline');
14
14
  require('node:fs');
15
- require('./agentGuidance-B9ENxSaS.cjs');
15
+ require('./projectPath-ChLhdOyt.cjs');
16
+ require('path');
17
+ require('url');
18
+ require('./agentGuidance-Bi8iBjy3.cjs');
16
19
  require('node:fs/promises');
17
20
  require('fs/promises');
18
21
  require('ink');
@@ -26,7 +29,6 @@ require('os');
26
29
  require('child_process');
27
30
  require('@paralleldrive/cuid2');
28
31
  require('fs');
29
- require('path');
30
32
  require('@anthropic-ai/sandbox-runtime');
31
33
  require('expo-server-sdk');
32
34
  require('crypto');
@@ -45,6 +47,5 @@ require('util');
45
47
  require('inquirer');
46
48
  require('node:url');
47
49
  require('node:readline/promises');
48
- require('url');
49
50
  require('node-pty');
50
51
 
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './index-C55sW8E9.mjs';
3
- import './limits-DT5Yk_UH.mjs';
2
+ import './index-CYFendNf.mjs';
3
+ import './limits-CHsz3Ba-.mjs';
4
4
  import 'zod';
5
- import './types-CLosaeZT.mjs';
5
+ import './types-Dnoxgb7G.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:os';
8
8
  import 'node:crypto';
@@ -10,7 +10,10 @@ import 'cross-spawn';
10
10
  import 'node:path';
11
11
  import 'node:readline';
12
12
  import 'node:fs';
13
- import './agentGuidance-Do7cQka3.mjs';
13
+ import './projectPath-CSpqWdxp.mjs';
14
+ import 'path';
15
+ import 'url';
16
+ import './agentGuidance-Cz8QVcX3.mjs';
14
17
  import 'node:fs/promises';
15
18
  import 'fs/promises';
16
19
  import 'ink';
@@ -24,7 +27,6 @@ import 'os';
24
27
  import 'child_process';
25
28
  import '@paralleldrive/cuid2';
26
29
  import 'fs';
27
- import 'path';
28
30
  import '@anthropic-ai/sandbox-runtime';
29
31
  import 'expo-server-sdk';
30
32
  import 'crypto';
@@ -43,5 +45,4 @@ import 'util';
43
45
  import 'inquirer';
44
46
  import 'node:url';
45
47
  import 'node:readline/promises';
46
- import 'url';
47
48
  import 'node-pty';