very-happy-cli 0.2.151 → 0.2.153

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 (65) hide show
  1. package/dist/{AcpBackend-blE9IEod.cjs → AcpBackend-DSt8nTYm.cjs} +2 -2
  2. package/dist/{AcpBackend-BjTA5gUB.mjs → AcpBackend-YDGv4E-g.mjs} +2 -2
  3. package/dist/{AcpSessionManager-D-9mrp40.mjs → AcpSessionManager-Cxf5HQX1.mjs} +1 -1
  4. package/dist/{AcpSessionManager-bF8PYu_B.cjs → AcpSessionManager-uov6I9C8.cjs} +9 -9
  5. package/dist/agentGuidance-BM4kMNyr.cjs +553 -0
  6. package/dist/agentGuidance-C8unGWp7.mjs +529 -0
  7. package/dist/{agentHome-D6MSfwnp.cjs → agentHome-BJ7bde35.cjs} +4 -4
  8. package/dist/{agentHome-CeFDNzvq.mjs → agentHome-D68Xh2ae.mjs} +4 -4
  9. package/dist/auto-C-90ojIH.cjs +472 -0
  10. package/dist/auto-CcXxfqkC.mjs +466 -0
  11. package/dist/codex/happyMcpStdioBridge.cjs +4 -2
  12. package/dist/codex/happyMcpStdioBridge.mjs +4 -2
  13. package/dist/{config-C-A1XF62.mjs → config-CHJ189UJ.mjs} +6 -6
  14. package/dist/{config-Cadw1sAk.cjs → config-D23kF0_u.cjs} +6 -6
  15. package/dist/{index-DYQgcgL2.mjs → index-BXA9fxbK.mjs} +6 -6
  16. package/dist/{index-CIyjJy8D.mjs → index-BacwoXzs.mjs} +748 -55
  17. package/dist/{index-DEp6CmmS.mjs → index-BgYZGODP.mjs} +20 -20
  18. package/dist/{index-vyRqLjDv.cjs → index-D49WvbDT.cjs} +6 -6
  19. package/dist/{index-BKGspSWk.cjs → index-DEOVn46R.cjs} +21 -21
  20. package/dist/{index-CqtfRzug.cjs → index-DHrwHxHf.cjs} +805 -105
  21. package/dist/index.cjs +5 -5
  22. package/dist/index.mjs +5 -5
  23. package/dist/install-BiOXBnnS.cjs +118 -0
  24. package/dist/install-Ca7_Z3bV.mjs +114 -0
  25. package/dist/{installPiTools-C-Lxv4Bt.mjs → installPiTools-Cj7yU9Fc.mjs} +2 -1
  26. package/dist/{installPiTools-BKnXjrVu.cjs → installPiTools-DuZ6jZvX.cjs} +3 -2
  27. package/dist/{installTerminalHooks-Bf_adbl3.cjs → installTerminalHooks-BF0kL0ae.cjs} +8 -8
  28. package/dist/{installTerminalHooks-Ch_yTtEA.mjs → installTerminalHooks-Bpl32K75.mjs} +7 -7
  29. package/dist/lib.cjs +4 -4
  30. package/dist/lib.mjs +4 -4
  31. package/dist/limits-BtAuKRl2.mjs +2080 -0
  32. package/dist/limits-DY_sFA3J.cjs +2175 -0
  33. package/dist/{mcp-zu8n8TkR.mjs → mcp-DQkmk4VV.mjs} +15 -8
  34. package/dist/{mcp-CMxEZ6-0.cjs → mcp-JpqI2POW.cjs} +15 -7
  35. package/dist/piExtension.d.mts +4 -1
  36. package/dist/piExtension.mjs +24 -1
  37. package/dist/{piRuntime-Cu6cXZ6N.mjs → piRuntime-DBpe12NN.mjs} +2 -2
  38. package/dist/{piRuntime-D3ny0mVg.cjs → piRuntime-DRbbeQ72.cjs} +2 -2
  39. package/dist/{piTerminal-M677UP7y.mjs → piTerminal-BoHvPEZ_.mjs} +8 -7
  40. package/dist/{piTerminal-kDSd_r9X.cjs → piTerminal-qdJ9KZVL.cjs} +8 -7
  41. package/dist/{runGemini-DuwdVV1O.cjs → runGemini-CtOEFvhf.cjs} +9 -9
  42. package/dist/{runGemini-DvJwQVGp.mjs → runGemini-YqH7a-7O.mjs} +8 -8
  43. package/dist/{runOpenClaw-BG82bF18.mjs → runOpenClaw-DSSyFQBb.mjs} +7 -7
  44. package/dist/{runOpenClaw-BsvtCE_H.cjs → runOpenClaw-DoqZXBvL.cjs} +7 -7
  45. package/dist/{send-aUkjhey7.cjs → send-9075kHZP.cjs} +6 -6
  46. package/dist/{send-o6WM-1G8.mjs → send-Cs-RwqNf.mjs} +6 -6
  47. package/dist/{sessions-DlU3foY_.mjs → sessions-iBnYzVUK.mjs} +6 -6
  48. package/dist/{sessions-B3vP18kz.cjs → sessions-qULzUzlI.cjs} +6 -6
  49. package/dist/{spawn-DxHIIqhi.mjs → spawn-C6fRkedx.mjs} +7 -32
  50. package/dist/{spawn-DH6_p4-f.cjs → spawn-od9V23cc.cjs} +8 -33
  51. package/dist/{teams-DoAA_CcN.mjs → teams-CkrWQ4uM.mjs} +16 -73
  52. package/dist/{teams-BW8D1n3o.cjs → teams-CrCzU-AV.cjs} +14 -71
  53. package/dist/terminalTitleSuggest-DKgX3osW.mjs +38 -0
  54. package/dist/terminalTitleSuggest-Dji8I0Jy.cjs +45 -0
  55. package/dist/{todo-Bcc2XxGh.cjs → todo-BCT_ZPuV.cjs} +4 -23
  56. package/dist/{todo-BhJbG5eq.mjs → todo-aCZmSt27.mjs} +2 -21
  57. package/dist/{types-BN3eiipi.mjs → types-BvqOVUOW.mjs} +214 -1022
  58. package/dist/{types-CPubg05Z.cjs → types-CUCU7Vw8.cjs} +43 -863
  59. package/package.json +7 -7
  60. package/dist/agentGuidance-BXa9ikrZ.cjs +0 -267
  61. package/dist/agentGuidance-Dvo3cZMW.mjs +0 -251
  62. package/dist/limits-DS-bnYYp.mjs +0 -1165
  63. package/dist/limits-DwcY3kyi.cjs +0 -1236
  64. package/dist/projectPath-CSpqWdxp.mjs +0 -10
  65. package/dist/projectPath-ChLhdOyt.cjs +0 -13
@@ -1,10 +1,10 @@
1
- import { r as registerTeamsTools, P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION } from './agentGuidance-Dvo3cZMW.mjs';
1
+ import { r as registerTeamsTools, P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION } from './agentGuidance-C8unGWp7.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 { g as pushClipboardViaDaemon, h as pushFilePreviewViaDaemon, j as setTerminalTitleViaDaemon } from './types-BN3eiipi.mjs';
6
- import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, f as CLIPBOARD_MAX_BYTES } from './limits-DS-bnYYp.mjs';
7
- import { g as checkPreviewPath, h as registerAssistantSessionTools } from './index-CIyjJy8D.mjs';
5
+ import { l as pushClipboardViaDaemon, m as pushFilePreviewViaDaemon, n as setTerminalTitleViaDaemon } from './types-BvqOVUOW.mjs';
6
+ import { l as logger, C as CLIPBOARD_TOOL_NAME, a as CLIPBOARD_TOOL_TITLE, b as CLIPBOARD_TOOL_DESCRIPTION, h as CLIPBOARD_MAX_BYTES } from './limits-BtAuKRl2.mjs';
7
+ import { v as checkPreviewPath, x as registerAssistantSessionTools, y as suggestTitleForPrompt } from './index-BacwoXzs.mjs';
8
8
  import 'node:fs/promises';
9
9
  import 'node:os';
10
10
  import 'node:crypto';
@@ -14,18 +14,17 @@ import 'socket.io-client';
14
14
  import 'node:child_process';
15
15
  import 'node:fs';
16
16
  import 'node:path';
17
+ import { b as TerminalTitleSuggestRequestSchema } from './terminalTitleSuggest-DKgX3osW.mjs';
17
18
  import { r as resolveMcpTerminalId } from './terminalToolContext-CFeGeaNm.mjs';
18
19
  import 'node:events';
19
- import '@paralleldrive/cuid2';
20
20
  import 'child_process';
21
21
  import 'util';
22
22
  import 'fs/promises';
23
23
  import 'crypto';
24
24
  import 'path';
25
25
  import 'cross-spawn';
26
- import './projectPath-CSpqWdxp.mjs';
27
- import 'url';
28
26
  import 'os';
27
+ import '@paralleldrive/cuid2';
29
28
  import 'node-pty';
30
29
  import 'fs';
31
30
  import 'node:readline';
@@ -48,6 +47,7 @@ import 'http';
48
47
  import 'inquirer';
49
48
  import 'node:url';
50
49
  import 'node:readline/promises';
50
+ import 'url';
51
51
 
52
52
  const TERMINAL_TITLE_TOOL_NAME = "change_title";
53
53
  function resolveMcpToolSurface(env) {
@@ -56,6 +56,12 @@ function resolveMcpToolSurface(env) {
56
56
  return "assistant";
57
57
  }
58
58
 
59
+ function registerTerminalTitleSuggest(server) {
60
+ server.server.setRequestHandler(TerminalTitleSuggestRequestSchema, async (request) => {
61
+ logger.debug("[MCP] terminal title suggestion requested");
62
+ return { title: await suggestTitleForPrompt(request.params.prompt) };
63
+ });
64
+ }
59
65
  function registerMcpTools(server, surface, terminalId = null) {
60
66
  server.registerTool(CLIPBOARD_TOOL_NAME, {
61
67
  description: CLIPBOARD_TOOL_DESCRIPTION,
@@ -138,6 +144,7 @@ async function handleMcpCommand(terminalToolsOnly = false) {
138
144
  const terminalId = resolveMcpTerminalId(process.env);
139
145
  if (terminalToolsOnly && !terminalId) throw new Error("Very Happy terminal context is required");
140
146
  registerMcpTools(server, surface, terminalId);
147
+ if (terminalId) registerTerminalTitleSuggest(server);
141
148
  if (!terminalToolsOnly && process.env.HAPPY_MANAGED !== "1" && !process.env.HAPPY_MCP_URL) registerTeamsTools(server, process.env.HAPPY_SESSION_ID);
142
149
  const transport = new StdioServerTransport();
143
150
  await server.connect(transport);
@@ -148,4 +155,4 @@ async function handleMcpCommand(terminalToolsOnly = false) {
148
155
  });
149
156
  }
150
157
 
151
- export { handleMcpCommand, registerMcpTools };
158
+ export { handleMcpCommand, registerMcpTools, registerTerminalTitleSuggest };
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var agentGuidance = require('./agentGuidance-BXa9ikrZ.cjs');
3
+ var agentGuidance = require('./agentGuidance-BM4kMNyr.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('./types-CPubg05Z.cjs');
8
- var persistence = require('./limits-DwcY3kyi.cjs');
9
- var index$1 = require('./index-CqtfRzug.cjs');
7
+ var index = require('./types-CUCU7Vw8.cjs');
8
+ var persistence = require('./limits-DY_sFA3J.cjs');
9
+ var index$1 = require('./index-DHrwHxHf.cjs');
10
10
  require('node:fs/promises');
11
11
  require('node:os');
12
12
  require('node:crypto');
@@ -16,18 +16,17 @@ require('socket.io-client');
16
16
  require('node:child_process');
17
17
  require('node:fs');
18
18
  require('node:path');
19
+ var terminalTitleSuggest = require('./terminalTitleSuggest-Dji8I0Jy.cjs');
19
20
  var terminalToolContext = require('./terminalToolContext-DoV9Gs7K.cjs');
20
21
  require('node:events');
21
- require('@paralleldrive/cuid2');
22
22
  require('child_process');
23
23
  require('util');
24
24
  require('fs/promises');
25
25
  require('crypto');
26
26
  require('path');
27
27
  require('cross-spawn');
28
- require('./projectPath-ChLhdOyt.cjs');
29
- require('url');
30
28
  require('os');
29
+ require('@paralleldrive/cuid2');
31
30
  require('node-pty');
32
31
  require('fs');
33
32
  require('node:readline');
@@ -50,6 +49,7 @@ require('http');
50
49
  require('inquirer');
51
50
  require('node:url');
52
51
  require('node:readline/promises');
52
+ require('url');
53
53
 
54
54
  const TERMINAL_TITLE_TOOL_NAME = "change_title";
55
55
  function resolveMcpToolSurface(env) {
@@ -58,6 +58,12 @@ function resolveMcpToolSurface(env) {
58
58
  return "assistant";
59
59
  }
60
60
 
61
+ function registerTerminalTitleSuggest(server) {
62
+ server.server.setRequestHandler(terminalTitleSuggest.TerminalTitleSuggestRequestSchema, async (request) => {
63
+ persistence.logger.debug("[MCP] terminal title suggestion requested");
64
+ return { title: await index$1.suggestTitleForPrompt(request.params.prompt) };
65
+ });
66
+ }
61
67
  function registerMcpTools(server, surface, terminalId = null) {
62
68
  server.registerTool(persistence.CLIPBOARD_TOOL_NAME, {
63
69
  description: persistence.CLIPBOARD_TOOL_DESCRIPTION,
@@ -140,6 +146,7 @@ async function handleMcpCommand(terminalToolsOnly = false) {
140
146
  const terminalId = terminalToolContext.resolveMcpTerminalId(process.env);
141
147
  if (terminalToolsOnly && !terminalId) throw new Error("Very Happy terminal context is required");
142
148
  registerMcpTools(server, surface, terminalId);
149
+ if (terminalId) registerTerminalTitleSuggest(server);
143
150
  if (!terminalToolsOnly && process.env.HAPPY_MANAGED !== "1" && !process.env.HAPPY_MCP_URL) agentGuidance.registerTeamsTools(server, process.env.HAPPY_SESSION_ID);
144
151
  const transport = new stdio_js.StdioServerTransport();
145
152
  await server.connect(transport);
@@ -152,3 +159,4 @@ async function handleMcpCommand(terminalToolsOnly = false) {
152
159
 
153
160
  exports.handleMcpCommand = handleMcpCommand;
154
161
  exports.registerMcpTools = registerMcpTools;
162
+ exports.registerTerminalTitleSuggest = registerTerminalTitleSuggest;
@@ -2,7 +2,7 @@ type PiContext = {
2
2
  cwd: string;
3
3
  };
4
4
  type PiApi = {
5
- on(event: 'session_start' | 'session_shutdown', handler: (event: unknown, ctx: PiContext) => Promise<void>): void;
5
+ on(event: 'session_start' | 'session_shutdown' | 'before_agent_start', handler: (event: unknown, ctx: PiContext) => Promise<void>): void;
6
6
  registerTool(tool: {
7
7
  name: string;
8
8
  label: string;
@@ -10,6 +10,9 @@ type PiApi = {
10
10
  parameters: unknown;
11
11
  execute(id: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;
12
12
  }): void;
13
+ /** Pi ≥0.8x session naming (`/name`); optional so an older Pi still gets the tools. */
14
+ getSessionName?(): string | undefined;
15
+ setSessionName?(name: string): void;
13
16
  };
14
17
  /** Auto-discovered native Pi extension. Managed launchers own their own bridge. */
15
18
  declare function piTerminalExtension(pi: PiApi): void;
@@ -1,11 +1,13 @@
1
1
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
2
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
3
  import { resolve } from 'node:path';
4
- import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
4
+ import { T as TERMINAL_TITLE_SUGGEST_METHOD, a as TerminalTitleSuggestResultSchema, p as projectPath } from './terminalTitleSuggest-DKgX3osW.mjs';
5
5
  import { r as resolveMcpTerminalId } from './terminalToolContext-CFeGeaNm.mjs';
6
6
  import 'path';
7
7
  import 'url';
8
+ import 'zod';
8
9
 
10
+ const TITLE_SUGGEST_TIMEOUT_MS = 45e3;
9
11
  function piTerminalExtension(pi) {
10
12
  if (process.env.HAPPY_MCP_URL || process.env.HAPPY_TERMINAL_MCP_URL || !resolveMcpTerminalId(process.env)) return;
11
13
  let client;
@@ -49,8 +51,12 @@ function piTerminalExtension(pi) {
49
51
  });
50
52
  return connecting;
51
53
  }
54
+ let titleArmed = false;
55
+ let generation = 0;
52
56
  pi.on("session_start", async (_event, ctx) => {
53
57
  cwd = ctx.cwd;
58
+ generation += 1;
59
+ titleArmed = !!pi.setSessionName && !pi.getSessionName?.();
54
60
  const current = await connect();
55
61
  const available = await current.listTools({}, { timeout: 1e4 });
56
62
  if (stopped) return;
@@ -72,6 +78,23 @@ function piTerminalExtension(pi) {
72
78
  });
73
79
  }
74
80
  });
81
+ pi.on("before_agent_start", async (event) => {
82
+ if (!titleArmed) return;
83
+ const prompt = event?.prompt;
84
+ if (typeof prompt !== "string" || !prompt.trim()) return;
85
+ titleArmed = false;
86
+ const expected = generation;
87
+ void (async () => {
88
+ const active = await connect();
89
+ const result = await active.request(
90
+ { method: TERMINAL_TITLE_SUGGEST_METHOD, params: { prompt } },
91
+ TerminalTitleSuggestResultSchema,
92
+ { timeout: TITLE_SUGGEST_TIMEOUT_MS }
93
+ );
94
+ if (result.title && expected === generation && !stopped && !pi.getSessionName?.()) pi.setSessionName(result.title);
95
+ })().catch(() => {
96
+ });
97
+ });
75
98
  pi.on("session_shutdown", async () => {
76
99
  stopped = true;
77
100
  await connecting?.catch(() => {
@@ -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-DS-bnYYp.mjs';
5
- import { P as PI_TEAMS_EXTENSION } from './index-CIyjJy8D.mjs';
4
+ import { c as configuration } from './limits-BtAuKRl2.mjs';
5
+ import { P as PI_TEAMS_EXTENSION } from './index-BacwoXzs.mjs';
6
6
 
7
7
  async function publish(path, content, mode) {
8
8
  const temporary = `${path}.${randomUUID()}.new`;
@@ -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-DwcY3kyi.cjs');
7
- var index = require('./index-CqtfRzug.cjs');
6
+ var persistence = require('./limits-DY_sFA3J.cjs');
7
+ var index = require('./index-DHrwHxHf.cjs');
8
8
 
9
9
  async function publish(path, content, mode) {
10
10
  const temporary = `${path}.${node_crypto.randomUUID()}.new`;
@@ -3,25 +3,25 @@ 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-Cu6cXZ6N.mjs';
7
- import { registerMcpTools } from './mcp-zu8n8TkR.mjs';
8
- import './agentGuidance-Dvo3cZMW.mjs';
6
+ import { p as preparePiTeamsRuntime } from './piRuntime-DBpe12NN.mjs';
7
+ import { registerMcpTools, registerTerminalTitleSuggest } from './mcp-DQkmk4VV.mjs';
8
+ import './agentGuidance-C8unGWp7.mjs';
9
9
  import 'node:fs/promises';
10
10
  import 'node:os';
11
11
  import 'zod';
12
- import './limits-DS-bnYYp.mjs';
12
+ import './limits-BtAuKRl2.mjs';
13
13
  import 'axios';
14
14
  import 'tweetnacl';
15
15
  import 'socket.io-client';
16
- import './types-BN3eiipi.mjs';
16
+ import './types-BvqOVUOW.mjs';
17
17
  import 'node:fs';
18
18
  import 'node:path';
19
19
  import { r as resolveMcpTerminalId } from './terminalToolContext-CFeGeaNm.mjs';
20
- import './index-CIyjJy8D.mjs';
20
+ import './index-BacwoXzs.mjs';
21
21
  import 'chalk';
22
22
  import 'cross-spawn';
23
23
  import 'node:readline';
24
- import './projectPath-CSpqWdxp.mjs';
24
+ import './terminalTitleSuggest-DKgX3osW.mjs';
25
25
  import 'path';
26
26
  import 'url';
27
27
  import 'fs/promises';
@@ -60,6 +60,7 @@ async function startPiTerminalTools(terminalId) {
60
60
  }
61
61
  const mcp = new McpServer({ name: "Very Happy Terminal Tools", version: "1.0.0" });
62
62
  registerMcpTools(mcp, "clipboard", terminalId);
63
+ registerTerminalTitleSuggest(mcp);
63
64
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: void 0 });
64
65
  res.on("close", () => {
65
66
  void transport.close();
@@ -5,25 +5,25 @@ 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-D3ny0mVg.cjs');
9
- var mcp = require('./mcp-CMxEZ6-0.cjs');
10
- require('./agentGuidance-BXa9ikrZ.cjs');
8
+ var piRuntime = require('./piRuntime-DRbbeQ72.cjs');
9
+ var mcp = require('./mcp-JpqI2POW.cjs');
10
+ require('./agentGuidance-BM4kMNyr.cjs');
11
11
  require('node:fs/promises');
12
12
  require('node:os');
13
13
  require('zod');
14
- require('./limits-DwcY3kyi.cjs');
14
+ require('./limits-DY_sFA3J.cjs');
15
15
  require('axios');
16
16
  require('tweetnacl');
17
17
  require('socket.io-client');
18
- require('./types-CPubg05Z.cjs');
18
+ require('./types-CUCU7Vw8.cjs');
19
19
  require('node:fs');
20
20
  require('node:path');
21
21
  var terminalToolContext = require('./terminalToolContext-DoV9Gs7K.cjs');
22
- require('./index-CqtfRzug.cjs');
22
+ require('./index-DHrwHxHf.cjs');
23
23
  require('chalk');
24
24
  require('cross-spawn');
25
25
  require('node:readline');
26
- require('./projectPath-ChLhdOyt.cjs');
26
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
27
27
  require('path');
28
28
  require('url');
29
29
  require('fs/promises');
@@ -62,6 +62,7 @@ async function startPiTerminalTools(terminalId) {
62
62
  }
63
63
  const mcp$1 = new mcp_js.McpServer({ name: "Very Happy Terminal Tools", version: "1.0.0" });
64
64
  mcp.registerMcpTools(mcp$1, "clipboard", terminalId);
65
+ mcp.registerTerminalTitleSuggest(mcp$1);
65
66
  const transport = new streamableHttp_js.StreamableHTTPServerTransport({ sessionIdGenerator: void 0 });
66
67
  res.on("close", () => {
67
68
  void transport.close();
@@ -4,17 +4,16 @@ 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 index$1 = require('./types-CPubg05Z.cjs');
8
- var persistence = require('./limits-DwcY3kyi.cjs');
9
- var index = require('./index-CqtfRzug.cjs');
10
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
11
- var AcpBackend = require('./AcpBackend-blE9IEod.cjs');
12
- var config = require('./config-Cadw1sAk.cjs');
7
+ var index$1 = require('./types-CUCU7Vw8.cjs');
8
+ var persistence = require('./limits-DY_sFA3J.cjs');
9
+ var index = require('./index-DHrwHxHf.cjs');
10
+ var terminalTitleSuggest = require('./terminalTitleSuggest-Dji8I0Jy.cjs');
11
+ var AcpBackend = require('./AcpBackend-DSt8nTYm.cjs');
12
+ var config = require('./config-D23kF0_u.cjs');
13
13
  require('axios');
14
14
  require('node:events');
15
15
  require('socket.io-client');
16
16
  require('zod');
17
- require('@paralleldrive/cuid2');
18
17
  require('child_process');
19
18
  require('util');
20
19
  require('fs/promises');
@@ -22,6 +21,7 @@ require('crypto');
22
21
  require('path');
23
22
  require('cross-spawn');
24
23
  require('os');
24
+ require('@paralleldrive/cuid2');
25
25
  require('node:fs/promises');
26
26
  require('node:os');
27
27
  require('node:child_process');
@@ -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-BXa9ikrZ.cjs');
37
+ require('./agentGuidance-BM4kMNyr.cjs');
38
38
  require('@anthropic-ai/claude-agent-sdk');
39
39
  require('ps-list');
40
40
  require('tmp');
@@ -1169,7 +1169,7 @@ async function runGemini(opts) {
1169
1169
  process.stdin.setEncoding("utf8");
1170
1170
  }
1171
1171
  const happyServer = await index.startHappyServer(session);
1172
- const bridgeCommand = path.join(projectPath.projectPath(), "bin", "very-happy-mcp.mjs");
1172
+ const bridgeCommand = path.join(terminalTitleSuggest.projectPath(), "bin", "very-happy-mcp.mjs");
1173
1173
  const mcpServers = {
1174
1174
  happy: {
1175
1175
  command: bridgeCommand,
@@ -2,17 +2,16 @@ 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 { x as connectionState, A as ApiClient, D as errorLogMetadata, y as notifyDaemonSessionStarted, E as contentLogMetadata } from './types-BN3eiipi.mjs';
6
- import { l as logger, r as readSettings, g as encodeBase64 } from './limits-DS-bnYYp.mjs';
7
- import { O as GEMINI_API_KEY_ENV, Q as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, I as BasePermissionHandler, R as BaseReasoningProcessor, n as initialMachineMetadata, o as createSessionMetadata, p as setupOfflineReconnection, v as MessageQueue2, x as hashObject, U as MessageBuffer, V as CHANGE_TITLE_INSTRUCTION, C as registerKillSessionHandler, y as startHappyServer } from './index-CIyjJy8D.mjs';
8
- import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
9
- import { A as AcpBackend } from './AcpBackend-BjTA5gUB.mjs';
10
- import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-C-A1XF62.mjs';
5
+ import { o as connectionState, A as ApiClient, t as errorLogMetadata, q as notifyDaemonSessionStarted, u as contentLogMetadata } from './types-BvqOVUOW.mjs';
6
+ import { l as logger, r as readSettings, j as encodeBase64 } from './limits-BtAuKRl2.mjs';
7
+ import { Y as GEMINI_API_KEY_ENV, Z as GOOGLE_API_KEY_ENV, G as GEMINI_MODEL_ENV, U as BasePermissionHandler, _ as BaseReasoningProcessor, B as initialMachineMetadata, C as createSessionMetadata, E as setupOfflineReconnection, H as MessageQueue2, I as hashObject, $ as MessageBuffer, a0 as CHANGE_TITLE_INSTRUCTION, N as registerKillSessionHandler, J as startHappyServer } from './index-BacwoXzs.mjs';
8
+ import { p as projectPath } from './terminalTitleSuggest-DKgX3osW.mjs';
9
+ import { A as AcpBackend } from './AcpBackend-YDGv4E-g.mjs';
10
+ import { readGeminiLocalConfig, determineGeminiModel, getGeminiModelSource, getInitialGeminiModel, saveGeminiModelToConfig } from './config-CHJ189UJ.mjs';
11
11
  import 'axios';
12
12
  import 'node:events';
13
13
  import 'socket.io-client';
14
14
  import 'zod';
15
- import '@paralleldrive/cuid2';
16
15
  import 'child_process';
17
16
  import 'util';
18
17
  import 'fs/promises';
@@ -20,6 +19,7 @@ import 'crypto';
20
19
  import 'path';
21
20
  import 'cross-spawn';
22
21
  import 'os';
22
+ import '@paralleldrive/cuid2';
23
23
  import 'node:fs/promises';
24
24
  import 'node:os';
25
25
  import 'node:child_process';
@@ -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-Dvo3cZMW.mjs';
35
+ import './agentGuidance-C8unGWp7.mjs';
36
36
  import '@anthropic-ai/claude-agent-sdk';
37
37
  import 'ps-list';
38
38
  import '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 { D as errorLogMetadata, E as contentLogMetadata, x as connectionState, A as ApiClient, y as notifyDaemonSessionStarted } from './types-BN3eiipi.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-D-9mrp40.mjs';
8
- import { h as ensurePrivateDirectorySync, i as hardenPrivateFileSync, w as writePrivateFileSync, r as readSettings, g as encodeBase64, l as logger, c as configuration } from './limits-DS-bnYYp.mjs';
9
- import { n as initialMachineMetadata, o as createSessionMetadata, p as setupOfflineReconnection, v as MessageQueue2, C as registerKillSessionHandler } from './index-CIyjJy8D.mjs';
6
+ import { t as errorLogMetadata, u as contentLogMetadata, o as connectionState, A as ApiClient, q as notifyDaemonSessionStarted } from './types-BvqOVUOW.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-Cxf5HQX1.mjs';
8
+ import { m as ensurePrivateDirectorySync, n as hardenPrivateFileSync, w as writePrivateFileSync, r as readSettings, j as encodeBase64, l as logger, c as configuration } from './limits-BtAuKRl2.mjs';
9
+ import { B as initialMachineMetadata, C as createSessionMetadata, E as setupOfflineReconnection, H as MessageQueue2, N as registerKillSessionHandler } from './index-BacwoXzs.mjs';
10
10
  import WebSocket from 'ws';
11
11
  import * as ed from '@noble/ed25519';
12
12
  import { sha512 } from '@noble/hashes/sha2.js';
@@ -14,16 +14,16 @@ import 'axios';
14
14
  import 'node:events';
15
15
  import 'socket.io-client';
16
16
  import 'zod';
17
- import '@paralleldrive/cuid2';
18
17
  import 'child_process';
19
18
  import 'util';
20
19
  import 'fs/promises';
21
20
  import 'crypto';
22
21
  import 'path';
23
22
  import 'cross-spawn';
24
- import './projectPath-CSpqWdxp.mjs';
23
+ import './terminalTitleSuggest-DKgX3osW.mjs';
25
24
  import 'url';
26
25
  import 'os';
26
+ import '@paralleldrive/cuid2';
27
27
  import 'node:fs/promises';
28
28
  import 'node-pty';
29
29
  import 'fs';
@@ -33,7 +33,7 @@ import '@anthropic-ai/sandbox-runtime';
33
33
  import 'expo-server-sdk';
34
34
  import 'chalk';
35
35
  import 'node:util';
36
- import './agentGuidance-Dvo3cZMW.mjs';
36
+ import './agentGuidance-C8unGWp7.mjs';
37
37
  import 'ink';
38
38
  import 'react';
39
39
  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 index = require('./types-CPubg05Z.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-bF8PYu_B.cjs');
10
- var persistence = require('./limits-DwcY3kyi.cjs');
11
- var index$1 = require('./index-CqtfRzug.cjs');
8
+ var index = require('./types-CUCU7Vw8.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-uov6I9C8.cjs');
10
+ var persistence = require('./limits-DY_sFA3J.cjs');
11
+ var index$1 = require('./index-DHrwHxHf.cjs');
12
12
  var WebSocket = require('ws');
13
13
  var ed = require('@noble/ed25519');
14
14
  var sha2_js = require('@noble/hashes/sha2.js');
@@ -16,16 +16,16 @@ require('axios');
16
16
  require('node:events');
17
17
  require('socket.io-client');
18
18
  require('zod');
19
- require('@paralleldrive/cuid2');
20
19
  require('child_process');
21
20
  require('util');
22
21
  require('fs/promises');
23
22
  require('crypto');
24
23
  require('path');
25
24
  require('cross-spawn');
26
- require('./projectPath-ChLhdOyt.cjs');
25
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
27
26
  require('url');
28
27
  require('os');
28
+ require('@paralleldrive/cuid2');
29
29
  require('node:fs/promises');
30
30
  require('node-pty');
31
31
  require('fs');
@@ -35,7 +35,7 @@ require('@anthropic-ai/sandbox-runtime');
35
35
  require('expo-server-sdk');
36
36
  require('chalk');
37
37
  require('node:util');
38
- require('./agentGuidance-BXa9ikrZ.cjs');
38
+ require('./agentGuidance-BM4kMNyr.cjs');
39
39
  require('ink');
40
40
  require('react');
41
41
  require('@anthropic-ai/claude-agent-sdk');
@@ -3,26 +3,26 @@
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-DwcY3kyi.cjs');
7
- var index = require('./index-CqtfRzug.cjs');
6
+ var persistence = require('./limits-DY_sFA3J.cjs');
7
+ var index = require('./index-DHrwHxHf.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-CPubg05Z.cjs');
14
+ require('@paralleldrive/cuid2');
15
+ require('./types-CUCU7Vw8.cjs');
15
16
  require('axios');
16
17
  require('node:events');
17
18
  require('socket.io-client');
18
- require('@paralleldrive/cuid2');
19
19
  require('child_process');
20
20
  require('util');
21
21
  require('fs/promises');
22
22
  require('crypto');
23
23
  require('path');
24
24
  require('cross-spawn');
25
- require('./projectPath-ChLhdOyt.cjs');
25
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
26
26
  require('url');
27
27
  require('os');
28
28
  require('node:child_process');
@@ -31,7 +31,7 @@ require('fs');
31
31
  require('node:readline');
32
32
  require('@anthropic-ai/sandbox-runtime');
33
33
  require('expo-server-sdk');
34
- require('./agentGuidance-BXa9ikrZ.cjs');
34
+ require('./agentGuidance-BM4kMNyr.cjs');
35
35
  require('ink');
36
36
  require('react');
37
37
  require('@anthropic-ai/claude-agent-sdk');
@@ -1,26 +1,26 @@
1
1
  import chalk from 'chalk';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { resolve } from 'node:path';
4
- import { d as readPersistedSessions, c as configuration } from './limits-DS-bnYYp.mjs';
5
- import { d as sendUserMessage, e as sessionWebUrl } from './index-CIyjJy8D.mjs';
4
+ import { d as readPersistedSessions, c as configuration } from './limits-BtAuKRl2.mjs';
5
+ import { d as sendUserMessage, e as sessionWebUrl } from './index-BacwoXzs.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-BN3eiipi.mjs';
12
+ import '@paralleldrive/cuid2';
13
+ import './types-BvqOVUOW.mjs';
13
14
  import 'axios';
14
15
  import 'node:events';
15
16
  import 'socket.io-client';
16
- import '@paralleldrive/cuid2';
17
17
  import 'child_process';
18
18
  import 'util';
19
19
  import 'fs/promises';
20
20
  import 'crypto';
21
21
  import 'path';
22
22
  import 'cross-spawn';
23
- import './projectPath-CSpqWdxp.mjs';
23
+ import './terminalTitleSuggest-DKgX3osW.mjs';
24
24
  import 'url';
25
25
  import 'os';
26
26
  import 'node:child_process';
@@ -29,7 +29,7 @@ import 'fs';
29
29
  import 'node:readline';
30
30
  import '@anthropic-ai/sandbox-runtime';
31
31
  import 'expo-server-sdk';
32
- import './agentGuidance-Dvo3cZMW.mjs';
32
+ import './agentGuidance-C8unGWp7.mjs';
33
33
  import 'ink';
34
34
  import 'react';
35
35
  import '@anthropic-ai/claude-agent-sdk';
@@ -1,21 +1,22 @@
1
1
  import chalk from 'chalk';
2
- import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, a as listSessions, w as waitForTurnEnd, T as TurnWaitTimeoutError, r as readSessionTranscript, s as stopSession, b as resolvePermissionRequest, c as archiveSession } from './index-CIyjJy8D.mjs';
3
- import { i as isValidSessionId } from './types-BN3eiipi.mjs';
2
+ import { D as DEFAULT_RECENT_LIMIT, M as MAX_READ_LIMIT, l as listAccountSessions, a as listSessions, w as waitForTurnEnd, T as TurnWaitTimeoutError, r as readSessionTranscript, s as stopSession, b as resolvePermissionRequest, c as archiveSession } from './index-BacwoXzs.mjs';
3
+ import { i as isValidSessionId } from './types-BvqOVUOW.mjs';
4
4
  import 'node:os';
5
5
  import 'node:crypto';
6
- import './limits-DS-bnYYp.mjs';
6
+ import './limits-BtAuKRl2.mjs';
7
7
  import 'node:fs/promises';
8
8
  import 'node:fs';
9
9
  import 'node:path';
10
10
  import 'zod';
11
11
  import 'tweetnacl';
12
12
  import 'node:util';
13
+ import '@paralleldrive/cuid2';
13
14
  import 'cross-spawn';
14
15
  import 'node:readline';
15
- import './projectPath-CSpqWdxp.mjs';
16
+ import './terminalTitleSuggest-DKgX3osW.mjs';
16
17
  import 'path';
17
18
  import 'url';
18
- import './agentGuidance-Dvo3cZMW.mjs';
19
+ import './agentGuidance-C8unGWp7.mjs';
19
20
  import 'fs/promises';
20
21
  import 'ink';
21
22
  import 'react';
@@ -25,7 +26,6 @@ import 'node:events';
25
26
  import 'socket.io-client';
26
27
  import 'os';
27
28
  import 'child_process';
28
- import '@paralleldrive/cuid2';
29
29
  import 'node:child_process';
30
30
  import 'fs';
31
31
  import '@anthropic-ai/sandbox-runtime';