zenflo 0.12.0 → 0.13.0

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.
@@ -30,7 +30,7 @@ async function main() {
30
30
  async function ensureHttpClient() {
31
31
  if (httpClient) return httpClient;
32
32
  const client = new index_js.Client(
33
- { name: "happy-stdio-bridge", version: "1.0.0" },
33
+ { name: "zenflo-stdio-bridge", version: "1.0.0" },
34
34
  { capabilities: { tools: {} } }
35
35
  );
36
36
  const transport = new streamableHttp_js.StreamableHTTPClientTransport(new URL(baseUrl));
@@ -39,9 +39,9 @@ async function main() {
39
39
  return client;
40
40
  }
41
41
  const server = new mcp_js.McpServer({
42
- name: "Happy MCP Bridge",
42
+ name: "ZenFlo MCP Bridge",
43
43
  version: "1.0.0",
44
- description: "STDIO bridge forwarding to Happy HTTP MCP"
44
+ description: "STDIO bridge forwarding to ZenFlo HTTP MCP"
45
45
  });
46
46
  server.registerTool(
47
47
  "change_title",
@@ -67,39 +67,12 @@ async function main() {
67
67
  }
68
68
  }
69
69
  );
70
- server.registerTool(
71
- "send_inbox_message",
72
- {
73
- description: "Send a message to Quinn's Happy app inbox for cross-session communication",
74
- title: "Send Inbox Message",
75
- inputSchema: {
76
- title: z.z.string().describe('Message title (e.g., "Task completed", "Found a bug")'),
77
- message: z.z.string().describe("Message content/details"),
78
- sessionId: z.z.string().optional().describe("Optional session ID to link the message to (makes it clickable)"),
79
- priority: z.z.enum(["low", "normal", "high"]).optional().describe("Message priority (affects icon and color)")
80
- }
81
- },
82
- async (args) => {
83
- try {
84
- const client = await ensureHttpClient();
85
- const response = await client.callTool({ name: "send_inbox_message", arguments: args });
86
- return response;
87
- } catch (error) {
88
- return {
89
- content: [
90
- { type: "text", text: `Failed to send inbox message: ${error instanceof Error ? error.message : String(error)}` }
91
- ],
92
- isError: true
93
- };
94
- }
95
- }
96
- );
97
70
  const stdio = new stdio_js.StdioServerTransport();
98
71
  await server.connect(stdio);
99
72
  }
100
73
  main().catch((err) => {
101
74
  try {
102
- process.stderr.write(`[happy-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}
75
+ process.stderr.write(`[zenflo-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}
103
76
  `);
104
77
  } finally {
105
78
  process.exit(1);
@@ -28,7 +28,7 @@ async function main() {
28
28
  async function ensureHttpClient() {
29
29
  if (httpClient) return httpClient;
30
30
  const client = new Client(
31
- { name: "happy-stdio-bridge", version: "1.0.0" },
31
+ { name: "zenflo-stdio-bridge", version: "1.0.0" },
32
32
  { capabilities: { tools: {} } }
33
33
  );
34
34
  const transport = new StreamableHTTPClientTransport(new URL(baseUrl));
@@ -37,9 +37,9 @@ async function main() {
37
37
  return client;
38
38
  }
39
39
  const server = new McpServer({
40
- name: "Happy MCP Bridge",
40
+ name: "ZenFlo MCP Bridge",
41
41
  version: "1.0.0",
42
- description: "STDIO bridge forwarding to Happy HTTP MCP"
42
+ description: "STDIO bridge forwarding to ZenFlo HTTP MCP"
43
43
  });
44
44
  server.registerTool(
45
45
  "change_title",
@@ -65,39 +65,12 @@ async function main() {
65
65
  }
66
66
  }
67
67
  );
68
- server.registerTool(
69
- "send_inbox_message",
70
- {
71
- description: "Send a message to Quinn's Happy app inbox for cross-session communication",
72
- title: "Send Inbox Message",
73
- inputSchema: {
74
- title: z.string().describe('Message title (e.g., "Task completed", "Found a bug")'),
75
- message: z.string().describe("Message content/details"),
76
- sessionId: z.string().optional().describe("Optional session ID to link the message to (makes it clickable)"),
77
- priority: z.enum(["low", "normal", "high"]).optional().describe("Message priority (affects icon and color)")
78
- }
79
- },
80
- async (args) => {
81
- try {
82
- const client = await ensureHttpClient();
83
- const response = await client.callTool({ name: "send_inbox_message", arguments: args });
84
- return response;
85
- } catch (error) {
86
- return {
87
- content: [
88
- { type: "text", text: `Failed to send inbox message: ${error instanceof Error ? error.message : String(error)}` }
89
- ],
90
- isError: true
91
- };
92
- }
93
- }
94
- );
95
68
  const stdio = new StdioServerTransport();
96
69
  await server.connect(stdio);
97
70
  }
98
71
  main().catch((err) => {
99
72
  try {
100
- process.stderr.write(`[happy-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}
73
+ process.stderr.write(`[zenflo-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}
101
74
  `);
102
75
  } finally {
103
76
  process.exit(1);
@@ -3,7 +3,7 @@
3
3
  var chalk = require('chalk');
4
4
  var os = require('node:os');
5
5
  var node_crypto = require('node:crypto');
6
- var types = require('./types-C0K47bQB.cjs');
6
+ var types = require('./types-DILJPonx.cjs');
7
7
  var node_child_process = require('node:child_process');
8
8
  var node_path = require('node:path');
9
9
  var node_readline = require('node:readline');
@@ -236,10 +236,10 @@ const CO_AUTHORED_CREDITS = (() => trimIdent(`
236
236
  <main commit message>
237
237
 
238
238
  Generated with [Claude Code](https://claude.ai/code)
239
- via [ZenFlo](https://zenflo.app)
239
+ via [ZenFlo](https://zenflo.dev)
240
240
 
241
241
  Co-Authored-By: Claude <noreply@anthropic.com>
242
- Co-Authored-By: ZenFlo <yesreply@zenflo.app>
242
+ Co-Authored-By: ZenFlo <yesreply@zenflo.dev>
243
243
  `))();
244
244
  const systemPrompt = (() => {
245
245
  const includeCoAuthored = shouldIncludeCoAuthoredBy();
@@ -1046,7 +1046,7 @@ class AbortError extends Error {
1046
1046
  }
1047
1047
  }
1048
1048
 
1049
- const __filename$2 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-LeMT1COL.cjs', document.baseURI).href)));
1049
+ const __filename$2 = node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CJ8JfQbJ.cjs', document.baseURI).href)));
1050
1050
  const __dirname$2 = node_path.join(__filename$2, "..");
1051
1051
  function getDefaultClaudeCodePath() {
1052
1052
  return node_path.join(__dirname$2, "..", "..", "..", "node_modules", "@anthropic-ai", "claude-code", "cli.js");
@@ -3544,7 +3544,7 @@ async function waitForProcessDeath(pid, timeout) {
3544
3544
  throw new Error("Process did not die within timeout");
3545
3545
  }
3546
3546
 
3547
- async function findAllHappyProcesses() {
3547
+ async function findAllZenfloProcesses() {
3548
3548
  try {
3549
3549
  const processes = await psList();
3550
3550
  const allProcesses = [];
@@ -3576,14 +3576,14 @@ async function findAllHappyProcesses() {
3576
3576
  return [];
3577
3577
  }
3578
3578
  }
3579
- async function findRunawayHappyProcesses() {
3580
- const allProcesses = await findAllHappyProcesses();
3579
+ async function findRunawayZenfloProcesses() {
3580
+ const allProcesses = await findAllZenfloProcesses();
3581
3581
  return allProcesses.filter(
3582
3582
  (p) => p.pid !== process.pid && (p.type === "daemon" || p.type === "dev-daemon" || p.type === "daemon-spawned-session" || p.type === "dev-daemon-spawned" || p.type === "daemon-version-check" || p.type === "dev-daemon-version-check")
3583
3583
  ).map((p) => ({ pid: p.pid, command: p.command }));
3584
3584
  }
3585
3585
  async function killRunawayZenfloProcesses() {
3586
- const runawayProcesses = await findRunawayHappyProcesses();
3586
+ const runawayProcesses = await findRunawayZenfloProcesses();
3587
3587
  const errors = [];
3588
3588
  let killed = 0;
3589
3589
  for (const { pid, command } of runawayProcesses) {
@@ -3665,7 +3665,7 @@ async function runDoctorCommand(filter) {
3665
3665
  console.log("");
3666
3666
  console.log(chalk.bold("\u{1F527} Daemon Spawn Diagnostics"));
3667
3667
  const projectRoot = types.projectPath();
3668
- const wrapperPath = node_path.join(projectRoot, "bin", "happy.mjs");
3668
+ const wrapperPath = node_path.join(projectRoot, "bin", "zenflo.mjs");
3669
3669
  const cliEntrypoint = node_path.join(projectRoot, "dist", "index.mjs");
3670
3670
  console.log(`Project Root: ${chalk.blue(projectRoot)}`);
3671
3671
  console.log(`Wrapper Script: ${chalk.blue(wrapperPath)}`);
@@ -3674,7 +3674,7 @@ async function runDoctorCommand(filter) {
3674
3674
  console.log(`CLI Exists: ${fs.existsSync(cliEntrypoint) ? chalk.green("\u2713 Yes") : chalk.red("\u274C No")}`);
3675
3675
  console.log("");
3676
3676
  console.log(chalk.bold("\u2699\uFE0F Configuration"));
3677
- console.log(`Happy Home: ${chalk.blue(types.configuration.zenfloHomeDir)}`);
3677
+ console.log(`ZenFlo Home: ${chalk.blue(types.configuration.zenfloHomeDir)}`);
3678
3678
  console.log(`Server URL: ${chalk.blue(types.configuration.serverUrl)}`);
3679
3679
  console.log(`Logs Dir: ${chalk.blue(types.configuration.logsDir)}`);
3680
3680
  console.log(chalk.bold("\n\u{1F30D} Environment Variables"));
@@ -3726,7 +3726,7 @@ async function runDoctorCommand(filter) {
3726
3726
  console.log(chalk.blue(`Location: ${types.configuration.daemonStateFile}`));
3727
3727
  console.log(chalk.gray(JSON.stringify(state, null, 2)));
3728
3728
  }
3729
- const allProcesses = await findAllHappyProcesses();
3729
+ const allProcesses = await findAllZenfloProcesses();
3730
3730
  if (allProcesses.length > 0) {
3731
3731
  console.log(chalk.bold("\n\u{1F50D} All ZenFlo CLI Processes"));
3732
3732
  const grouped = allProcesses.reduce((groups, process2) => {
@@ -3757,11 +3757,11 @@ ${typeLabels[type] || type}:`));
3757
3757
  });
3758
3758
  });
3759
3759
  } else {
3760
- console.log(chalk.red("\u274C No happy processes found"));
3760
+ console.log(chalk.red("\u274C No zenflo processes found"));
3761
3761
  }
3762
3762
  if (filter === "all" && allProcesses.length > 1) {
3763
3763
  console.log(chalk.bold("\n\u{1F4A1} Process Management"));
3764
- console.log(chalk.gray("To clean up runaway processes: happy doctor clean"));
3764
+ console.log(chalk.gray("To clean up runaway processes: zenflo doctor clean"));
3765
3765
  }
3766
3766
  } catch (error) {
3767
3767
  console.log(chalk.red("\u274C Error checking daemon status"));
@@ -4655,7 +4655,7 @@ async function startDaemon() {
4655
4655
  }
4656
4656
  }
4657
4657
 
4658
- async function startZenfloServer(client, apiClient) {
4658
+ async function startZenfloServer(client) {
4659
4659
  const handler = async (title) => {
4660
4660
  types.logger.debug("[zenfloMCP] Changing title to:", title);
4661
4661
  try {
@@ -4672,7 +4672,7 @@ async function startZenfloServer(client, apiClient) {
4672
4672
  const mcp = new mcp_js.McpServer({
4673
4673
  name: "ZenFlo MCP",
4674
4674
  version: "1.0.0",
4675
- description: "ZenFlo CLI MCP server with chat session management tools"
4675
+ description: "ZenFlo CLI MCP server for chat session title management"
4676
4676
  });
4677
4677
  mcp.registerTool("change_title", {
4678
4678
  description: "Change the title of the current chat session",
@@ -4705,46 +4705,6 @@ async function startZenfloServer(client, apiClient) {
4705
4705
  };
4706
4706
  }
4707
4707
  });
4708
- mcp.registerTool("send_inbox_message", {
4709
- description: "Send a message to Quinn's ZenFlo app inbox for cross-session communication",
4710
- title: "Send Inbox Message",
4711
- inputSchema: {
4712
- title: z.z.string().describe('Message title (e.g., "Task completed", "Found a bug")'),
4713
- message: z.z.string().describe("Message content/details"),
4714
- sessionId: z.z.string().optional().describe("Optional session ID to link the message to (makes it clickable)"),
4715
- priority: z.z.enum(["low", "normal", "high"]).optional().describe("Message priority (affects icon and color)")
4716
- }
4717
- }, async (args) => {
4718
- types.logger.debug("[zenfloMCP] Sending inbox message:", args.title);
4719
- try {
4720
- await apiClient.sendInboxMessage({
4721
- title: args.title,
4722
- message: args.message,
4723
- sessionId: args.sessionId,
4724
- priority: args.priority || "normal"
4725
- });
4726
- return {
4727
- content: [
4728
- {
4729
- type: "text",
4730
- text: `Successfully sent inbox message: "${args.title}"`
4731
- }
4732
- ],
4733
- isError: false
4734
- };
4735
- } catch (error) {
4736
- types.logger.debug("[zenfloMCP] Error sending inbox message:", error);
4737
- return {
4738
- content: [
4739
- {
4740
- type: "text",
4741
- text: `Failed to send inbox message: ${error instanceof Error ? error.message : String(error)}`
4742
- }
4743
- ],
4744
- isError: true
4745
- };
4746
- }
4747
- });
4748
4708
  const transport = new streamableHttp_js.StreamableHTTPServerTransport({
4749
4709
  // NOTE: Returning session id here will result in claude
4750
4710
  // sdk spawn to fail with `Invalid Request: Server already initialized`
@@ -4769,7 +4729,7 @@ async function startZenfloServer(client, apiClient) {
4769
4729
  });
4770
4730
  return {
4771
4731
  url: baseUrl.toString(),
4772
- toolNames: ["change_title", "send_inbox_message"],
4732
+ toolNames: ["change_title"],
4773
4733
  stop: () => {
4774
4734
  types.logger.debug("[zenfloMCP] Stopping server");
4775
4735
  mcp.close();
@@ -4784,7 +4744,7 @@ function registerKillSessionHandler(rpcHandlerManager, killThisHappy) {
4784
4744
  void killThisHappy();
4785
4745
  return {
4786
4746
  success: true,
4787
- message: "Killing happy-cli process"
4747
+ message: "Killing zenflo-cli process"
4788
4748
  };
4789
4749
  });
4790
4750
  }
@@ -4857,7 +4817,7 @@ async function runClaude(credentials, options = {}) {
4857
4817
  }
4858
4818
  });
4859
4819
  const session = api.sessionSyncClient(response);
4860
- const zenfloServer = await startZenfloServer(session, api);
4820
+ const zenfloServer = await startZenfloServer(session);
4861
4821
  types.logger.debug(`[START] ZenFlo MCP server started at ${zenfloServer.url}`);
4862
4822
  const logPath = types.logger.logFilePath;
4863
4823
  types.logger.infoDeveloper(`Session: ${response.id}`);
@@ -5065,7 +5025,7 @@ async function runClaude(credentials, options = {}) {
5065
5025
  process.exit(0);
5066
5026
  }
5067
5027
 
5068
- const __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-LeMT1COL.cjs', document.baseURI).href)));
5028
+ const __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-CJ8JfQbJ.cjs', document.baseURI).href)));
5069
5029
  const __dirname$1 = path.dirname(__filename$1);
5070
5030
  const PLIST_LABEL$1 = "com.zenflo.daemon";
5071
5031
  const LAUNCH_AGENTS_DIR$1 = path.join(os$1.homedir(), "Library", "LaunchAgents");
@@ -6247,38 +6207,38 @@ async function handleConnectCommand(args) {
6247
6207
  }
6248
6208
  function showConnectHelp() {
6249
6209
  console.log(`
6250
- ${chalk.bold("happy connect")} - Connect AI vendor API keys to Happy cloud
6210
+ ${chalk.bold("zenflo connect")} - Connect AI vendor API keys to ZenFlo cloud
6251
6211
 
6252
6212
  ${chalk.bold("Usage:")}
6253
- happy connect codex Store your Codex API key in Happy cloud
6254
- happy connect claude Store your Anthropic API key in Happy cloud
6255
- happy connect gemini Store your Gemini API key in Happy cloud
6256
- happy connect help Show this help message
6213
+ zenflo connect codex Store your Codex API key in ZenFlo cloud
6214
+ zenflo connect claude Store your Anthropic API key in ZenFlo cloud
6215
+ zenflo connect gemini Store your Gemini API key in ZenFlo cloud
6216
+ zenflo connect help Show this help message
6257
6217
 
6258
6218
  ${chalk.bold("Description:")}
6259
6219
  The connect command allows you to securely store your AI vendor API keys
6260
- in Happy cloud. This enables you to use these services through Happy
6220
+ in ZenFlo cloud. This enables you to use these services through ZenFlo
6261
6221
  without exposing your API keys locally.
6262
6222
 
6263
6223
  ${chalk.bold("Examples:")}
6264
- happy connect codex
6265
- happy connect claude
6266
- happy connect gemini
6224
+ zenflo connect codex
6225
+ zenflo connect claude
6226
+ zenflo connect gemini
6267
6227
 
6268
6228
  ${chalk.bold("Notes:")}
6269
- \u2022 You must be authenticated with Happy first (run 'happy auth login')
6270
- \u2022 API keys are encrypted and stored securely in Happy cloud
6229
+ \u2022 You must be authenticated with ZenFlo first (run 'zenflo auth login')
6230
+ \u2022 API keys are encrypted and stored securely in ZenFlo cloud
6271
6231
  \u2022 You can manage your stored keys at app.zenflo.dev
6272
6232
  `);
6273
6233
  }
6274
6234
  async function handleConnectVendor(vendor, displayName) {
6275
6235
  console.log(chalk.bold(`
6276
- \u{1F50C} Connecting ${displayName} to Happy cloud
6236
+ \u{1F50C} Connecting ${displayName} to ZenFlo cloud
6277
6237
  `));
6278
6238
  const credentials = await types.readCredentials();
6279
6239
  if (!credentials) {
6280
- console.log(chalk.yellow("\u26A0\uFE0F Not authenticated with Happy"));
6281
- console.log(chalk.gray(' Please run "happy auth login" first'));
6240
+ console.log(chalk.yellow("\u26A0\uFE0F Not authenticated with ZenFlo"));
6241
+ console.log(chalk.gray(' Please run "zenflo auth login" first'));
6282
6242
  process.exit(1);
6283
6243
  }
6284
6244
  const api = await types.ApiClient.create(credentials);
@@ -6346,7 +6306,7 @@ async function handleConnectVendor(vendor, displayName) {
6346
6306
  return;
6347
6307
  } else if (subcommand === "codex") {
6348
6308
  try {
6349
- const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-BED95lb3.cjs'); });
6309
+ const { runCodex } = await Promise.resolve().then(function () { return require('./runCodex-gxOwFxj9.cjs'); });
6350
6310
  let startedBy = void 0;
6351
6311
  for (let i = 1; i < args.length; i++) {
6352
6312
  if (args[i] === "--started-by") {
@@ -6367,7 +6327,7 @@ async function handleConnectVendor(vendor, displayName) {
6367
6327
  return;
6368
6328
  } else if (subcommand === "ccr" || subcommand === "glm") {
6369
6329
  try {
6370
- const { runCCR } = await Promise.resolve().then(function () { return require('./runCCR-CokU0NUY.cjs'); });
6330
+ const { runCCR } = await Promise.resolve().then(function () { return require('./runCCR-CsBd9Bin.cjs'); });
6371
6331
  let startedBy = void 0;
6372
6332
  for (let i = 1; i < args.length; i++) {
6373
6333
  if (args[i] === "--started-by") {
@@ -6470,13 +6430,13 @@ async function handleConnectVendor(vendor, displayName) {
6470
6430
  let statusModule;
6471
6431
  switch (process.platform) {
6472
6432
  case "darwin":
6473
- statusModule = await Promise.resolve().then(function () { return require('./status-6nX5obxE.cjs'); });
6433
+ statusModule = await Promise.resolve().then(function () { return require('./status-wSLqL6_S.cjs'); });
6474
6434
  break;
6475
6435
  case "win32":
6476
- statusModule = await Promise.resolve().then(function () { return require('./status-DUnHkBDq.cjs'); });
6436
+ statusModule = await Promise.resolve().then(function () { return require('./status-CmuBM9eE.cjs'); });
6477
6437
  break;
6478
6438
  case "linux":
6479
- statusModule = await Promise.resolve().then(function () { return require('./status-CES2ft-F.cjs'); });
6439
+ statusModule = await Promise.resolve().then(function () { return require('./status-B_tjHFOS.cjs'); });
6480
6440
  break;
6481
6441
  default:
6482
6442
  console.error(chalk.red(`Status command not supported on platform: ${process.platform}`));
@@ -6563,7 +6523,7 @@ ${chalk.bold("To clean up runaway processes:")} Use ${chalk.cyan("zenflo doctor
6563
6523
  }
6564
6524
  if (showHelp) {
6565
6525
  console.log(`
6566
- ${chalk.bold("zenflo")} - Claude Code On the Go
6526
+ ${chalk.bold("zenflo")} - Claude Code with ZenFlo
6567
6527
 
6568
6528
  ${chalk.bold("Usage:")}
6569
6529
  zenflo [options] Start Claude with mobile control
@@ -1,7 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import os$1, { homedir } from 'node:os';
3
3
  import { randomUUID, randomBytes } from 'node:crypto';
4
- import { l as logger, p as projectPath, e as backoff, f as delay, R as RawJSONLinesSchema, g as AsyncLock, c as configuration, r as readDaemonState, h as clearDaemonState, d as packageJson, b as readSettings, i as readCredentials, j as encodeBase64, u as updateSettings, k as encodeBase64Url, m as decodeBase64, w as writeCredentialsLegacy, n as writeCredentialsDataKey, o as acquireDaemonLock, q as writeDaemonState, A as ApiClient, s as releaseDaemonLock, t as clearCredentials, v as clearMachineId, x as getLatestDaemonLog } from './types-Bm-nJvHk.mjs';
4
+ import { l as logger, p as projectPath, e as backoff, f as delay, R as RawJSONLinesSchema, g as AsyncLock, c as configuration, r as readDaemonState, h as clearDaemonState, d as packageJson, b as readSettings, i as readCredentials, j as encodeBase64, u as updateSettings, k as encodeBase64Url, m as decodeBase64, w as writeCredentialsLegacy, n as writeCredentialsDataKey, o as acquireDaemonLock, q as writeDaemonState, A as ApiClient, s as releaseDaemonLock, t as clearCredentials, v as clearMachineId, x as getLatestDaemonLog } from './types-cYVbBsSI.mjs';
5
5
  import { spawn, execSync, execFileSync } from 'node:child_process';
6
6
  import { resolve, join } from 'node:path';
7
7
  import { createInterface } from 'node:readline';
@@ -214,10 +214,10 @@ const CO_AUTHORED_CREDITS = (() => trimIdent(`
214
214
  <main commit message>
215
215
 
216
216
  Generated with [Claude Code](https://claude.ai/code)
217
- via [ZenFlo](https://zenflo.app)
217
+ via [ZenFlo](https://zenflo.dev)
218
218
 
219
219
  Co-Authored-By: Claude <noreply@anthropic.com>
220
- Co-Authored-By: ZenFlo <yesreply@zenflo.app>
220
+ Co-Authored-By: ZenFlo <yesreply@zenflo.dev>
221
221
  `))();
222
222
  const systemPrompt = (() => {
223
223
  const includeCoAuthored = shouldIncludeCoAuthoredBy();
@@ -3522,7 +3522,7 @@ async function waitForProcessDeath(pid, timeout) {
3522
3522
  throw new Error("Process did not die within timeout");
3523
3523
  }
3524
3524
 
3525
- async function findAllHappyProcesses() {
3525
+ async function findAllZenfloProcesses() {
3526
3526
  try {
3527
3527
  const processes = await psList();
3528
3528
  const allProcesses = [];
@@ -3554,14 +3554,14 @@ async function findAllHappyProcesses() {
3554
3554
  return [];
3555
3555
  }
3556
3556
  }
3557
- async function findRunawayHappyProcesses() {
3558
- const allProcesses = await findAllHappyProcesses();
3557
+ async function findRunawayZenfloProcesses() {
3558
+ const allProcesses = await findAllZenfloProcesses();
3559
3559
  return allProcesses.filter(
3560
3560
  (p) => p.pid !== process.pid && (p.type === "daemon" || p.type === "dev-daemon" || p.type === "daemon-spawned-session" || p.type === "dev-daemon-spawned" || p.type === "daemon-version-check" || p.type === "dev-daemon-version-check")
3561
3561
  ).map((p) => ({ pid: p.pid, command: p.command }));
3562
3562
  }
3563
3563
  async function killRunawayZenfloProcesses() {
3564
- const runawayProcesses = await findRunawayHappyProcesses();
3564
+ const runawayProcesses = await findRunawayZenfloProcesses();
3565
3565
  const errors = [];
3566
3566
  let killed = 0;
3567
3567
  for (const { pid, command } of runawayProcesses) {
@@ -3643,7 +3643,7 @@ async function runDoctorCommand(filter) {
3643
3643
  console.log("");
3644
3644
  console.log(chalk.bold("\u{1F527} Daemon Spawn Diagnostics"));
3645
3645
  const projectRoot = projectPath();
3646
- const wrapperPath = join(projectRoot, "bin", "happy.mjs");
3646
+ const wrapperPath = join(projectRoot, "bin", "zenflo.mjs");
3647
3647
  const cliEntrypoint = join(projectRoot, "dist", "index.mjs");
3648
3648
  console.log(`Project Root: ${chalk.blue(projectRoot)}`);
3649
3649
  console.log(`Wrapper Script: ${chalk.blue(wrapperPath)}`);
@@ -3652,7 +3652,7 @@ async function runDoctorCommand(filter) {
3652
3652
  console.log(`CLI Exists: ${existsSync(cliEntrypoint) ? chalk.green("\u2713 Yes") : chalk.red("\u274C No")}`);
3653
3653
  console.log("");
3654
3654
  console.log(chalk.bold("\u2699\uFE0F Configuration"));
3655
- console.log(`Happy Home: ${chalk.blue(configuration.zenfloHomeDir)}`);
3655
+ console.log(`ZenFlo Home: ${chalk.blue(configuration.zenfloHomeDir)}`);
3656
3656
  console.log(`Server URL: ${chalk.blue(configuration.serverUrl)}`);
3657
3657
  console.log(`Logs Dir: ${chalk.blue(configuration.logsDir)}`);
3658
3658
  console.log(chalk.bold("\n\u{1F30D} Environment Variables"));
@@ -3704,7 +3704,7 @@ async function runDoctorCommand(filter) {
3704
3704
  console.log(chalk.blue(`Location: ${configuration.daemonStateFile}`));
3705
3705
  console.log(chalk.gray(JSON.stringify(state, null, 2)));
3706
3706
  }
3707
- const allProcesses = await findAllHappyProcesses();
3707
+ const allProcesses = await findAllZenfloProcesses();
3708
3708
  if (allProcesses.length > 0) {
3709
3709
  console.log(chalk.bold("\n\u{1F50D} All ZenFlo CLI Processes"));
3710
3710
  const grouped = allProcesses.reduce((groups, process2) => {
@@ -3735,11 +3735,11 @@ ${typeLabels[type] || type}:`));
3735
3735
  });
3736
3736
  });
3737
3737
  } else {
3738
- console.log(chalk.red("\u274C No happy processes found"));
3738
+ console.log(chalk.red("\u274C No zenflo processes found"));
3739
3739
  }
3740
3740
  if (filter === "all" && allProcesses.length > 1) {
3741
3741
  console.log(chalk.bold("\n\u{1F4A1} Process Management"));
3742
- console.log(chalk.gray("To clean up runaway processes: happy doctor clean"));
3742
+ console.log(chalk.gray("To clean up runaway processes: zenflo doctor clean"));
3743
3743
  }
3744
3744
  } catch (error) {
3745
3745
  console.log(chalk.red("\u274C Error checking daemon status"));
@@ -4633,7 +4633,7 @@ async function startDaemon() {
4633
4633
  }
4634
4634
  }
4635
4635
 
4636
- async function startZenfloServer(client, apiClient) {
4636
+ async function startZenfloServer(client) {
4637
4637
  const handler = async (title) => {
4638
4638
  logger.debug("[zenfloMCP] Changing title to:", title);
4639
4639
  try {
@@ -4650,7 +4650,7 @@ async function startZenfloServer(client, apiClient) {
4650
4650
  const mcp = new McpServer({
4651
4651
  name: "ZenFlo MCP",
4652
4652
  version: "1.0.0",
4653
- description: "ZenFlo CLI MCP server with chat session management tools"
4653
+ description: "ZenFlo CLI MCP server for chat session title management"
4654
4654
  });
4655
4655
  mcp.registerTool("change_title", {
4656
4656
  description: "Change the title of the current chat session",
@@ -4683,46 +4683,6 @@ async function startZenfloServer(client, apiClient) {
4683
4683
  };
4684
4684
  }
4685
4685
  });
4686
- mcp.registerTool("send_inbox_message", {
4687
- description: "Send a message to Quinn's ZenFlo app inbox for cross-session communication",
4688
- title: "Send Inbox Message",
4689
- inputSchema: {
4690
- title: z.string().describe('Message title (e.g., "Task completed", "Found a bug")'),
4691
- message: z.string().describe("Message content/details"),
4692
- sessionId: z.string().optional().describe("Optional session ID to link the message to (makes it clickable)"),
4693
- priority: z.enum(["low", "normal", "high"]).optional().describe("Message priority (affects icon and color)")
4694
- }
4695
- }, async (args) => {
4696
- logger.debug("[zenfloMCP] Sending inbox message:", args.title);
4697
- try {
4698
- await apiClient.sendInboxMessage({
4699
- title: args.title,
4700
- message: args.message,
4701
- sessionId: args.sessionId,
4702
- priority: args.priority || "normal"
4703
- });
4704
- return {
4705
- content: [
4706
- {
4707
- type: "text",
4708
- text: `Successfully sent inbox message: "${args.title}"`
4709
- }
4710
- ],
4711
- isError: false
4712
- };
4713
- } catch (error) {
4714
- logger.debug("[zenfloMCP] Error sending inbox message:", error);
4715
- return {
4716
- content: [
4717
- {
4718
- type: "text",
4719
- text: `Failed to send inbox message: ${error instanceof Error ? error.message : String(error)}`
4720
- }
4721
- ],
4722
- isError: true
4723
- };
4724
- }
4725
- });
4726
4686
  const transport = new StreamableHTTPServerTransport({
4727
4687
  // NOTE: Returning session id here will result in claude
4728
4688
  // sdk spawn to fail with `Invalid Request: Server already initialized`
@@ -4747,7 +4707,7 @@ async function startZenfloServer(client, apiClient) {
4747
4707
  });
4748
4708
  return {
4749
4709
  url: baseUrl.toString(),
4750
- toolNames: ["change_title", "send_inbox_message"],
4710
+ toolNames: ["change_title"],
4751
4711
  stop: () => {
4752
4712
  logger.debug("[zenfloMCP] Stopping server");
4753
4713
  mcp.close();
@@ -4762,7 +4722,7 @@ function registerKillSessionHandler(rpcHandlerManager, killThisHappy) {
4762
4722
  void killThisHappy();
4763
4723
  return {
4764
4724
  success: true,
4765
- message: "Killing happy-cli process"
4725
+ message: "Killing zenflo-cli process"
4766
4726
  };
4767
4727
  });
4768
4728
  }
@@ -4835,7 +4795,7 @@ async function runClaude(credentials, options = {}) {
4835
4795
  }
4836
4796
  });
4837
4797
  const session = api.sessionSyncClient(response);
4838
- const zenfloServer = await startZenfloServer(session, api);
4798
+ const zenfloServer = await startZenfloServer(session);
4839
4799
  logger.debug(`[START] ZenFlo MCP server started at ${zenfloServer.url}`);
4840
4800
  const logPath = logger.logFilePath;
4841
4801
  logger.infoDeveloper(`Session: ${response.id}`);
@@ -6225,38 +6185,38 @@ async function handleConnectCommand(args) {
6225
6185
  }
6226
6186
  function showConnectHelp() {
6227
6187
  console.log(`
6228
- ${chalk.bold("happy connect")} - Connect AI vendor API keys to Happy cloud
6188
+ ${chalk.bold("zenflo connect")} - Connect AI vendor API keys to ZenFlo cloud
6229
6189
 
6230
6190
  ${chalk.bold("Usage:")}
6231
- happy connect codex Store your Codex API key in Happy cloud
6232
- happy connect claude Store your Anthropic API key in Happy cloud
6233
- happy connect gemini Store your Gemini API key in Happy cloud
6234
- happy connect help Show this help message
6191
+ zenflo connect codex Store your Codex API key in ZenFlo cloud
6192
+ zenflo connect claude Store your Anthropic API key in ZenFlo cloud
6193
+ zenflo connect gemini Store your Gemini API key in ZenFlo cloud
6194
+ zenflo connect help Show this help message
6235
6195
 
6236
6196
  ${chalk.bold("Description:")}
6237
6197
  The connect command allows you to securely store your AI vendor API keys
6238
- in Happy cloud. This enables you to use these services through Happy
6198
+ in ZenFlo cloud. This enables you to use these services through ZenFlo
6239
6199
  without exposing your API keys locally.
6240
6200
 
6241
6201
  ${chalk.bold("Examples:")}
6242
- happy connect codex
6243
- happy connect claude
6244
- happy connect gemini
6202
+ zenflo connect codex
6203
+ zenflo connect claude
6204
+ zenflo connect gemini
6245
6205
 
6246
6206
  ${chalk.bold("Notes:")}
6247
- \u2022 You must be authenticated with Happy first (run 'happy auth login')
6248
- \u2022 API keys are encrypted and stored securely in Happy cloud
6207
+ \u2022 You must be authenticated with ZenFlo first (run 'zenflo auth login')
6208
+ \u2022 API keys are encrypted and stored securely in ZenFlo cloud
6249
6209
  \u2022 You can manage your stored keys at app.zenflo.dev
6250
6210
  `);
6251
6211
  }
6252
6212
  async function handleConnectVendor(vendor, displayName) {
6253
6213
  console.log(chalk.bold(`
6254
- \u{1F50C} Connecting ${displayName} to Happy cloud
6214
+ \u{1F50C} Connecting ${displayName} to ZenFlo cloud
6255
6215
  `));
6256
6216
  const credentials = await readCredentials();
6257
6217
  if (!credentials) {
6258
- console.log(chalk.yellow("\u26A0\uFE0F Not authenticated with Happy"));
6259
- console.log(chalk.gray(' Please run "happy auth login" first'));
6218
+ console.log(chalk.yellow("\u26A0\uFE0F Not authenticated with ZenFlo"));
6219
+ console.log(chalk.gray(' Please run "zenflo auth login" first'));
6260
6220
  process.exit(1);
6261
6221
  }
6262
6222
  const api = await ApiClient.create(credentials);
@@ -6324,7 +6284,7 @@ async function handleConnectVendor(vendor, displayName) {
6324
6284
  return;
6325
6285
  } else if (subcommand === "codex") {
6326
6286
  try {
6327
- const { runCodex } = await import('./runCodex-DU0XMdXX.mjs');
6287
+ const { runCodex } = await import('./runCodex-CAfYUB9k.mjs');
6328
6288
  let startedBy = void 0;
6329
6289
  for (let i = 1; i < args.length; i++) {
6330
6290
  if (args[i] === "--started-by") {
@@ -6345,7 +6305,7 @@ async function handleConnectVendor(vendor, displayName) {
6345
6305
  return;
6346
6306
  } else if (subcommand === "ccr" || subcommand === "glm") {
6347
6307
  try {
6348
- const { runCCR } = await import('./runCCR-DHyrfvNo.mjs');
6308
+ const { runCCR } = await import('./runCCR-BUMMywJS.mjs');
6349
6309
  let startedBy = void 0;
6350
6310
  for (let i = 1; i < args.length; i++) {
6351
6311
  if (args[i] === "--started-by") {
@@ -6448,13 +6408,13 @@ async function handleConnectVendor(vendor, displayName) {
6448
6408
  let statusModule;
6449
6409
  switch (process.platform) {
6450
6410
  case "darwin":
6451
- statusModule = await import('./status-VT6VbsEc.mjs');
6411
+ statusModule = await import('./status-Ci3LMn8d.mjs');
6452
6412
  break;
6453
6413
  case "win32":
6454
- statusModule = await import('./status-DcMExT1x.mjs');
6414
+ statusModule = await import('./status-BPrNeVH-.mjs');
6455
6415
  break;
6456
6416
  case "linux":
6457
- statusModule = await import('./status-DgMMF-7E.mjs');
6417
+ statusModule = await import('./status-CbsGtmMn.mjs');
6458
6418
  break;
6459
6419
  default:
6460
6420
  console.error(chalk.red(`Status command not supported on platform: ${process.platform}`));
@@ -6541,7 +6501,7 @@ ${chalk.bold("To clean up runaway processes:")} Use ${chalk.cyan("zenflo doctor
6541
6501
  }
6542
6502
  if (showHelp) {
6543
6503
  console.log(`
6544
- ${chalk.bold("zenflo")} - Claude Code On the Go
6504
+ ${chalk.bold("zenflo")} - Claude Code with ZenFlo
6545
6505
 
6546
6506
  ${chalk.bold("Usage:")}
6547
6507
  zenflo [options] Start Claude with mobile control
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  require('chalk');
4
- require('./index-LeMT1COL.cjs');
5
- require('./types-C0K47bQB.cjs');
4
+ require('./index-CJ8JfQbJ.cjs');
5
+ require('./types-DILJPonx.cjs');
6
6
  require('zod');
7
7
  require('node:child_process');
8
8
  require('node:os');
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import 'chalk';
2
- import './index-BmkLkj0P.mjs';
3
- import './types-Bm-nJvHk.mjs';
2
+ import './index-HyLXtYMY.mjs';
3
+ import './types-cYVbBsSI.mjs';
4
4
  import 'zod';
5
5
  import 'node:child_process';
6
6
  import 'node:os';
package/dist/lib.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var types = require('./types-C0K47bQB.cjs');
3
+ var types = require('./types-DILJPonx.cjs');
4
4
  require('axios');
5
5
  require('chalk');
6
6
  require('fs');
package/dist/lib.d.cts CHANGED
@@ -668,7 +668,7 @@ type SpawnSessionResult = {
668
668
  };
669
669
 
670
670
  /**
671
- * WebSocket client for machine/daemon communication with Happy server
671
+ * WebSocket client for machine/daemon communication with ZenFlo server
672
672
  * Similar to ApiSessionClient but for machine-scoped connections
673
673
  */
674
674
 
package/dist/lib.d.mts CHANGED
@@ -668,7 +668,7 @@ type SpawnSessionResult = {
668
668
  };
669
669
 
670
670
  /**
671
- * WebSocket client for machine/daemon communication with Happy server
671
+ * WebSocket client for machine/daemon communication with ZenFlo server
672
672
  * Similar to ApiSessionClient but for machine-scoped connections
673
673
  */
674
674
 
package/dist/lib.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-Bm-nJvHk.mjs';
1
+ export { A as ApiClient, a as ApiSessionClient, R as RawJSONLinesSchema, c as configuration, l as logger } from './types-cYVbBsSI.mjs';
2
2
  import 'axios';
3
3
  import 'chalk';
4
4
  import 'fs';
@@ -1,5 +1,5 @@
1
- import { r as runClaude } from './index-BmkLkj0P.mjs';
2
- import { l as logger } from './types-Bm-nJvHk.mjs';
1
+ import { r as runClaude } from './index-HyLXtYMY.mjs';
2
+ import { l as logger } from './types-cYVbBsSI.mjs';
3
3
  import { execSync } from 'node:child_process';
4
4
  import 'chalk';
5
5
  import 'node:os';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-LeMT1COL.cjs');
4
- var types = require('./types-C0K47bQB.cjs');
3
+ var index = require('./index-CJ8JfQbJ.cjs');
4
+ var types = require('./types-DILJPonx.cjs');
5
5
  var node_child_process = require('node:child_process');
6
6
  require('chalk');
7
7
  require('node:os');
@@ -1,13 +1,13 @@
1
1
  import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
- import { l as logger, A as ApiClient, b as readSettings, p as projectPath, c as configuration, d as packageJson } from './types-Bm-nJvHk.mjs';
3
+ import { l as logger, A as ApiClient, b as readSettings, p as projectPath, c as configuration, d as packageJson } from './types-cYVbBsSI.mjs';
4
4
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
5
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
6
6
  import { z } from 'zod';
7
7
  import { ElicitRequestSchema } from '@modelcontextprotocol/sdk/types.js';
8
8
  import { execSync } from 'child_process';
9
9
  import { randomUUID } from 'node:crypto';
10
- import { i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, a as registerKillSessionHandler, b as MessageBuffer, s as startZenfloServer, t as trimIdent, c as stopCaffeinate } from './index-BmkLkj0P.mjs';
10
+ import { i as initialMachineMetadata, n as notifyDaemonSessionStarted, M as MessageQueue2, h as hashObject, a as registerKillSessionHandler, b as MessageBuffer, s as startZenfloServer, t as trimIdent, c as stopCaffeinate } from './index-HyLXtYMY.mjs';
11
11
  import os from 'node:os';
12
12
  import { resolve, join } from 'node:path';
13
13
  import fs from 'node:fs';
@@ -72,7 +72,7 @@ class CodexMcpClient {
72
72
  permissionHandler = null;
73
73
  constructor() {
74
74
  this.client = new Client(
75
- { name: "happy-codex-client", version: "1.0.0" },
75
+ { name: "zenflo-codex-client", version: "1.0.0" },
76
76
  { capabilities: { tools: {}, elicitation: {} } }
77
77
  );
78
78
  this.client.setNotificationHandler(z.object({
@@ -1122,11 +1122,11 @@ async function runCodex(opts) {
1122
1122
  }
1123
1123
  }
1124
1124
  });
1125
- const zenfloServer = await startZenfloServer(session, api);
1125
+ const zenfloServer = await startZenfloServer(session);
1126
1126
  const bridgeCommand = join(projectPath(), "bin", "zenflo-mcp.mjs");
1127
1127
  const zenModeConfig = {
1128
1128
  command: "node",
1129
- args: [join(projectPath(), "..", "zen-mcp", "zen-mode-mcp-server", "dist", "index.js")]
1129
+ args: [join(projectPath(), "..", "integrations", "mcp", "zen-mode", "zen-mode-mcp-server", "dist", "index.js")]
1130
1130
  };
1131
1131
  if (process.env.ZENFLO_AUTH_TOKEN || process.env.ZENFLO_SECRET_KEY || process.env.ZENFLO_USER_ID) {
1132
1132
  zenModeConfig.env = {};
@@ -1141,7 +1141,7 @@ async function runCodex(opts) {
1141
1141
  }
1142
1142
  }
1143
1143
  const mcpServers = {
1144
- happy: {
1144
+ zenflo: {
1145
1145
  command: bridgeCommand,
1146
1146
  args: ["--url", zenfloServer.url]
1147
1147
  },
@@ -1232,7 +1232,7 @@ async function runCodex(opts) {
1232
1232
  })();
1233
1233
  if (!wasCreated) {
1234
1234
  const startConfig = {
1235
- prompt: first ? message.message + "\n\n" + trimIdent(`Based on this message, call functions.happy__change_title to change chat session title that would represent the current task. If chat idea would change dramatically - call this function again to update the title.`) : message.message,
1235
+ prompt: first ? message.message + "\n\n" + trimIdent(`Based on this message, call functions.zenflo__change_title to change chat session title that would represent the current task. If chat idea would change dramatically - call this function again to update the title.`) : message.message,
1236
1236
  sandbox,
1237
1237
  "approval-policy": approvalPolicy,
1238
1238
  config: { mcp_servers: mcpServers }
@@ -2,14 +2,14 @@
2
2
 
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
- var types = require('./types-C0K47bQB.cjs');
5
+ var types = require('./types-DILJPonx.cjs');
6
6
  var index_js = require('@modelcontextprotocol/sdk/client/index.js');
7
7
  var stdio_js = require('@modelcontextprotocol/sdk/client/stdio.js');
8
8
  var z = require('zod');
9
9
  var types_js = require('@modelcontextprotocol/sdk/types.js');
10
10
  var child_process = require('child_process');
11
11
  var node_crypto = require('node:crypto');
12
- var index = require('./index-LeMT1COL.cjs');
12
+ var index = require('./index-CJ8JfQbJ.cjs');
13
13
  var os = require('node:os');
14
14
  var node_path = require('node:path');
15
15
  var fs = require('node:fs');
@@ -74,7 +74,7 @@ class CodexMcpClient {
74
74
  permissionHandler = null;
75
75
  constructor() {
76
76
  this.client = new index_js.Client(
77
- { name: "happy-codex-client", version: "1.0.0" },
77
+ { name: "zenflo-codex-client", version: "1.0.0" },
78
78
  { capabilities: { tools: {}, elicitation: {} } }
79
79
  );
80
80
  this.client.setNotificationHandler(z.z.object({
@@ -1124,11 +1124,11 @@ async function runCodex(opts) {
1124
1124
  }
1125
1125
  }
1126
1126
  });
1127
- const zenfloServer = await index.startZenfloServer(session, api);
1127
+ const zenfloServer = await index.startZenfloServer(session);
1128
1128
  const bridgeCommand = node_path.join(types.projectPath(), "bin", "zenflo-mcp.mjs");
1129
1129
  const zenModeConfig = {
1130
1130
  command: "node",
1131
- args: [node_path.join(types.projectPath(), "..", "zen-mcp", "zen-mode-mcp-server", "dist", "index.js")]
1131
+ args: [node_path.join(types.projectPath(), "..", "integrations", "mcp", "zen-mode", "zen-mode-mcp-server", "dist", "index.js")]
1132
1132
  };
1133
1133
  if (process.env.ZENFLO_AUTH_TOKEN || process.env.ZENFLO_SECRET_KEY || process.env.ZENFLO_USER_ID) {
1134
1134
  zenModeConfig.env = {};
@@ -1143,7 +1143,7 @@ async function runCodex(opts) {
1143
1143
  }
1144
1144
  }
1145
1145
  const mcpServers = {
1146
- happy: {
1146
+ zenflo: {
1147
1147
  command: bridgeCommand,
1148
1148
  args: ["--url", zenfloServer.url]
1149
1149
  },
@@ -1234,7 +1234,7 @@ async function runCodex(opts) {
1234
1234
  })();
1235
1235
  if (!wasCreated) {
1236
1236
  const startConfig = {
1237
- prompt: first ? message.message + "\n\n" + index.trimIdent(`Based on this message, call functions.happy__change_title to change chat session title that would represent the current task. If chat idea would change dramatically - call this function again to update the title.`) : message.message,
1237
+ prompt: first ? message.message + "\n\n" + index.trimIdent(`Based on this message, call functions.zenflo__change_title to change chat session title that would represent the current task. If chat idea would change dramatically - call this function again to update the title.`) : message.message,
1238
1238
  sandbox,
1239
1239
  "approval-policy": approvalPolicy,
1240
1240
  config: { mcp_servers: mcpServers }
@@ -1,5 +1,5 @@
1
1
  import { execSync } from 'child_process';
2
- import { r as readDaemonState, l as logger } from './types-Bm-nJvHk.mjs';
2
+ import { r as readDaemonState, l as logger } from './types-cYVbBsSI.mjs';
3
3
  import chalk from 'chalk';
4
4
  import 'axios';
5
5
  import 'fs';
@@ -2,7 +2,7 @@
2
2
 
3
3
  var fs = require('fs');
4
4
  var child_process = require('child_process');
5
- var types = require('./types-C0K47bQB.cjs');
5
+ var types = require('./types-DILJPonx.cjs');
6
6
  var os = require('os');
7
7
  var path = require('path');
8
8
  var chalk = require('chalk');
@@ -1,6 +1,6 @@
1
1
  import { existsSync } from 'fs';
2
2
  import { execSync } from 'child_process';
3
- import { r as readDaemonState, l as logger } from './types-Bm-nJvHk.mjs';
3
+ import { r as readDaemonState, l as logger } from './types-cYVbBsSI.mjs';
4
4
  import os from 'os';
5
5
  import path from 'path';
6
6
  import chalk from 'chalk';
@@ -3,7 +3,7 @@ import { execSync } from 'child_process';
3
3
  import os from 'os';
4
4
  import path from 'path';
5
5
  import chalk from 'chalk';
6
- import { r as readDaemonState } from './types-Bm-nJvHk.mjs';
6
+ import { r as readDaemonState } from './types-cYVbBsSI.mjs';
7
7
  import 'axios';
8
8
  import 'node:fs';
9
9
  import 'node:os';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var child_process = require('child_process');
4
- var types = require('./types-C0K47bQB.cjs');
4
+ var types = require('./types-DILJPonx.cjs');
5
5
  var chalk = require('chalk');
6
6
  require('axios');
7
7
  require('fs');
@@ -5,7 +5,7 @@ var child_process = require('child_process');
5
5
  var os = require('os');
6
6
  var path = require('path');
7
7
  var chalk = require('chalk');
8
- var types = require('./types-C0K47bQB.cjs');
8
+ var types = require('./types-DILJPonx.cjs');
9
9
  require('axios');
10
10
  require('node:fs');
11
11
  require('node:os');
@@ -42,7 +42,7 @@ function _interopNamespaceDefault(e) {
42
42
  var z__namespace = /*#__PURE__*/_interopNamespaceDefault(z);
43
43
 
44
44
  var name = "zenflo";
45
- var version = "0.12.0";
45
+ var version = "0.13.0";
46
46
  var description = "Mobile and Web client for Claude Code and Codex - ZenFlo edition";
47
47
  var author = "Combined Memory";
48
48
  var license = "MIT";
@@ -105,11 +105,9 @@ var scripts = {
105
105
  "why do we need to build before running tests / dev?": "We need the binary to be built so we run daemon commands which directly run the binary - we don't want them to go out of sync or have custom spawn logic depending how we started zenflo",
106
106
  typecheck: "tsc --noEmit",
107
107
  build: "shx rm -rf dist && npx tsc --noEmit && pkgroll",
108
- test: "yarn build && tsx --env-file .env.integration-test node_modules/.bin/vitest run",
108
+ test: "yarn build && ZENFLO_HOME_DIR=~/.zenflo-test tsx node_modules/.bin/vitest run",
109
109
  start: "yarn build && ./bin/zenflo.mjs",
110
- dev: "tsx src/index.ts",
111
- "dev:local-server": "yarn build && tsx --env-file .env.dev-local-server src/index.ts",
112
- "dev:integration-test-env": "yarn build && tsx --env-file .env.integration-test src/index.ts",
110
+ dev: "DEBUG=1 tsx src/index.ts",
113
111
  prepublishOnly: "yarn build && yarn test",
114
112
  release: "release-it",
115
113
  postinstall: "node scripts/unpack-tools.cjs"
@@ -1028,7 +1026,7 @@ class RpcHandlerManager {
1028
1026
  }
1029
1027
  }
1030
1028
 
1031
- const __dirname$1 = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-C0K47bQB.cjs', document.baseURI).href))));
1029
+ const __dirname$1 = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('types-DILJPonx.cjs', document.baseURI).href))));
1032
1030
  function projectPath() {
1033
1031
  const path$1 = path.resolve(__dirname$1, "..");
1034
1032
  return path$1;
@@ -1847,7 +1845,7 @@ class PushNotificationClient {
1847
1845
  token;
1848
1846
  baseUrl;
1849
1847
  expo;
1850
- constructor(token, baseUrl = "https://api.cluster-fluster.com") {
1848
+ constructor(token, baseUrl = "https://api.zenflo.dev") {
1851
1849
  this.token = token;
1852
1850
  this.baseUrl = baseUrl;
1853
1851
  this.expo = new expoServerSdk.Expo();
@@ -2071,7 +2069,7 @@ class ApiClient {
2071
2069
  );
2072
2070
  if (response.status !== 200) {
2073
2071
  console.error(chalk.red(`[API] Failed to create machine: ${response.statusText}`));
2074
- console.log(chalk.yellow(`[API] Failed to create machine: ${response.statusText}, most likely you have re-authenticated, but you still have a machine associated with the old account. Now we are trying to re-associate the machine with the new account. That is not allowed. Please run 'happy doctor clean' to clean up your happy state, and try your original command again. Please create an issue on github if this is causing you problems. We apologize for the inconvenience.`));
2072
+ console.log(chalk.yellow(`[API] Failed to create machine: ${response.statusText}, most likely you have re-authenticated, but you still have a machine associated with the old account. Now we are trying to re-associate the machine with the new account. That is not allowed. Please run 'zenflo doctor clean' to clean up your state, and try your original command again. Please create an issue on github if this is causing you problems. We apologize for the inconvenience.`));
2075
2073
  process.exit(1);
2076
2074
  }
2077
2075
  const raw = response.data.machine;
@@ -21,7 +21,7 @@ import { platform } from 'os';
21
21
  import { Expo } from 'expo-server-sdk';
22
22
 
23
23
  var name = "zenflo";
24
- var version = "0.12.0";
24
+ var version = "0.13.0";
25
25
  var description = "Mobile and Web client for Claude Code and Codex - ZenFlo edition";
26
26
  var author = "Combined Memory";
27
27
  var license = "MIT";
@@ -84,11 +84,9 @@ var scripts = {
84
84
  "why do we need to build before running tests / dev?": "We need the binary to be built so we run daemon commands which directly run the binary - we don't want them to go out of sync or have custom spawn logic depending how we started zenflo",
85
85
  typecheck: "tsc --noEmit",
86
86
  build: "shx rm -rf dist && npx tsc --noEmit && pkgroll",
87
- test: "yarn build && tsx --env-file .env.integration-test node_modules/.bin/vitest run",
87
+ test: "yarn build && ZENFLO_HOME_DIR=~/.zenflo-test tsx node_modules/.bin/vitest run",
88
88
  start: "yarn build && ./bin/zenflo.mjs",
89
- dev: "tsx src/index.ts",
90
- "dev:local-server": "yarn build && tsx --env-file .env.dev-local-server src/index.ts",
91
- "dev:integration-test-env": "yarn build && tsx --env-file .env.integration-test src/index.ts",
89
+ dev: "DEBUG=1 tsx src/index.ts",
92
90
  prepublishOnly: "yarn build && yarn test",
93
91
  release: "release-it",
94
92
  postinstall: "node scripts/unpack-tools.cjs"
@@ -1826,7 +1824,7 @@ class PushNotificationClient {
1826
1824
  token;
1827
1825
  baseUrl;
1828
1826
  expo;
1829
- constructor(token, baseUrl = "https://api.cluster-fluster.com") {
1827
+ constructor(token, baseUrl = "https://api.zenflo.dev") {
1830
1828
  this.token = token;
1831
1829
  this.baseUrl = baseUrl;
1832
1830
  this.expo = new Expo();
@@ -2050,7 +2048,7 @@ class ApiClient {
2050
2048
  );
2051
2049
  if (response.status !== 200) {
2052
2050
  console.error(chalk.red(`[API] Failed to create machine: ${response.statusText}`));
2053
- console.log(chalk.yellow(`[API] Failed to create machine: ${response.statusText}, most likely you have re-authenticated, but you still have a machine associated with the old account. Now we are trying to re-associate the machine with the new account. That is not allowed. Please run 'happy doctor clean' to clean up your happy state, and try your original command again. Please create an issue on github if this is causing you problems. We apologize for the inconvenience.`));
2051
+ console.log(chalk.yellow(`[API] Failed to create machine: ${response.statusText}, most likely you have re-authenticated, but you still have a machine associated with the old account. Now we are trying to re-associate the machine with the new account. That is not allowed. Please run 'zenflo doctor clean' to clean up your state, and try your original command again. Please create an issue on github if this is causing you problems. We apologize for the inconvenience.`));
2054
2052
  process.exit(1);
2055
2053
  }
2056
2054
  const raw = response.data.machine;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zenflo",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Mobile and Web client for Claude Code and Codex - ZenFlo edition",
5
5
  "author": "Combined Memory",
6
6
  "license": "MIT",
@@ -63,11 +63,9 @@
63
63
  "why do we need to build before running tests / dev?": "We need the binary to be built so we run daemon commands which directly run the binary - we don't want them to go out of sync or have custom spawn logic depending how we started zenflo",
64
64
  "typecheck": "tsc --noEmit",
65
65
  "build": "shx rm -rf dist && npx tsc --noEmit && pkgroll",
66
- "test": "yarn build && tsx --env-file .env.integration-test node_modules/.bin/vitest run",
66
+ "test": "yarn build && ZENFLO_HOME_DIR=~/.zenflo-test tsx node_modules/.bin/vitest run",
67
67
  "start": "yarn build && ./bin/zenflo.mjs",
68
- "dev": "tsx src/index.ts",
69
- "dev:local-server": "yarn build && tsx --env-file .env.dev-local-server src/index.ts",
70
- "dev:integration-test-env": "yarn build && tsx --env-file .env.integration-test src/index.ts",
68
+ "dev": "DEBUG=1 tsx src/index.ts",
71
69
  "prepublishOnly": "yarn build && yarn test",
72
70
  "release": "release-it",
73
71
  "postinstall": "node scripts/unpack-tools.cjs"