more-compute 0.3.0__tar.gz → 0.3.2__tar.gz

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 (110) hide show
  1. {more_compute-0.3.0/more_compute.egg-info → more_compute-0.3.2}/PKG-INFO +1 -1
  2. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/app/globals.css +1 -0
  3. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/cell/MonacoCell.tsx +31 -31
  4. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/FilterPopup.tsx +24 -24
  5. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/PackagesPopup.tsx +19 -8
  6. {more_compute-0.3.0 → more_compute-0.3.2}/kernel_run.py +26 -13
  7. {more_compute-0.3.0 → more_compute-0.3.2/more_compute.egg-info}/PKG-INFO +1 -1
  8. more_compute-0.3.2/morecompute/__version__.py +1 -0
  9. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/execution/worker.py +8 -1
  10. more_compute-0.3.0/morecompute/__version__.py +0 -1
  11. {more_compute-0.3.0 → more_compute-0.3.2}/LICENSE +0 -0
  12. {more_compute-0.3.0 → more_compute-0.3.2}/MANIFEST.in +0 -0
  13. {more_compute-0.3.0 → more_compute-0.3.2}/README.md +0 -0
  14. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/.DS_Store +0 -0
  15. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/.gitignore +0 -0
  16. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/README.md +0 -0
  17. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/__init__.py +0 -0
  18. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/app/favicon.ico +0 -0
  19. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/app/layout.tsx +0 -0
  20. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/app/page.tsx +0 -0
  21. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/Notebook.tsx +0 -0
  22. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/cell/AddCellButton.tsx +0 -0
  23. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/cell/CellButton.tsx +0 -0
  24. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/layout/ConnectionBanner.tsx +0 -0
  25. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/layout/Sidebar.tsx +0 -0
  26. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/modals/ConfirmModal.tsx +0 -0
  27. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/modals/ErrorModal.tsx +0 -0
  28. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/modals/SuccessModal.tsx +0 -0
  29. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/output/CellOutput.tsx +0 -0
  30. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/output/ErrorDisplay.tsx +0 -0
  31. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/output/MarkdownRenderer.tsx +0 -0
  32. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/ComputePopup.tsx +0 -0
  33. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/FolderPopup.tsx +0 -0
  34. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/MetricsPopup.tsx +0 -0
  35. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/components/popups/SettingsPopup.tsx +0 -0
  36. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/contexts/PodWebSocketContext.tsx +0 -0
  37. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/eslint.config.mjs +0 -0
  38. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/api.ts +0 -0
  39. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/monaco-themes.ts +0 -0
  40. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/settings.ts +0 -0
  41. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/themes.json +0 -0
  42. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/websocket-native.ts +0 -0
  43. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/lib/websocket.ts +0 -0
  44. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/next-env.d.ts +0 -0
  45. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/next.config.mjs +0 -0
  46. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/next.config.ts +0 -0
  47. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/package-lock.json +0 -0
  48. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/package.json +0 -0
  49. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/postcss.config.mjs +0 -0
  50. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/add.svg +0 -0
  51. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/check.svg +0 -0
  52. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/copy.svg +0 -0
  53. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/folder.svg +0 -0
  54. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/metric.svg +0 -0
  55. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/packages.svg +0 -0
  56. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/play.svg +0 -0
  57. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/python.svg +0 -0
  58. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/setting.svg +0 -0
  59. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/stop.svg +0 -0
  60. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/trash.svg +0 -0
  61. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/up-down.svg +0 -0
  62. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/assets/icons/x.svg +0 -0
  63. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/file.svg +0 -0
  64. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/fonts/Fira.ttf +0 -0
  65. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/fonts/Tiempos.woff2 +0 -0
  66. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/fonts/VeraMono.ttf +0 -0
  67. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/globe.svg +0 -0
  68. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/next.svg +0 -0
  69. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/vercel.svg +0 -0
  70. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/public/window.svg +0 -0
  71. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/styling_README.md +0 -0
  72. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/tailwind.config.ts +0 -0
  73. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/tsconfig.json +0 -0
  74. {more_compute-0.3.0 → more_compute-0.3.2}/frontend/types/notebook.ts +0 -0
  75. {more_compute-0.3.0 → more_compute-0.3.2}/more_compute.egg-info/SOURCES.txt +0 -0
  76. {more_compute-0.3.0 → more_compute-0.3.2}/more_compute.egg-info/dependency_links.txt +0 -0
  77. {more_compute-0.3.0 → more_compute-0.3.2}/more_compute.egg-info/entry_points.txt +0 -0
  78. {more_compute-0.3.0 → more_compute-0.3.2}/more_compute.egg-info/requires.txt +0 -0
  79. {more_compute-0.3.0 → more_compute-0.3.2}/more_compute.egg-info/top_level.txt +0 -0
  80. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/__init__.py +0 -0
  81. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/cli.py +0 -0
  82. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/execution/__init__.py +0 -0
  83. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/execution/__main__.py +0 -0
  84. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/execution/executor.py +0 -0
  85. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/models/__init__.py +0 -0
  86. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/models/api_models.py +0 -0
  87. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/notebook.py +0 -0
  88. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/process_worker.py +0 -0
  89. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/server.py +0 -0
  90. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/services/data_manager.py +0 -0
  91. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/services/lsp_service.py +0 -0
  92. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/services/pod_manager.py +0 -0
  93. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/services/pod_monitor.py +0 -0
  94. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/services/prime_intellect.py +0 -0
  95. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/static/styles.css +0 -0
  96. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/__init__.py +0 -0
  97. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/cache_util.py +0 -0
  98. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/cell_magics.py +0 -0
  99. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/config_util.py +0 -0
  100. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/error_utils.py +0 -0
  101. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/line_magics.py +0 -0
  102. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/notebook_util.py +0 -0
  103. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/python_environment_util.py +0 -0
  104. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/shell_utils.py +0 -0
  105. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/special_commands.py +0 -0
  106. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/system_environment_util.py +0 -0
  107. {more_compute-0.3.0 → more_compute-0.3.2}/morecompute/utils/zmq_util.py +0 -0
  108. {more_compute-0.3.0 → more_compute-0.3.2}/pyproject.toml +0 -0
  109. {more_compute-0.3.0 → more_compute-0.3.2}/setup.cfg +0 -0
  110. {more_compute-0.3.0 → more_compute-0.3.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: more-compute
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: An interactive notebook environment for local and GPU computing
5
5
  Home-page: https://github.com/DannyMang/MORECOMPUTE
6
6
  Author: MoreCompute Team
@@ -480,6 +480,7 @@ body {
480
480
 
481
481
  .cell:hover {
482
482
  box-shadow: 2px 4px 0 var(--mc-secondary-hover);
483
+ z-index: 11; /* Ensure hovered cell appears above add-cell-line (z-index: 10) */
483
484
  }
484
485
 
485
486
  .cell.active {
@@ -580,9 +580,9 @@ export const MonacoCell: React.FC<CellProps> = ({
580
580
  data-cell-index={index}
581
581
  >
582
582
  {/* Hover Controls */}
583
- {!isMarkdownWithContent && (
584
- <div className="cell-hover-controls">
585
- <div className="cell-actions-right">
583
+ <div className="cell-hover-controls">
584
+ <div className="cell-actions-right">
585
+ {!isMarkdownWithContent && (
586
586
  <CellButton
587
587
  icon={<PlayIcon className="w-6 h-6" />}
588
588
  onClick={(e) => {
@@ -592,35 +592,35 @@ export const MonacoCell: React.FC<CellProps> = ({
592
592
  title={isExecuting ? "Stop execution" : "Run cell"}
593
593
  isLoading={isExecuting}
594
594
  />
595
- <CellButton
596
- icon={<ChevronUpIcon className="w-6 h-6" />}
597
- onClick={(e) => {
598
- e.stopPropagation();
599
- onMoveUp(indexRef.current);
600
- }}
601
- title="Move cell up"
602
- disabled={index === 0}
603
- />
604
- <CellButton
605
- icon={<ChevronDownIcon className="w-6 h-6" />}
606
- onClick={(e) => {
607
- e.stopPropagation();
608
- onMoveDown(indexRef.current);
609
- }}
610
- title="Move cell down"
611
- disabled={index === totalCells - 1}
612
- />
613
- <CellButton
614
- icon={<LinkBreak2Icon className="w-5 h-5" />}
615
- onClick={(e) => {
616
- e.stopPropagation();
617
- onDelete(indexRef.current);
618
- }}
619
- title="Delete cell"
620
- />
621
- </div>
595
+ )}
596
+ <CellButton
597
+ icon={<ChevronUpIcon className="w-6 h-6" />}
598
+ onClick={(e) => {
599
+ e.stopPropagation();
600
+ onMoveUp(indexRef.current);
601
+ }}
602
+ title="Move cell up"
603
+ disabled={index === 0}
604
+ />
605
+ <CellButton
606
+ icon={<ChevronDownIcon className="w-6 h-6" />}
607
+ onClick={(e) => {
608
+ e.stopPropagation();
609
+ onMoveDown(indexRef.current);
610
+ }}
611
+ title="Move cell down"
612
+ disabled={index === totalCells - 1}
613
+ />
614
+ <CellButton
615
+ icon={<LinkBreak2Icon className="w-5 h-5" />}
616
+ onClick={(e) => {
617
+ e.stopPropagation();
618
+ onDelete(indexRef.current);
619
+ }}
620
+ title="Delete cell"
621
+ />
622
622
  </div>
623
- )}
623
+ </div>
624
624
 
625
625
  {/* Cell Content */}
626
626
  <div
@@ -84,8 +84,8 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
84
84
  top: "50%",
85
85
  left: "50%",
86
86
  transform: "translate(-50%, -50%)",
87
- backgroundColor: "white",
88
- border: "1px solid #d1d5db",
87
+ backgroundColor: "var(--mc-cell-background)",
88
+ border: "1px solid var(--mc-border)",
89
89
  borderRadius: "8px",
90
90
  padding: "16px",
91
91
  width: "320px",
@@ -110,7 +110,7 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
110
110
  fontSize: "14px",
111
111
  fontWeight: 600,
112
112
  margin: 0,
113
- color: "#111827",
113
+ color: "var(--mc-text-color)",
114
114
  }}
115
115
  >
116
116
  Filter
@@ -119,7 +119,7 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
119
119
  onClick={handleClearAll}
120
120
  style={{
121
121
  fontSize: "11px",
122
- color: "#3b82f6",
122
+ color: "var(--mc-primary)",
123
123
  background: "none",
124
124
  border: "none",
125
125
  cursor: "pointer",
@@ -142,9 +142,9 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
142
142
  width: "100%",
143
143
  padding: "8px 10px",
144
144
  borderRadius: "6px",
145
- border: "1px solid #d1d5db",
146
- backgroundColor: "white",
147
- color: "#111827",
145
+ border: "1px solid var(--mc-border)",
146
+ backgroundColor: "var(--mc-input-background)",
147
+ color: "var(--mc-text-color)",
148
148
  fontSize: "12px",
149
149
  marginBottom: "12px",
150
150
  cursor: "pointer",
@@ -166,9 +166,9 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
166
166
  width: "100%",
167
167
  padding: "8px 10px",
168
168
  borderRadius: "6px",
169
- border: "1px solid #d1d5db",
170
- backgroundColor: "white",
171
- color: "#111827",
169
+ border: "1px solid var(--mc-border)",
170
+ backgroundColor: "var(--mc-input-background)",
171
+ color: "var(--mc-text-color)",
172
172
  fontSize: "12px",
173
173
  marginBottom: "12px",
174
174
  boxSizing: "border-box",
@@ -182,7 +182,7 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
182
182
  overflowY: "auto",
183
183
  marginBottom: "16px",
184
184
  maxHeight: "240px",
185
- border: "1px solid #e5e7eb",
185
+ border: "1px solid var(--mc-border)",
186
186
  borderRadius: "6px",
187
187
  padding: "4px",
188
188
  }}
@@ -200,12 +200,12 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
200
200
  padding: "8px 6px",
201
201
  cursor: "pointer",
202
202
  fontSize: "12px",
203
- color: "#374151",
203
+ color: "var(--mc-text-color)",
204
204
  borderRadius: "4px",
205
205
  transition: "background-color 0.15s",
206
206
  }}
207
207
  onMouseEnter={(e) =>
208
- (e.currentTarget.style.backgroundColor = "#f3f4f6")
208
+ (e.currentTarget.style.backgroundColor = "var(--mc-secondary)")
209
209
  }
210
210
  onMouseLeave={(e) =>
211
211
  (e.currentTarget.style.backgroundColor = "transparent")
@@ -249,12 +249,12 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
249
249
  padding: "8px 6px",
250
250
  cursor: "pointer",
251
251
  fontSize: "12px",
252
- color: "#374151",
252
+ color: "var(--mc-text-color)",
253
253
  borderRadius: "4px",
254
254
  transition: "background-color 0.15s",
255
255
  }}
256
256
  onMouseEnter={(e) =>
257
- (e.currentTarget.style.backgroundColor = "#f3f4f6")
257
+ (e.currentTarget.style.backgroundColor = "var(--mc-secondary)")
258
258
  }
259
259
  onMouseLeave={(e) =>
260
260
  (e.currentTarget.style.backgroundColor = "transparent")
@@ -303,12 +303,12 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
303
303
  padding: "8px 6px",
304
304
  cursor: "pointer",
305
305
  fontSize: "12px",
306
- color: "#374151",
306
+ color: "var(--mc-text-color)",
307
307
  borderRadius: "4px",
308
308
  transition: "background-color 0.15s",
309
309
  }}
310
310
  onMouseEnter={(e) =>
311
- (e.currentTarget.style.backgroundColor = "#f3f4f6")
311
+ (e.currentTarget.style.backgroundColor = "var(--mc-secondary)")
312
312
  }
313
313
  onMouseLeave={(e) =>
314
314
  (e.currentTarget.style.backgroundColor = "transparent")
@@ -352,12 +352,12 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
352
352
  padding: "8px 6px",
353
353
  cursor: "pointer",
354
354
  fontSize: "12px",
355
- color: "#374151",
355
+ color: "var(--mc-text-color)",
356
356
  borderRadius: "4px",
357
357
  transition: "background-color 0.15s",
358
358
  }}
359
359
  onMouseEnter={(e) =>
360
- (e.currentTarget.style.backgroundColor = "#f3f4f6")
360
+ (e.currentTarget.style.backgroundColor = "var(--mc-secondary)")
361
361
  }
362
362
  onMouseLeave={(e) =>
363
363
  (e.currentTarget.style.backgroundColor = "transparent")
@@ -390,9 +390,9 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
390
390
  padding: "8px 16px",
391
391
  fontSize: "12px",
392
392
  borderRadius: "6px",
393
- border: "1px solid #d1d5db",
394
- backgroundColor: "white",
395
- color: "#374151",
393
+ border: "1px solid var(--mc-border)",
394
+ backgroundColor: "var(--mc-secondary)",
395
+ color: "var(--mc-text-color)",
396
396
  cursor: "pointer",
397
397
  fontWeight: 500,
398
398
  }}
@@ -410,8 +410,8 @@ const FilterPopup: React.FC<FilterPopupProps> = ({
410
410
  fontSize: "12px",
411
411
  borderRadius: "6px",
412
412
  border: "none",
413
- backgroundColor: "#3b82f6",
414
- color: "white",
413
+ backgroundColor: "var(--mc-primary)",
414
+ color: "var(--mc-button-foreground)",
415
415
  cursor: "pointer",
416
416
  fontWeight: 500,
417
417
  }}
@@ -70,9 +70,6 @@ const PackagesPopup: React.FC<PackagesPopupProps> = ({ onClose }) => {
70
70
  return packages.filter(p => p.name.toLowerCase().includes(q));
71
71
  }, [packages, query]);
72
72
 
73
- if (loading) return <div className="packages-list">Loading...</div>;
74
- if (error) return <div className="packages-list">{error}</div>;
75
-
76
73
  return (
77
74
  <div className="packages-container">
78
75
  <div className="packages-toolbar">
@@ -98,12 +95,26 @@ const PackagesPopup: React.FC<PackagesPopupProps> = ({ onClose }) => {
98
95
  <div className="col-version">Version</div>
99
96
  </div>
100
97
  <div className="packages-list">
101
- {filtered.map((pkg) => (
102
- <div key={`${pkg.name}@${pkg.version}`} className="package-row">
103
- <div className="col-name package-name">{pkg.name}</div>
104
- <div className="col-version package-version">{pkg.version}</div>
98
+ {loading ? (
99
+ <div style={{ padding: '20px', textAlign: 'center', color: 'var(--mc-text-color)' }}>
100
+ Loading packages...
101
+ </div>
102
+ ) : error ? (
103
+ <div style={{ padding: '20px', textAlign: 'center', color: '#dc2626' }}>
104
+ {error}
105
+ </div>
106
+ ) : filtered.length === 0 ? (
107
+ <div style={{ padding: '20px', textAlign: 'center', color: 'var(--mc-text-color)', opacity: 0.6 }}>
108
+ {query ? 'No packages found' : 'No packages installed'}
105
109
  </div>
106
- ))}
110
+ ) : (
111
+ filtered.map((pkg) => (
112
+ <div key={`${pkg.name}@${pkg.version}`} className="package-row">
113
+ <div className="col-name package-name">{pkg.name}</div>
114
+ <div className="col-version package-version">{pkg.version}</div>
115
+ </div>
116
+ ))
117
+ )}
107
118
  </div>
108
119
  </div>
109
120
  </div>
@@ -24,6 +24,7 @@ class NotebookLauncher:
24
24
  self.debug = debug
25
25
  self.notebook_path = notebook_path
26
26
  self.is_windows = platform.system() == "Windows"
27
+ self.cleaning_up = False # Flag to prevent multiple cleanup calls
27
28
  root_dir = notebook_path.parent if notebook_path.parent != Path('') else Path.cwd()
28
29
  os.environ["MORECOMPUTE_ROOT"] = str(root_dir.resolve())
29
30
  os.environ["MORECOMPUTE_NOTEBOOK_PATH"] = str(self.notebook_path)
@@ -262,8 +263,14 @@ class NotebookLauncher:
262
263
  self.cleanup()
263
264
  sys.exit(1)
264
265
 
265
- def cleanup(self):
266
+ def cleanup(self, force=False):
266
267
  """Clean up processes on exit"""
268
+ if self.cleaning_up:
269
+ return # Already cleaning up, don't run again
270
+ self.cleaning_up = True
271
+
272
+ timeout = 0.5 if force else 2 # Shorter timeout on force exit
273
+
267
274
  if self.frontend_process:
268
275
  try:
269
276
  if self.is_windows:
@@ -274,11 +281,14 @@ class NotebookLauncher:
274
281
  stderr=subprocess.DEVNULL
275
282
  )
276
283
  else:
277
- self.frontend_process.terminate()
278
- try:
279
- self.frontend_process.wait(timeout=5)
280
- except subprocess.TimeoutExpired:
281
- self.frontend_process.kill()
284
+ if force:
285
+ self.frontend_process.kill() # Force kill immediately
286
+ else:
287
+ self.frontend_process.terminate()
288
+ try:
289
+ self.frontend_process.wait(timeout=timeout)
290
+ except subprocess.TimeoutExpired:
291
+ self.frontend_process.kill()
282
292
  except Exception:
283
293
  pass
284
294
 
@@ -292,11 +302,14 @@ class NotebookLauncher:
292
302
  stderr=subprocess.DEVNULL
293
303
  )
294
304
  else:
295
- self.backend_process.terminate()
296
- try:
297
- self.backend_process.wait(timeout=5)
298
- except subprocess.TimeoutExpired:
299
- self.backend_process.kill()
305
+ if force:
306
+ self.backend_process.kill() # Force kill immediately
307
+ else:
308
+ self.backend_process.terminate()
309
+ try:
310
+ self.backend_process.wait(timeout=timeout)
311
+ except subprocess.TimeoutExpired:
312
+ self.backend_process.kill()
300
313
  except Exception:
301
314
  pass
302
315
 
@@ -316,8 +329,8 @@ class NotebookLauncher:
316
329
  print("[CTRL-C AGAIN TO EXIT]")
317
330
  else:
318
331
  print("\n Thanks for using MoreCompute!\n")
319
- self.cleanup()
320
- sys.exit(0)
332
+ self.cleanup(force=True) # Force immediate cleanup
333
+ os._exit(0) # Hard exit without raising SystemExit
321
334
 
322
335
  # Windows signal handling is different
323
336
  if not self.is_windows:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: more-compute
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: An interactive notebook environment for local and GPU computing
5
5
  Home-page: https://github.com/DannyMang/MORECOMPUTE
6
6
  Author: MoreCompute Team
@@ -0,0 +1 @@
1
+ __version__ = "0.3.2"
@@ -332,7 +332,14 @@ def worker_main():
332
332
  if lines:
333
333
  last = lines[-1].strip()
334
334
  # Skip comments and empty lines
335
- if last and not last.startswith('#'):
335
+ if not last or last.startswith('#'):
336
+ last = None
337
+ # Skip orphaned closing brackets from multi-line expressions
338
+ # e.g., the ')' from: model = func(\n arg1,\n arg2\n)
339
+ elif last.lstrip().startswith(')') or last.lstrip().startswith('}') or last.lstrip().startswith(']'):
340
+ last = None
341
+
342
+ if last:
336
343
  # Check if it looks like a statement (assignment, import, etc)
337
344
  is_statement = False
338
345
 
@@ -1 +0,0 @@
1
- __version__ = "0.3.0"
File without changes
File without changes
File without changes
File without changes
File without changes