nebula-notebook 0.1.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 (97) hide show
  1. package/README.md +222 -0
  2. package/bin/nebula-notebook.js +33 -0
  3. package/dist/assets/index-C1h_sArD.css +32 -0
  4. package/dist/assets/index-CDSTBon8.js +658 -0
  5. package/dist/favicon.svg +11 -0
  6. package/dist/index.html +73 -0
  7. package/node-server/dist/app.d.ts +5 -0
  8. package/node-server/dist/app.js +38 -0
  9. package/node-server/dist/auth/auth-middleware.d.ts +24 -0
  10. package/node-server/dist/auth/auth-middleware.js +276 -0
  11. package/node-server/dist/auth/auth-service.d.ts +84 -0
  12. package/node-server/dist/auth/auth-service.js +265 -0
  13. package/node-server/dist/auth/index.d.ts +3 -0
  14. package/node-server/dist/auth/index.js +8 -0
  15. package/node-server/dist/cluster/client-registration.d.ts +43 -0
  16. package/node-server/dist/cluster/client-registration.js +217 -0
  17. package/node-server/dist/cluster/cluster-secret.d.ts +11 -0
  18. package/node-server/dist/cluster/cluster-secret.js +90 -0
  19. package/node-server/dist/cluster/kernel-proxy.d.ts +100 -0
  20. package/node-server/dist/cluster/kernel-proxy.js +361 -0
  21. package/node-server/dist/cluster/server-registry.d.ts +109 -0
  22. package/node-server/dist/cluster/server-registry.js +217 -0
  23. package/node-server/dist/config/output-limits.d.ts +7 -0
  24. package/node-server/dist/config/output-limits.js +10 -0
  25. package/node-server/dist/discovery/discovery-service.d.ts +198 -0
  26. package/node-server/dist/discovery/discovery-service.js +811 -0
  27. package/node-server/dist/discovery/index.d.ts +5 -0
  28. package/node-server/dist/discovery/index.js +21 -0
  29. package/node-server/dist/discovery/types.d.ts +48 -0
  30. package/node-server/dist/discovery/types.js +24 -0
  31. package/node-server/dist/fs/fs-service.d.ts +218 -0
  32. package/node-server/dist/fs/fs-service.js +1422 -0
  33. package/node-server/dist/fs/index.d.ts +5 -0
  34. package/node-server/dist/fs/index.js +21 -0
  35. package/node-server/dist/fs/types.d.ts +132 -0
  36. package/node-server/dist/fs/types.js +5 -0
  37. package/node-server/dist/index.d.ts +13 -0
  38. package/node-server/dist/index.js +556 -0
  39. package/node-server/dist/kernel/default-kernel.d.ts +5 -0
  40. package/node-server/dist/kernel/default-kernel.js +138 -0
  41. package/node-server/dist/kernel/index.d.ts +7 -0
  42. package/node-server/dist/kernel/index.js +23 -0
  43. package/node-server/dist/kernel/kernel-service.d.ts +290 -0
  44. package/node-server/dist/kernel/kernel-service.js +1714 -0
  45. package/node-server/dist/kernel/kernelspec.d.ts +29 -0
  46. package/node-server/dist/kernel/kernelspec.js +210 -0
  47. package/node-server/dist/kernel/session-store.d.ts +87 -0
  48. package/node-server/dist/kernel/session-store.js +303 -0
  49. package/node-server/dist/kernel/types.d.ts +143 -0
  50. package/node-server/dist/kernel/types.js +17 -0
  51. package/node-server/dist/llm/index.d.ts +5 -0
  52. package/node-server/dist/llm/index.js +21 -0
  53. package/node-server/dist/llm/llm-service.d.ts +77 -0
  54. package/node-server/dist/llm/llm-service.js +454 -0
  55. package/node-server/dist/llm/types.d.ts +40 -0
  56. package/node-server/dist/llm/types.js +15 -0
  57. package/node-server/dist/notebook/cell-metadata.d.ts +27 -0
  58. package/node-server/dist/notebook/cell-metadata.js +76 -0
  59. package/node-server/dist/notebook/headless-handler.d.ts +127 -0
  60. package/node-server/dist/notebook/headless-handler.js +1530 -0
  61. package/node-server/dist/notebook/notebook-websocket.d.ts +12 -0
  62. package/node-server/dist/notebook/notebook-websocket.js +103 -0
  63. package/node-server/dist/notebook/operation-router.d.ts +115 -0
  64. package/node-server/dist/notebook/operation-router.js +641 -0
  65. package/node-server/dist/notebook/undoRedoManager.d.ts +194 -0
  66. package/node-server/dist/notebook/undoRedoManager.js +558 -0
  67. package/node-server/dist/output/display-data.d.ts +14 -0
  68. package/node-server/dist/output/display-data.js +134 -0
  69. package/node-server/dist/resources/resource-service.d.ts +69 -0
  70. package/node-server/dist/resources/resource-service.js +363 -0
  71. package/node-server/dist/routes/auth.d.ts +5 -0
  72. package/node-server/dist/routes/auth.js +61 -0
  73. package/node-server/dist/routes/cluster.d.ts +7 -0
  74. package/node-server/dist/routes/cluster.js +94 -0
  75. package/node-server/dist/routes/fs.d.ts +7 -0
  76. package/node-server/dist/routes/fs.js +392 -0
  77. package/node-server/dist/routes/kernel.d.ts +13 -0
  78. package/node-server/dist/routes/kernel.js +637 -0
  79. package/node-server/dist/routes/llm.d.ts +8 -0
  80. package/node-server/dist/routes/llm.js +105 -0
  81. package/node-server/dist/routes/notebook.d.ts +10 -0
  82. package/node-server/dist/routes/notebook.js +335 -0
  83. package/node-server/dist/routes/python.d.ts +8 -0
  84. package/node-server/dist/routes/python.js +187 -0
  85. package/node-server/dist/routes/resources.d.ts +7 -0
  86. package/node-server/dist/routes/resources.js +77 -0
  87. package/node-server/dist/scripts/show-auth-qr.d.ts +1 -0
  88. package/node-server/dist/scripts/show-auth-qr.js +81 -0
  89. package/node-server/dist/terminal/pty-manager.d.ts +100 -0
  90. package/node-server/dist/terminal/pty-manager.js +246 -0
  91. package/node-server/dist/terminal/server.d.ts +19 -0
  92. package/node-server/dist/terminal/server.js +254 -0
  93. package/node-server/dist/terminal/types.d.ts +50 -0
  94. package/node-server/dist/terminal/types.js +9 -0
  95. package/node-server/package.json +45 -0
  96. package/package.json +99 -0
  97. package/scripts/postinstall.cjs +26 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Python Discovery Service Module
3
+ */
4
+ export * from './types';
5
+ export * from './discovery-service';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Python Discovery Service Module
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./types"), exports);
21
+ __exportStar(require("./discovery-service"), exports);
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Python Discovery Service Types
3
+ */
4
+ export type PythonEnvType = 'system' | 'conda' | 'pyenv' | 'venv' | 'homebrew' | 'uv' | 'pixi';
5
+ export interface PythonEnvironment {
6
+ path: string;
7
+ version: string;
8
+ displayName: string;
9
+ envType: PythonEnvType;
10
+ envName: string | null;
11
+ hasIpykernel: boolean;
12
+ kernelName: string | null;
13
+ externallyManaged: boolean;
14
+ installHint: string | null;
15
+ }
16
+ export interface DiscoveryCandidate {
17
+ path: string;
18
+ envType: PythonEnvType;
19
+ envName: string | null;
20
+ base?: string;
21
+ }
22
+ export interface CacheData {
23
+ environments: Record<string, PythonEnvironment>;
24
+ timestamp: number;
25
+ }
26
+ export interface InstallKernelResult {
27
+ kernelName: string;
28
+ pythonPath: string;
29
+ message: string;
30
+ }
31
+ export type KernelProvisionErrorCode = 'python_not_found' | 'externally_managed' | 'needs_ipykernel' | 'install_failed' | 'register_failed';
32
+ export declare class KernelProvisionError extends Error {
33
+ code: KernelProvisionErrorCode;
34
+ installHint?: string;
35
+ constructor(message: string, code: KernelProvisionErrorCode, installHint?: string);
36
+ }
37
+ export interface CacheInfo {
38
+ cachedCount: number;
39
+ cacheAgeHours: number | null;
40
+ cacheValid: boolean;
41
+ cacheFile: string;
42
+ }
43
+ export declare const DEFAULT_CACHE_TTL_HOURS = 24;
44
+ export declare const DEFAULT_VERSION_CHECK_TIMEOUT_MS = 5000;
45
+ export declare const DEFAULT_IPYKERNEL_CHECK_TIMEOUT_MS = 10000;
46
+ export declare const DEFAULT_CONDA_LIST_TIMEOUT_MS = 30000;
47
+ export declare const DEFAULT_KERNEL_INSTALL_TIMEOUT_MS = 120000;
48
+ export declare const DEFAULT_REGISTRATION_TIMEOUT_MS = 60000;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Python Discovery Service Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_REGISTRATION_TIMEOUT_MS = exports.DEFAULT_KERNEL_INSTALL_TIMEOUT_MS = exports.DEFAULT_CONDA_LIST_TIMEOUT_MS = exports.DEFAULT_IPYKERNEL_CHECK_TIMEOUT_MS = exports.DEFAULT_VERSION_CHECK_TIMEOUT_MS = exports.DEFAULT_CACHE_TTL_HOURS = exports.KernelProvisionError = void 0;
7
+ class KernelProvisionError extends Error {
8
+ code;
9
+ installHint;
10
+ constructor(message, code, installHint) {
11
+ super(message);
12
+ this.name = 'KernelProvisionError';
13
+ this.code = code;
14
+ this.installHint = installHint;
15
+ }
16
+ }
17
+ exports.KernelProvisionError = KernelProvisionError;
18
+ // Configuration defaults
19
+ exports.DEFAULT_CACHE_TTL_HOURS = 24;
20
+ exports.DEFAULT_VERSION_CHECK_TIMEOUT_MS = 5000;
21
+ exports.DEFAULT_IPYKERNEL_CHECK_TIMEOUT_MS = 10000;
22
+ exports.DEFAULT_CONDA_LIST_TIMEOUT_MS = 30000;
23
+ exports.DEFAULT_KERNEL_INSTALL_TIMEOUT_MS = 120000;
24
+ exports.DEFAULT_REGISTRATION_TIMEOUT_MS = 60000;
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Filesystem Service - Real filesystem operations
3
+ *
4
+ * Node.js port of the Python FilesystemService.
5
+ */
6
+ import { FileInfo, FileInfoResponse, FileType, DirectoryListing, MtimeResponse, ReadFileResponse, NebulaCell, NotebookCellsResponse, SaveNotebookResult } from './types';
7
+ export interface AgentPermissionSnapshot {
8
+ agent_created: boolean;
9
+ agent_permitted: boolean;
10
+ has_history: boolean;
11
+ can_agent_modify: boolean;
12
+ reason: string;
13
+ }
14
+ export declare class FilesystemService {
15
+ private writeLocks;
16
+ private defaultRoot;
17
+ constructor(defaultRoot?: string);
18
+ /**
19
+ * Get the server root directory.
20
+ */
21
+ getRootDirectory(): string;
22
+ /**
23
+ * Set the server root directory and persist it.
24
+ */
25
+ setRootDirectory(rootDirectory: string, options?: {
26
+ persist?: boolean;
27
+ }): string;
28
+ private expandRootDirectory;
29
+ private saveRootDirectory;
30
+ /**
31
+ * Normalize and expand path
32
+ */
33
+ normalizePath(filePath: string): string;
34
+ /**
35
+ * Serialize write operations per notebook to avoid interleaving writes.
36
+ */
37
+ private withWriteLock;
38
+ /**
39
+ * Atomically write a file (write temp, fsync, rename, fsync dir).
40
+ * Prevents partial/corrupt files on interruption.
41
+ */
42
+ private atomicWriteFileSync;
43
+ private writeJsonAtomicSync;
44
+ /**
45
+ * Format file size for display
46
+ */
47
+ formatSize(size: number): string;
48
+ /**
49
+ * Determine file type from extension
50
+ */
51
+ getFileType(extension: string): FileType;
52
+ /**
53
+ * Get file info for a path
54
+ */
55
+ private getFileInfo;
56
+ /**
57
+ * Convert FileInfo to FileInfoResponse for API
58
+ */
59
+ private toFileInfoResponse;
60
+ /**
61
+ * Get directory modification time (lightweight check for changes)
62
+ */
63
+ getDirectoryMtime(dirPath: string): MtimeResponse;
64
+ /**
65
+ * Get file modification time
66
+ */
67
+ getFileMtime(filePath: string): MtimeResponse;
68
+ /**
69
+ * List contents of a directory
70
+ */
71
+ listDirectory(dirPath: string): DirectoryListing;
72
+ /**
73
+ * Read a file's contents
74
+ */
75
+ readFile(filePath: string): ReadFileResponse;
76
+ /**
77
+ * Write content to a file
78
+ */
79
+ writeFile(filePath: string, content: unknown, fileType?: 'text' | 'notebook'): boolean;
80
+ /**
81
+ * Create a new file or directory
82
+ */
83
+ createFile(filePath: string, isDirectory?: boolean): FileInfo & {
84
+ is_directory: boolean;
85
+ };
86
+ /**
87
+ * Get the history file path for a notebook
88
+ */
89
+ private getHistoryPath;
90
+ /**
91
+ * Get the session state file path for a notebook
92
+ */
93
+ private getSessionPath;
94
+ /**
95
+ * Get the journal file path for a notebook (used for crash-safe commits)
96
+ */
97
+ private getJournalPath;
98
+ private readJournal;
99
+ private hasPendingCommit;
100
+ private getNebulaPaths;
101
+ /**
102
+ * Delete notebook-related metadata files (history, session)
103
+ */
104
+ private deleteNotebookMetadata;
105
+ /**
106
+ * Delete a file or directory
107
+ */
108
+ deleteFile(filePath: string): boolean;
109
+ /**
110
+ * Rename notebook-related metadata files
111
+ */
112
+ private renameNotebookMetadata;
113
+ /**
114
+ * Rename/move a file or directory
115
+ */
116
+ renameFile(oldPath: string, newPath: string): FileInfo;
117
+ /**
118
+ * Duplicate notebook-related metadata files
119
+ */
120
+ private duplicateNotebookMetadata;
121
+ /**
122
+ * Recursively copy a directory
123
+ */
124
+ private copyDirectoryRecursive;
125
+ /**
126
+ * Duplicate a file or directory with _copy suffix
127
+ */
128
+ duplicateFile(filePath: string): FileInfoResponse;
129
+ /**
130
+ * Upload a file to a directory
131
+ */
132
+ uploadFile(destDir: string, tempFilePath: string, originalName: string): Promise<FileInfoResponse>;
133
+ /**
134
+ * Convert Jupyter source to string
135
+ */
136
+ private sourceToString;
137
+ /**
138
+ * Convert string to Jupyter source format (array of lines)
139
+ */
140
+ private stringToSource;
141
+ /**
142
+ * Convert Jupyter outputs to Nebula format
143
+ */
144
+ private convertOutputs;
145
+ /**
146
+ * Convert Nebula outputs back to Jupyter format
147
+ */
148
+ private convertOutputsToJupyter;
149
+ /**
150
+ * Read a notebook and convert to internal cell format
151
+ */
152
+ getNotebookCells(notebookPath: string): NotebookCellsResponse;
153
+ /**
154
+ * Read a notebook and convert to internal cell format, resolving default kernel if needed
155
+ */
156
+ getNotebookCellsWithKernel(notebookPath: string): Promise<NotebookCellsResponse>;
157
+ /**
158
+ * Save cells to a notebook file
159
+ */
160
+ saveNotebookCells(notebookPath: string, cells: NebulaCell[], kernelName?: string, notebookMetadata?: Record<string, unknown>): SaveNotebookResult;
161
+ /**
162
+ * Save notebook cells and history in a single crash-safe commit.
163
+ * Uses a small journal + atomic writes to avoid partial files.
164
+ */
165
+ saveNotebookBundle(notebookPath: string, cells: NebulaCell[], kernelName?: string, history?: unknown[], session?: Record<string, unknown>, notebookMetadata?: Record<string, unknown>): Promise<SaveNotebookResult>;
166
+ /**
167
+ * Get notebook-level metadata
168
+ */
169
+ getNotebookMetadata(notebookPath: string): Record<string, unknown>;
170
+ /**
171
+ * Update notebook-level metadata without modifying cells
172
+ */
173
+ updateNotebookMetadata(notebookPath: string, metadataUpdates: Record<string, unknown>): Promise<{
174
+ success: boolean;
175
+ changed?: boolean;
176
+ mtime?: number;
177
+ error?: string;
178
+ }>;
179
+ private stripOutputsForHistorySnapshot;
180
+ private buildInitialHistory;
181
+ /**
182
+ * Set agent permission and ensure newly-permitted notebooks are immediately editable.
183
+ */
184
+ setAgentPermission(notebookPath: string, permitted: boolean): Promise<{
185
+ success: boolean;
186
+ error?: string;
187
+ status?: AgentPermissionSnapshot;
188
+ }>;
189
+ /**
190
+ * Derive agent permission status from persisted notebook metadata.
191
+ */
192
+ getAgentPermissionStatus(notebookPath: string): AgentPermissionSnapshot;
193
+ /**
194
+ * Check if a notebook is permitted for agent modifications
195
+ */
196
+ isAgentPermitted(notebookPath: string): boolean;
197
+ /**
198
+ * Check if a notebook has history tracking enabled
199
+ */
200
+ hasHistory(notebookPath: string): boolean;
201
+ /**
202
+ * Save operation history for a notebook
203
+ */
204
+ saveHistory(notebookPath: string, history: unknown[]): Promise<boolean>;
205
+ /**
206
+ * Load operation history for a notebook
207
+ */
208
+ loadHistory(notebookPath: string): unknown[];
209
+ /**
210
+ * Save session state for a notebook
211
+ */
212
+ saveSession(notebookPath: string, session: Record<string, unknown>): Promise<boolean>;
213
+ /**
214
+ * Load session state for a notebook
215
+ */
216
+ loadSession(notebookPath: string): Record<string, unknown>;
217
+ }
218
+ export declare const fsService: FilesystemService;