very-happy-cli 0.2.156 → 0.2.157

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 (55) hide show
  1. package/dist/{AcpBackend-BHe1_F1h.cjs → AcpBackend-BymWX-LI.cjs} +2 -2
  2. package/dist/{AcpBackend-C3nc1u-s.mjs → AcpBackend-Cy18U7yw.mjs} +2 -2
  3. package/dist/{AcpSessionManager-BVxkQnNf.cjs → AcpSessionManager-BF7zBGAi.cjs} +1 -1
  4. package/dist/{AcpSessionManager-dN3k1LbI.mjs → AcpSessionManager-Ds8rcp95.mjs} +1 -1
  5. package/dist/{agentGuidance-C604n0Zq.mjs → agentGuidance-CU6YD_Ms.mjs} +560 -29
  6. package/dist/{agentGuidance-C-CmV03f.cjs → agentGuidance-Db76O1kw.cjs} +579 -28
  7. package/dist/{agentHome-CmIJNV7f.cjs → agentHome-B0CLy0Qx.cjs} +2 -2
  8. package/dist/{agentHome-D2XGsoqs.mjs → agentHome-BaJ9xtxB.mjs} +2 -2
  9. package/dist/{auto-B1I6G_Nf.mjs → auto-B1YAwaeU.mjs} +6 -6
  10. package/dist/{auto-CMDq4oIu.cjs → auto-DqKGFq8U.cjs} +6 -6
  11. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  12. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  13. package/dist/{config-BYHSRY2E.cjs → config-CzkBjZnV.cjs} +4 -4
  14. package/dist/{config-BkTu25bH.mjs → config-aAbhJllb.mjs} +4 -4
  15. package/dist/{index-B5QbzEga.mjs → index-BVu8Cufk.mjs} +8 -8
  16. package/dist/{index-DAAreiRF.mjs → index-BYU1e81k.mjs} +288 -44
  17. package/dist/{index-BbtR-Qto.cjs → index-C9QzZsUQ.cjs} +291 -47
  18. package/dist/{index-B_-7NpGZ.cjs → index-CTbGqVFY.cjs} +7 -7
  19. package/dist/{index-CB8QnjvS.cjs → index-Cz-uqnJk.cjs} +4 -4
  20. package/dist/{index-PYO8Mdz4.mjs → index-DQcRkI9r.mjs} +4 -4
  21. package/dist/index.cjs +4 -4
  22. package/dist/index.mjs +4 -4
  23. package/dist/{install-CO1ps6Wt.cjs → install-BMlV0Tnr.cjs} +1 -1
  24. package/dist/{install-CNtXzwT_.mjs → install-BuYnqtVa.mjs} +1 -1
  25. package/dist/{installTerminalHooks-BOAnQ1Qe.cjs → installTerminalHooks-BVVOEGhG.cjs} +4 -4
  26. package/dist/{installTerminalHooks-CMpOV3RU.mjs → installTerminalHooks-ELDoqh0A.mjs} +4 -4
  27. package/dist/lib.cjs +2 -2
  28. package/dist/lib.d.cts +77 -1
  29. package/dist/lib.d.mts +77 -1
  30. package/dist/lib.mjs +2 -2
  31. package/dist/{limits-DmMdchTz.mjs → limits-A2c-3M-_.mjs} +162 -11
  32. package/dist/{limits-o29KXBgj.cjs → limits-CyuIt-Vl.cjs} +169 -10
  33. package/dist/{mcp-C_uejotl.mjs → mcp-Bo934Kpy.mjs} +4 -4
  34. package/dist/{mcp-CwK1nI7Y.cjs → mcp-CXkvnztT.cjs} +4 -4
  35. package/dist/{piRuntime-Dj5WnqzJ.cjs → piRuntime-CJjA26oD.cjs} +2 -2
  36. package/dist/{piRuntime-Cu2-8nOT.mjs → piRuntime-DdEY2mE9.mjs} +2 -2
  37. package/dist/{piTerminal-D-BIbov9.cjs → piTerminal-CpU3hzrX.cjs} +6 -6
  38. package/dist/{piTerminal-DanZeBrO.mjs → piTerminal-DwWmgumi.mjs} +6 -6
  39. package/dist/{runGemini-CZ_lhMWY.mjs → runGemini-Cj6oJQ-I.mjs} +6 -6
  40. package/dist/{runGemini--QqK-Ap5.cjs → runGemini-DS-0qm0L.cjs} +6 -6
  41. package/dist/{runOpenClaw-C0xLhTvk.cjs → runOpenClaw-CvSm8oTc.cjs} +5 -5
  42. package/dist/{runOpenClaw-CxgLpm38.mjs → runOpenClaw-DUCQxkI-.mjs} +5 -5
  43. package/dist/{send-CTcGMVuG.cjs → send-CHxobaoI.cjs} +43 -31
  44. package/dist/{send-BaOkDgH0.mjs → send-D5CyRyZ_.mjs} +43 -31
  45. package/dist/{sessions-OmvyJb0n.cjs → sessions-BFlIrKCY.cjs} +133 -49
  46. package/dist/{sessions-Bn304xF1.mjs → sessions-DsE01xKc.mjs} +133 -49
  47. package/dist/{spawn-BKNabutV.mjs → spawn-CdihhwHs.mjs} +4 -4
  48. package/dist/{spawn-CC6V2KiA.cjs → spawn-HV345RN-.cjs} +4 -4
  49. package/dist/{teams-CLbS2_4Q.mjs → teams-BE8nMB6O.mjs} +5 -5
  50. package/dist/{teams-XtrH3_h3.cjs → teams-BahinMnH.cjs} +5 -5
  51. package/dist/{todo-CEDvKNXK.cjs → todo-CMMQ6yhU.cjs} +2 -2
  52. package/dist/{todo-BcPbNKt2.mjs → todo-CuQAkSp2.mjs} +2 -2
  53. package/dist/{types-CphWjqHc.cjs → types-B0sSi6eM.cjs} +77 -4
  54. package/dist/{types-BEVzYSoV.mjs → types-BrGJ7PJz.mjs} +77 -4
  55. package/package.json +7 -7
@@ -11,7 +11,7 @@ import { homedir } from 'node:os';
11
11
  import { join, basename } from 'node:path';
12
12
 
13
13
  var name = "very-happy-cli";
14
- var version = "0.2.156";
14
+ var version = "0.2.157";
15
15
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
16
16
  var author = "Kirill Dubovitskiy";
17
17
  var contributors = [
@@ -128,12 +128,12 @@ var dependencies = {
128
128
  zod: "^4.0.0"
129
129
  };
130
130
  var optionalDependencies = {
131
- "very-happy-tools-arm64-darwin": "0.2.156",
132
- "very-happy-tools-x64-darwin": "0.2.156",
133
- "very-happy-tools-arm64-linux": "0.2.156",
134
- "very-happy-tools-x64-linux": "0.2.156",
135
- "very-happy-tools-arm64-win32": "0.2.156",
136
- "very-happy-tools-x64-win32": "0.2.156"
131
+ "very-happy-tools-arm64-darwin": "0.2.157",
132
+ "very-happy-tools-x64-darwin": "0.2.157",
133
+ "very-happy-tools-arm64-linux": "0.2.157",
134
+ "very-happy-tools-x64-linux": "0.2.157",
135
+ "very-happy-tools-arm64-win32": "0.2.157",
136
+ "very-happy-tools-x64-win32": "0.2.157"
137
137
  };
138
138
  var devDependencies = {
139
139
  "@slopus/happy-wire": "workspace:*",
@@ -1571,7 +1571,7 @@ const TeamActionSchema = z$1.discriminatedUnion("type", [
1571
1571
  z$1.object({ requestId: id$1, action: TeamActionSchema });
1572
1572
  z$1.object({ name: id$1, machineId: id$1, requestId: id$1.optional(), launch: TeamLaunchSchema.optional() });
1573
1573
  const id = z$1.string().min(1).max(128);
1574
- const text = z$1.string().min(1).max(32e3);
1574
+ const text$2 = z$1.string().min(1).max(32e3);
1575
1575
  const AUTOMATION_NAME_PATTERN = /^[a-z0-9][a-z0-9-_.]{0,63}$/;
1576
1576
  const AutomationNameSchema = z$1.string().regex(AUTOMATION_NAME_PATTERN, "automation name must match [a-z0-9][a-z0-9-_.]{0,63}");
1577
1577
  const AUTOMATION_MIN_INTERVAL_MS = 6e4;
@@ -1599,13 +1599,13 @@ const AutomationActionSchema = z$1.discriminatedUnion("kind", [
1599
1599
  kind: z$1.literal("spawn"),
1600
1600
  agent: z$1.string().trim().min(1).max(64),
1601
1601
  directory: z$1.string().min(1).max(4096),
1602
- prompt: text,
1602
+ prompt: text$2,
1603
1603
  model: z$1.string().trim().min(1).max(256).nullable().optional(),
1604
1604
  permissionMode: z$1.string().trim().min(1).max(64).nullable().optional(),
1605
1605
  worktree: z$1.boolean().optional(),
1606
1606
  sticky: AutomationStickySchema.optional()
1607
1607
  }),
1608
- z$1.object({ kind: z$1.literal("send"), sessionId: id, prompt: text }),
1608
+ z$1.object({ kind: z$1.literal("send"), sessionId: id, prompt: text$2 }),
1609
1609
  z$1.object({
1610
1610
  kind: z$1.literal("script"),
1611
1611
  command: z$1.array(z$1.string().min(1).max(4096)).min(1).max(256),
@@ -2169,6 +2169,9 @@ async function notifyDaemonClaudeAuthFailed(sessionId) {
2169
2169
  async function notifyDaemonTurnEvent(sessionId, event) {
2170
2170
  return daemonPost("/session-event", { sessionId, event });
2171
2171
  }
2172
+ async function notifyDaemonBackgroundTasks(sessionId, backgroundTasks) {
2173
+ return daemonPost("/session-event", { sessionId, event: "background_tasks", backgroundTasks });
2174
+ }
2172
2175
  function reportSessionEditToDaemon(edit) {
2173
2176
  void daemonPost("/session-edit", edit).then((result) => {
2174
2177
  if (result?.error) logger.debug(`[CONTROL CLIENT] session-edit not recorded: ${result.error}`);
@@ -2338,6 +2341,154 @@ let backoff = createBackoff({
2338
2341
  }
2339
2342
  });
2340
2343
 
2344
+ const BACKGROUND_TASKS_MAX = 50;
2345
+ const BACKGROUND_TASK_DESCRIPTION_MAX = 200;
2346
+ const text = (value) => typeof value === "string" && value.length > 0 && !value.includes("\0") ? value : null;
2347
+ const clip = (value) => value.length <= BACKGROUND_TASK_DESCRIPTION_MAX ? value : `${value.slice(0, BACKGROUND_TASK_DESCRIPTION_MAX - 1)}\u2026`;
2348
+ const SETTLED_STATUSES = /* @__PURE__ */ new Set(["completed", "failed", "killed"]);
2349
+ function sameBackgroundTasks(a, b) {
2350
+ if (a.length !== b.length) return false;
2351
+ const byId = new Map(a.map((task) => [task.id, task]));
2352
+ for (const task of b) {
2353
+ const other = byId.get(task.id);
2354
+ if (!other || other.description !== task.description || other.type !== task.type) return false;
2355
+ }
2356
+ return true;
2357
+ }
2358
+ function createBackgroundTaskTracker() {
2359
+ const background = /* @__PURE__ */ new Map();
2360
+ const known = /* @__PURE__ */ new Map();
2361
+ const add = (id, now, meta) => {
2362
+ const existing = background.get(id);
2363
+ const seen = known.get(id);
2364
+ background.set(id, {
2365
+ id,
2366
+ type: meta?.type ?? existing?.type ?? seen?.type ?? "unknown",
2367
+ description: clip(meta?.description ?? existing?.description ?? seen?.description ?? ""),
2368
+ startedAt: existing?.startedAt ?? now
2369
+ });
2370
+ if (background.size > BACKGROUND_TASKS_MAX) background.delete(background.keys().next().value);
2371
+ };
2372
+ function observe(message, now = Date.now()) {
2373
+ const m = message;
2374
+ if (m.type === "system") {
2375
+ if (m.subtype === "background_tasks_changed" && Array.isArray(m.tasks)) {
2376
+ const next = /* @__PURE__ */ new Set();
2377
+ for (const task of m.tasks) {
2378
+ const id2 = text(task?.task_id);
2379
+ if (!id2 || task.ambient === true) continue;
2380
+ next.add(id2);
2381
+ add(id2, now, { type: text(task.task_type) ?? void 0, description: text(task.description) ?? void 0 });
2382
+ }
2383
+ for (const id2 of [...background.keys()]) if (!next.has(id2)) background.delete(id2);
2384
+ return;
2385
+ }
2386
+ const id = text(m.task_id);
2387
+ if (!id) return;
2388
+ if (m.subtype === "task_started") {
2389
+ if (m.ambient === true || m.skip_transcript === true) return;
2390
+ const meta = { id, type: text(m.task_type) ?? "unknown", description: clip(text(m.description) ?? ""), toolUseId: text(m.tool_use_id) };
2391
+ known.set(id, meta);
2392
+ if (known.size > BACKGROUND_TASKS_MAX * 4) known.delete(known.keys().next().value);
2393
+ if (m.is_backgrounded === true) add(id, now, meta);
2394
+ return;
2395
+ }
2396
+ if (m.subtype === "task_updated" && m.patch && typeof m.patch === "object") {
2397
+ if (SETTLED_STATUSES.has(String(m.patch.status))) {
2398
+ background.delete(id);
2399
+ return;
2400
+ }
2401
+ if (m.patch.is_backgrounded === true) add(id, now, { description: text(m.patch.description) ?? void 0 });
2402
+ return;
2403
+ }
2404
+ if (m.subtype === "task_notification") {
2405
+ background.delete(id);
2406
+ return;
2407
+ }
2408
+ return;
2409
+ }
2410
+ if (m.type === "user" && m.tool_use_result && typeof m.tool_use_result === "object" && m.tool_use_result.status === "async_launched" && Array.isArray(m.message?.content)) {
2411
+ for (const block of m.message.content) {
2412
+ const toolUseId = block?.type === "tool_result" ? text(block.tool_use_id) : null;
2413
+ if (!toolUseId) continue;
2414
+ for (const seen of known.values()) if (seen.toolUseId === toolUseId) add(seen.id, now, seen);
2415
+ }
2416
+ }
2417
+ }
2418
+ function reset() {
2419
+ background.clear();
2420
+ known.clear();
2421
+ }
2422
+ function list() {
2423
+ return [...background.values()].sort((a, b) => a.startedAt - b.startedAt).map((task) => ({ ...task }));
2424
+ }
2425
+ return { observe, reset, list };
2426
+ }
2427
+
2428
+ const BACKGROUND_TASKS_LEASE_MS = 6e4;
2429
+ const BACKGROUND_TASKS_TTL_MS = 15e4;
2430
+ const EMPTY_BACKGROUND_TASKS = Object.freeze({ count: 0, tasks: [] });
2431
+ function backgroundTasksReport(stored, now, options = {}) {
2432
+ const tasks = Array.isArray(stored?.tasks) ? stored.tasks.filter((task) => task && typeof task.id === "string") : [];
2433
+ const reportedAt = typeof stored?.updatedAt === "number" ? stored.updatedAt : void 0;
2434
+ if (tasks.length === 0) return reportedAt === void 0 ? { ...EMPTY_BACKGROUND_TASKS, tasks: [] } : { count: 0, tasks: [], reportedAt };
2435
+ const fresh = options.active !== false && reportedAt !== void 0 && now - reportedAt <= (options.ttlMs ?? BACKGROUND_TASKS_TTL_MS);
2436
+ if (!fresh) return { count: 0, tasks: [], ...reportedAt !== void 0 ? { reportedAt } : {}, stale: true };
2437
+ return { count: tasks.length, tasks: tasks.map((task) => ({ ...task })), reportedAt };
2438
+ }
2439
+ class BackgroundTaskReporter {
2440
+ constructor(publish, leaseMs = BACKGROUND_TASKS_LEASE_MS) {
2441
+ this.publish = publish;
2442
+ this.leaseMs = leaseMs;
2443
+ }
2444
+ last = [];
2445
+ lastPublishedAt = 0;
2446
+ /** Called on every keepAlive tick with the current set; publishes only on an edge or a due renewal. */
2447
+ observe(tasks, now = Date.now()) {
2448
+ const changed = !sameBackgroundTasks(this.last, tasks);
2449
+ const due = tasks.length > 0 && now - this.lastPublishedAt >= this.leaseMs;
2450
+ if (!changed && !due) return false;
2451
+ this.last = tasks.map((task) => ({ ...task }));
2452
+ this.lastPublishedAt = now;
2453
+ this.publish(this.last, now);
2454
+ return true;
2455
+ }
2456
+ current() {
2457
+ return this.last;
2458
+ }
2459
+ }
2460
+ class BackgroundTaskTracker {
2461
+ constructor(ttlMs = BACKGROUND_TASKS_TTL_MS) {
2462
+ this.ttlMs = ttlMs;
2463
+ }
2464
+ sets = /* @__PURE__ */ new Map();
2465
+ apply(sessionId, tasks, now = Date.now()) {
2466
+ if (tasks.length === 0) this.sets.delete(sessionId);
2467
+ else this.sets.set(sessionId, { at: now, tasks: tasks.map((task) => ({ ...task })) });
2468
+ }
2469
+ /** The wrapper is gone: whatever it reported no longer holds. */
2470
+ forget(sessionId) {
2471
+ this.sets.delete(sessionId);
2472
+ }
2473
+ report(sessionId, now = Date.now()) {
2474
+ const entry = this.sets.get(sessionId);
2475
+ if (!entry) return { ...EMPTY_BACKGROUND_TASKS, tasks: [] };
2476
+ const out = backgroundTasksReport({ updatedAt: entry.at, tasks: entry.tasks }, now, { ttlMs: this.ttlMs });
2477
+ if (out.stale) this.sets.delete(sessionId);
2478
+ return out;
2479
+ }
2480
+ count(sessionId, now = Date.now()) {
2481
+ return this.report(sessionId, now).count;
2482
+ }
2483
+ /** Sessions whose published set is still inside the TTL. */
2484
+ activeSessions(now = Date.now()) {
2485
+ return [...this.sets.keys()].filter((id) => this.count(id, now) > 0);
2486
+ }
2487
+ hasAny(now = Date.now()) {
2488
+ return this.activeSessions(now).length > 0;
2489
+ }
2490
+ }
2491
+
2341
2492
  const CLIPBOARD_MAX_BYTES = 256 * 1024;
2342
2493
  const CLIPBOARD_HISTORY_MAX_BYTES = 32 * 1024;
2343
2494
  const CLIPBOARD_TOOL_NAME = "copy_to_clipboard";
@@ -2373,4 +2524,4 @@ function prepareClipboardHistoryText(input) {
2373
2524
  return { text, truncated: true, totalBytes: prepared.totalBytes };
2374
2525
  }
2375
2526
 
2376
- export { readTrackedClaudeSessionIds as $, AUTOMATION_NAME_PATTERN as A, BUILTIN_TODO_SKILL as B, CLIPBOARD_TOOL_NAME as C, hardenPrivateFileSync as D, writePrivateFileSync as E, packageJson as F, normalizeHttpEndpoint as G, AutomationNameSchema as H, AutomationConcurrencySchema as I, AutomationActionSchema as J, AutomationTriggerSchema as K, encrypt as L, decodeBase64 as M, decrypt as N, listDaemonSessions as O, resumeDaemonSession as P, listDaemonPeers as Q, AgentVersionsSchema as R, backoff as S, ReleaseDrainNoticeSchema as T, decryptBlob as U, RelayAssignmentResponseSchema as V, notifyDaemonTurnEvent as W, prepareClipboardText as X, prepareClipboardHistoryText as Y, credentialRelayProblem as Z, RelayCandidatesResponseSchema as _, CLIPBOARD_TOOL_TITLE as a, readTrackedCodexThreadIds as a0, isValidTerminalId as a1, exponentialBackoffDelay as a2, libsodiumEncryptForPublicKey as a3, libsodiumPublicKeyFromSecretKey as a4, getRandomBytes as a5, redactLogValue as a6, notifyDaemonSessionEvent as a7, STREAM_DELTA_MAX_CHARS as a8, ensurePrivateDirectory as a9, releaseDaemonLock as aA, ContextUsageSchema as aB, clearCredentials as aC, clearMachineId as aD, SandboxConfigSchema as aE, getLatestDaemonLog as aF, persistence as aG, hardenPrivateFile as aa, notifyDaemonClaudeAuthFailed as ab, readCredentials as ac, readDaemonState as ad, AGENT_VERSION_SOURCES as ae, readSettingsOutcome as af, encodeBase64Url as ag, writeCredentialsLegacy as ah, writeCredentialsDataKey as ai, decryptWithDataKey as aj, decryptLegacy as ak, persistSession as al, getAgentCodeDefaults as am, normalizeAgentKey as an, isClaudeOpus55Model as ao, supportsClaudeOpus55 as ap, AUTOMATION_SUMMARY_MAX_CHARS as aq, AUTOMATION_CLAIM_MAX_RUNS as ar, AUTOMATION_DEFAULT_LEASE_MS as as, isDaemonRunningCurrentlyInstalledHappyVersion as at, stopDaemon as au, acquireDaemonLock as av, deletePersistedSessions as aw, writeDaemonState as ax, writeSettings as ay, cleanupDaemonState as az, CLIPBOARD_TOOL_DESCRIPTION as b, configuration as c, readPersistedSessions as d, createEnvelope as e, isAutomationRunTerminal as f, delay as g, readCredentialsForConfiguredRelay as h, isValidSessionId as i, createBuiltinTodoClient as j, checkIfDaemonRunningAndCleanupStaleState as k, logger as l, spawnDaemonSession as m, stopDaemonSession as n, CLIPBOARD_MAX_BYTES as o, pushClipboardViaDaemon as p, pushFilePreviewViaDaemon as q, readSettings as r, streamKeyOf as s, setTerminalTitleViaDaemon as t, updateSettings as u, notifyDaemonSessionStarted as v, encodeBase64 as w, BUILTIN_TODO_DISCOVERY as x, reportSessionEditToDaemon as y, ensurePrivateDirectorySync as z };
2527
+ export { prepareClipboardHistoryText as $, AUTOMATION_NAME_PATTERN as A, BUILTIN_TODO_SKILL as B, CLIPBOARD_TOOL_NAME as C, hardenPrivateFileSync as D, writePrivateFileSync as E, packageJson as F, normalizeHttpEndpoint as G, AutomationNameSchema as H, AutomationConcurrencySchema as I, AutomationActionSchema as J, AutomationTriggerSchema as K, encrypt as L, decodeBase64 as M, decrypt as N, listDaemonSessions as O, backgroundTasksReport as P, resumeDaemonSession as Q, listDaemonPeers as R, AgentVersionsSchema as S, backoff as T, ReleaseDrainNoticeSchema as U, decryptBlob as V, RelayAssignmentResponseSchema as W, notifyDaemonTurnEvent as X, BackgroundTaskReporter as Y, notifyDaemonBackgroundTasks as Z, prepareClipboardText as _, CLIPBOARD_TOOL_TITLE as a, credentialRelayProblem as a0, RelayCandidatesResponseSchema as a1, readTrackedClaudeSessionIds as a2, readTrackedCodexThreadIds as a3, isValidTerminalId as a4, exponentialBackoffDelay as a5, libsodiumEncryptForPublicKey as a6, libsodiumPublicKeyFromSecretKey as a7, getRandomBytes as a8, redactLogValue as a9, isDaemonRunningCurrentlyInstalledHappyVersion as aA, stopDaemon as aB, acquireDaemonLock as aC, BackgroundTaskTracker as aD, deletePersistedSessions as aE, writeDaemonState as aF, writeSettings as aG, cleanupDaemonState as aH, releaseDaemonLock as aI, ContextUsageSchema as aJ, clearCredentials as aK, clearMachineId as aL, SandboxConfigSchema as aM, getLatestDaemonLog as aN, persistence as aO, sameBackgroundTasks as aa, notifyDaemonSessionEvent as ab, STREAM_DELTA_MAX_CHARS as ac, ensurePrivateDirectory as ad, hardenPrivateFile as ae, notifyDaemonClaudeAuthFailed as af, createBackgroundTaskTracker as ag, readCredentials as ah, readDaemonState as ai, AGENT_VERSION_SOURCES as aj, readSettingsOutcome as ak, encodeBase64Url as al, writeCredentialsLegacy as am, writeCredentialsDataKey as an, BACKGROUND_TASK_DESCRIPTION_MAX as ao, BACKGROUND_TASKS_MAX as ap, decryptWithDataKey as aq, decryptLegacy as ar, persistSession as as, getAgentCodeDefaults as at, normalizeAgentKey as au, isClaudeOpus55Model as av, supportsClaudeOpus55 as aw, AUTOMATION_SUMMARY_MAX_CHARS as ax, AUTOMATION_CLAIM_MAX_RUNS as ay, AUTOMATION_DEFAULT_LEASE_MS as az, CLIPBOARD_TOOL_DESCRIPTION as b, configuration as c, readPersistedSessions as d, createEnvelope as e, isAutomationRunTerminal as f, delay as g, readCredentialsForConfiguredRelay as h, isValidSessionId as i, createBuiltinTodoClient as j, checkIfDaemonRunningAndCleanupStaleState as k, logger as l, spawnDaemonSession as m, stopDaemonSession as n, CLIPBOARD_MAX_BYTES as o, pushClipboardViaDaemon as p, pushFilePreviewViaDaemon as q, readSettings as r, streamKeyOf as s, setTerminalTitleViaDaemon as t, updateSettings as u, notifyDaemonSessionStarted as v, encodeBase64 as w, BUILTIN_TODO_DISCOVERY as x, reportSessionEditToDaemon as y, ensurePrivateDirectorySync as z };
@@ -31,7 +31,7 @@ function _interopNamespaceDefault(e) {
31
31
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
32
32
 
33
33
  var name = "very-happy-cli";
34
- var version = "0.2.156";
34
+ var version = "0.2.157";
35
35
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
36
36
  var author = "Kirill Dubovitskiy";
37
37
  var contributors = [
@@ -148,12 +148,12 @@ var dependencies = {
148
148
  zod: "^4.0.0"
149
149
  };
150
150
  var optionalDependencies = {
151
- "very-happy-tools-arm64-darwin": "0.2.156",
152
- "very-happy-tools-x64-darwin": "0.2.156",
153
- "very-happy-tools-arm64-linux": "0.2.156",
154
- "very-happy-tools-x64-linux": "0.2.156",
155
- "very-happy-tools-arm64-win32": "0.2.156",
156
- "very-happy-tools-x64-win32": "0.2.156"
151
+ "very-happy-tools-arm64-darwin": "0.2.157",
152
+ "very-happy-tools-x64-darwin": "0.2.157",
153
+ "very-happy-tools-arm64-linux": "0.2.157",
154
+ "very-happy-tools-x64-linux": "0.2.157",
155
+ "very-happy-tools-arm64-win32": "0.2.157",
156
+ "very-happy-tools-x64-win32": "0.2.157"
157
157
  };
158
158
  var devDependencies = {
159
159
  "@slopus/happy-wire": "workspace:*",
@@ -1591,7 +1591,7 @@ const TeamActionSchema = z.z.discriminatedUnion("type", [
1591
1591
  z.z.object({ requestId: id$1, action: TeamActionSchema });
1592
1592
  z.z.object({ name: id$1, machineId: id$1, requestId: id$1.optional(), launch: TeamLaunchSchema.optional() });
1593
1593
  const id = z.z.string().min(1).max(128);
1594
- const text = z.z.string().min(1).max(32e3);
1594
+ const text$2 = z.z.string().min(1).max(32e3);
1595
1595
  const AUTOMATION_NAME_PATTERN = /^[a-z0-9][a-z0-9-_.]{0,63}$/;
1596
1596
  const AutomationNameSchema = z.z.string().regex(AUTOMATION_NAME_PATTERN, "automation name must match [a-z0-9][a-z0-9-_.]{0,63}");
1597
1597
  const AUTOMATION_MIN_INTERVAL_MS = 6e4;
@@ -1619,13 +1619,13 @@ const AutomationActionSchema = z.z.discriminatedUnion("kind", [
1619
1619
  kind: z.z.literal("spawn"),
1620
1620
  agent: z.z.string().trim().min(1).max(64),
1621
1621
  directory: z.z.string().min(1).max(4096),
1622
- prompt: text,
1622
+ prompt: text$2,
1623
1623
  model: z.z.string().trim().min(1).max(256).nullable().optional(),
1624
1624
  permissionMode: z.z.string().trim().min(1).max(64).nullable().optional(),
1625
1625
  worktree: z.z.boolean().optional(),
1626
1626
  sticky: AutomationStickySchema.optional()
1627
1627
  }),
1628
- z.z.object({ kind: z.z.literal("send"), sessionId: id, prompt: text }),
1628
+ z.z.object({ kind: z.z.literal("send"), sessionId: id, prompt: text$2 }),
1629
1629
  z.z.object({
1630
1630
  kind: z.z.literal("script"),
1631
1631
  command: z.z.array(z.z.string().min(1).max(4096)).min(1).max(256),
@@ -2189,6 +2189,9 @@ async function notifyDaemonClaudeAuthFailed(sessionId) {
2189
2189
  async function notifyDaemonTurnEvent(sessionId, event) {
2190
2190
  return daemonPost("/session-event", { sessionId, event });
2191
2191
  }
2192
+ async function notifyDaemonBackgroundTasks(sessionId, backgroundTasks) {
2193
+ return daemonPost("/session-event", { sessionId, event: "background_tasks", backgroundTasks });
2194
+ }
2192
2195
  function reportSessionEditToDaemon(edit) {
2193
2196
  void daemonPost("/session-edit", edit).then((result) => {
2194
2197
  if (result?.error) logger.debug(`[CONTROL CLIENT] session-edit not recorded: ${result.error}`);
@@ -2358,6 +2361,154 @@ let backoff = createBackoff({
2358
2361
  }
2359
2362
  });
2360
2363
 
2364
+ const BACKGROUND_TASKS_MAX = 50;
2365
+ const BACKGROUND_TASK_DESCRIPTION_MAX = 200;
2366
+ const text = (value) => typeof value === "string" && value.length > 0 && !value.includes("\0") ? value : null;
2367
+ const clip = (value) => value.length <= BACKGROUND_TASK_DESCRIPTION_MAX ? value : `${value.slice(0, BACKGROUND_TASK_DESCRIPTION_MAX - 1)}\u2026`;
2368
+ const SETTLED_STATUSES = /* @__PURE__ */ new Set(["completed", "failed", "killed"]);
2369
+ function sameBackgroundTasks(a, b) {
2370
+ if (a.length !== b.length) return false;
2371
+ const byId = new Map(a.map((task) => [task.id, task]));
2372
+ for (const task of b) {
2373
+ const other = byId.get(task.id);
2374
+ if (!other || other.description !== task.description || other.type !== task.type) return false;
2375
+ }
2376
+ return true;
2377
+ }
2378
+ function createBackgroundTaskTracker() {
2379
+ const background = /* @__PURE__ */ new Map();
2380
+ const known = /* @__PURE__ */ new Map();
2381
+ const add = (id, now, meta) => {
2382
+ const existing = background.get(id);
2383
+ const seen = known.get(id);
2384
+ background.set(id, {
2385
+ id,
2386
+ type: meta?.type ?? existing?.type ?? seen?.type ?? "unknown",
2387
+ description: clip(meta?.description ?? existing?.description ?? seen?.description ?? ""),
2388
+ startedAt: existing?.startedAt ?? now
2389
+ });
2390
+ if (background.size > BACKGROUND_TASKS_MAX) background.delete(background.keys().next().value);
2391
+ };
2392
+ function observe(message, now = Date.now()) {
2393
+ const m = message;
2394
+ if (m.type === "system") {
2395
+ if (m.subtype === "background_tasks_changed" && Array.isArray(m.tasks)) {
2396
+ const next = /* @__PURE__ */ new Set();
2397
+ for (const task of m.tasks) {
2398
+ const id2 = text(task?.task_id);
2399
+ if (!id2 || task.ambient === true) continue;
2400
+ next.add(id2);
2401
+ add(id2, now, { type: text(task.task_type) ?? void 0, description: text(task.description) ?? void 0 });
2402
+ }
2403
+ for (const id2 of [...background.keys()]) if (!next.has(id2)) background.delete(id2);
2404
+ return;
2405
+ }
2406
+ const id = text(m.task_id);
2407
+ if (!id) return;
2408
+ if (m.subtype === "task_started") {
2409
+ if (m.ambient === true || m.skip_transcript === true) return;
2410
+ const meta = { id, type: text(m.task_type) ?? "unknown", description: clip(text(m.description) ?? ""), toolUseId: text(m.tool_use_id) };
2411
+ known.set(id, meta);
2412
+ if (known.size > BACKGROUND_TASKS_MAX * 4) known.delete(known.keys().next().value);
2413
+ if (m.is_backgrounded === true) add(id, now, meta);
2414
+ return;
2415
+ }
2416
+ if (m.subtype === "task_updated" && m.patch && typeof m.patch === "object") {
2417
+ if (SETTLED_STATUSES.has(String(m.patch.status))) {
2418
+ background.delete(id);
2419
+ return;
2420
+ }
2421
+ if (m.patch.is_backgrounded === true) add(id, now, { description: text(m.patch.description) ?? void 0 });
2422
+ return;
2423
+ }
2424
+ if (m.subtype === "task_notification") {
2425
+ background.delete(id);
2426
+ return;
2427
+ }
2428
+ return;
2429
+ }
2430
+ if (m.type === "user" && m.tool_use_result && typeof m.tool_use_result === "object" && m.tool_use_result.status === "async_launched" && Array.isArray(m.message?.content)) {
2431
+ for (const block of m.message.content) {
2432
+ const toolUseId = block?.type === "tool_result" ? text(block.tool_use_id) : null;
2433
+ if (!toolUseId) continue;
2434
+ for (const seen of known.values()) if (seen.toolUseId === toolUseId) add(seen.id, now, seen);
2435
+ }
2436
+ }
2437
+ }
2438
+ function reset() {
2439
+ background.clear();
2440
+ known.clear();
2441
+ }
2442
+ function list() {
2443
+ return [...background.values()].sort((a, b) => a.startedAt - b.startedAt).map((task) => ({ ...task }));
2444
+ }
2445
+ return { observe, reset, list };
2446
+ }
2447
+
2448
+ const BACKGROUND_TASKS_LEASE_MS = 6e4;
2449
+ const BACKGROUND_TASKS_TTL_MS = 15e4;
2450
+ const EMPTY_BACKGROUND_TASKS = Object.freeze({ count: 0, tasks: [] });
2451
+ function backgroundTasksReport(stored, now, options = {}) {
2452
+ const tasks = Array.isArray(stored?.tasks) ? stored.tasks.filter((task) => task && typeof task.id === "string") : [];
2453
+ const reportedAt = typeof stored?.updatedAt === "number" ? stored.updatedAt : void 0;
2454
+ if (tasks.length === 0) return reportedAt === void 0 ? { ...EMPTY_BACKGROUND_TASKS, tasks: [] } : { count: 0, tasks: [], reportedAt };
2455
+ const fresh = options.active !== false && reportedAt !== void 0 && now - reportedAt <= (options.ttlMs ?? BACKGROUND_TASKS_TTL_MS);
2456
+ if (!fresh) return { count: 0, tasks: [], ...reportedAt !== void 0 ? { reportedAt } : {}, stale: true };
2457
+ return { count: tasks.length, tasks: tasks.map((task) => ({ ...task })), reportedAt };
2458
+ }
2459
+ class BackgroundTaskReporter {
2460
+ constructor(publish, leaseMs = BACKGROUND_TASKS_LEASE_MS) {
2461
+ this.publish = publish;
2462
+ this.leaseMs = leaseMs;
2463
+ }
2464
+ last = [];
2465
+ lastPublishedAt = 0;
2466
+ /** Called on every keepAlive tick with the current set; publishes only on an edge or a due renewal. */
2467
+ observe(tasks, now = Date.now()) {
2468
+ const changed = !sameBackgroundTasks(this.last, tasks);
2469
+ const due = tasks.length > 0 && now - this.lastPublishedAt >= this.leaseMs;
2470
+ if (!changed && !due) return false;
2471
+ this.last = tasks.map((task) => ({ ...task }));
2472
+ this.lastPublishedAt = now;
2473
+ this.publish(this.last, now);
2474
+ return true;
2475
+ }
2476
+ current() {
2477
+ return this.last;
2478
+ }
2479
+ }
2480
+ class BackgroundTaskTracker {
2481
+ constructor(ttlMs = BACKGROUND_TASKS_TTL_MS) {
2482
+ this.ttlMs = ttlMs;
2483
+ }
2484
+ sets = /* @__PURE__ */ new Map();
2485
+ apply(sessionId, tasks, now = Date.now()) {
2486
+ if (tasks.length === 0) this.sets.delete(sessionId);
2487
+ else this.sets.set(sessionId, { at: now, tasks: tasks.map((task) => ({ ...task })) });
2488
+ }
2489
+ /** The wrapper is gone: whatever it reported no longer holds. */
2490
+ forget(sessionId) {
2491
+ this.sets.delete(sessionId);
2492
+ }
2493
+ report(sessionId, now = Date.now()) {
2494
+ const entry = this.sets.get(sessionId);
2495
+ if (!entry) return { ...EMPTY_BACKGROUND_TASKS, tasks: [] };
2496
+ const out = backgroundTasksReport({ updatedAt: entry.at, tasks: entry.tasks }, now, { ttlMs: this.ttlMs });
2497
+ if (out.stale) this.sets.delete(sessionId);
2498
+ return out;
2499
+ }
2500
+ count(sessionId, now = Date.now()) {
2501
+ return this.report(sessionId, now).count;
2502
+ }
2503
+ /** Sessions whose published set is still inside the TTL. */
2504
+ activeSessions(now = Date.now()) {
2505
+ return [...this.sets.keys()].filter((id) => this.count(id, now) > 0);
2506
+ }
2507
+ hasAny(now = Date.now()) {
2508
+ return this.activeSessions(now).length > 0;
2509
+ }
2510
+ }
2511
+
2361
2512
  const CLIPBOARD_MAX_BYTES = 256 * 1024;
2362
2513
  const CLIPBOARD_HISTORY_MAX_BYTES = 32 * 1024;
2363
2514
  const CLIPBOARD_TOOL_NAME = "copy_to_clipboard";
@@ -2403,8 +2554,12 @@ exports.AutomationActionSchema = AutomationActionSchema;
2403
2554
  exports.AutomationConcurrencySchema = AutomationConcurrencySchema;
2404
2555
  exports.AutomationNameSchema = AutomationNameSchema;
2405
2556
  exports.AutomationTriggerSchema = AutomationTriggerSchema;
2557
+ exports.BACKGROUND_TASKS_MAX = BACKGROUND_TASKS_MAX;
2558
+ exports.BACKGROUND_TASK_DESCRIPTION_MAX = BACKGROUND_TASK_DESCRIPTION_MAX;
2406
2559
  exports.BUILTIN_TODO_DISCOVERY = BUILTIN_TODO_DISCOVERY;
2407
2560
  exports.BUILTIN_TODO_SKILL = BUILTIN_TODO_SKILL;
2561
+ exports.BackgroundTaskReporter = BackgroundTaskReporter;
2562
+ exports.BackgroundTaskTracker = BackgroundTaskTracker;
2408
2563
  exports.CLIPBOARD_MAX_BYTES = CLIPBOARD_MAX_BYTES;
2409
2564
  exports.CLIPBOARD_TOOL_DESCRIPTION = CLIPBOARD_TOOL_DESCRIPTION;
2410
2565
  exports.CLIPBOARD_TOOL_NAME = CLIPBOARD_TOOL_NAME;
@@ -2416,12 +2571,14 @@ exports.ReleaseDrainNoticeSchema = ReleaseDrainNoticeSchema;
2416
2571
  exports.STREAM_DELTA_MAX_CHARS = STREAM_DELTA_MAX_CHARS;
2417
2572
  exports.SandboxConfigSchema = SandboxConfigSchema;
2418
2573
  exports.acquireDaemonLock = acquireDaemonLock;
2574
+ exports.backgroundTasksReport = backgroundTasksReport;
2419
2575
  exports.backoff = backoff;
2420
2576
  exports.checkIfDaemonRunningAndCleanupStaleState = checkIfDaemonRunningAndCleanupStaleState;
2421
2577
  exports.cleanupDaemonState = cleanupDaemonState;
2422
2578
  exports.clearCredentials = clearCredentials;
2423
2579
  exports.clearMachineId = clearMachineId;
2424
2580
  exports.configuration = configuration;
2581
+ exports.createBackgroundTaskTracker = createBackgroundTaskTracker;
2425
2582
  exports.createBuiltinTodoClient = createBuiltinTodoClient;
2426
2583
  exports.createEnvelope = createEnvelope;
2427
2584
  exports.credentialRelayProblem = credentialRelayProblem;
@@ -2455,6 +2612,7 @@ exports.listDaemonSessions = listDaemonSessions;
2455
2612
  exports.logger = logger;
2456
2613
  exports.normalizeAgentKey = normalizeAgentKey;
2457
2614
  exports.normalizeHttpEndpoint = normalizeHttpEndpoint;
2615
+ exports.notifyDaemonBackgroundTasks = notifyDaemonBackgroundTasks;
2458
2616
  exports.notifyDaemonClaudeAuthFailed = notifyDaemonClaudeAuthFailed;
2459
2617
  exports.notifyDaemonSessionEvent = notifyDaemonSessionEvent;
2460
2618
  exports.notifyDaemonSessionStarted = notifyDaemonSessionStarted;
@@ -2478,6 +2636,7 @@ exports.redactLogValue = redactLogValue;
2478
2636
  exports.releaseDaemonLock = releaseDaemonLock;
2479
2637
  exports.reportSessionEditToDaemon = reportSessionEditToDaemon;
2480
2638
  exports.resumeDaemonSession = resumeDaemonSession;
2639
+ exports.sameBackgroundTasks = sameBackgroundTasks;
2481
2640
  exports.setTerminalTitleViaDaemon = setTerminalTitleViaDaemon;
2482
2641
  exports.spawnDaemonSession = spawnDaemonSession;
2483
2642
  exports.stopDaemon = stopDaemon;
@@ -1,9 +1,9 @@
1
- import { r as registerTeamsTools, P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION } from './agentGuidance-C604n0Zq.mjs';
1
+ import { r as registerTeamsTools, P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION } from './agentGuidance-CU6YD_Ms.mjs';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { z } from 'zod';
5
- import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, p as pushClipboardViaDaemon, o as CLIPBOARD_MAX_BYTES, q as pushFilePreviewViaDaemon, t as setTerminalTitleViaDaemon } from './limits-DmMdchTz.mjs';
6
- import { e as checkPreviewPath, f as registerAssistantSessionTools, g as suggestTitleForPrompt } from './index-DAAreiRF.mjs';
5
+ import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, p as pushClipboardViaDaemon, o as CLIPBOARD_MAX_BYTES, q as pushFilePreviewViaDaemon, t as setTerminalTitleViaDaemon } from './limits-A2c-3M-_.mjs';
6
+ import { e as checkPreviewPath, f as registerAssistantSessionTools, g as suggestTitleForPrompt } from './index-BYU1e81k.mjs';
7
7
  import 'node:fs/promises';
8
8
  import 'node:os';
9
9
  import 'node:crypto';
@@ -11,7 +11,7 @@ import 'axios';
11
11
  import 'tweetnacl';
12
12
  import 'socket.io-client';
13
13
  import 'node:child_process';
14
- import './types-BEVzYSoV.mjs';
14
+ import './types-BrGJ7PJz.mjs';
15
15
  import 'node:fs';
16
16
  import 'node:path';
17
17
  import { b as TerminalTitleSuggestRequestSchema } from './terminalTitleSuggest-DKgX3osW.mjs';
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var agentGuidance = require('./agentGuidance-C-CmV03f.cjs');
3
+ var agentGuidance = require('./agentGuidance-Db76O1kw.cjs');
4
4
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
5
5
  var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
6
6
  var z = require('zod');
7
- var persistence = require('./limits-o29KXBgj.cjs');
8
- var index = require('./index-BbtR-Qto.cjs');
7
+ var persistence = require('./limits-CyuIt-Vl.cjs');
8
+ var index = require('./index-C9QzZsUQ.cjs');
9
9
  require('node:fs/promises');
10
10
  require('node:os');
11
11
  require('node:crypto');
@@ -13,7 +13,7 @@ require('axios');
13
13
  require('tweetnacl');
14
14
  require('socket.io-client');
15
15
  require('node:child_process');
16
- require('./types-CphWjqHc.cjs');
16
+ require('./types-B0sSi6eM.cjs');
17
17
  require('node:fs');
18
18
  require('node:path');
19
19
  var terminalTitleSuggest = require('./terminalTitleSuggest-Dji8I0Jy.cjs');
@@ -3,8 +3,8 @@
3
3
  var promises = require('node:fs/promises');
4
4
  var node_crypto = require('node:crypto');
5
5
  var path = require('node:path');
6
- var persistence = require('./limits-o29KXBgj.cjs');
7
- var index = require('./index-BbtR-Qto.cjs');
6
+ var persistence = require('./limits-CyuIt-Vl.cjs');
7
+ var index = require('./index-C9QzZsUQ.cjs');
8
8
 
9
9
  async function publish(path, content, mode) {
10
10
  const temporary = `${path}.${node_crypto.randomUUID()}.new`;
@@ -1,8 +1,8 @@
1
1
  import { mkdir, chmod, writeFile, rename } from 'node:fs/promises';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { join } from 'node:path';
4
- import { c as configuration } from './limits-DmMdchTz.mjs';
5
- import { P as PI_TEAMS_EXTENSION } from './index-DAAreiRF.mjs';
4
+ import { c as configuration } from './limits-A2c-3M-_.mjs';
5
+ import { P as PI_TEAMS_EXTENSION } from './index-BYU1e81k.mjs';
6
6
 
7
7
  async function publish(path, content, mode) {
8
8
  const temporary = `${path}.${randomUUID()}.new`;
@@ -5,21 +5,21 @@ var node_crypto = require('node:crypto');
5
5
  var node_http = require('node:http');
6
6
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
7
7
  var streamableHttp_js = require('@modelcontextprotocol/sdk/server/streamableHttp.js');
8
- var piRuntime = require('./piRuntime-Dj5WnqzJ.cjs');
9
- var mcp = require('./mcp-CwK1nI7Y.cjs');
10
- require('./agentGuidance-C-CmV03f.cjs');
8
+ var piRuntime = require('./piRuntime-CJjA26oD.cjs');
9
+ var mcp = require('./mcp-CXkvnztT.cjs');
10
+ require('./agentGuidance-Db76O1kw.cjs');
11
11
  require('node:fs/promises');
12
12
  require('node:os');
13
13
  require('zod');
14
- require('./limits-o29KXBgj.cjs');
14
+ require('./limits-CyuIt-Vl.cjs');
15
15
  require('axios');
16
16
  require('tweetnacl');
17
17
  require('socket.io-client');
18
- require('./types-CphWjqHc.cjs');
18
+ require('./types-B0sSi6eM.cjs');
19
19
  require('node:fs');
20
20
  require('node:path');
21
21
  var terminalToolContext = require('./terminalToolContext-DoV9Gs7K.cjs');
22
- require('./index-BbtR-Qto.cjs');
22
+ require('./index-C9QzZsUQ.cjs');
23
23
  require('chalk');
24
24
  require('cross-spawn');
25
25
  require('node:readline');
@@ -3,21 +3,21 @@ import { randomUUID } from 'node:crypto';
3
3
  import { createServer } from 'node:http';
4
4
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
5
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
6
- import { p as preparePiTeamsRuntime } from './piRuntime-Cu2-8nOT.mjs';
7
- import { registerMcpTools, registerTerminalTitleSuggest } from './mcp-C_uejotl.mjs';
8
- import './agentGuidance-C604n0Zq.mjs';
6
+ import { p as preparePiTeamsRuntime } from './piRuntime-DdEY2mE9.mjs';
7
+ import { registerMcpTools, registerTerminalTitleSuggest } from './mcp-Bo934Kpy.mjs';
8
+ import './agentGuidance-CU6YD_Ms.mjs';
9
9
  import 'node:fs/promises';
10
10
  import 'node:os';
11
11
  import 'zod';
12
- import './limits-DmMdchTz.mjs';
12
+ import './limits-A2c-3M-_.mjs';
13
13
  import 'axios';
14
14
  import 'tweetnacl';
15
15
  import 'socket.io-client';
16
- import './types-BEVzYSoV.mjs';
16
+ import './types-BrGJ7PJz.mjs';
17
17
  import 'node:fs';
18
18
  import 'node:path';
19
19
  import { r as resolveMcpTerminalId } from './terminalToolContext-CFeGeaNm.mjs';
20
- import './index-DAAreiRF.mjs';
20
+ import './index-BYU1e81k.mjs';
21
21
  import 'chalk';
22
22
  import 'cross-spawn';
23
23
  import 'node:readline';
@@ -2,12 +2,12 @@ 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 { h as connectionState, A as ApiClient, i as errorLogMetadata, j as contentLogMetadata } from './types-BEVzYSoV.mjs';
6
- import { l as logger, r as readSettings, v as notifyDaemonSessionStarted, w as encodeBase64 } from './limits-DmMdchTz.mjs';
7
- import { I as GEMINI_API_KEY_ENV, J as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, K as BaseReasoningProcessor, h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, M as MessageQueue2, m as hashObject, L as MessageBuffer, N as CHANGE_TITLE_INSTRUCTION, v as registerKillSessionHandler, n as startHappyServer } from './index-DAAreiRF.mjs';
5
+ import { h as connectionState, A as ApiClient, i as errorLogMetadata, j as contentLogMetadata } from './types-BrGJ7PJz.mjs';
6
+ import { l as logger, r as readSettings, v as notifyDaemonSessionStarted, w as encodeBase64 } from './limits-A2c-3M-_.mjs';
7
+ import { I as GEMINI_API_KEY_ENV, J as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, B as BasePermissionHandler, K as BaseReasoningProcessor, h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, M as MessageQueue2, m as hashObject, L as MessageBuffer, N as CHANGE_TITLE_INSTRUCTION, v as registerKillSessionHandler, n as startHappyServer } from './index-BYU1e81k.mjs';
8
8
  import { p as projectPath } from './terminalTitleSuggest-DKgX3osW.mjs';
9
- import { A as AcpBackend } from './AcpBackend-C3nc1u-s.mjs';
10
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-BkTu25bH.mjs';
9
+ import { A as AcpBackend } from './AcpBackend-Cy18U7yw.mjs';
10
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-aAbhJllb.mjs';
11
11
  import 'axios';
12
12
  import 'node:events';
13
13
  import 'socket.io-client';
@@ -32,7 +32,7 @@ import '@anthropic-ai/sandbox-runtime';
32
32
  import 'expo-server-sdk';
33
33
  import 'chalk';
34
34
  import 'node:util';
35
- import './agentGuidance-C604n0Zq.mjs';
35
+ import './agentGuidance-CU6YD_Ms.mjs';
36
36
  import '@anthropic-ai/claude-agent-sdk';
37
37
  import 'ps-list';
38
38
  import 'tmp';