nebula-notebook-mcp 0.2.0 → 0.4.1

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 (67) hide show
  1. package/bin/nebula +5 -0
  2. package/bin/nebula.js +4 -0
  3. package/dist/cli/compute.d.ts +11 -0
  4. package/dist/cli/compute.d.ts.map +1 -0
  5. package/dist/cli/compute.js +405 -0
  6. package/dist/cli/compute.js.map +1 -0
  7. package/dist/cli/fs.d.ts +11 -0
  8. package/dist/cli/fs.d.ts.map +1 -0
  9. package/dist/cli/fs.js +282 -0
  10. package/dist/cli/fs.js.map +1 -0
  11. package/dist/cli/index.d.ts +12 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +93 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/kernel.d.ts +8 -0
  16. package/dist/cli/kernel.d.ts.map +1 -0
  17. package/dist/cli/kernel.js +165 -0
  18. package/dist/cli/kernel.js.map +1 -0
  19. package/dist/cli/nb.d.ts +8 -0
  20. package/dist/cli/nb.d.ts.map +1 -0
  21. package/dist/cli/nb.js +618 -0
  22. package/dist/cli/nb.js.map +1 -0
  23. package/dist/cli/run.d.ts +7 -0
  24. package/dist/cli/run.d.ts.map +1 -0
  25. package/dist/cli/run.js +124 -0
  26. package/dist/cli/run.js.map +1 -0
  27. package/dist/cli/session.d.ts +10 -0
  28. package/dist/cli/session.d.ts.map +1 -0
  29. package/dist/cli/session.js +116 -0
  30. package/dist/cli/session.js.map +1 -0
  31. package/dist/cli/shared.d.ts +68 -0
  32. package/dist/cli/shared.d.ts.map +1 -0
  33. package/dist/cli/shared.js +216 -0
  34. package/dist/cli/shared.js.map +1 -0
  35. package/dist/cli/skill.d.ts +12 -0
  36. package/dist/cli/skill.d.ts.map +1 -0
  37. package/dist/cli/skill.js +189 -0
  38. package/dist/cli/skill.js.map +1 -0
  39. package/dist/index.d.ts +2 -2
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +4 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/notebook/client.d.ts +127 -3
  44. package/dist/notebook/client.d.ts.map +1 -1
  45. package/dist/notebook/client.js +63 -4
  46. package/dist/notebook/client.js.map +1 -1
  47. package/dist/tools/compute.d.ts +62 -0
  48. package/dist/tools/compute.d.ts.map +1 -0
  49. package/dist/tools/compute.js +307 -0
  50. package/dist/tools/compute.js.map +1 -0
  51. package/dist/tools/files.js +1 -1
  52. package/dist/tools/files.js.map +1 -1
  53. package/dist/tools/index.d.ts +8 -0
  54. package/dist/tools/index.d.ts.map +1 -1
  55. package/dist/tools/index.js +6 -0
  56. package/dist/tools/index.js.map +1 -1
  57. package/dist/tools/kernel.d.ts.map +1 -1
  58. package/dist/tools/kernel.js +8 -5
  59. package/dist/tools/kernel.js.map +1 -1
  60. package/dist/tools/notebook.js +2 -2
  61. package/dist/tools/notebook.js.map +1 -1
  62. package/dist/types.d.ts +4 -0
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/utils/imageResize.d.ts.map +1 -1
  65. package/dist/utils/imageResize.js +18 -1
  66. package/dist/utils/imageResize.js.map +1 -1
  67. package/package.json +5 -4
package/dist/cli/fs.js ADDED
@@ -0,0 +1,282 @@
1
+ /**
2
+ * `nebula fs …` — file operations on the Nebula SERVER's filesystem
3
+ * (list / cat / write / rm / mv / download / upload).
4
+ *
5
+ * For agents running in a terminal ON the server, plain shell commands are
6
+ * simpler — this group exists for remote agents (laptop ↔ server) and for
7
+ * parity with the MCP file tools. Thin wrappers over the same NebulaClient
8
+ * methods the MCP server uses.
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import { CliError, EXIT, makeClient, parse, printHint, printJson, requirePositional, resolveContentInput, resolveUrl, toCliError, } from './shared.js';
13
+ const FS_HELP = `usage: nebula fs <ls|cat|write|rm|mv|download|upload> …
14
+
15
+ Paths are paths on the Nebula SERVER (in a Nebula terminal that is the local
16
+ filesystem — prefer plain shell commands there; this group is for remote use).
17
+
18
+ examples:
19
+ nebula fs ls data/
20
+ nebula fs cat results/summary.csv
21
+ echo 'hello' | nebula fs write notes.txt -
22
+ nebula fs mv old.csv archive/old.csv
23
+ nebula fs rm scratch.txt --force
24
+ nebula fs download results/fig1.pdf ./fig1.pdf
25
+ nebula fs upload ./local.csv data/
26
+
27
+ Run 'nebula fs <subcommand> --help' for details.`;
28
+ export async function cmdFs(argv) {
29
+ const [sub, ...rest] = argv;
30
+ switch (sub) {
31
+ case 'ls':
32
+ return fsLs(rest);
33
+ case 'cat':
34
+ return fsCat(rest);
35
+ case 'write':
36
+ return fsWrite(rest);
37
+ case 'rm':
38
+ return fsRm(rest);
39
+ case 'mv':
40
+ return fsMv(rest);
41
+ case 'download':
42
+ return fsDownload(rest);
43
+ case 'upload':
44
+ return fsUpload(rest);
45
+ case undefined:
46
+ case '--help':
47
+ case '-h':
48
+ console.log(FS_HELP);
49
+ return sub === undefined ? EXIT.USAGE : EXIT.OK;
50
+ default:
51
+ throw new CliError(`unknown fs subcommand: ${sub}`, EXIT.USAGE, "run 'nebula fs --help' for the list");
52
+ }
53
+ }
54
+ function clientFor(values) {
55
+ return makeClient(resolveUrl(values.url));
56
+ }
57
+ // =============================================================================
58
+ // fs ls
59
+ // =============================================================================
60
+ const LS_HELP = `usage: nebula fs ls [path]
61
+
62
+ Lists a directory on the server (defaults to the server's root directory).
63
+
64
+ examples:
65
+ nebula fs ls
66
+ nebula fs ls data/raw`;
67
+ async function fsLs(argv) {
68
+ const { values, positionals } = parse(argv);
69
+ if (values.help) {
70
+ console.log(LS_HELP);
71
+ return EXIT.OK;
72
+ }
73
+ const dirPath = positionals[0] ?? '.';
74
+ const result = await clientFor(values).listFiles(dirPath);
75
+ if (!result.success)
76
+ throw toCliError(result.error);
77
+ const items = result.data ?? [];
78
+ if (values.json) {
79
+ printJson(items);
80
+ return EXIT.OK;
81
+ }
82
+ for (const item of items) {
83
+ console.log(item.type === 'directory' ? `${item.name}/` : item.name);
84
+ }
85
+ if (items.length === 0) {
86
+ console.log('(empty)');
87
+ }
88
+ printHint('read a file with: nebula fs cat <path>', values);
89
+ return EXIT.OK;
90
+ }
91
+ // =============================================================================
92
+ // fs cat
93
+ // =============================================================================
94
+ const CAT_HELP = `usage: nebula fs cat <path>
95
+
96
+ Prints a text file from the server. Binary files error — use fs download.
97
+
98
+ examples:
99
+ nebula fs cat results/summary.csv`;
100
+ async function fsCat(argv) {
101
+ const { values, positionals } = parse(argv);
102
+ if (values.help) {
103
+ console.log(CAT_HELP);
104
+ return EXIT.OK;
105
+ }
106
+ const filePath = requirePositional(positionals, 0, 'path', 'nebula fs cat <path>');
107
+ const result = await clientFor(values).readFile(filePath);
108
+ if (!result.success)
109
+ throw toCliError(result.error);
110
+ if (values.json) {
111
+ printJson({ path: filePath, content: result.data.content });
112
+ return EXIT.OK;
113
+ }
114
+ process.stdout.write(result.data.content);
115
+ if (!result.data.content.endsWith('\n'))
116
+ process.stdout.write('\n');
117
+ return EXIT.OK;
118
+ }
119
+ // =============================================================================
120
+ // fs write
121
+ // =============================================================================
122
+ const WRITE_HELP = `usage: nebula fs write <path> (--content <str> | --content-file <f> | -)
123
+
124
+ Writes a text file on the server (creates or overwrites).
125
+
126
+ examples:
127
+ nebula fs write notes.txt --content 'hello'
128
+ cat local.csv | nebula fs write data/upload.csv -`;
129
+ async function fsWrite(argv) {
130
+ const { values, positionals } = parse(argv, {
131
+ content: { type: 'string' },
132
+ 'content-file': { type: 'string' },
133
+ });
134
+ if (values.help) {
135
+ console.log(WRITE_HELP);
136
+ return EXIT.OK;
137
+ }
138
+ const usage = 'nebula fs write <path> (--content <str> | --content-file <f> | -)';
139
+ const filePath = requirePositional(positionals, 0, 'path', usage);
140
+ const stdinMarker = positionals[1] === '-';
141
+ const content = await resolveContentInput(values.content, values['content-file'], stdinMarker);
142
+ const result = await clientFor(values).writeFile(filePath, content);
143
+ if (!result.success)
144
+ throw toCliError(result.error);
145
+ if (values.json) {
146
+ printJson({ path: filePath, bytes: Buffer.byteLength(content), written: true });
147
+ return EXIT.OK;
148
+ }
149
+ console.log(`wrote ${filePath} (${Buffer.byteLength(content)} bytes)`);
150
+ printHint(`verify with: nebula fs cat ${filePath}`, values);
151
+ return EXIT.OK;
152
+ }
153
+ // =============================================================================
154
+ // fs rm
155
+ // =============================================================================
156
+ const RM_HELP = `usage: nebula fs rm <path> --force
157
+
158
+ Deletes a file (or directory) on the server — --force is required.
159
+
160
+ examples:
161
+ nebula fs rm scratch.txt --force`;
162
+ async function fsRm(argv) {
163
+ const { values, positionals } = parse(argv, { force: { type: 'boolean' } });
164
+ if (values.help) {
165
+ console.log(RM_HELP);
166
+ return EXIT.OK;
167
+ }
168
+ const filePath = requirePositional(positionals, 0, 'path', 'nebula fs rm <path> --force');
169
+ if (!values.force) {
170
+ throw new CliError('fs rm deletes server files — pass --force to confirm', EXIT.USAGE);
171
+ }
172
+ const result = await clientFor(values).deleteFile(filePath);
173
+ if (!result.success)
174
+ throw toCliError(result.error);
175
+ if (values.json) {
176
+ printJson({ path: filePath, deleted: true });
177
+ return EXIT.OK;
178
+ }
179
+ console.log(`deleted ${filePath}`);
180
+ return EXIT.OK;
181
+ }
182
+ // =============================================================================
183
+ // fs mv
184
+ // =============================================================================
185
+ const MV_HELP = `usage: nebula fs mv <old-path> <new-path>
186
+
187
+ Renames/moves a file or directory on the server.
188
+
189
+ examples:
190
+ nebula fs mv old.csv archive/old.csv`;
191
+ async function fsMv(argv) {
192
+ const { values, positionals } = parse(argv);
193
+ if (values.help) {
194
+ console.log(MV_HELP);
195
+ return EXIT.OK;
196
+ }
197
+ const usage = 'nebula fs mv <old-path> <new-path>';
198
+ const oldPath = requirePositional(positionals, 0, 'old-path', usage);
199
+ const newPath = requirePositional(positionals, 1, 'new-path', usage);
200
+ const result = await clientFor(values).renameFile(oldPath, newPath);
201
+ if (!result.success)
202
+ throw toCliError(result.error);
203
+ if (values.json) {
204
+ printJson({ from: oldPath, to: newPath, moved: true });
205
+ return EXIT.OK;
206
+ }
207
+ console.log(`moved ${oldPath} -> ${newPath}`);
208
+ return EXIT.OK;
209
+ }
210
+ // =============================================================================
211
+ // fs download
212
+ // =============================================================================
213
+ const DOWNLOAD_HELP = `usage: nebula fs download <server-path> <local-path>
214
+
215
+ Downloads a file from the server to THIS machine (text or binary).
216
+
217
+ examples:
218
+ nebula fs download results/fig1.pdf ./fig1.pdf`;
219
+ async function fsDownload(argv) {
220
+ const { values, positionals } = parse(argv);
221
+ if (values.help) {
222
+ console.log(DOWNLOAD_HELP);
223
+ return EXIT.OK;
224
+ }
225
+ const usage = 'nebula fs download <server-path> <local-path>';
226
+ const serverPath = requirePositional(positionals, 0, 'server-path', usage);
227
+ const localPath = requirePositional(positionals, 1, 'local-path', usage);
228
+ const result = await clientFor(values).downloadFile(serverPath);
229
+ if (!result.success)
230
+ throw toCliError(result.error);
231
+ const target = localPath.endsWith('/') || (fs.existsSync(localPath) && fs.statSync(localPath).isDirectory())
232
+ ? path.join(localPath, path.basename(serverPath))
233
+ : localPath;
234
+ fs.mkdirSync(path.dirname(path.resolve(target)), { recursive: true });
235
+ fs.writeFileSync(target, result.data.content);
236
+ if (values.json) {
237
+ printJson({ from: serverPath, to: target, bytes: result.data.content.length });
238
+ return EXIT.OK;
239
+ }
240
+ console.log(`downloaded ${serverPath} -> ${target} (${result.data.content.length} bytes)`);
241
+ return EXIT.OK;
242
+ }
243
+ // =============================================================================
244
+ // fs upload
245
+ // =============================================================================
246
+ const UPLOAD_HELP = `usage: nebula fs upload <local-path> <server-dir> [--name NAME]
247
+
248
+ Uploads a local file into a directory on the server (text or binary).
249
+
250
+ examples:
251
+ nebula fs upload ./local.csv data/
252
+ nebula fs upload ./local.csv data/ --name renamed.csv`;
253
+ async function fsUpload(argv) {
254
+ const { values, positionals } = parse(argv, { name: { type: 'string' } });
255
+ if (values.help) {
256
+ console.log(UPLOAD_HELP);
257
+ return EXIT.OK;
258
+ }
259
+ const usage = 'nebula fs upload <local-path> <server-dir> [--name NAME]';
260
+ const localPath = requirePositional(positionals, 0, 'local-path', usage);
261
+ const serverDir = requirePositional(positionals, 1, 'server-dir', usage);
262
+ let content;
263
+ try {
264
+ content = fs.readFileSync(localPath);
265
+ }
266
+ catch (e) {
267
+ throw new CliError(`cannot read ${localPath}: ${e instanceof Error ? e.message : String(e)}`, EXIT.USAGE);
268
+ }
269
+ const filename = values.name ?? path.basename(localPath);
270
+ const result = await clientFor(values).uploadFile(serverDir, content, filename);
271
+ if (!result.success)
272
+ throw toCliError(result.error);
273
+ const dest = `${serverDir.replace(/\/+$/, '')}/${filename}`;
274
+ if (values.json) {
275
+ printJson({ from: localPath, to: dest, bytes: content.length });
276
+ return EXIT.OK;
277
+ }
278
+ console.log(`uploaded ${localPath} -> ${dest} (${content.length} bytes)`);
279
+ printHint(`verify with: nebula fs ls ${serverDir}`, values);
280
+ return EXIT.OK;
281
+ }
282
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/cli/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * nebula — agent-facing CLI for Nebula Notebook.
3
+ *
4
+ * A thin layer over the shared NebulaClient / tools code (the same code the
5
+ * MCP server uses). Design follows AXI (https://axi.md): compact plain-text
6
+ * output, combined operations, one contextual hint per command, --json for
7
+ * raw output, distinct exit codes.
8
+ *
9
+ * Exit codes: 0 ok · 1 error · 2 usage · 7 kernel dead/not-found · 9 OCC conflict
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * nebula — agent-facing CLI for Nebula Notebook.
3
+ *
4
+ * A thin layer over the shared NebulaClient / tools code (the same code the
5
+ * MCP server uses). Design follows AXI (https://axi.md): compact plain-text
6
+ * output, combined operations, one contextual hint per command, --json for
7
+ * raw output, distinct exit codes.
8
+ *
9
+ * Exit codes: 0 ok · 1 error · 2 usage · 7 kernel dead/not-found · 9 OCC conflict
10
+ */
11
+ import { CliError, EXIT } from './shared.js';
12
+ import { cmdNb } from './nb.js';
13
+ import { cmdRun } from './run.js';
14
+ import { cmdKernel } from './kernel.js';
15
+ import { cmdSession } from './session.js';
16
+ import { cmdCompute } from './compute.js';
17
+ import { cmdFs } from './fs.js';
18
+ import { cmdSetupSkill } from './skill.js';
19
+ const ROOT_HELP = `nebula — work with notebooks on a running Nebula server
20
+
21
+ Server URL required: --url <url> on any command, or export NEBULA_URL.
22
+ Not installed? npx -p nebula-notebook-mcp nebula … (or: npm i -g nebula-notebook-mcp)
23
+
24
+ usage: nebula <command> …
25
+
26
+ nb read|edit|insert|delete|search <path> …
27
+ cells: read/OCC-checked edit (conflict → exit 9)/
28
+ insert/delete/search — see 'nebula nb --help'
29
+ nb create|move|duplicate|clear-outputs|clear|meta <path> …
30
+ create notebooks, reorder/copy cells, outputs, metadata
31
+ run <path> <cell-id> execute a cell + print output tail (--tail)
32
+ kernel ls available kernels on the server
33
+ kernel status|start|stop|restart|interrupt <path>
34
+ session start|end <path> hold/release the agent lock across invocations
35
+ compute status|queues|alloc|ls|use|cancel
36
+ cluster compute allocations (HPC; optional)
37
+ fs ls|cat|write|rm|mv|download|upload
38
+ SERVER files (remote agents; in a Nebula terminal use the shell)
39
+ setup-skill install the Claude Code skill (for agents outside Nebula terminals)
40
+
41
+ Every command accepts --json (raw output) and --quiet (no hint line).
42
+ Run 'nebula <command> --help' for examples.`;
43
+ async function main(argv) {
44
+ const [cmd, ...rest] = argv;
45
+ if (cmd === undefined || cmd === '--help' || cmd === '-h' || cmd === 'help') {
46
+ console.log(ROOT_HELP);
47
+ return EXIT.OK;
48
+ }
49
+ switch (cmd) {
50
+ case 'nb':
51
+ return cmdNb(rest);
52
+ case 'run':
53
+ return cmdRun(rest);
54
+ case 'kernel':
55
+ return cmdKernel(rest);
56
+ case 'session':
57
+ return cmdSession(rest);
58
+ case 'compute':
59
+ return cmdCompute(rest);
60
+ case 'fs':
61
+ return cmdFs(rest);
62
+ case 'setup-skill':
63
+ return cmdSetupSkill(rest);
64
+ default:
65
+ throw new CliError(`unknown command: ${cmd}`, EXIT.USAGE, "run 'nebula --help' for the command list");
66
+ }
67
+ }
68
+ /** Exit only after stdout/stderr are flushed (they can be async on pipes). */
69
+ function finish(code) {
70
+ let pending = 2;
71
+ const done = () => {
72
+ pending -= 1;
73
+ if (pending === 0)
74
+ process.exit(code);
75
+ };
76
+ process.stdout.write('', done);
77
+ process.stderr.write('', done);
78
+ }
79
+ main(process.argv.slice(2))
80
+ .then(finish)
81
+ .catch((e) => {
82
+ if (e instanceof CliError) {
83
+ console.error(`error: ${e.message}`);
84
+ if (e.hintText)
85
+ console.error(`hint: ${e.hintText}`);
86
+ finish(e.code);
87
+ }
88
+ else {
89
+ console.error(`error: ${e instanceof Error ? e.message : String(e)}`);
90
+ finish(EXIT.ERROR);
91
+ }
92
+ });
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `nebula kernel …` — kernel status / restart / interrupt for a notebook.
3
+ *
4
+ * Uses the shared NebulaClient kernel-session helpers (same logic as the
5
+ * MCP kernel tools, but addressed by notebook path per invocation).
6
+ */
7
+ export declare function cmdKernel(argv: string[]): Promise<number>;
8
+ //# sourceMappingURL=kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/cli/kernel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC/D"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * `nebula kernel …` — kernel status / restart / interrupt for a notebook.
3
+ *
4
+ * Uses the shared NebulaClient kernel-session helpers (same logic as the
5
+ * MCP kernel tools, but addressed by notebook path per invocation).
6
+ */
7
+ import { CliError, EXIT, makeClient, parse, printHint, printJson, requirePositional, resolveUrl, toCliError, } from './shared.js';
8
+ const KERNEL_HELP = `usage: nebula kernel <status|start|stop|restart|interrupt> <path>
9
+ nebula kernel ls
10
+
11
+ examples:
12
+ nebula kernel ls # available kernels on the server
13
+ nebula kernel status analysis.ipynb # session id, kernel, state
14
+ nebula kernel start analysis.ipynb # start (kernel from notebook metadata)
15
+ nebula kernel start analysis.ipynb --name ir
16
+ nebula kernel stop analysis.ipynb # shut the session down
17
+ nebula kernel interrupt analysis.ipynb # stop the running cell
18
+ nebula kernel restart analysis.ipynb # fresh kernel (variables cleared)
19
+
20
+ Exit code 7 means no kernel session exists for the notebook.`;
21
+ export async function cmdKernel(argv) {
22
+ const [sub, ...rest] = argv;
23
+ if (sub === undefined || sub === '--help' || sub === '-h') {
24
+ console.log(KERNEL_HELP);
25
+ return sub === undefined ? EXIT.USAGE : EXIT.OK;
26
+ }
27
+ const { values, positionals } = parse(rest, { name: { type: 'string' } });
28
+ if (values.help) {
29
+ console.log(KERNEL_HELP);
30
+ return EXIT.OK;
31
+ }
32
+ // Path-less subcommands
33
+ if (sub === 'ls') {
34
+ return kernelLs(makeClient(resolveUrl(values.url)), values);
35
+ }
36
+ const nbPath = requirePositional(positionals, 0, 'path', `nebula kernel ${sub} <path>`);
37
+ const url = resolveUrl(values.url);
38
+ const client = makeClient(url, nbPath);
39
+ switch (sub) {
40
+ case 'status':
41
+ return kernelStatus(client, nbPath, values);
42
+ case 'start':
43
+ return kernelStart(client, nbPath, values);
44
+ case 'stop':
45
+ return kernelStop(client, nbPath, values);
46
+ case 'restart':
47
+ return kernelRestart(client, nbPath, values);
48
+ case 'interrupt':
49
+ return kernelInterrupt(client, nbPath, values);
50
+ default:
51
+ throw new CliError(`unknown kernel subcommand: ${sub}`, EXIT.USAGE, "run 'nebula kernel --help' for the list");
52
+ }
53
+ }
54
+ async function kernelLs(client, values) {
55
+ const result = await client.listKernels();
56
+ if (!result.success)
57
+ throw toCliError(result.error);
58
+ const kernels = result.data ?? [];
59
+ if (values.json) {
60
+ printJson(kernels);
61
+ return EXIT.OK;
62
+ }
63
+ if (kernels.length === 0) {
64
+ console.log('no kernels discovered on the server');
65
+ return EXIT.OK;
66
+ }
67
+ const nameWidth = Math.max(...kernels.map((k) => k.name.length), 4);
68
+ console.log(`${'NAME'.padEnd(nameWidth)} LANGUAGE DISPLAY NAME`);
69
+ for (const k of kernels) {
70
+ console.log(`${k.name.padEnd(nameWidth)} ${(k.language || '-').padEnd(8)} ${k.displayName}`);
71
+ }
72
+ printHint('start one for a notebook with: nebula kernel start <path> --name <NAME>', values);
73
+ return EXIT.OK;
74
+ }
75
+ async function kernelStart(client, nbPath, values) {
76
+ // No --name → the server resolves the kernel from the notebook's kernelspec.
77
+ const started = await client.getOrCreateKernelForFile(nbPath, values.name);
78
+ if (!started.success)
79
+ throw toCliError(started.error, nbPath);
80
+ if (values.json) {
81
+ printJson({ sessionId: started.data.sessionId, kernelName: started.data.kernelName });
82
+ return EXIT.OK;
83
+ }
84
+ console.log(`kernel session: ${started.data.sessionId} (${started.data.kernelName})`);
85
+ printHint(`execute a cell with: nebula run ${nbPath} <cell-id>`, values);
86
+ return EXIT.OK;
87
+ }
88
+ async function kernelStop(client, nbPath, values) {
89
+ const session = await client.resolveKernelSessionIdForNotebook(nbPath, { createIfMissing: false });
90
+ if (!session.success) {
91
+ throw new CliError(`no kernel session for ${nbPath}`, EXIT.KERNEL);
92
+ }
93
+ const result = await client.shutdownKernel(session.data.sessionId);
94
+ if (!result.success)
95
+ throw toCliError(result.error, nbPath);
96
+ if (values.json) {
97
+ printJson({ stopped: true, sessionId: session.data.sessionId });
98
+ return EXIT.OK;
99
+ }
100
+ console.log('kernel stopped');
101
+ printHint(`start a fresh one with: nebula kernel start ${nbPath}`, values);
102
+ return EXIT.OK;
103
+ }
104
+ async function kernelStatus(client, nbPath, values) {
105
+ const sessions = await client.listSessions();
106
+ if (!sessions.success)
107
+ throw toCliError(sessions.error, nbPath);
108
+ const matching = (sessions.data ?? []).filter((s) => s.file_path === nbPath);
109
+ if (matching.length === 0) {
110
+ throw new CliError(`no kernel session for ${nbPath}`, EXIT.KERNEL, `one starts automatically on: nebula run ${nbPath} <cell-id>`);
111
+ }
112
+ const session = matching[matching.length - 1];
113
+ if (values.json) {
114
+ printJson(session);
115
+ return EXIT.OK;
116
+ }
117
+ console.log(`session: ${session.id}`);
118
+ console.log(`kernel: ${session.kernel_name}`);
119
+ console.log(`status: ${session.status}`);
120
+ if (session.execution_count !== undefined) {
121
+ console.log(`execution_count: ${session.execution_count}`);
122
+ }
123
+ printHint(`if stuck: nebula kernel interrupt ${nbPath}; for a clean slate: nebula kernel restart ${nbPath}`, values);
124
+ return EXIT.OK;
125
+ }
126
+ async function kernelRestart(client, nbPath, values) {
127
+ // Robust restart (same approach as the MCP kernel_restart tool): shut down
128
+ // any existing session for the file, then start a fresh one.
129
+ const existing = await client.resolveKernelSessionIdForNotebook(nbPath, { createIfMissing: false });
130
+ if (existing.success) {
131
+ const stopped = await client.shutdownKernel(existing.data.sessionId);
132
+ if (!stopped.success && !/not found/i.test(stopped.error ?? '')) {
133
+ throw toCliError(stopped.error, nbPath);
134
+ }
135
+ }
136
+ const started = await client.getOrCreateKernelForFile(nbPath);
137
+ if (!started.success)
138
+ throw toCliError(started.error, nbPath);
139
+ if (values.json) {
140
+ printJson({ restarted: true, sessionId: started.data.sessionId, kernelName: started.data.kernelName });
141
+ return EXIT.OK;
142
+ }
143
+ console.log(`kernel restarted: ${started.data.sessionId} (${started.data.kernelName})`);
144
+ printHint('variables were cleared — re-run setup cells before dependent ones', values);
145
+ return EXIT.OK;
146
+ }
147
+ async function kernelInterrupt(client, nbPath, values) {
148
+ const session = await client.resolveKernelSessionIdForNotebook(nbPath, { createIfMissing: false });
149
+ if (!session.success) {
150
+ throw new CliError(`no kernel session for ${nbPath}`, EXIT.KERNEL);
151
+ }
152
+ const result = await client.interruptKernel(session.data.sessionId);
153
+ if (!result.success) {
154
+ const notFound = /not found/i.test(result.error ?? '');
155
+ throw new CliError(result.error ?? 'interrupt failed', notFound ? EXIT.KERNEL : EXIT.ERROR);
156
+ }
157
+ if (values.json) {
158
+ printJson({ interrupted: true, sessionId: session.data.sessionId });
159
+ return EXIT.OK;
160
+ }
161
+ console.log('kernel interrupted');
162
+ printHint(`check state with: nebula kernel status ${nbPath}`, values);
163
+ return EXIT.OK;
164
+ }
165
+ //# sourceMappingURL=kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/cli/kernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `nebula nb …` — notebook cell commands (read / edit / insert / delete / search).
3
+ *
4
+ * Thin wrappers over the shared tool objects in ../tools and NebulaClient
5
+ * operations; all HTTP goes through the same code the MCP server uses.
6
+ */
7
+ export declare function cmdNb(argv: string[]): Promise<number>;
8
+ //# sourceMappingURL=nb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nb.d.ts","sourceRoot":"","sources":["../../src/cli/nb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4CH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC3D"}