very-happy-cli 0.2.152 → 0.2.154

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 (61) hide show
  1. package/dist/{AcpBackend-CogiKCng.cjs → AcpBackend-B14xNj5L.cjs} +2 -2
  2. package/dist/{AcpBackend-Bs3wwYbt.mjs → AcpBackend-Ckyadhf4.mjs} +2 -2
  3. package/dist/{AcpSessionManager-BazkBuFo.cjs → AcpSessionManager-CCHmPdrR.cjs} +1 -1
  4. package/dist/{AcpSessionManager-BT8PJMEm.mjs → AcpSessionManager-H8t4P-IW.mjs} +1 -1
  5. package/dist/{agentGuidance-CqBn77AI.cjs → agentGuidance-DUBXppv-.cjs} +2 -1
  6. package/dist/{agentGuidance-Daxn5Nvj.mjs → agentGuidance-TLYQxsm2.mjs} +2 -1
  7. package/dist/{agentHome-CCYfs8Ec.mjs → agentHome-B20RWdgE.mjs} +3 -3
  8. package/dist/{agentHome-CpJjrQZc.cjs → agentHome-BUsLTZnz.cjs} +3 -3
  9. package/dist/{auto-DV5emt1-.mjs → auto-BQnncDcs.mjs} +7 -7
  10. package/dist/{auto-DncmTDvw.cjs → auto-IeldARBS.cjs} +7 -7
  11. package/dist/codex/happyMcpStdioBridge.cjs +2 -2
  12. package/dist/codex/happyMcpStdioBridge.mjs +2 -2
  13. package/dist/{config-DbKpQpdL.mjs → config-B-ocQh5V.mjs} +5 -5
  14. package/dist/{config-DeJgSMh-.cjs → config-DM_xI9M6.cjs} +5 -5
  15. package/dist/{index-BauTv2jB.mjs → index-BELV05ko.mjs} +284 -45
  16. package/dist/{index-imt4mC41.cjs → index-BUxBxSxJ.cjs} +9 -9
  17. package/dist/{index-CN7OF2cU.mjs → index-CIx3248o.mjs} +5 -5
  18. package/dist/{index-DahaLbu4.mjs → index-ZKuBjvHi.mjs} +9 -9
  19. package/dist/{index-ZIW1jrYm.cjs → index-eCjkm8Y2.cjs} +307 -66
  20. package/dist/{index-CRaJ9k2p.cjs → index-okLyUzeD.cjs} +5 -5
  21. package/dist/index.cjs +5 -5
  22. package/dist/index.mjs +5 -5
  23. package/dist/{install-CDR3qBhs.cjs → install-BZOdxfPd.cjs} +1 -1
  24. package/dist/{install-C1K3nrxF.mjs → install-CoLN3whR.mjs} +1 -1
  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-BoDxpaBO.cjs → installTerminalHooks-CA4OcAS7.cjs} +7 -7
  28. package/dist/{installTerminalHooks-VvmlO6Ue.mjs → installTerminalHooks-Dde_8t36.mjs} +6 -6
  29. package/dist/lib.cjs +3 -3
  30. package/dist/lib.mjs +3 -3
  31. package/dist/{limits-BNTWyUaZ.cjs → limits-CmzISka2.cjs} +7 -7
  32. package/dist/{limits-CKR_HJnO.mjs → limits-Dt7_unH4.mjs} +7 -7
  33. package/dist/{mcp-CCKCKL6l.cjs → mcp-7iDHlyCI.cjs} +14 -6
  34. package/dist/{mcp-D4dAo5BQ.mjs → mcp-9Ui4nQZL.mjs} +14 -7
  35. package/dist/piExtension.d.mts +4 -1
  36. package/dist/piExtension.mjs +24 -1
  37. package/dist/{piRuntime-Bn5ypbjH.cjs → piRuntime-BesGGPME.cjs} +2 -2
  38. package/dist/{piRuntime-CW-XA4rz.mjs → piRuntime-C4E4pgye.mjs} +2 -2
  39. package/dist/{piTerminal-BLSXK1u2.mjs → piTerminal-CCEGCQOY.mjs} +8 -7
  40. package/dist/{piTerminal-B7K75aXB.cjs → piTerminal-fUogwxYr.cjs} +8 -7
  41. package/dist/{runGemini-D5N11LxO.mjs → runGemini-BW-pEklU.mjs} +7 -7
  42. package/dist/{runGemini-Bgg1BzDK.cjs → runGemini-CNPGSsSK.cjs} +8 -8
  43. package/dist/{runOpenClaw-B9qWHybc.cjs → runOpenClaw-Bsodkg_s.cjs} +6 -6
  44. package/dist/{runOpenClaw-CCpyKbrn.mjs → runOpenClaw-NRB6-_jU.mjs} +6 -6
  45. package/dist/{send-wl9ei8yG.cjs → send-Bd00QcHC.cjs} +56 -18
  46. package/dist/{send-C44kcXz5.mjs → send-DYeSFg8s.mjs} +56 -19
  47. package/dist/{sessions-DXJEcUg6.mjs → sessions-DlPOYKLU.mjs} +5 -5
  48. package/dist/{sessions-Tad8elmy.cjs → sessions-RIFUoy_g.cjs} +5 -5
  49. package/dist/{spawn-BOlb5y1_.mjs → spawn-D1bhyHbH.mjs} +5 -5
  50. package/dist/{spawn-DA8WAFmm.cjs → spawn-DxrfHTF4.cjs} +5 -5
  51. package/dist/{teams-qVLrFcdd.cjs → teams-Cfy0VMCo.cjs} +6 -6
  52. package/dist/{teams-Bs8lI887.mjs → teams-pfKHpkgL.mjs} +6 -6
  53. package/dist/terminalTitleSuggest-DKgX3osW.mjs +38 -0
  54. package/dist/terminalTitleSuggest-Dji8I0Jy.cjs +45 -0
  55. package/dist/{todo-nzsqGZqp.mjs → todo-B2CjDg_V.mjs} +2 -2
  56. package/dist/{todo-mCMoGjJk.cjs → todo-B4cBFzHB.cjs} +2 -2
  57. package/dist/{types-CN28qJl7.cjs → types-Bd_TGr0F.cjs} +34 -10
  58. package/dist/{types-xKrxbCRv.mjs → types-D5RWyBE5.mjs} +32 -9
  59. package/package.json +7 -7
  60. package/dist/projectPath-CSpqWdxp.mjs +0 -10
  61. package/dist/projectPath-ChLhdOyt.cjs +0 -13
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-ZIW1jrYm.cjs');
3
+ var index = require('./index-eCjkm8Y2.cjs');
4
4
  var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
5
5
  require('chalk');
6
6
  require('node:os');
7
7
  require('node:crypto');
8
- require('./types-CN28qJl7.cjs');
8
+ require('./types-Bd_TGr0F.cjs');
9
9
  require('axios');
10
- require('./limits-BNTWyUaZ.cjs');
10
+ require('./limits-CmzISka2.cjs');
11
11
  require('node:fs/promises');
12
12
  require('node:fs');
13
13
  require('node:path');
@@ -23,7 +23,7 @@ require('fs/promises');
23
23
  require('crypto');
24
24
  require('path');
25
25
  require('cross-spawn');
26
- require('./projectPath-ChLhdOyt.cjs');
26
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
27
27
  require('url');
28
28
  require('os');
29
29
  require('node:child_process');
@@ -32,7 +32,7 @@ require('fs');
32
32
  require('node:readline');
33
33
  require('@anthropic-ai/sandbox-runtime');
34
34
  require('expo-server-sdk');
35
- require('./agentGuidance-CqBn77AI.cjs');
35
+ require('./agentGuidance-DUBXppv-.cjs');
36
36
  require('ink');
37
37
  require('react');
38
38
  require('ps-list');
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-ZIW1jrYm.cjs');
5
- require('./limits-BNTWyUaZ.cjs');
4
+ require('./index-eCjkm8Y2.cjs');
5
+ require('./limits-CmzISka2.cjs');
6
6
  require('zod');
7
- require('./types-CN28qJl7.cjs');
7
+ require('./types-Bd_TGr0F.cjs');
8
8
  require('node:child_process');
9
9
  require('node:os');
10
10
  require('node:crypto');
@@ -12,10 +12,10 @@ require('cross-spawn');
12
12
  require('node:path');
13
13
  require('node:readline');
14
14
  require('node:fs');
15
- require('./projectPath-ChLhdOyt.cjs');
15
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
16
16
  require('path');
17
17
  require('url');
18
- require('./agentGuidance-CqBn77AI.cjs');
18
+ require('./agentGuidance-DUBXppv-.cjs');
19
19
  require('node:fs/promises');
20
20
  require('fs/promises');
21
21
  require('ink');
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import 'chalk';
2
- import './index-BauTv2jB.mjs';
3
- import './limits-CKR_HJnO.mjs';
2
+ import './index-BELV05ko.mjs';
3
+ import './limits-Dt7_unH4.mjs';
4
4
  import 'zod';
5
- import './types-xKrxbCRv.mjs';
5
+ import './types-D5RWyBE5.mjs';
6
6
  import 'node:child_process';
7
7
  import 'node:os';
8
8
  import 'node:crypto';
@@ -10,10 +10,10 @@ import 'cross-spawn';
10
10
  import 'node:path';
11
11
  import 'node:readline';
12
12
  import 'node:fs';
13
- import './projectPath-CSpqWdxp.mjs';
13
+ import './terminalTitleSuggest-DKgX3osW.mjs';
14
14
  import 'path';
15
15
  import 'url';
16
- import './agentGuidance-Daxn5Nvj.mjs';
16
+ import './agentGuidance-TLYQxsm2.mjs';
17
17
  import 'node:fs/promises';
18
18
  import 'fs/promises';
19
19
  import 'ink';
@@ -3,7 +3,7 @@
3
3
  var node_crypto = require('node:crypto');
4
4
  var promises = require('node:fs/promises');
5
5
  var path = require('node:path');
6
- var index = require('./index-ZIW1jrYm.cjs');
6
+ var index = require('./index-eCjkm8Y2.cjs');
7
7
 
8
8
  async function assertPrivateDestination(directory) {
9
9
  for (let path$1 = directory; ; path$1 = path.dirname(path$1)) {
@@ -1,7 +1,7 @@
1
1
  import { createHash, randomUUID } from 'node:crypto';
2
2
  import { unlink, rmdir, mkdir, lstat, readFile, writeFile, rename } from 'node:fs/promises';
3
3
  import { join, resolve, dirname } from 'node:path';
4
- import { y as TEAM_SKILL } from './index-BauTv2jB.mjs';
4
+ import { B as TEAM_SKILL } from './index-BELV05ko.mjs';
5
5
 
6
6
  async function assertPrivateDestination(directory) {
7
7
  for (let path = directory; ; path = dirname(path)) {
@@ -3,9 +3,10 @@ import { homedir } from 'node:os';
3
3
  import { join, resolve, dirname } from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { p as projectPath } from './projectPath-CSpqWdxp.mjs';
6
+ import { p as projectPath } from './terminalTitleSuggest-DKgX3osW.mjs';
7
7
  import 'path';
8
8
  import 'url';
9
+ import 'zod';
9
10
 
10
11
  const HEADER = "// Managed by Very Happy: native Pi terminal tools.\n";
11
12
  const PI_TOOLS_HELP = `very-happy install-pi-tools - enable tools in native Pi
@@ -5,9 +5,10 @@ var os = require('node:os');
5
5
  var path = require('node:path');
6
6
  var node_url = require('node:url');
7
7
  var node_crypto = require('node:crypto');
8
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
8
+ var terminalTitleSuggest = require('./terminalTitleSuggest-Dji8I0Jy.cjs');
9
9
  require('path');
10
10
  require('url');
11
+ require('zod');
11
12
 
12
13
  const HEADER = "// Managed by Very Happy: native Pi terminal tools.\n";
13
14
  const PI_TOOLS_HELP = `very-happy install-pi-tools - enable tools in native Pi
@@ -51,7 +52,7 @@ async function installPiTools(remove = false) {
51
52
  await promises.unlink(target);
52
53
  return target;
53
54
  }
54
- const content = piToolsLoader(path.resolve(projectPath.projectPath(), "dist/piExtension.mjs"));
55
+ const content = piToolsLoader(path.resolve(terminalTitleSuggest.projectPath(), "dist/piExtension.mjs"));
55
56
  await promises.mkdir(path.dirname(target), { recursive: true, mode: 448 });
56
57
  const temporary = `${target}.${node_crypto.randomUUID()}.new`;
57
58
  try {
@@ -5,16 +5,16 @@ 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 projectPath = require('./projectPath-ChLhdOyt.cjs');
9
- var index = require('./index-ZIW1jrYm.cjs');
8
+ var terminalTitleSuggest = require('./terminalTitleSuggest-Dji8I0Jy.cjs');
9
+ var index = require('./index-eCjkm8Y2.cjs');
10
10
  require('path');
11
11
  require('url');
12
+ require('zod');
12
13
  require('node:crypto');
13
- require('./types-CN28qJl7.cjs');
14
+ require('./types-Bd_TGr0F.cjs');
14
15
  require('axios');
15
- require('./limits-BNTWyUaZ.cjs');
16
+ require('./limits-CmzISka2.cjs');
16
17
  require('node:fs/promises');
17
- require('zod');
18
18
  require('tweetnacl');
19
19
  require('node:util');
20
20
  require('@paralleldrive/cuid2');
@@ -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-CqBn77AI.cjs');
34
+ require('./agentGuidance-DUBXppv-.cjs');
35
35
  require('ink');
36
36
  require('react');
37
37
  require('@anthropic-ai/claude-agent-sdk');
@@ -153,7 +153,7 @@ function claudeSettingsPath() {
153
153
  return path.join(configDir, "settings.json");
154
154
  }
155
155
  function terminalMirrorHookCommand() {
156
- const script = path.resolve(projectPath.projectPath(), "scripts", TERMINAL_MIRROR_FORWARDER_BASENAME);
156
+ const script = path.resolve(terminalTitleSuggest.projectPath(), "scripts", TERMINAL_MIRROR_FORWARDER_BASENAME);
157
157
  return `[ -f "${script}" ] && node "${script}" || true`;
158
158
  }
159
159
  async function installTerminalHooks(opts = {}) {
@@ -3,16 +3,16 @@ 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 './projectPath-CSpqWdxp.mjs';
7
- import { j as tmuxSupportsSessionEnv } from './index-BauTv2jB.mjs';
6
+ import { p as projectPath } from './terminalTitleSuggest-DKgX3osW.mjs';
7
+ import { j as tmuxSupportsSessionEnv } from './index-BELV05ko.mjs';
8
8
  import 'path';
9
9
  import 'url';
10
+ import 'zod';
10
11
  import 'node:crypto';
11
- import './types-xKrxbCRv.mjs';
12
+ import './types-D5RWyBE5.mjs';
12
13
  import 'axios';
13
- import './limits-CKR_HJnO.mjs';
14
+ import './limits-Dt7_unH4.mjs';
14
15
  import 'node:fs/promises';
15
- import 'zod';
16
16
  import 'tweetnacl';
17
17
  import 'node:util';
18
18
  import '@paralleldrive/cuid2';
@@ -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-Daxn5Nvj.mjs';
32
+ import './agentGuidance-TLYQxsm2.mjs';
33
33
  import 'ink';
34
34
  import 'react';
35
35
  import '@anthropic-ai/claude-agent-sdk';
package/dist/lib.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./types-CN28qJl7.cjs');
4
- var persistence = require('./limits-BNTWyUaZ.cjs');
3
+ var index = require('./types-Bd_TGr0F.cjs');
4
+ var persistence = require('./limits-CmzISka2.cjs');
5
5
  require('axios');
6
6
  require('node:events');
7
7
  require('socket.io-client');
@@ -13,7 +13,7 @@ require('fs/promises');
13
13
  require('crypto');
14
14
  require('path');
15
15
  require('cross-spawn');
16
- require('./projectPath-ChLhdOyt.cjs');
16
+ require('./terminalTitleSuggest-Dji8I0Jy.cjs');
17
17
  require('url');
18
18
  require('os');
19
19
  require('@paralleldrive/cuid2');
package/dist/lib.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-xKrxbCRv.mjs';
2
- export { c as configuration, l as logger } from './limits-CKR_HJnO.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema } from './types-D5RWyBE5.mjs';
2
+ export { c as configuration, l as logger } from './limits-Dt7_unH4.mjs';
3
3
  import 'axios';
4
4
  import 'node:events';
5
5
  import 'socket.io-client';
@@ -11,7 +11,7 @@ import 'fs/promises';
11
11
  import 'crypto';
12
12
  import 'path';
13
13
  import 'cross-spawn';
14
- import './projectPath-CSpqWdxp.mjs';
14
+ import './terminalTitleSuggest-DKgX3osW.mjs';
15
15
  import 'url';
16
16
  import 'os';
17
17
  import '@paralleldrive/cuid2';
@@ -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.152";
34
+ var version = "0.2.154";
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.152",
152
- "very-happy-tools-x64-darwin": "0.2.152",
153
- "very-happy-tools-arm64-linux": "0.2.152",
154
- "very-happy-tools-x64-linux": "0.2.152",
155
- "very-happy-tools-arm64-win32": "0.2.152",
156
- "very-happy-tools-x64-win32": "0.2.152"
151
+ "very-happy-tools-arm64-darwin": "0.2.154",
152
+ "very-happy-tools-x64-darwin": "0.2.154",
153
+ "very-happy-tools-arm64-linux": "0.2.154",
154
+ "very-happy-tools-x64-linux": "0.2.154",
155
+ "very-happy-tools-arm64-win32": "0.2.154",
156
+ "very-happy-tools-x64-win32": "0.2.154"
157
157
  };
158
158
  var devDependencies = {
159
159
  "@slopus/happy-wire": "workspace:*",
@@ -11,7 +11,7 @@ import { inspect } from 'node:util';
11
11
  import { isCuid, createId } from '@paralleldrive/cuid2';
12
12
 
13
13
  var name = "very-happy-cli";
14
- var version = "0.2.152";
14
+ var version = "0.2.154";
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.152",
132
- "very-happy-tools-x64-darwin": "0.2.152",
133
- "very-happy-tools-arm64-linux": "0.2.152",
134
- "very-happy-tools-x64-linux": "0.2.152",
135
- "very-happy-tools-arm64-win32": "0.2.152",
136
- "very-happy-tools-x64-win32": "0.2.152"
131
+ "very-happy-tools-arm64-darwin": "0.2.154",
132
+ "very-happy-tools-x64-darwin": "0.2.154",
133
+ "very-happy-tools-arm64-linux": "0.2.154",
134
+ "very-happy-tools-x64-linux": "0.2.154",
135
+ "very-happy-tools-arm64-win32": "0.2.154",
136
+ "very-happy-tools-x64-win32": "0.2.154"
137
137
  };
138
138
  var devDependencies = {
139
139
  "@slopus/happy-wire": "workspace:*",
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var agentGuidance = require('./agentGuidance-CqBn77AI.cjs');
3
+ var agentGuidance = require('./agentGuidance-DUBXppv-.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-CN28qJl7.cjs');
8
- var persistence = require('./limits-BNTWyUaZ.cjs');
9
- var index$1 = require('./index-ZIW1jrYm.cjs');
7
+ var index = require('./types-Bd_TGr0F.cjs');
8
+ var persistence = require('./limits-CmzISka2.cjs');
9
+ var index$1 = require('./index-eCjkm8Y2.cjs');
10
10
  require('node:fs/promises');
11
11
  require('node:os');
12
12
  require('node:crypto');
@@ -16,6 +16,7 @@ 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
22
  require('child_process');
@@ -24,8 +25,6 @@ require('fs/promises');
24
25
  require('crypto');
25
26
  require('path');
26
27
  require('cross-spawn');
27
- require('./projectPath-ChLhdOyt.cjs');
28
- require('url');
29
28
  require('os');
30
29
  require('@paralleldrive/cuid2');
31
30
  require('node-pty');
@@ -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;
@@ -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-Daxn5Nvj.mjs';
1
+ import { r as registerTeamsTools, P as PREVIEW_TOOL_NAME, a as PREVIEW_TOOL_TITLE, b as PREVIEW_TOOL_DESCRIPTION } from './agentGuidance-TLYQxsm2.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 pushClipboardViaDaemon, m as pushFilePreviewViaDaemon, n as setTerminalTitleViaDaemon } from './types-xKrxbCRv.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-CKR_HJnO.mjs';
7
- import { v as checkPreviewPath, x as registerAssistantSessionTools } from './index-BauTv2jB.mjs';
5
+ import { l as pushClipboardViaDaemon, m as pushFilePreviewViaDaemon, n as setTerminalTitleViaDaemon } from './types-D5RWyBE5.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-Dt7_unH4.mjs';
7
+ import { x as checkPreviewPath, y as registerAssistantSessionTools, z as suggestTitleForPrompt } from './index-BELV05ko.mjs';
8
8
  import 'node:fs/promises';
9
9
  import 'node:os';
10
10
  import 'node:crypto';
@@ -14,6 +14,7 @@ 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
20
  import 'child_process';
@@ -22,8 +23,6 @@ import 'fs/promises';
22
23
  import 'crypto';
23
24
  import 'path';
24
25
  import 'cross-spawn';
25
- import './projectPath-CSpqWdxp.mjs';
26
- import 'url';
27
26
  import 'os';
28
27
  import '@paralleldrive/cuid2';
29
28
  import 'node-pty';
@@ -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 };
@@ -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(() => {
@@ -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-BNTWyUaZ.cjs');
7
- var index = require('./index-ZIW1jrYm.cjs');
6
+ var persistence = require('./limits-CmzISka2.cjs');
7
+ var index = require('./index-eCjkm8Y2.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-CKR_HJnO.mjs';
5
- import { P as PI_TEAMS_EXTENSION } from './index-BauTv2jB.mjs';
4
+ import { c as configuration } from './limits-Dt7_unH4.mjs';
5
+ import { P as PI_TEAMS_EXTENSION } from './index-BELV05ko.mjs';
6
6
 
7
7
  async function publish(path, content, mode) {
8
8
  const temporary = `${path}.${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-CW-XA4rz.mjs';
7
- import { registerMcpTools } from './mcp-D4dAo5BQ.mjs';
8
- import './agentGuidance-Daxn5Nvj.mjs';
6
+ import { p as preparePiTeamsRuntime } from './piRuntime-C4E4pgye.mjs';
7
+ import { registerMcpTools, registerTerminalTitleSuggest } from './mcp-9Ui4nQZL.mjs';
8
+ import './agentGuidance-TLYQxsm2.mjs';
9
9
  import 'node:fs/promises';
10
10
  import 'node:os';
11
11
  import 'zod';
12
- import './limits-CKR_HJnO.mjs';
12
+ import './limits-Dt7_unH4.mjs';
13
13
  import 'axios';
14
14
  import 'tweetnacl';
15
15
  import 'socket.io-client';
16
- import './types-xKrxbCRv.mjs';
16
+ import './types-D5RWyBE5.mjs';
17
17
  import 'node:fs';
18
18
  import 'node:path';
19
19
  import { r as resolveMcpTerminalId } from './terminalToolContext-CFeGeaNm.mjs';
20
- import './index-BauTv2jB.mjs';
20
+ import './index-BELV05ko.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-Bn5ypbjH.cjs');
9
- var mcp = require('./mcp-CCKCKL6l.cjs');
10
- require('./agentGuidance-CqBn77AI.cjs');
8
+ var piRuntime = require('./piRuntime-BesGGPME.cjs');
9
+ var mcp = require('./mcp-7iDHlyCI.cjs');
10
+ require('./agentGuidance-DUBXppv-.cjs');
11
11
  require('node:fs/promises');
12
12
  require('node:os');
13
13
  require('zod');
14
- require('./limits-BNTWyUaZ.cjs');
14
+ require('./limits-CmzISka2.cjs');
15
15
  require('axios');
16
16
  require('tweetnacl');
17
17
  require('socket.io-client');
18
- require('./types-CN28qJl7.cjs');
18
+ require('./types-Bd_TGr0F.cjs');
19
19
  require('node:fs');
20
20
  require('node:path');
21
21
  var terminalToolContext = require('./terminalToolContext-DoV9Gs7K.cjs');
22
- require('./index-ZIW1jrYm.cjs');
22
+ require('./index-eCjkm8Y2.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();