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.
- package/dist/codex/zenfloMcpStdioBridge.cjs +4 -31
- package/dist/codex/zenfloMcpStdioBridge.mjs +4 -31
- package/dist/{index-LeMT1COL.cjs → index-CJ8JfQbJ.cjs} +39 -79
- package/dist/{index-BmkLkj0P.mjs → index-HyLXtYMY.mjs} +37 -77
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +1 -1
- package/dist/lib.d.mts +1 -1
- package/dist/lib.mjs +1 -1
- package/dist/{runCCR-DHyrfvNo.mjs → runCCR-BUMMywJS.mjs} +2 -2
- package/dist/{runCCR-CokU0NUY.cjs → runCCR-CsBd9Bin.cjs} +2 -2
- package/dist/{runCodex-DU0XMdXX.mjs → runCodex-CAfYUB9k.mjs} +7 -7
- package/dist/{runCodex-BED95lb3.cjs → runCodex-gxOwFxj9.cjs} +7 -7
- package/dist/{status-DcMExT1x.mjs → status-BPrNeVH-.mjs} +1 -1
- package/dist/{status-CES2ft-F.cjs → status-B_tjHFOS.cjs} +1 -1
- package/dist/{status-DgMMF-7E.mjs → status-CbsGtmMn.mjs} +1 -1
- package/dist/{status-VT6VbsEc.mjs → status-Ci3LMn8d.mjs} +1 -1
- package/dist/{status-DUnHkBDq.cjs → status-CmuBM9eE.cjs} +1 -1
- package/dist/{status-6nX5obxE.cjs → status-wSLqL6_S.cjs} +1 -1
- package/dist/{types-C0K47bQB.cjs → types-DILJPonx.cjs} +6 -8
- package/dist/{types-Bm-nJvHk.mjs → types-cYVbBsSI.mjs} +5 -7
- package/package.json +3 -5
|
@@ -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: "
|
|
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: "
|
|
42
|
+
name: "ZenFlo MCP Bridge",
|
|
43
43
|
version: "1.0.0",
|
|
44
|
-
description: "STDIO bridge forwarding to
|
|
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(`[
|
|
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: "
|
|
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: "
|
|
40
|
+
name: "ZenFlo MCP Bridge",
|
|
41
41
|
version: "1.0.0",
|
|
42
|
-
description: "STDIO bridge forwarding to
|
|
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(`[
|
|
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-
|
|
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.
|
|
239
|
+
via [ZenFlo](https://zenflo.dev)
|
|
240
240
|
|
|
241
241
|
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
242
|
-
Co-Authored-By: ZenFlo <yesreply@zenflo.
|
|
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-
|
|
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
|
|
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
|
|
3580
|
-
const allProcesses = await
|
|
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
|
|
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", "
|
|
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(`
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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
|
|
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-
|
|
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("
|
|
6210
|
+
${chalk.bold("zenflo connect")} - Connect AI vendor API keys to ZenFlo cloud
|
|
6251
6211
|
|
|
6252
6212
|
${chalk.bold("Usage:")}
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
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
|
|
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
|
-
|
|
6265
|
-
|
|
6266
|
-
|
|
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
|
|
6270
|
-
\u2022 API keys are encrypted and stored securely in
|
|
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
|
|
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
|
|
6281
|
-
console.log(chalk.gray(' Please run "
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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.
|
|
217
|
+
via [ZenFlo](https://zenflo.dev)
|
|
218
218
|
|
|
219
219
|
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
220
|
-
Co-Authored-By: ZenFlo <yesreply@zenflo.
|
|
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
|
|
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
|
|
3558
|
-
const allProcesses = await
|
|
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
|
|
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", "
|
|
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(`
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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
|
|
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("
|
|
6188
|
+
${chalk.bold("zenflo connect")} - Connect AI vendor API keys to ZenFlo cloud
|
|
6229
6189
|
|
|
6230
6190
|
${chalk.bold("Usage:")}
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
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
|
|
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
|
-
|
|
6243
|
-
|
|
6244
|
-
|
|
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
|
|
6248
|
-
\u2022 API keys are encrypted and stored securely in
|
|
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
|
|
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
|
|
6259
|
-
console.log(chalk.gray(' Please run "
|
|
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-
|
|
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-
|
|
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-
|
|
6411
|
+
statusModule = await import('./status-Ci3LMn8d.mjs');
|
|
6452
6412
|
break;
|
|
6453
6413
|
case "win32":
|
|
6454
|
-
statusModule = await import('./status-
|
|
6414
|
+
statusModule = await import('./status-BPrNeVH-.mjs');
|
|
6455
6415
|
break;
|
|
6456
6416
|
case "linux":
|
|
6457
|
-
statusModule = await import('./status-
|
|
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
|
|
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
package/dist/index.mjs
CHANGED
package/dist/lib.cjs
CHANGED
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
|
|
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
|
|
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-
|
|
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-
|
|
2
|
-
import { l as logger } from './types-
|
|
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-
|
|
4
|
-
var types = require('./types-
|
|
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-
|
|
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-
|
|
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: "
|
|
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
|
|
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-
|
|
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
|
-
|
|
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.
|
|
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-
|
|
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-
|
|
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: "
|
|
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
|
|
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-
|
|
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
|
-
|
|
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.
|
|
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,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-
|
|
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-
|
|
6
|
+
import { r as readDaemonState } from './types-cYVbBsSI.mjs';
|
|
7
7
|
import 'axios';
|
|
8
8
|
import 'node:fs';
|
|
9
9
|
import 'node:os';
|
|
@@ -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-
|
|
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.
|
|
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 &&
|
|
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-
|
|
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.
|
|
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 '
|
|
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.
|
|
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 &&
|
|
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.
|
|
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 '
|
|
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.
|
|
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 &&
|
|
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"
|