very-happy-cli 0.2.133 → 0.2.135

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 (45) hide show
  1. package/dist/{AcpBackend-DgG8o4jd.cjs → AcpBackend-C0Bwx6bc.cjs} +3 -3
  2. package/dist/{AcpBackend-BQm7dNza.mjs → AcpBackend-CkDpu1n_.mjs} +3 -3
  3. package/dist/{AcpSessionManager-C7unPEZO.mjs → AcpSessionManager-DB_mfFaH.mjs} +1 -1
  4. package/dist/{AcpSessionManager-DDFEmhQp.cjs → AcpSessionManager-DqvUp-UU.cjs} +1 -1
  5. package/dist/{agentGuidance-BaplwDcV.mjs → agentGuidance-7MByWxKj.mjs} +1 -1
  6. package/dist/{agentGuidance-BItqIZTf.cjs → agentGuidance-DlZM_YPV.cjs} +1 -1
  7. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  8. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  9. package/dist/{config-uLywzv5t.cjs → config-BO0ZHyoB.cjs} +4 -4
  10. package/dist/{config-BZ8xEnOv.mjs → config-DzvbcL_x.mjs} +4 -4
  11. package/dist/{index-Daga0ztv.cjs → index-BEpZjXs4.cjs} +15 -9
  12. package/dist/{index-ClCeQ1FW.mjs → index-C33JB4xB.mjs} +16 -10
  13. package/dist/{index-D8i2EViA.mjs → index-CpEdOGpe.mjs} +4 -4
  14. package/dist/{index-CdH3ecC5.cjs → index-DHI6Y1xW.cjs} +4 -4
  15. package/dist/{index-6Xm0CgN_.cjs → index-DNbKbe23.cjs} +1536 -1202
  16. package/dist/{index-EsR8ayIg.mjs → index-gefLe1Bk.mjs} +1534 -1200
  17. package/dist/index.cjs +4 -4
  18. package/dist/index.mjs +4 -4
  19. package/dist/{installTerminalHooks-NH4kiB2E.mjs → installTerminalHooks-BWoHGCew.mjs} +4 -4
  20. package/dist/{installTerminalHooks-CKG0MYVK.cjs → installTerminalHooks-gmWKACNb.cjs} +4 -4
  21. package/dist/lib.cjs +2 -2
  22. package/dist/lib.d.cts +20 -60
  23. package/dist/lib.d.mts +20 -60
  24. package/dist/lib.mjs +2 -2
  25. package/dist/{limits-Du7S6jqA.mjs → limits-CPTgiQ9A.mjs} +8 -8
  26. package/dist/{limits-XRNzIlVm.cjs → limits-K17AgMHD.cjs} +8 -8
  27. package/dist/{mcp-CAMCuudA.cjs → mcp-CK1NCZm0.cjs} +4 -4
  28. package/dist/{mcp-D8zhjyZa.mjs → mcp-DhuxpwTB.mjs} +4 -4
  29. package/dist/{runGemini-Db4rX54F.mjs → runGemini-BVJE7LZl.mjs} +6 -6
  30. package/dist/{runGemini-BIVHp0ST.cjs → runGemini-n0wD2Z9R.cjs} +6 -6
  31. package/dist/{runOpenClaw-D2MceXPO.mjs → runOpenClaw-CJaIYpB7.mjs} +5 -5
  32. package/dist/{runOpenClaw-a0f2pZZp.cjs → runOpenClaw-fYx1XweW.cjs} +5 -5
  33. package/dist/{send-DKbumEcg.cjs → send-WlJ4r3U2.cjs} +4 -4
  34. package/dist/{send-1Wjb0lIh.mjs → send-fWHOFJV9.mjs} +4 -4
  35. package/dist/{sessions-DXCCRDb5.mjs → sessions-5fJxQ2xj.mjs} +4 -4
  36. package/dist/{sessions-SIFOOlGp.cjs → sessions-Cx_3cvN6.cjs} +4 -4
  37. package/dist/{spawn-Bj3W6HR4.mjs → spawn-CF1ZV-YH.mjs} +4 -4
  38. package/dist/{spawn-C-XpSPLX.cjs → spawn-DVJtNwWN.cjs} +4 -4
  39. package/dist/{teams-ChFzXAqr.cjs → teams-BbYi0fWG.cjs} +4 -4
  40. package/dist/{teams-CqhFQLVC.mjs → teams-gzvKrMfn.mjs} +4 -4
  41. package/dist/{todo-B0gbQHH8.mjs → todo-BAK2DVLV.mjs} +3 -3
  42. package/dist/{todo-o0clp-_I.cjs → todo-DHY20tpD.cjs} +3 -3
  43. package/dist/{types-6DrEgHVx.mjs → types-BEXGahmj.mjs} +128 -35
  44. package/dist/{types-CcjVmS2i.cjs → types-DjAHWb4J.cjs} +129 -35
  45. package/package.json +8 -8
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-6Xm0CgN_.cjs');
5
- require('./limits-XRNzIlVm.cjs');
4
+ require('./index-DNbKbe23.cjs');
5
+ require('./limits-K17AgMHD.cjs');
6
6
  require('zod');
7
- require('./types-CcjVmS2i.cjs');
7
+ require('./types-DjAHWb4J.cjs');
8
8
  require('node:child_process');
9
9
  require('node:os');
10
10
  require('node:crypto');
@@ -12,7 +12,7 @@ require('cross-spawn');
12
12
  require('node:path');
13
13
  require('node:readline');
14
14
  require('node:fs');
15
- require('./agentGuidance-BItqIZTf.cjs');
15
+ require('./agentGuidance-DlZM_YPV.cjs');
16
16
  require('node:fs/promises');
17
17
  require('fs/promises');
18
18
  require('ink');
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './index-EsR8ayIg.mjs';
3
- import './limits-Du7S6jqA.mjs';
2
+ import './index-gefLe1Bk.mjs';
3
+ import './limits-CPTgiQ9A.mjs';
4
4
  import 'zod';
5
- import './types-6DrEgHVx.mjs';
5
+ import './types-BEXGahmj.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:os';
8
8
  import 'node:crypto';
@@ -10,7 +10,7 @@ import 'cross-spawn';
10
10
  import 'node:path';
11
11
  import 'node:readline';
12
12
  import 'node:fs';
13
- import './agentGuidance-BaplwDcV.mjs';
13
+ import './agentGuidance-7MByWxKj.mjs';
14
14
  import 'node:fs/promises';
15
15
  import 'fs/promises';
16
16
  import 'ink';
@@ -3,10 +3,10 @@ import { join, resolve } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import chalk from 'chalk';
6
- import { p as projectPath } from './types-6DrEgHVx.mjs';
7
- import { t as tmuxSupportsSessionEnv } from './index-EsR8ayIg.mjs';
6
+ import { p as projectPath } from './types-BEXGahmj.mjs';
7
+ import { t as tmuxSupportsSessionEnv } from './index-gefLe1Bk.mjs';
8
8
  import 'axios';
9
- import './limits-Du7S6jqA.mjs';
9
+ import './limits-CPTgiQ9A.mjs';
10
10
  import 'node:fs/promises';
11
11
  import 'zod';
12
12
  import 'node:crypto';
@@ -28,7 +28,7 @@ import 'fs';
28
28
  import 'node:readline';
29
29
  import '@anthropic-ai/sandbox-runtime';
30
30
  import 'expo-server-sdk';
31
- import './agentGuidance-BaplwDcV.mjs';
31
+ import './agentGuidance-7MByWxKj.mjs';
32
32
  import 'ink';
33
33
  import 'react';
34
34
  import '@anthropic-ai/claude-agent-sdk';
@@ -5,10 +5,10 @@ var path = require('node:path');
5
5
  var os = require('node:os');
6
6
  var node_child_process = require('node:child_process');
7
7
  var chalk = require('chalk');
8
- var api = require('./types-CcjVmS2i.cjs');
9
- var index = require('./index-6Xm0CgN_.cjs');
8
+ var api = require('./types-DjAHWb4J.cjs');
9
+ var index = require('./index-DNbKbe23.cjs');
10
10
  require('axios');
11
- require('./limits-XRNzIlVm.cjs');
11
+ require('./limits-K17AgMHD.cjs');
12
12
  require('node:fs/promises');
13
13
  require('zod');
14
14
  require('node:crypto');
@@ -30,7 +30,7 @@ require('fs');
30
30
  require('node:readline');
31
31
  require('@anthropic-ai/sandbox-runtime');
32
32
  require('expo-server-sdk');
33
- require('./agentGuidance-BItqIZTf.cjs');
33
+ require('./agentGuidance-DlZM_YPV.cjs');
34
34
  require('ink');
35
35
  require('react');
36
36
  require('@anthropic-ai/claude-agent-sdk');
package/dist/lib.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./types-CcjVmS2i.cjs');
4
- var persistence = require('./limits-XRNzIlVm.cjs');
3
+ var api = require('./types-DjAHWb4J.cjs');
4
+ var persistence = require('./limits-K17AgMHD.cjs');
5
5
  require('axios');
6
6
  require('node:events');
7
7
  require('socket.io-client');
package/dist/lib.d.cts CHANGED
@@ -33,6 +33,7 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
33
33
  t: z.ZodLiteral<"text">;
34
34
  text: z.ZodString;
35
35
  thinking: z.ZodOptional<z.ZodBoolean>;
36
+ actualModel: z.ZodOptional<z.ZodString>;
36
37
  }, z.core.$strip>, z.ZodObject<{
37
38
  t: z.ZodLiteral<"service">;
38
39
  text: z.ZodString;
@@ -379,6 +380,17 @@ type CliUpdateState = z$1.infer<typeof CliUpdateStateSchema>;
379
380
  * Daemon state - dynamic runtime information (frequently updated)
380
381
  */
381
382
  declare const DaemonStateSchema: z$1.ZodObject<{
383
+ agentVersions: z$1.ZodOptional<z$1.ZodObject<{
384
+ checkedAt: z$1.ZodNumber;
385
+ daemonPid: z$1.ZodNumber;
386
+ agents: z$1.ZodArray<z$1.ZodObject<{
387
+ id: z$1.ZodString;
388
+ installed: z$1.ZodNullable<z$1.ZodString>;
389
+ latest: z$1.ZodNullable<z$1.ZodString>;
390
+ status: z$1.ZodString;
391
+ }, z$1.core.$strip>>;
392
+ }, z$1.core.$strip>>;
393
+ agentVersionEpoch: z$1.ZodOptional<z$1.ZodNumber>;
382
394
  status: z$1.ZodUnion<readonly [z$1.ZodEnum<{
383
395
  running: "running";
384
396
  "shutting-down": "shutting-down";
@@ -408,6 +420,8 @@ declare const DaemonStateSchema: z$1.ZodObject<{
408
420
  idle: "idle";
409
421
  shell: "shell";
410
422
  }>>;
423
+ agentKind: z$1.ZodOptional<z$1.ZodString>;
424
+ agentObservedAt: z$1.ZodOptional<z$1.ZodNumber>;
411
425
  mirrorSessionId: z$1.ZodOptional<z$1.ZodString>;
412
426
  restoredAt: z$1.ZodOptional<z$1.ZodNumber>;
413
427
  manual: z$1.ZodOptional<z$1.ZodBoolean>;
@@ -1184,66 +1198,8 @@ type SpawnSessionResult = {
1184
1198
  errorMessage: string;
1185
1199
  };
1186
1200
 
1187
- /**
1188
- * Web terminal manager (daemon side).
1189
- *
1190
- * ── Architecture (Stage 1: daemon-authoritative screen) ──────────────────────
1191
- * Each web terminal is a long-lived daemon session object that owns the screen
1192
- * state, so client reconnect/redraw no longer relies on tmux redrawing on
1193
- * re-attach. A session holds:
1194
- * 1. a node-pty attached to a BACKGROUND tmux session `vh-<id>` (the pty is
1195
- * just tmux's single stable client; the tmux session holds the process);
1196
- * 2. an `@xterm/headless` Terminal — every pty output chunk is `.write()` into
1197
- * it, so the daemon always has the authoritative screen + scrollback;
1198
- * 3. a monotonic output `seq` (incremented per emitted chunk);
1199
- * 4. a bounded ring buffer of recent `{ seq, data }` chunks, used to replay
1200
- * only the gap after a brief client disconnect instead of a full snapshot.
1201
- *
1202
- * On (re)subscribe (`open`), the daemon returns either a REPLAY (the client's
1203
- * `fromSeq..now` is still covered by the ring → send just the missing chunks) or
1204
- * a SNAPSHOT (serialize the headless screen, bounded scrollback). The pty is NOT
1205
- * recreated on re-subscribe — the browser connecting/disconnecting is pure
1206
- * subscribe/unsubscribe against the daemon buffer. This is what kills the old
1207
- * single-client redraw jitter: the daemon keeps exactly one steady tmux client;
1208
- * it no longer creates/destroys a tmux client on every browser open/close.
1209
- *
1210
- * Cross-browser survival: closing the web view only marks the session as having
1211
- * no subscribers; the pty (and headless buffer) live on. An idle reaper detaches
1212
- * the pty only when it has no subscribers AND has been idle past the timeout
1213
- * (tmux stays alive → reopening reattaches instantly). MAX_LIVE_SESSIONS still
1214
- * LRU-evicts to protect the system PTY pool.
1215
- *
1216
- * Transport: raw bytes are relayed base64 over the (TLS) socket through the
1217
- * server, consistent with the server-trusted model. open/input/resize/close are
1218
- * driven from apiMachine; live output is pushed via the injected emit callback.
1219
- * If tmux isn't installed we fall back to the login shell directly (no local
1220
- * attach / no background survival, but the terminal still works).
1221
- *
1222
- * ── List push (Stage 2: daemon-driven terminal list) ─────────────────────────
1223
- * The manager also runs ONE internal list-tracking loop (startListTracking):
1224
- * every tick it rebuilds the cross-device list (tmux membership + @vh_title
1225
- * follow + agent classification + activity) and fires the callback only when
1226
- * the list SIGNATURE changed (terminalListSignature — activityAt quantized so
1227
- * raw output alone can't turn it into a metronome). Event kicks (open / kill /
1228
- * exit / rename / live OSC title via headless onTitleChange) refresh within
1229
- * LIST_KICK_DEBOUNCE_MS instead of waiting for the tick. apiMachine writes each
1230
- * changed list into daemonState.webTerminals, which the server persists and
1231
- * broadcasts — clients consume the push instead of polling `list-terminals`
1232
- * (the RPC remains for old clients; both return the same item shape).
1233
- *
1234
- * ── Realtime activity (Stage 3: ephemeral `terminal-activity`) ───────────────
1235
- * The list push above is the DURABLE lane and is deliberately coarse: one push
1236
- * costs a full daemonState encrypt + CAS + DB write + broadcast, so activity
1237
- * only participates in its signature at 60s granularity — which meant a
1238
- * terminal that was merely PRINTING could take up to a minute to float to the
1239
- * top of the sidebar. Stage 3 adds a second, ephemeral lane for exactly that
1240
- * one number: `terminal-activity` frames carrying `[{ id, activityAt }]`,
1241
- * relayed by the server to the account's web clients and stored nowhere. Fed
1242
- * by the live pty stream (leading-edge throttled to ~1s) and by the tracking
1243
- * tick (which is the only observer of COLD sessions' tmux activity). Emitted
1244
- * only when a value actually moved, so an idle machine sends nothing at all.
1245
- * The 60s bucket stays exactly as it is — the two lanes have different jobs.
1246
- */
1201
+ /** Agent-specific visible-screen adapters. Unknown is deliberately not idle. */
1202
+ type CodingAgentKind = 'claude' | 'codex' | 'pi';
1247
1203
 
1248
1204
  /**
1249
1205
  * Coarse state of the agent (Claude Code) inside a web terminal, surfaced in
@@ -1267,6 +1223,8 @@ interface TerminalListItem {
1267
1223
  createdAt?: number;
1268
1224
  activityAt?: number;
1269
1225
  agentState?: AgentState;
1226
+ agentKind?: CodingAgentKind;
1227
+ agentObservedAt?: number;
1270
1228
  /** Mirror reconcile (design v3): stricter "claude is really here" gate (its
1271
1229
  * own TUI footer/dialog present) — daemon-internal, NOT pushed to web and
1272
1230
  * NOT part of the list signature. Only this may trigger mirror adopt (which
@@ -1347,6 +1305,8 @@ declare class ApiMachineClient {
1347
1305
  * stale" so the FIRST keep-alive tick always probes and populates the
1348
1306
  * machine metadata that a connecting/reconnecting web client reads. */
1349
1307
  private lastCliProbeAt;
1308
+ /** Stable across socket reconnects; a new client/run invalidates old version checks. */
1309
+ private readonly agentVersionEpoch;
1350
1310
  private cliUpdateState;
1351
1311
  private cliUpdatePushChain;
1352
1312
  private claudeAuthState;
package/dist/lib.d.mts CHANGED
@@ -33,6 +33,7 @@ declare const sessionEnvelopeSchema: z.ZodObject<{
33
33
  t: z.ZodLiteral<"text">;
34
34
  text: z.ZodString;
35
35
  thinking: z.ZodOptional<z.ZodBoolean>;
36
+ actualModel: z.ZodOptional<z.ZodString>;
36
37
  }, z.core.$strip>, z.ZodObject<{
37
38
  t: z.ZodLiteral<"service">;
38
39
  text: z.ZodString;
@@ -379,6 +380,17 @@ type CliUpdateState = z$1.infer<typeof CliUpdateStateSchema>;
379
380
  * Daemon state - dynamic runtime information (frequently updated)
380
381
  */
381
382
  declare const DaemonStateSchema: z$1.ZodObject<{
383
+ agentVersions: z$1.ZodOptional<z$1.ZodObject<{
384
+ checkedAt: z$1.ZodNumber;
385
+ daemonPid: z$1.ZodNumber;
386
+ agents: z$1.ZodArray<z$1.ZodObject<{
387
+ id: z$1.ZodString;
388
+ installed: z$1.ZodNullable<z$1.ZodString>;
389
+ latest: z$1.ZodNullable<z$1.ZodString>;
390
+ status: z$1.ZodString;
391
+ }, z$1.core.$strip>>;
392
+ }, z$1.core.$strip>>;
393
+ agentVersionEpoch: z$1.ZodOptional<z$1.ZodNumber>;
382
394
  status: z$1.ZodUnion<readonly [z$1.ZodEnum<{
383
395
  running: "running";
384
396
  "shutting-down": "shutting-down";
@@ -408,6 +420,8 @@ declare const DaemonStateSchema: z$1.ZodObject<{
408
420
  idle: "idle";
409
421
  shell: "shell";
410
422
  }>>;
423
+ agentKind: z$1.ZodOptional<z$1.ZodString>;
424
+ agentObservedAt: z$1.ZodOptional<z$1.ZodNumber>;
411
425
  mirrorSessionId: z$1.ZodOptional<z$1.ZodString>;
412
426
  restoredAt: z$1.ZodOptional<z$1.ZodNumber>;
413
427
  manual: z$1.ZodOptional<z$1.ZodBoolean>;
@@ -1184,66 +1198,8 @@ type SpawnSessionResult = {
1184
1198
  errorMessage: string;
1185
1199
  };
1186
1200
 
1187
- /**
1188
- * Web terminal manager (daemon side).
1189
- *
1190
- * ── Architecture (Stage 1: daemon-authoritative screen) ──────────────────────
1191
- * Each web terminal is a long-lived daemon session object that owns the screen
1192
- * state, so client reconnect/redraw no longer relies on tmux redrawing on
1193
- * re-attach. A session holds:
1194
- * 1. a node-pty attached to a BACKGROUND tmux session `vh-<id>` (the pty is
1195
- * just tmux's single stable client; the tmux session holds the process);
1196
- * 2. an `@xterm/headless` Terminal — every pty output chunk is `.write()` into
1197
- * it, so the daemon always has the authoritative screen + scrollback;
1198
- * 3. a monotonic output `seq` (incremented per emitted chunk);
1199
- * 4. a bounded ring buffer of recent `{ seq, data }` chunks, used to replay
1200
- * only the gap after a brief client disconnect instead of a full snapshot.
1201
- *
1202
- * On (re)subscribe (`open`), the daemon returns either a REPLAY (the client's
1203
- * `fromSeq..now` is still covered by the ring → send just the missing chunks) or
1204
- * a SNAPSHOT (serialize the headless screen, bounded scrollback). The pty is NOT
1205
- * recreated on re-subscribe — the browser connecting/disconnecting is pure
1206
- * subscribe/unsubscribe against the daemon buffer. This is what kills the old
1207
- * single-client redraw jitter: the daemon keeps exactly one steady tmux client;
1208
- * it no longer creates/destroys a tmux client on every browser open/close.
1209
- *
1210
- * Cross-browser survival: closing the web view only marks the session as having
1211
- * no subscribers; the pty (and headless buffer) live on. An idle reaper detaches
1212
- * the pty only when it has no subscribers AND has been idle past the timeout
1213
- * (tmux stays alive → reopening reattaches instantly). MAX_LIVE_SESSIONS still
1214
- * LRU-evicts to protect the system PTY pool.
1215
- *
1216
- * Transport: raw bytes are relayed base64 over the (TLS) socket through the
1217
- * server, consistent with the server-trusted model. open/input/resize/close are
1218
- * driven from apiMachine; live output is pushed via the injected emit callback.
1219
- * If tmux isn't installed we fall back to the login shell directly (no local
1220
- * attach / no background survival, but the terminal still works).
1221
- *
1222
- * ── List push (Stage 2: daemon-driven terminal list) ─────────────────────────
1223
- * The manager also runs ONE internal list-tracking loop (startListTracking):
1224
- * every tick it rebuilds the cross-device list (tmux membership + @vh_title
1225
- * follow + agent classification + activity) and fires the callback only when
1226
- * the list SIGNATURE changed (terminalListSignature — activityAt quantized so
1227
- * raw output alone can't turn it into a metronome). Event kicks (open / kill /
1228
- * exit / rename / live OSC title via headless onTitleChange) refresh within
1229
- * LIST_KICK_DEBOUNCE_MS instead of waiting for the tick. apiMachine writes each
1230
- * changed list into daemonState.webTerminals, which the server persists and
1231
- * broadcasts — clients consume the push instead of polling `list-terminals`
1232
- * (the RPC remains for old clients; both return the same item shape).
1233
- *
1234
- * ── Realtime activity (Stage 3: ephemeral `terminal-activity`) ───────────────
1235
- * The list push above is the DURABLE lane and is deliberately coarse: one push
1236
- * costs a full daemonState encrypt + CAS + DB write + broadcast, so activity
1237
- * only participates in its signature at 60s granularity — which meant a
1238
- * terminal that was merely PRINTING could take up to a minute to float to the
1239
- * top of the sidebar. Stage 3 adds a second, ephemeral lane for exactly that
1240
- * one number: `terminal-activity` frames carrying `[{ id, activityAt }]`,
1241
- * relayed by the server to the account's web clients and stored nowhere. Fed
1242
- * by the live pty stream (leading-edge throttled to ~1s) and by the tracking
1243
- * tick (which is the only observer of COLD sessions' tmux activity). Emitted
1244
- * only when a value actually moved, so an idle machine sends nothing at all.
1245
- * The 60s bucket stays exactly as it is — the two lanes have different jobs.
1246
- */
1201
+ /** Agent-specific visible-screen adapters. Unknown is deliberately not idle. */
1202
+ type CodingAgentKind = 'claude' | 'codex' | 'pi';
1247
1203
 
1248
1204
  /**
1249
1205
  * Coarse state of the agent (Claude Code) inside a web terminal, surfaced in
@@ -1267,6 +1223,8 @@ interface TerminalListItem {
1267
1223
  createdAt?: number;
1268
1224
  activityAt?: number;
1269
1225
  agentState?: AgentState;
1226
+ agentKind?: CodingAgentKind;
1227
+ agentObservedAt?: number;
1270
1228
  /** Mirror reconcile (design v3): stricter "claude is really here" gate (its
1271
1229
  * own TUI footer/dialog present) — daemon-internal, NOT pushed to web and
1272
1230
  * NOT part of the list signature. Only this may trigger mirror adopt (which
@@ -1347,6 +1305,8 @@ declare class ApiMachineClient {
1347
1305
  * stale" so the FIRST keep-alive tick always probes and populates the
1348
1306
  * machine metadata that a connecting/reconnecting web client reads. */
1349
1307
  private lastCliProbeAt;
1308
+ /** Stable across socket reconnects; a new client/run invalidates old version checks. */
1309
+ private readonly agentVersionEpoch;
1350
1310
  private cliUpdateState;
1351
1311
  private cliUpdatePushChain;
1352
1312
  private claudeAuthState;
package/dist/lib.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-6DrEgHVx.mjs';
2
- export { c as configuration, l as logger } from './limits-Du7S6jqA.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-BEXGahmj.mjs';
2
+ export { c as configuration, l as logger } from './limits-CPTgiQ9A.mjs';
3
3
  import 'axios';
4
4
  import 'node:events';
5
5
  import 'socket.io-client';
@@ -9,7 +9,7 @@ import chalk from 'chalk';
9
9
  import { inspect } from 'node:util';
10
10
 
11
11
  var name = "very-happy-cli";
12
- var version = "0.2.133";
12
+ var version = "0.2.135";
13
13
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
14
14
  var author = "Kirill Dubovitskiy";
15
15
  var contributors = [
@@ -88,7 +88,7 @@ var scripts = {
88
88
  };
89
89
  var dependencies = {
90
90
  "@agentclientprotocol/sdk": "^0.14.1",
91
- "@anthropic-ai/claude-agent-sdk": "^0.3.232",
91
+ "@anthropic-ai/claude-agent-sdk": "0.3.267",
92
92
  "@anthropic-ai/sandbox-runtime": "^0.0.37",
93
93
  "@modelcontextprotocol/sdk": "1.30.0",
94
94
  "@noble/ed25519": "^3.0.0",
@@ -122,12 +122,12 @@ var dependencies = {
122
122
  zod: "^4.0.0"
123
123
  };
124
124
  var optionalDependencies = {
125
- "very-happy-tools-arm64-darwin": "0.2.133",
126
- "very-happy-tools-x64-darwin": "0.2.133",
127
- "very-happy-tools-arm64-linux": "0.2.133",
128
- "very-happy-tools-x64-linux": "0.2.133",
129
- "very-happy-tools-arm64-win32": "0.2.133",
130
- "very-happy-tools-x64-win32": "0.2.133"
125
+ "very-happy-tools-arm64-darwin": "0.2.135",
126
+ "very-happy-tools-x64-darwin": "0.2.135",
127
+ "very-happy-tools-arm64-linux": "0.2.135",
128
+ "very-happy-tools-x64-linux": "0.2.135",
129
+ "very-happy-tools-arm64-win32": "0.2.135",
130
+ "very-happy-tools-x64-win32": "0.2.135"
131
131
  };
132
132
  var devDependencies = {
133
133
  "@slopus/happy-wire": "workspace:*",
@@ -30,7 +30,7 @@ function _interopNamespaceDefault(e) {
30
30
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
31
31
 
32
32
  var name = "very-happy-cli";
33
- var version = "0.2.133";
33
+ var version = "0.2.135";
34
34
  var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
35
35
  var author = "Kirill Dubovitskiy";
36
36
  var contributors = [
@@ -109,7 +109,7 @@ var scripts = {
109
109
  };
110
110
  var dependencies = {
111
111
  "@agentclientprotocol/sdk": "^0.14.1",
112
- "@anthropic-ai/claude-agent-sdk": "^0.3.232",
112
+ "@anthropic-ai/claude-agent-sdk": "0.3.267",
113
113
  "@anthropic-ai/sandbox-runtime": "^0.0.37",
114
114
  "@modelcontextprotocol/sdk": "1.30.0",
115
115
  "@noble/ed25519": "^3.0.0",
@@ -143,12 +143,12 @@ var dependencies = {
143
143
  zod: "^4.0.0"
144
144
  };
145
145
  var optionalDependencies = {
146
- "very-happy-tools-arm64-darwin": "0.2.133",
147
- "very-happy-tools-x64-darwin": "0.2.133",
148
- "very-happy-tools-arm64-linux": "0.2.133",
149
- "very-happy-tools-x64-linux": "0.2.133",
150
- "very-happy-tools-arm64-win32": "0.2.133",
151
- "very-happy-tools-x64-win32": "0.2.133"
146
+ "very-happy-tools-arm64-darwin": "0.2.135",
147
+ "very-happy-tools-x64-darwin": "0.2.135",
148
+ "very-happy-tools-arm64-linux": "0.2.135",
149
+ "very-happy-tools-x64-linux": "0.2.135",
150
+ "very-happy-tools-arm64-win32": "0.2.135",
151
+ "very-happy-tools-x64-win32": "0.2.135"
152
152
  };
153
153
  var devDependencies = {
154
154
  "@slopus/happy-wire": "workspace:*",
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var agentGuidance = require('./agentGuidance-BItqIZTf.cjs');
3
+ var agentGuidance = require('./agentGuidance-DlZM_YPV.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 index = require('./index-6Xm0CgN_.cjs');
8
- var persistence = require('./limits-XRNzIlVm.cjs');
7
+ var index = require('./index-DNbKbe23.cjs');
8
+ var persistence = require('./limits-K17AgMHD.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-CcjVmS2i.cjs');
16
+ require('./types-DjAHWb4J.cjs');
17
17
  require('node:fs');
18
18
  require('node:path');
19
19
  require('chalk');
@@ -1,9 +1,9 @@
1
- import { r as registerTeamsTools } from './agentGuidance-BaplwDcV.mjs';
1
+ import { r as registerTeamsTools } from './agentGuidance-7MByWxKj.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 { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-EsR8ayIg.mjs';
6
- import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-Du7S6jqA.mjs';
5
+ import { p as pushClipboardViaDaemon, k as setTerminalTitleViaDaemon, m as registerAssistantSessionTools } from './index-gefLe1Bk.mjs';
6
+ import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, e as CLIPBOARD_MAX_BYTES } from './limits-CPTgiQ9A.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-6DrEgHVx.mjs';
14
+ import './types-BEXGahmj.mjs';
15
15
  import 'node:fs';
16
16
  import 'node:path';
17
17
  import 'chalk';
@@ -2,11 +2,11 @@ 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 { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-6DrEgHVx.mjs';
6
- import { l as logger, g as readSettings, i as encodeBase64 } from './limits-Du7S6jqA.mjs';
7
- import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-EsR8ayIg.mjs';
8
- import { A as AcpBackend } from './AcpBackend-BQm7dNza.mjs';
9
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-BZ8xEnOv.mjs';
5
+ import { f as connectionState, A as ApiClient, e as errorLogMetadata, p as projectPath, d as contentLogMetadata } from './types-BEXGahmj.mjs';
6
+ import { l as logger, g as readSettings, i as encodeBase64 } from './limits-CPTgiQ9A.mjs';
7
+ import { Q as GEMINI_API_KEY_ENV, R as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, K as BasePermissionHandler, U as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, B as hashObject, V as MessageBuffer, W as CHANGE_TITLE_INSTRUCTION, y as registerKillSessionHandler, C as startHappyServer } from './index-gefLe1Bk.mjs';
8
+ import { A as AcpBackend } from './AcpBackend-CkDpu1n_.mjs';
9
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-DzvbcL_x.mjs';
10
10
  import 'axios';
11
11
  import 'node:events';
12
12
  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-BaplwDcV.mjs';
35
+ import './agentGuidance-7MByWxKj.mjs';
36
36
  import '@anthropic-ai/claude-agent-sdk';
37
37
  import 'ps-list';
38
38
  import 'tmp';
@@ -4,11 +4,11 @@ var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
6
  var path = require('node:path');
7
- var api = require('./types-CcjVmS2i.cjs');
8
- var persistence = require('./limits-XRNzIlVm.cjs');
9
- var index = require('./index-6Xm0CgN_.cjs');
10
- var AcpBackend = require('./AcpBackend-DgG8o4jd.cjs');
11
- var config = require('./config-uLywzv5t.cjs');
7
+ var api = require('./types-DjAHWb4J.cjs');
8
+ var persistence = require('./limits-K17AgMHD.cjs');
9
+ var index = require('./index-DNbKbe23.cjs');
10
+ var AcpBackend = require('./AcpBackend-C0Bwx6bc.cjs');
11
+ var config = require('./config-BO0ZHyoB.cjs');
12
12
  require('axios');
13
13
  require('node:events');
14
14
  require('socket.io-client');
@@ -34,7 +34,7 @@ require('@anthropic-ai/sandbox-runtime');
34
34
  require('expo-server-sdk');
35
35
  require('chalk');
36
36
  require('node:util');
37
- require('./agentGuidance-BItqIZTf.cjs');
37
+ require('./agentGuidance-DlZM_YPV.cjs');
38
38
  require('@anthropic-ai/claude-agent-sdk');
39
39
  require('ps-list');
40
40
  require('tmp');
@@ -3,10 +3,10 @@ import { execFileSync } from 'node:child_process';
3
3
  import os from 'node:os';
4
4
  import { existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
- import { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-6DrEgHVx.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-C7unPEZO.mjs';
8
- import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-Du7S6jqA.mjs';
9
- import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-EsR8ayIg.mjs';
6
+ import { e as errorLogMetadata, d as contentLogMetadata, f as connectionState, A as ApiClient } from './types-BEXGahmj.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-DB_mfFaH.mjs';
8
+ import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, g as readSettings, i as encodeBase64, l as logger, c as configuration } from './limits-CPTgiQ9A.mjs';
9
+ import { n as initialMachineMetadata, o as createSessionMetadata, u as setupOfflineReconnection, v as notifyDaemonSessionStarted, x as MessageQueue2, y as registerKillSessionHandler } from './index-gefLe1Bk.mjs';
10
10
  import WebSocket from 'ws';
11
11
  import * as ed from '@noble/ed25519';
12
12
  import { sha512 } from '@noble/hashes/sha2.js';
@@ -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-BaplwDcV.mjs';
35
+ import './agentGuidance-7MByWxKj.mjs';
36
36
  import 'ink';
37
37
  import 'react';
38
38
  import '@anthropic-ai/claude-agent-sdk';
@@ -5,10 +5,10 @@ var node_child_process = require('node:child_process');
5
5
  var os = require('node:os');
6
6
  var node_fs = require('node:fs');
7
7
  var path = require('node:path');
8
- var api = require('./types-CcjVmS2i.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-DDFEmhQp.cjs');
10
- var persistence = require('./limits-XRNzIlVm.cjs');
11
- var index = require('./index-6Xm0CgN_.cjs');
8
+ var api = require('./types-DjAHWb4J.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-DqvUp-UU.cjs');
10
+ var persistence = require('./limits-K17AgMHD.cjs');
11
+ var index = require('./index-DNbKbe23.cjs');
12
12
  var WebSocket = require('ws');
13
13
  var ed = require('@noble/ed25519');
14
14
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -34,7 +34,7 @@ require('@anthropic-ai/sandbox-runtime');
34
34
  require('expo-server-sdk');
35
35
  require('chalk');
36
36
  require('node:util');
37
- require('./agentGuidance-BItqIZTf.cjs');
37
+ require('./agentGuidance-DlZM_YPV.cjs');
38
38
  require('ink');
39
39
  require('react');
40
40
  require('@anthropic-ai/claude-agent-sdk');
@@ -3,15 +3,15 @@
3
3
  var chalk = require('chalk');
4
4
  var node_fs = require('node:fs');
5
5
  var path = require('node:path');
6
- var persistence = require('./limits-XRNzIlVm.cjs');
7
- var index = require('./index-6Xm0CgN_.cjs');
6
+ var persistence = require('./limits-K17AgMHD.cjs');
7
+ var index = require('./index-DNbKbe23.cjs');
8
8
  require('node:fs/promises');
9
9
  require('node:os');
10
10
  require('zod');
11
11
  require('node:crypto');
12
12
  require('tweetnacl');
13
13
  require('node:util');
14
- require('./types-CcjVmS2i.cjs');
14
+ require('./types-DjAHWb4J.cjs');
15
15
  require('axios');
16
16
  require('node:events');
17
17
  require('socket.io-client');
@@ -30,7 +30,7 @@ require('fs');
30
30
  require('node:readline');
31
31
  require('@anthropic-ai/sandbox-runtime');
32
32
  require('expo-server-sdk');
33
- require('./agentGuidance-BItqIZTf.cjs');
33
+ require('./agentGuidance-DlZM_YPV.cjs');
34
34
  require('ink');
35
35
  require('react');
36
36
  require('@anthropic-ai/claude-agent-sdk');
@@ -1,15 +1,15 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { r as readPersistedSessions, c as configuration } from './limits-Du7S6jqA.mjs';
5
- import { d as sendUserMessage, a as sessionWebUrl } from './index-EsR8ayIg.mjs';
4
+ import { r as readPersistedSessions, c as configuration } from './limits-CPTgiQ9A.mjs';
5
+ import { d as sendUserMessage, a as sessionWebUrl } from './index-gefLe1Bk.mjs';
6
6
  import 'node:fs/promises';
7
7
  import 'node:os';
8
8
  import 'zod';
9
9
  import 'node:crypto';
10
10
  import 'tweetnacl';
11
11
  import 'node:util';
12
- import './types-6DrEgHVx.mjs';
12
+ import './types-BEXGahmj.mjs';
13
13
  import 'axios';
14
14
  import 'node:events';
15
15
  import 'socket.io-client';
@@ -28,7 +28,7 @@ import 'fs';
28
28
  import 'node:readline';
29
29
  import '@anthropic-ai/sandbox-runtime';
30
30
  import 'expo-server-sdk';
31
- import './agentGuidance-BaplwDcV.mjs';
31
+ import './agentGuidance-7MByWxKj.mjs';
32
32
  import 'ink';
33
33
  import 'react';
34
34
  import '@anthropic-ai/claude-agent-sdk';