@mrpatronz/nexusflow 1.7.0 → 1.8.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.
Files changed (92) hide show
  1. package/README.md +9 -8
  2. package/dist/agent/AntigravityCliAdapter.d.ts +7 -0
  3. package/dist/agent/AntigravityCliAdapter.d.ts.map +1 -0
  4. package/dist/agent/AntigravityCliAdapter.js +13 -0
  5. package/dist/agent/AntigravityCliAdapter.js.map +1 -0
  6. package/dist/agent/ClaudeCliAdapter.d.ts +16 -0
  7. package/dist/agent/ClaudeCliAdapter.d.ts.map +1 -0
  8. package/dist/agent/ClaudeCliAdapter.js +34 -0
  9. package/dist/agent/ClaudeCliAdapter.js.map +1 -0
  10. package/dist/agent/CliAdapterBase.d.ts +48 -0
  11. package/dist/agent/CliAdapterBase.d.ts.map +1 -0
  12. package/dist/agent/CliAdapterBase.js +120 -0
  13. package/dist/agent/CliAdapterBase.js.map +1 -0
  14. package/dist/agent/NativeAgent.d.ts +13 -0
  15. package/dist/agent/NativeAgent.d.ts.map +1 -0
  16. package/dist/agent/NativeAgent.js +97 -0
  17. package/dist/agent/NativeAgent.js.map +1 -0
  18. package/dist/agent/NativeAgentBase.d.ts +27 -0
  19. package/dist/agent/NativeAgentBase.d.ts.map +1 -0
  20. package/dist/agent/NativeAgentBase.js +58 -0
  21. package/dist/agent/NativeAgentBase.js.map +1 -0
  22. package/dist/agent/NativeClaudeAgent.d.ts +13 -0
  23. package/dist/agent/NativeClaudeAgent.d.ts.map +1 -0
  24. package/dist/agent/NativeClaudeAgent.js +115 -0
  25. package/dist/agent/NativeClaudeAgent.js.map +1 -0
  26. package/dist/agent/NativeGoogleAgent.d.ts +13 -0
  27. package/dist/agent/NativeGoogleAgent.d.ts.map +1 -0
  28. package/dist/agent/NativeGoogleAgent.js +90 -0
  29. package/dist/agent/NativeGoogleAgent.js.map +1 -0
  30. package/dist/agent/ProviderRegistry.d.ts +31 -0
  31. package/dist/agent/ProviderRegistry.d.ts.map +1 -0
  32. package/dist/agent/ProviderRegistry.js +20 -0
  33. package/dist/agent/ProviderRegistry.js.map +1 -0
  34. package/dist/agent/ProviderRegistry.test.d.ts +2 -0
  35. package/dist/agent/ProviderRegistry.test.d.ts.map +1 -0
  36. package/dist/agent/ProviderRegistry.test.js +57 -0
  37. package/dist/agent/ProviderRegistry.test.js.map +1 -0
  38. package/dist/agent/adapters.d.ts +3 -0
  39. package/dist/agent/adapters.d.ts.map +1 -0
  40. package/dist/agent/adapters.js +48 -0
  41. package/dist/agent/adapters.js.map +1 -0
  42. package/dist/agent/nativeAgent.test.d.ts +2 -0
  43. package/dist/agent/nativeAgent.test.d.ts.map +1 -0
  44. package/dist/agent/nativeAgent.test.js +35 -0
  45. package/dist/agent/nativeAgent.test.js.map +1 -0
  46. package/dist/agent/nativeTools.d.ts +26 -0
  47. package/dist/agent/nativeTools.d.ts.map +1 -0
  48. package/dist/agent/nativeTools.js +62 -0
  49. package/dist/agent/nativeTools.js.map +1 -0
  50. package/dist/agent/nativeTools.test.d.ts +2 -0
  51. package/dist/agent/nativeTools.test.d.ts.map +1 -0
  52. package/dist/agent/nativeTools.test.js +67 -0
  53. package/dist/agent/nativeTools.test.js.map +1 -0
  54. package/dist/agent/session.d.ts +25 -0
  55. package/dist/agent/session.d.ts.map +1 -0
  56. package/dist/agent/session.js +31 -0
  57. package/dist/agent/session.js.map +1 -0
  58. package/dist/agent/session.test.d.ts +2 -0
  59. package/dist/agent/session.test.d.ts.map +1 -0
  60. package/dist/agent/session.test.js +44 -0
  61. package/dist/agent/session.test.js.map +1 -0
  62. package/dist/commands/desktop.d.ts +4 -5
  63. package/dist/commands/desktop.d.ts.map +1 -1
  64. package/dist/commands/desktop.js +35 -89
  65. package/dist/commands/desktop.js.map +1 -1
  66. package/dist/commands/ui.d.ts +7 -3
  67. package/dist/commands/ui.d.ts.map +1 -1
  68. package/dist/commands/ui.js +12 -6
  69. package/dist/commands/ui.js.map +1 -1
  70. package/dist/desktop-server.d.ts +13 -0
  71. package/dist/desktop-server.d.ts.map +1 -0
  72. package/dist/desktop-server.js +23 -0
  73. package/dist/desktop-server.js.map +1 -0
  74. package/dist/gui/assets/index-CQTEzHj2.css +1 -0
  75. package/dist/gui/assets/index-DLmLdpqC.js +58 -0
  76. package/dist/gui/index.html +2 -2
  77. package/dist/index.js +6 -5
  78. package/dist/index.js.map +1 -1
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +109 -2
  81. package/dist/server.js.map +1 -1
  82. package/dist/utils/session-finder.d.ts +21 -1
  83. package/dist/utils/session-finder.d.ts.map +1 -1
  84. package/dist/utils/session-finder.js +220 -143
  85. package/dist/utils/session-finder.js.map +1 -1
  86. package/dist/utils/session-finder.test.d.ts +2 -0
  87. package/dist/utils/session-finder.test.d.ts.map +1 -0
  88. package/dist/utils/session-finder.test.js +65 -0
  89. package/dist/utils/session-finder.test.js.map +1 -0
  90. package/package.json +10 -1
  91. package/dist/gui/assets/index-CB-Ekvrs.css +0 -1
  92. package/dist/gui/assets/index-CixLsYSa.js +0 -26
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import fs from 'fs-extra';
5
+ import { executeNativeTool, buildSystemPrompt } from './nativeTools.js';
6
+ let workspace;
7
+ beforeAll(async () => {
8
+ workspace = await fs.mkdtemp(path.join(os.tmpdir(), 'nf-native-tools-'));
9
+ await fs.writeFile(path.join(workspace, 'inside.txt'), 'hello', 'utf8');
10
+ await fs.ensureDir(path.join(workspace, 'sub'));
11
+ });
12
+ afterAll(async () => {
13
+ await fs.remove(workspace);
14
+ });
15
+ describe('executeNativeTool', () => {
16
+ it('reads a file inside the workspace', async () => {
17
+ const out = await executeNativeTool(workspace, 'read_file', { filePath: 'inside.txt' });
18
+ expect(out).toBe('hello');
19
+ });
20
+ it('lists a directory inside the workspace with real newlines', async () => {
21
+ const out = await executeNativeTool(workspace, 'list_directory', { dirPath: '.' });
22
+ expect(out.split('\n').sort()).toEqual(['inside.txt', 'sub']);
23
+ });
24
+ it('rejects a relative path that escapes the workspace', async () => {
25
+ await expect(executeNativeTool(workspace, 'read_file', { filePath: '../../../etc/hosts' }))
26
+ .rejects.toThrow(/escapes the workspace/);
27
+ });
28
+ it('rejects an absolute path outside the workspace', async () => {
29
+ const outside = process.platform === 'win32' ? 'C:\\Windows\\win.ini' : '/etc/hosts';
30
+ await expect(executeNativeTool(workspace, 'read_file', { filePath: outside }))
31
+ .rejects.toThrow(/escapes the workspace/);
32
+ });
33
+ it('rejects an unknown tool', async () => {
34
+ await expect(executeNativeTool(workspace, 'delete_everything', {}))
35
+ .rejects.toThrow(/Unknown tool/);
36
+ });
37
+ it('rejects a symlink inside the workspace that points outside it', async () => {
38
+ const outsideDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nf-outside-'));
39
+ const secret = path.join(outsideDir, 'secret.txt');
40
+ await fs.writeFile(secret, 'top secret', 'utf8');
41
+ const link = path.join(workspace, 'escape.txt');
42
+ try {
43
+ await fs.symlink(secret, link);
44
+ }
45
+ catch {
46
+ // Symlink creation needs privileges on Windows; skip if unavailable.
47
+ await fs.remove(outsideDir);
48
+ return;
49
+ }
50
+ try {
51
+ await expect(executeNativeTool(workspace, 'read_file', { filePath: 'escape.txt' }))
52
+ .rejects.toThrow(/escapes the workspace/);
53
+ }
54
+ finally {
55
+ await fs.remove(link);
56
+ await fs.remove(outsideDir);
57
+ }
58
+ });
59
+ });
60
+ describe('buildSystemPrompt', () => {
61
+ it('states the workspace path and read-only scope', () => {
62
+ const p = buildSystemPrompt('/tmp/ws');
63
+ expect(p).toContain('/tmp/ws');
64
+ expect(p).toContain('read-only');
65
+ });
66
+ });
67
+ //# sourceMappingURL=nativeTools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeTools.test.js","sourceRoot":"","sources":["../../src/agent/nativeTools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @module agent/session
3
+ * Session identity for chat agents that support resumable conversations.
4
+ */
5
+ /** A chat session to create or resume. `resume` means the session already has turns on disk. */
6
+ export interface AgentSession {
7
+ id: string;
8
+ resume: boolean;
9
+ }
10
+ /**
11
+ * Strict UUID check. Session ids come from the client and end up in the argv of a
12
+ * shell:true spawn, so only the inert UUID charset may pass.
13
+ */
14
+ export declare function isValidSessionUuid(id: unknown): id is string;
15
+ /**
16
+ * Builds the claude CLI args for one print-mode turn. The prompt itself is
17
+ * always piped via stdin, never argv.
18
+ *
19
+ * Without a session the legacy behavior applies: `-c` continues the most
20
+ * recent conversation in the cwd. With a session, a fresh id is created via
21
+ * --session-id on the first turn and every later turn resumes that id;
22
+ * resumed sessions use --resume from the start.
23
+ */
24
+ export declare function buildClaudeTurnArgs(isFirstTurn: boolean, session?: AgentSession): string[];
25
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAQ1F"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module agent/session
3
+ * Session identity for chat agents that support resumable conversations.
4
+ */
5
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6
+ /**
7
+ * Strict UUID check. Session ids come from the client and end up in the argv of a
8
+ * shell:true spawn, so only the inert UUID charset may pass.
9
+ */
10
+ export function isValidSessionUuid(id) {
11
+ return typeof id === 'string' && UUID_RE.test(id);
12
+ }
13
+ /**
14
+ * Builds the claude CLI args for one print-mode turn. The prompt itself is
15
+ * always piped via stdin, never argv.
16
+ *
17
+ * Without a session the legacy behavior applies: `-c` continues the most
18
+ * recent conversation in the cwd. With a session, a fresh id is created via
19
+ * --session-id on the first turn and every later turn resumes that id;
20
+ * resumed sessions use --resume from the start.
21
+ */
22
+ export function buildClaudeTurnArgs(isFirstTurn, session) {
23
+ if (!session) {
24
+ return isFirstTurn ? ['-p'] : ['-c', '-p'];
25
+ }
26
+ if (!session.resume && isFirstTurn) {
27
+ return ['-p', '--session-id', session.id];
28
+ }
29
+ return ['-p', '--resume', session.id];
30
+ }
31
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAW;IAC5C,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB,EAAE,OAAsB;IAC9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../src/agent/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildClaudeTurnArgs, isValidSessionUuid } from './session.js';
3
+ const ID = '123e4567-e89b-42d3-a456-426614174000';
4
+ describe('buildClaudeTurnArgs', () => {
5
+ it('uses plain -p on the first legacy turn', () => {
6
+ expect(buildClaudeTurnArgs(true)).toEqual(['-p']);
7
+ });
8
+ it('continues with -c on later legacy turns', () => {
9
+ expect(buildClaudeTurnArgs(false)).toEqual(['-c', '-p']);
10
+ });
11
+ it('creates a new session with --session-id on the first turn', () => {
12
+ expect(buildClaudeTurnArgs(true, { id: ID, resume: false })).toEqual(['-p', '--session-id', ID]);
13
+ });
14
+ it('resumes the created session on later turns', () => {
15
+ expect(buildClaudeTurnArgs(false, { id: ID, resume: false })).toEqual(['-p', '--resume', ID]);
16
+ });
17
+ it('resumes an existing session from the first turn', () => {
18
+ expect(buildClaudeTurnArgs(true, { id: ID, resume: true })).toEqual(['-p', '--resume', ID]);
19
+ });
20
+ it('keeps resuming an existing session on later turns', () => {
21
+ expect(buildClaudeTurnArgs(false, { id: ID, resume: true })).toEqual(['-p', '--resume', ID]);
22
+ });
23
+ });
24
+ describe('isValidSessionUuid', () => {
25
+ it('accepts a lowercase uuid', () => {
26
+ expect(isValidSessionUuid(ID)).toBe(true);
27
+ });
28
+ it('accepts an uppercase uuid', () => {
29
+ expect(isValidSessionUuid(ID.toUpperCase())).toBe(true);
30
+ });
31
+ it('rejects empty strings', () => {
32
+ expect(isValidSessionUuid('')).toBe(false);
33
+ });
34
+ it('rejects shell metacharacters', () => {
35
+ expect(isValidSessionUuid('x; rm -rf .')).toBe(false);
36
+ expect(isValidSessionUuid(`${ID} && echo pwned`)).toBe(false);
37
+ });
38
+ it('rejects non-strings', () => {
39
+ expect(isValidSessionUuid(undefined)).toBe(false);
40
+ expect(isValidSessionUuid(42)).toBe(false);
41
+ expect(isValidSessionUuid({ id: ID })).toBe(false);
42
+ });
43
+ });
44
+ //# sourceMappingURL=session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.js","sourceRoot":"","sources":["../../src/agent/session.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  /**
2
2
  * @module commands/desktop
3
- * Launches the NexusFlow desktop application (Neutralinojs).
3
+ * Launches the NexusFlow Electron desktop app from the workspace `desktop/`
4
+ * project. (The previous Neutralino build was replaced by Electron.)
4
5
  */
5
6
  /**
6
- * Launches the NexusFlow desktop application.
7
- *
8
- * Spawns the process detached and unrefs it so the CLI exits immediately
9
- * while the desktop app keeps running.
7
+ * Launches the NexusFlow Electron desktop app via `npm start` in the desktop
8
+ * project. Spawns detached so the CLI returns while the app keeps running.
10
9
  */
11
10
  export declare function desktopCommand(): Promise<void>;
12
11
  //# sourceMappingURL=desktop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"desktop.d.ts","sourceRoot":"","sources":["../../src/commands/desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyFH;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BpD"}
1
+ {"version":3,"file":"desktop.d.ts","sourceRoot":"","sources":["../../src/commands/desktop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCpD"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @module commands/desktop
3
- * Launches the NexusFlow desktop application (Neutralinojs).
3
+ * Launches the NexusFlow Electron desktop app from the workspace `desktop/`
4
+ * project. (The previous Neutralino build was replaced by Electron.)
4
5
  */
5
6
  import { spawn } from 'node:child_process';
6
7
  import { existsSync } from 'node:fs';
@@ -8,112 +9,57 @@ import path from 'node:path';
8
9
  import { fileURLToPath } from 'node:url';
9
10
  import chalk from 'chalk';
10
11
  /**
11
- * Resolves the workspace root directory.
12
+ * Resolves the repo root directory.
12
13
  *
13
- * Assumes the standard NexusFlow workspace layout where the `desktop/`
14
- * project is a sibling of the `NexusFlow/` project under the same
15
- * workspace root:
14
+ * The Electron `desktop/` project lives inside this repo:
16
15
  *
17
- * <workspace-root>/
18
- * NexusFlow/ ← this CLI project
19
- * desktop/ Neutralinojs desktop app
20
- * dist/nexusflow-desktop/<platform-binary>
16
+ * NexusFlow/ ← repo root
17
+ * dist/commands/desktop.js ← this file at runtime
18
+ * desktop/ Electron desktop app (main.js)
21
19
  *
22
- * At runtime this file is compiled to `NexusFlow/dist/commands/desktop.js`,
23
- * so the workspace root is three levels up.
20
+ * This file compiles to `NexusFlow/dist/commands/desktop.js`, so the repo
21
+ * root is two levels up (and `desktop/` sits beside `dist/`).
24
22
  */
25
- function resolveWorkspaceRoot() {
23
+ function resolveRepoRoot() {
26
24
  const thisDir = path.dirname(fileURLToPath(import.meta.url));
27
- return path.resolve(thisDir, '..', '..', '..');
25
+ return path.resolve(thisDir, '..', '..');
28
26
  }
29
- /**
30
- * Returns the desktop dist directory path.
31
- */
32
- function getDesktopDistDir() {
33
- return path.join(resolveWorkspaceRoot(), 'desktop', 'dist', 'nexusflow-desktop');
34
- }
35
- /**
36
- * Resolves the platform-specific binary path for the desktop app.
37
- *
38
- * On macOS the architecture is taken into account:
39
- * - arm64 → `nexusflow-desktop-mac_arm64`
40
- * - x64 → prefers `nexusflow-desktop-mac_x64`, falls back to universal
41
- */
42
- function findDesktopBinary() {
43
- const desktopDistDir = getDesktopDistDir();
44
- const platform = process.platform;
45
- const arch = process.arch;
46
- let binaryName;
47
- if (platform === 'win32') {
48
- binaryName = 'nexusflow-desktop-win_x64.exe';
49
- }
50
- else if (platform === 'darwin') {
51
- if (arch === 'arm64') {
52
- binaryName = 'nexusflow-desktop-mac_arm64';
53
- }
54
- else {
55
- // Prefer smaller x64 binary, fall back to universal
56
- const x64Path = path.join(desktopDistDir, 'nexusflow-desktop-mac_x64');
57
- binaryName = existsSync(x64Path) ? 'nexusflow-desktop-mac_x64' : 'nexusflow-desktop-mac_universal';
58
- }
59
- }
60
- else {
61
- // Linux — detect ARM architectures
62
- if (arch === 'arm64') {
63
- binaryName = 'nexusflow-desktop-linux_arm64';
64
- }
65
- else if (arch === 'arm') {
66
- binaryName = 'nexusflow-desktop-linux_armhf';
67
- }
68
- else {
69
- binaryName = 'nexusflow-desktop-linux_x64';
70
- }
71
- }
72
- const fullPath = path.join(desktopDistDir, binaryName);
73
- return existsSync(fullPath) ? fullPath : null;
74
- }
75
- /**
76
- * Returns the expected binary path for display in the "not found" message.
77
- */
78
- function getExpectedBinaryPath() {
79
- const desktopDistDir = getDesktopDistDir();
80
- switch (process.platform) {
81
- case 'win32':
82
- return path.join(desktopDistDir, 'nexusflow-desktop-win_x64.exe');
83
- case 'darwin':
84
- return path.join(desktopDistDir, 'nexusflow-desktop-mac_*');
85
- case 'linux':
86
- default:
87
- return path.join(desktopDistDir, 'nexusflow-desktop-linux_x64');
88
- }
27
+ function getDesktopDir() {
28
+ return path.join(resolveRepoRoot(), 'desktop');
89
29
  }
90
30
  /**
91
- * Launches the NexusFlow desktop application.
92
- *
93
- * Spawns the process detached and unrefs it so the CLI exits immediately
94
- * while the desktop app keeps running.
31
+ * Launches the NexusFlow Electron desktop app via `npm start` in the desktop
32
+ * project. Spawns detached so the CLI returns while the app keeps running.
95
33
  */
96
34
  export async function desktopCommand() {
97
35
  console.log(chalk.bold.cyan('\n🖥️ NexusFlow — Desktop App\n'));
98
- const binaryPath = findDesktopBinary();
99
- if (!binaryPath) {
100
- const expectedPath = getExpectedBinaryPath();
101
- console.log(chalk.yellow('Desktop binary not found at:'));
102
- console.log(chalk.dim(` ${expectedPath}\n`));
103
- console.log(chalk.white('To build it, run:\n'));
104
- console.log(chalk.green(' cd desktop && npm install && npm run build\n'));
36
+ const desktopDir = getDesktopDir();
37
+ if (!existsSync(path.join(desktopDir, 'main.js'))) {
38
+ console.log(chalk.yellow('Desktop app not found at:'));
39
+ console.log(chalk.dim(` ${desktopDir}\n`));
40
+ console.log(chalk.white('The Electron app lives in the workspace `desktop/` folder. From a source checkout:\n'));
41
+ console.log(chalk.green(' cd desktop && npm install && npm start\n'));
42
+ return;
43
+ }
44
+ if (!existsSync(path.join(desktopDir, 'node_modules'))) {
45
+ console.log(chalk.yellow('Desktop dependencies are not installed.\n'));
46
+ console.log(chalk.white('Install them first:\n'));
47
+ console.log(chalk.green(' cd desktop && npm install\n'));
105
48
  return;
106
49
  }
107
- console.log(chalk.dim(`Launching ${path.basename(binaryPath)}…`));
108
- const child = spawn(binaryPath, [], {
50
+ console.log(chalk.dim('Launching the desktop app…'));
51
+ // The Electron app spawns the backend from ../dist, so the CLI must be built.
52
+ const child = spawn('npm', ['start'], {
53
+ cwd: desktopDir,
109
54
  detached: true,
110
55
  stdio: 'ignore',
111
- cwd: path.dirname(binaryPath), // Required: Neutralino looks for resources.neu in cwd
56
+ shell: process.platform === 'win32', // npm is npm.cmd on Windows
112
57
  });
113
58
  child.on('error', (err) => {
114
- console.error(chalk.red(` ✖ Desktop app process error: ${err.message}`));
59
+ console.error(chalk.red(` ✖ Failed to launch desktop app: ${err.message}`));
115
60
  });
116
61
  child.unref();
117
- console.log(chalk.green('Desktop app launched successfully.\n'));
62
+ console.log(chalk.green('Desktop app launched.\n'));
63
+ console.log(chalk.dim('(Ensure the CLI is built — `npm run build` — so the app can start its backend.)\n'));
118
64
  }
119
65
  //# sourceMappingURL=desktop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../src/commands/desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;GAcG;AACH,SAAS,oBAAoB;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB;IACxB,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAI,UAAkB,CAAC;IAEvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,UAAU,GAAG,+BAA+B,CAAC;IAC/C,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,UAAU,GAAG,6BAA6B,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,oDAAoD;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YACvE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,iCAAiC,CAAC;QACrG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,UAAU,GAAG,+BAA+B,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,UAAU,GAAG,+BAA+B,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,6BAA6B,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB;IAC5B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;QACpE,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;QAC9D,KAAK,OAAO,CAAC;QACb;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,6BAA6B,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAElE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE;QAClC,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,sDAAsD;KACtF,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../src/commands/desktop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;GAWG;AACH,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAErD,8EAA8E;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;QACpC,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,4BAA4B;KAClE,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC,CAAC;AAC9G,CAAC"}
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * @module commands/ui
3
- * Starts the Hono web server and opens the browser to the NexusFlow GUI.
3
+ * Starts the Hono dashboard server (the backend the desktop app embeds).
4
+ * Opening a browser is opt-in via --open.
4
5
  */
5
6
  /**
6
- * Starts the local GUI server and opens the dashboard in the default browser.
7
+ * Starts the local dashboard server. Pass `open: true` to also launch the
8
+ * default browser. `serverOnly` is deprecated (server-only is the default)
9
+ * but still accepted so existing callers keep working.
7
10
  *
8
- * @param options - CLI options, including optional port, daemon, and server-only.
11
+ * @param options - CLI options, including optional port, daemon, and open.
9
12
  */
10
13
  export declare function uiCommand(options: {
11
14
  port?: string;
12
15
  daemon?: boolean;
13
16
  serverOnly?: boolean;
14
17
  strictPort?: boolean;
18
+ open?: boolean;
15
19
  }): Promise<void>;
16
20
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuCH;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEvI"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEvJ"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @module commands/ui
3
- * Starts the Hono web server and opens the browser to the NexusFlow GUI.
3
+ * Starts the Hono dashboard server (the backend the desktop app embeds).
4
+ * Opening a browser is opt-in via --open.
4
5
  */
5
6
  import chalk from 'chalk';
6
7
  import { exec, spawn } from 'node:child_process';
@@ -37,9 +38,11 @@ function openBrowser(url) {
37
38
  });
38
39
  }
39
40
  /**
40
- * Starts the local GUI server and opens the dashboard in the default browser.
41
+ * Starts the local dashboard server. Pass `open: true` to also launch the
42
+ * default browser. `serverOnly` is deprecated (server-only is the default)
43
+ * but still accepted so existing callers keep working.
41
44
  *
42
- * @param options - CLI options, including optional port, daemon, and server-only.
45
+ * @param options - CLI options, including optional port, daemon, and open.
43
46
  */
44
47
  export async function uiCommand(options) {
45
48
  const port = options.port ? parseInt(options.port, 10) : 3000;
@@ -49,7 +52,7 @@ export async function uiCommand(options) {
49
52
  const active = await isPortActive(port);
50
53
  if (active) {
51
54
  console.log(chalk.green(` ✔ Dashboard is already active at: ${chalk.bold(url)}`));
52
- if (!options.serverOnly) {
55
+ if (options.open) {
53
56
  console.log(chalk.dim(' Opening browser...'));
54
57
  openBrowser(url);
55
58
  }
@@ -69,12 +72,15 @@ export async function uiCommand(options) {
69
72
  });
70
73
  child.unref();
71
74
  console.log(chalk.green(` ✔ Dashboard daemon successfully spawned.`));
72
- if (!options.serverOnly) {
75
+ if (options.open) {
73
76
  console.log(chalk.dim(' Opening browser...'));
74
77
  // Give the background process a brief moment to start listening
75
78
  await new Promise((resolve) => setTimeout(resolve, 600));
76
79
  openBrowser(url);
77
80
  }
81
+ else {
82
+ console.log(chalk.dim(` Dashboard available at ${url} — use the desktop app or 'nexusflow dashboard' to open it.`));
83
+ }
78
84
  return;
79
85
  }
80
86
  catch (err) {
@@ -90,7 +96,7 @@ export async function uiCommand(options) {
90
96
  const actualUrl = `http://localhost:${actualPort}`;
91
97
  console.log(chalk.green(` ✔ Dashboard running at: ${chalk.bold(actualUrl)}`));
92
98
  console.log(chalk.dim(' Press Ctrl+C to stop.\n'));
93
- if (!options.serverOnly) {
99
+ if (options.open) {
94
100
  openBrowser(actualUrl);
95
101
  }
96
102
  // Keep process alive
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @module desktop-server
3
+ * Minimal entry point for the desktop app's embedded backend: starts the Hono
4
+ * dashboard server directly, without the CLI layer (commander/pm2/inquirer and
5
+ * all the command modules). The Electron shell spawns this and parses the
6
+ * "http://localhost:<port>" line from stdout.
7
+ *
8
+ * Running the full CLI (`index.js ui`) here is both unnecessary and fragile —
9
+ * under Electron-as-Node the CLI's commander import can resolve to pm2's
10
+ * ancient nested commander (v2, no `.hook`) and crash at startup.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=desktop-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-server.d.ts","sourceRoot":"","sources":["../src/desktop-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module desktop-server
3
+ * Minimal entry point for the desktop app's embedded backend: starts the Hono
4
+ * dashboard server directly, without the CLI layer (commander/pm2/inquirer and
5
+ * all the command modules). The Electron shell spawns this and parses the
6
+ * "http://localhost:<port>" line from stdout.
7
+ *
8
+ * Running the full CLI (`index.js ui`) here is both unnecessary and fragile —
9
+ * under Electron-as-Node the CLI's commander import can resolve to pm2's
10
+ * ancient nested commander (v2, no `.hook`) and crash at startup.
11
+ */
12
+ import { startServer } from './server.js';
13
+ const port = Number(process.env.NF_PORT ?? process.argv[2] ?? 0) || 0;
14
+ startServer(port, { strictPort: false })
15
+ .then(({ port: actualPort }) => {
16
+ // The Electron shell watches stdout for this URL to know the server is up.
17
+ console.log(`Dashboard running at: http://localhost:${actualPort}`);
18
+ })
19
+ .catch((err) => {
20
+ console.error('Failed to start dashboard server:', err);
21
+ process.exit(1);
22
+ });
23
+ //# sourceMappingURL=desktop-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-server.js","sourceRoot":"","sources":["../src/desktop-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAEtE,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;KACrC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IAC7B,2EAA2E;IAC3E,OAAO,CAAC,GAAG,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}