pynect 0.0.0 → 0.2.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 (191) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +503 -2
  3. package/SECURITY.md +34 -0
  4. package/binding.gyp +67 -0
  5. package/dist/cli/codegen.d.ts +3 -0
  6. package/dist/cli/codegen.d.ts.map +1 -0
  7. package/dist/cli/codegen.js +543 -0
  8. package/dist/cli/codegen.js.map +1 -0
  9. package/dist/cli/sync.d.ts +3 -0
  10. package/dist/cli/sync.d.ts.map +1 -0
  11. package/dist/cli/sync.js +47 -0
  12. package/dist/cli/sync.js.map +1 -0
  13. package/dist/config/project.d.ts +113 -0
  14. package/dist/config/project.d.ts.map +1 -0
  15. package/dist/config/project.js +344 -0
  16. package/dist/config/project.js.map +1 -0
  17. package/dist/core/isolated-worker.d.ts +39 -0
  18. package/dist/core/isolated-worker.d.ts.map +1 -0
  19. package/dist/core/isolated-worker.js +178 -0
  20. package/dist/core/isolated-worker.js.map +1 -0
  21. package/dist/core/py-callable.d.ts +67 -0
  22. package/dist/core/py-callable.d.ts.map +1 -0
  23. package/dist/core/py-callable.js +104 -0
  24. package/dist/core/py-callable.js.map +1 -0
  25. package/dist/core/py-context.d.ts +76 -0
  26. package/dist/core/py-context.d.ts.map +1 -0
  27. package/dist/core/py-context.js +239 -0
  28. package/dist/core/py-context.js.map +1 -0
  29. package/dist/core/py-iterator.d.ts +84 -0
  30. package/dist/core/py-iterator.d.ts.map +1 -0
  31. package/dist/core/py-iterator.js +243 -0
  32. package/dist/core/py-iterator.js.map +1 -0
  33. package/dist/core/py-module.d.ts +53 -0
  34. package/dist/core/py-module.d.ts.map +1 -0
  35. package/dist/core/py-module.js +162 -0
  36. package/dist/core/py-module.js.map +1 -0
  37. package/dist/core/py-proxy.d.ts +75 -0
  38. package/dist/core/py-proxy.d.ts.map +1 -0
  39. package/dist/core/py-proxy.js +563 -0
  40. package/dist/core/py-proxy.js.map +1 -0
  41. package/dist/core/py-runtime.d.ts +113 -0
  42. package/dist/core/py-runtime.d.ts.map +1 -0
  43. package/dist/core/py-runtime.js +528 -0
  44. package/dist/core/py-runtime.js.map +1 -0
  45. package/dist/env/executables.d.ts +3 -0
  46. package/dist/env/executables.d.ts.map +1 -0
  47. package/dist/env/executables.js +14 -0
  48. package/dist/env/executables.js.map +1 -0
  49. package/dist/env/package-installer.d.ts +232 -0
  50. package/dist/env/package-installer.d.ts.map +1 -0
  51. package/dist/env/package-installer.js +615 -0
  52. package/dist/env/package-installer.js.map +1 -0
  53. package/dist/env/project-environment.d.ts +64 -0
  54. package/dist/env/project-environment.d.ts.map +1 -0
  55. package/dist/env/project-environment.js +388 -0
  56. package/dist/env/project-environment.js.map +1 -0
  57. package/dist/env/pyfig-adapter.d.ts +38 -0
  58. package/dist/env/pyfig-adapter.d.ts.map +1 -0
  59. package/dist/env/pyfig-adapter.js +10 -0
  60. package/dist/env/pyfig-adapter.js.map +1 -0
  61. package/dist/env/python-detector.d.ts +48 -0
  62. package/dist/env/python-detector.d.ts.map +1 -0
  63. package/dist/env/python-detector.js +182 -0
  64. package/dist/env/python-detector.js.map +1 -0
  65. package/dist/env/python-provisioner.d.ts +16 -0
  66. package/dist/env/python-provisioner.d.ts.map +1 -0
  67. package/dist/env/python-provisioner.js +42 -0
  68. package/dist/env/python-provisioner.js.map +1 -0
  69. package/dist/env/venv-manager.d.ts +56 -0
  70. package/dist/env/venv-manager.d.ts.map +1 -0
  71. package/dist/env/venv-manager.js +160 -0
  72. package/dist/env/venv-manager.js.map +1 -0
  73. package/dist/index.d.ts +182 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +394 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/native/native-addon-loader.d.ts +13 -0
  78. package/dist/native/native-addon-loader.d.ts.map +1 -0
  79. package/dist/native/native-addon-loader.js +171 -0
  80. package/dist/native/native-addon-loader.js.map +1 -0
  81. package/dist/plugins/builtin/numpy-plugin.d.ts +17 -0
  82. package/dist/plugins/builtin/numpy-plugin.d.ts.map +1 -0
  83. package/dist/plugins/builtin/numpy-plugin.js +41 -0
  84. package/dist/plugins/builtin/numpy-plugin.js.map +1 -0
  85. package/dist/plugins/builtin/pandas-plugin.d.ts +19 -0
  86. package/dist/plugins/builtin/pandas-plugin.d.ts.map +1 -0
  87. package/dist/plugins/builtin/pandas-plugin.js +57 -0
  88. package/dist/plugins/builtin/pandas-plugin.js.map +1 -0
  89. package/dist/plugins/builtin/torch-plugin.d.ts +23 -0
  90. package/dist/plugins/builtin/torch-plugin.d.ts.map +1 -0
  91. package/dist/plugins/builtin/torch-plugin.js +50 -0
  92. package/dist/plugins/builtin/torch-plugin.js.map +1 -0
  93. package/dist/plugins/index.d.ts +7 -0
  94. package/dist/plugins/index.d.ts.map +1 -0
  95. package/dist/plugins/index.js +12 -0
  96. package/dist/plugins/index.js.map +1 -0
  97. package/dist/plugins/plugin-manager.d.ts +26 -0
  98. package/dist/plugins/plugin-manager.d.ts.map +1 -0
  99. package/dist/plugins/plugin-manager.js +174 -0
  100. package/dist/plugins/plugin-manager.js.map +1 -0
  101. package/dist/plugins/plugin.interface.d.ts +41 -0
  102. package/dist/plugins/plugin.interface.d.ts.map +1 -0
  103. package/dist/plugins/plugin.interface.js +12 -0
  104. package/dist/plugins/plugin.interface.js.map +1 -0
  105. package/dist/serialization/data-frame-bridge.d.ts +141 -0
  106. package/dist/serialization/data-frame-bridge.d.ts.map +1 -0
  107. package/dist/serialization/data-frame-bridge.js +355 -0
  108. package/dist/serialization/data-frame-bridge.js.map +1 -0
  109. package/dist/serialization/msg-pack-serializer.d.ts +45 -0
  110. package/dist/serialization/msg-pack-serializer.d.ts.map +1 -0
  111. package/dist/serialization/msg-pack-serializer.js +242 -0
  112. package/dist/serialization/msg-pack-serializer.js.map +1 -0
  113. package/dist/serialization/numpy-bridge.d.ts +96 -0
  114. package/dist/serialization/numpy-bridge.d.ts.map +1 -0
  115. package/dist/serialization/numpy-bridge.js +323 -0
  116. package/dist/serialization/numpy-bridge.js.map +1 -0
  117. package/dist/serialization/serializer.d.ts +78 -0
  118. package/dist/serialization/serializer.d.ts.map +1 -0
  119. package/dist/serialization/serializer.js +281 -0
  120. package/dist/serialization/serializer.js.map +1 -0
  121. package/dist/types/addon.d.ts +131 -0
  122. package/dist/types/addon.d.ts.map +1 -0
  123. package/dist/types/addon.js +32 -0
  124. package/dist/types/addon.js.map +1 -0
  125. package/dist/types/config.d.ts +236 -0
  126. package/dist/types/config.d.ts.map +1 -0
  127. package/dist/types/config.js +61 -0
  128. package/dist/types/config.js.map +1 -0
  129. package/dist/types/index.d.ts +10 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +12 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/python.d.ts +235 -0
  134. package/dist/types/python.d.ts.map +1 -0
  135. package/dist/types/python.js +7 -0
  136. package/dist/types/python.js.map +1 -0
  137. package/dist/utils/error-translator.d.ts +83 -0
  138. package/dist/utils/error-translator.d.ts.map +1 -0
  139. package/dist/utils/error-translator.js +210 -0
  140. package/dist/utils/error-translator.js.map +1 -0
  141. package/dist/utils/locking.d.ts +3 -0
  142. package/dist/utils/locking.d.ts.map +1 -0
  143. package/dist/utils/locking.js +10 -0
  144. package/dist/utils/locking.js.map +1 -0
  145. package/dist/utils/logger.d.ts +27 -0
  146. package/dist/utils/logger.d.ts.map +1 -0
  147. package/dist/utils/logger.js +115 -0
  148. package/dist/utils/logger.js.map +1 -0
  149. package/dist/utils/memory-monitor.d.ts +43 -0
  150. package/dist/utils/memory-monitor.d.ts.map +1 -0
  151. package/dist/utils/memory-monitor.js +143 -0
  152. package/dist/utils/memory-monitor.js.map +1 -0
  153. package/package.json +93 -17
  154. package/prebuilds/darwin-arm64/pynect-prebuild.json +8 -0
  155. package/prebuilds/darwin-arm64/pynect_addon.node +0 -0
  156. package/prebuilds/darwin-x64/pynect-prebuild.json +8 -0
  157. package/prebuilds/darwin-x64/pynect_addon.node +0 -0
  158. package/prebuilds/linux-arm64/pynect-prebuild.json +9 -0
  159. package/prebuilds/linux-arm64/pynect_addon.node +0 -0
  160. package/prebuilds/linux-x64/pynect-prebuild.json +9 -0
  161. package/prebuilds/linux-x64/pynect_addon.node +0 -0
  162. package/prebuilds/win32-arm64/pynect-prebuild.json +8 -0
  163. package/prebuilds/win32-arm64/pynect_addon.node +0 -0
  164. package/prebuilds/win32-x64/pynect-prebuild.json +8 -0
  165. package/prebuilds/win32-x64/pynect_addon.node +0 -0
  166. package/python/ast_inspector.py +248 -0
  167. package/python/error_handler.py +432 -0
  168. package/python/isolated_worker.py +94 -0
  169. package/python/pynect_dispatcher.py +382 -0
  170. package/python/pynect_runtime.py +574 -0
  171. package/python/serializer.py +373 -0
  172. package/python/type_inspector.py +315 -0
  173. package/scripts/build-native.js +50 -0
  174. package/scripts/cli.js +21 -0
  175. package/scripts/ensure-native.js +85 -0
  176. package/scripts/postinstall.js +40 -0
  177. package/scripts/pyfig.js +128 -0
  178. package/scripts/python-provisioner.js +23 -0
  179. package/scripts/smoke-python-boundary.js +103 -0
  180. package/src/native/gil_guard.cpp +25 -0
  181. package/src/native/gil_guard.h +174 -0
  182. package/src/native/native-addon-loader.ts +218 -0
  183. package/src/native/pynect_addon.cpp +942 -0
  184. package/src/native/python_bridge.cpp +904 -0
  185. package/src/native/python_bridge.h +263 -0
  186. package/src/native/thread_pool.cpp +375 -0
  187. package/src/native/thread_pool.h +185 -0
  188. package/src/native/type_converter.cpp +906 -0
  189. package/src/native/type_converter.h +271 -0
  190. package/index.d.ts +0 -3
  191. package/index.js +0 -3
@@ -0,0 +1,113 @@
1
+ /**
2
+ * pynect - PyRuntime
3
+ * The central manager for the Python interpreter lifecycle.
4
+ * Creates, configures, and shuts down the embedded CPython instance.
5
+ */
6
+ import type { NativeAddon } from '../types/addon';
7
+ import type { PynectConfig, ResolvedPynectConfig } from '../types/config';
8
+ import { PyModule } from './py-module';
9
+ import { PyContext } from './py-context';
10
+ import { type IsolatedCallOptions } from './isolated-worker';
11
+ /**
12
+ * PyRuntime - manages the lifecycle of the embedded Python interpreter.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const runtime = await PyRuntime.create({
17
+ * project: { dependencies: ['pandas'] },
18
+ * tool: { pynect: { autoSync: 'if-missing' } },
19
+ * });
20
+ *
21
+ * const pd = await runtime.import('pandas');
22
+ * const df = await pd.read_csv('data.csv');
23
+ * const result = await df.to_dict('records');
24
+ *
25
+ * await runtime.shutdown();
26
+ * ```
27
+ */
28
+ export declare class PyRuntime {
29
+ private readonly _config;
30
+ private _pythonExecutable;
31
+ private readonly _pythonLibrary;
32
+ private readonly _addon;
33
+ private readonly _pluginManager;
34
+ private readonly _memoryMonitor;
35
+ private _isolatedWorker?;
36
+ private _running;
37
+ private constructor();
38
+ /**
39
+ * Create and initialize a PyRuntime instance.
40
+ */
41
+ static create(config?: PynectConfig): Promise<PyRuntime>;
42
+ private _initialize;
43
+ private _setupPythonEnvironment;
44
+ private _bootstrapPythonRuntime;
45
+ /**
46
+ * Import a Python module and return a PyProxy.
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const pd = await runtime.import('pandas');
51
+ * const df = await pd.read_csv('data.csv');
52
+ * ```
53
+ */
54
+ import(moduleName: string): Promise<PyModule>;
55
+ /**
56
+ * Import multiple modules at once (concurrent).
57
+ */
58
+ importAll(moduleNames: string[]): Promise<Record<string, PyModule>>;
59
+ /**
60
+ * Call a JSON-compatible Python function in a killable child process.
61
+ * This is a process boundary, not an operating-system sandbox.
62
+ */
63
+ callIsolated<T = unknown>(moduleName: string, functionName: string, args?: unknown[], options?: IsolatedCallOptions): Promise<T>;
64
+ /**
65
+ * Evaluate a Python expression.
66
+ */
67
+ eval(expression: string): Promise<unknown>;
68
+ /**
69
+ * Execute Python statements.
70
+ */
71
+ exec(code: string): Promise<void>;
72
+ /**
73
+ * Run a Python script file.
74
+ */
75
+ runFile(filePath: string): Promise<unknown>;
76
+ /**
77
+ * Create an isolated Python execution context.
78
+ */
79
+ createContext(): Promise<PyContext>;
80
+ /**
81
+ * Install Python packages into the active environment.
82
+ */
83
+ installPackages(packages: string[]): Promise<void>;
84
+ /**
85
+ * Get current memory statistics.
86
+ */
87
+ getMemoryStats(): ReturnType<NativeAddon['getMemoryStats']>;
88
+ /**
89
+ * Trigger Python garbage collection.
90
+ */
91
+ collectGarbage(): Promise<void>;
92
+ /**
93
+ * Get the underlying native addon.
94
+ * Advanced use only.
95
+ */
96
+ getAddon(): NativeAddon;
97
+ isRunning(): boolean;
98
+ getConfig(): ResolvedPynectConfig;
99
+ /**
100
+ * Gracefully shut down the Python runtime.
101
+ * Releases all Python objects and finalizes the interpreter.
102
+ */
103
+ shutdown(): Promise<void>;
104
+ /**
105
+ * Synchronous shutdown (for process.on('exit') handler).
106
+ * Best-effort only - may not complete all cleanup.
107
+ */
108
+ shutdownSync(): void;
109
+ private _ensureRunning;
110
+ private _ensureUnsafeCodeAllowed;
111
+ private _parseBytes;
112
+ }
113
+ //# sourceMappingURL=py-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"py-runtime.d.ts","sourceRoot":"","sources":["../../src/core/py-runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAsB7E;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAgBP;;OAEG;WACU,MAAM,CAAC,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;YAoJpD,WAAW;YA2DX,uBAAuB;YAMvB,uBAAuB;IAkCrC;;;;;;;;OAQG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2CnD;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAOzE;;;OAGG;IACG,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,OAAO,EAAO,EACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,CAAC,CAAC;IAUb;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4ChD;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BjD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAQzC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD;;OAEG;IACH,cAAc,IAAI,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAK3D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC;;;OAGG;IACH,QAAQ,IAAI,WAAW;IAOvB,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,oBAAoB;IAMjC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB/B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAYpB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,528 @@
1
+ "use strict";
2
+ /**
3
+ * pynect - PyRuntime
4
+ * The central manager for the Python interpreter lifecycle.
5
+ * Creates, configures, and shuts down the embedded CPython instance.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.PyRuntime = void 0;
12
+ const path_1 = __importDefault(require("path"));
13
+ const project_1 = require("../config/project");
14
+ const config_1 = require("../types/config");
15
+ const py_proxy_1 = require("./py-proxy");
16
+ const py_module_1 = require("./py-module");
17
+ const py_context_1 = require("./py-context");
18
+ const isolated_worker_1 = require("./isolated-worker");
19
+ const plugin_manager_1 = require("../plugins/plugin-manager");
20
+ const package_installer_1 = require("../env/package-installer");
21
+ const pyfig_adapter_1 = require("../env/pyfig-adapter");
22
+ const project_environment_1 = require("../env/project-environment");
23
+ const native_addon_loader_1 = require("../native/native-addon-loader");
24
+ const memory_monitor_1 = require("../utils/memory-monitor");
25
+ const logger_1 = require("../utils/logger");
26
+ const error_translator_1 = require("../utils/error-translator");
27
+ const logger = new logger_1.Logger('PyRuntime');
28
+ /**
29
+ * PyRuntime - manages the lifecycle of the embedded Python interpreter.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const runtime = await PyRuntime.create({
34
+ * project: { dependencies: ['pandas'] },
35
+ * tool: { pynect: { autoSync: 'if-missing' } },
36
+ * });
37
+ *
38
+ * const pd = await runtime.import('pandas');
39
+ * const df = await pd.read_csv('data.csv');
40
+ * const result = await df.to_dict('records');
41
+ *
42
+ * await runtime.shutdown();
43
+ * ```
44
+ */
45
+ class PyRuntime {
46
+ _config;
47
+ _pythonExecutable;
48
+ _pythonLibrary;
49
+ _addon;
50
+ _pluginManager;
51
+ _memoryMonitor;
52
+ _isolatedWorker;
53
+ _running = false;
54
+ constructor(config, addon, pythonLibrary) {
55
+ this._config = config;
56
+ this._pythonExecutable = config.pythonExecutable;
57
+ this._pythonLibrary = pythonLibrary;
58
+ this._addon = addon;
59
+ this._pluginManager = new plugin_manager_1.PluginManager();
60
+ this._memoryMonitor = new memory_monitor_1.MemoryMonitor({
61
+ gcThreshold: this._parseBytes(config.gcThreshold),
62
+ });
63
+ this._memoryMonitor.attach(addon);
64
+ }
65
+ /**
66
+ * Create and initialize a PyRuntime instance.
67
+ */
68
+ static async create(config = {}) {
69
+ const projectOverrides = {
70
+ ...config,
71
+ projectRoot: config.projectRoot,
72
+ python: config.python ?? config.pythonPath,
73
+ requiresPython: config.requiresPython,
74
+ managedPython: config.managedPython,
75
+ uvVersion: config.uvVersion,
76
+ installPython: config.installPython ?? config.autoInstallPython,
77
+ installUv: config.installUv ?? config.autoInstallUv,
78
+ createVirtualEnvironment: config.createVirtualEnvironment ?? config.autoCreateVirtualEnvironment,
79
+ autoSync: config.autoSync,
80
+ lockfile: config.lockfile,
81
+ generatedDirectory: config.generatedDirectory,
82
+ env: config.env,
83
+ };
84
+ const project = (0, project_1.resolveProjectConfig)(projectOverrides);
85
+ const plan = (0, project_environment_1.createProjectPlan)(projectOverrides);
86
+ let environmentState;
87
+ if ((0, project_environment_1.requiresProjectSync)(plan)) {
88
+ if (project.autoSync === 'if-missing') {
89
+ try {
90
+ environmentState = (0, project_environment_1.validateProjectEnvironment)(plan);
91
+ }
92
+ catch {
93
+ environmentState = (await (0, project_environment_1.syncProject)(projectOverrides)).state;
94
+ }
95
+ }
96
+ else {
97
+ environmentState = (0, project_environment_1.validateProjectEnvironment)(plan);
98
+ }
99
+ }
100
+ if (config.virtualenv?.autoInstall && (config.virtualenv.packages?.length ?? 0) > 0) {
101
+ throw new Error('virtualenv.autoInstall is no longer supported. Declare Python dependencies in the ' +
102
+ 'root package.json pynect.project.dependencies field and run "pynect sync".');
103
+ }
104
+ // Resolve Python before loading the native addon. On Windows the addon
105
+ // depends on the selected Python DLL, so its directory must already be on
106
+ // PATH when Node loads the .node file.
107
+ const { python: selected } = await (0, pyfig_adapter_1.ensurePynectPython)({
108
+ autoInstallPython: project.installPython,
109
+ autoInstallUv: project.installUv,
110
+ autoCreateVirtualEnvironment: project.createVirtualEnvironment,
111
+ managedPython: project.managedPython,
112
+ uvVersion: project.uvVersion,
113
+ pythonRange: plan.pythonRange,
114
+ pythonPath: project.python,
115
+ projectRoot: project.projectRoot,
116
+ env: project.env,
117
+ });
118
+ if (environmentState) {
119
+ const selectedAbi = `${selected.implementation}-${selected.version}-` +
120
+ `${selected.architecture}-${selected.pointerBits}`;
121
+ if (!pathsEqual(environmentState.pythonExecutable, selected.executable) ||
122
+ environmentState.pythonAbi !== selectedAbi) {
123
+ throw new Error('Pynect environment Python changed since the last sync. Run "pynect sync" before ' +
124
+ 'starting the application.');
125
+ }
126
+ }
127
+ const selectedProjectRoot = project.projectRoot;
128
+ if (config.virtualenv?.path) {
129
+ const configuredVenv = path_1.default.resolve(config.virtualenv.path);
130
+ if (!selected.virtualEnvironment || !pathsEqual(configuredVenv, selected.virtualEnvironment)) {
131
+ throw new Error(`virtualenv.path must resolve to the Pyfig-selected environment at ${selected.virtualEnvironment}.`);
132
+ }
133
+ }
134
+ const preparedConfig = {
135
+ ...config,
136
+ python: selected.executable,
137
+ requiresPython: plan.pythonRange,
138
+ projectRoot: selectedProjectRoot,
139
+ installPython: project.installPython,
140
+ installUv: project.installUv,
141
+ createVirtualEnvironment: project.createVirtualEnvironment,
142
+ managedPython: project.managedPython,
143
+ uvVersion: project.uvVersion,
144
+ autoSync: project.autoSync,
145
+ lockfile: project.lockfile,
146
+ generatedDirectory: project.generatedDirectory,
147
+ env: project.env,
148
+ dispatcher: {
149
+ ...config.dispatcher,
150
+ include: [
151
+ ...(config.dispatcher?.include ?? []),
152
+ ...(0, project_environment_1.moduleDispatcherIncludes)(plan),
153
+ ],
154
+ },
155
+ };
156
+ if (process.platform === 'win32') {
157
+ const requiredDirectories = [
158
+ selected.basePrefix,
159
+ selected.embedding.libraryDirectory,
160
+ path_1.default.dirname(selected.executable),
161
+ ];
162
+ const entries = (process.env['PATH'] ?? '').split(path_1.default.delimiter);
163
+ for (const directory of requiredDirectories.reverse()) {
164
+ if (!entries.some((entry) => entry.toLowerCase() === directory.toLowerCase())) {
165
+ process.env['PATH'] = `${directory}${path_1.default.delimiter}${process.env['PATH'] ?? ''}`;
166
+ }
167
+ }
168
+ }
169
+ const resolved = (0, config_1.resolveConfig)(preparedConfig);
170
+ // Set log level
171
+ logger_1.Logger.setGlobalLevel(resolved.logLevel);
172
+ logger.info('Creating PyRuntime...');
173
+ // Load the native addon
174
+ let addon;
175
+ try {
176
+ addon = (0, native_addon_loader_1.loadOrBuildNativeAddon)({
177
+ projectRoot: selectedProjectRoot,
178
+ pythonExecutable: selected.executable,
179
+ pythonLibrary: selected.embedding.libraryPath,
180
+ pythonVersion: selected.version,
181
+ });
182
+ logger.debug('Native addon loaded');
183
+ }
184
+ catch (err) {
185
+ logger.error('Failed to load the Pynect native addon.', err);
186
+ throw new Error('Pynect native addon could not be loaded or built by the active JavaScript runtime.\n' +
187
+ `Original error: ${err.message}`);
188
+ }
189
+ const runtime = new PyRuntime(resolved, addon, selected.embedding.libraryPath);
190
+ try {
191
+ await runtime._initialize();
192
+ return runtime;
193
+ }
194
+ catch (error) {
195
+ if (addon.isInitialized()) {
196
+ await addon.finalizePython().catch(() => undefined);
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+ // Initialization
202
+ async _initialize() {
203
+ const startTime = performance.now();
204
+ // 1. Detect/setup Python environment
205
+ const pythonExecutable = await this._setupPythonEnvironment();
206
+ this._pythonExecutable = pythonExecutable;
207
+ if (this._config.isolation.enabled) {
208
+ const packagedPython = path_1.default.join(__dirname, '..', '..', 'python');
209
+ this._isolatedWorker = new isolated_worker_1.IsolatedWorker({
210
+ pythonExecutable,
211
+ projectRoot: this._config.projectRoot,
212
+ scriptPath: path_1.default.join(packagedPython, 'isolated_worker.py'),
213
+ cwd: this._config.isolation.cwd,
214
+ timeout: this._config.isolation.timeout,
215
+ env: this._config.env,
216
+ pythonPath: [packagedPython, ...this._config.pythonPathExtra],
217
+ dispatcher: this._config.dispatcher,
218
+ includeTracebacks: this._config.includeTracebacks,
219
+ });
220
+ }
221
+ // 2. Initialize Python interpreter via C++ addon
222
+ logger.debug(`Initializing Python interpreter: ${pythonExecutable}`);
223
+ await this._addon.initializePython({
224
+ pythonHome: this._config.pythonHome || '',
225
+ pythonExecutable,
226
+ pythonLibrary: this._pythonLibrary,
227
+ threadPoolSize: this._config.threadPoolSize,
228
+ maxQueueSize: this._config.maxQueueSize,
229
+ gilReleaseInterval: this._config.gil.releaseInterval,
230
+ callTimeout: this._config.callTimeout,
231
+ pythonPathExtra: [
232
+ path_1.default.join(__dirname, '..', '..', 'python'),
233
+ ...this._config.pythonPathExtra,
234
+ ],
235
+ env: this._config.env,
236
+ enableProfiling: this._config.profilingEnabled,
237
+ includeTracebacks: this._config.includeTracebacks,
238
+ });
239
+ logger.debug('Python interpreter initialized');
240
+ // 3. Bootstrap Python runtime helpers
241
+ await this._bootstrapPythonRuntime();
242
+ // 4. Register built-in plugins
243
+ await this._pluginManager.registerBuiltins();
244
+ // 5. Start memory monitoring
245
+ this._memoryMonitor.startMonitoring(10000);
246
+ this._running = true;
247
+ const elapsed = (performance.now() - startTime).toFixed(0);
248
+ logger.success(`PyRuntime ready in ${elapsed}ms (Python: ${pythonExecutable})`);
249
+ }
250
+ async _setupPythonEnvironment() {
251
+ const pythonExecutable = this._config.pythonExecutable;
252
+ logger.info(`Using repository virtualenv: ${path_1.default.dirname(path_1.default.dirname(pythonExecutable))}`);
253
+ return pythonExecutable;
254
+ }
255
+ async _bootstrapPythonRuntime() {
256
+ try {
257
+ const dispatcherConfig = Buffer.from(JSON.stringify(this._config.dispatcher), 'utf8').toString('base64');
258
+ // Initialize pynect Python runtime helpers
259
+ const bootstrapCode = `
260
+ # Initialize optional upstream helpers. The packaged Python directory is
261
+ # already inserted into sys.path by the native initialization options.
262
+ try:
263
+ import pynect_runtime
264
+ pynect_runtime.initialize()
265
+ except ImportError:
266
+ pass # Runtime helpers not available, basic operation only
267
+
268
+ import base64 as _pynect_base64
269
+ import json as _pynect_json
270
+ import pynect_dispatcher
271
+ pynect_dispatcher.configure(
272
+ _pynect_json.loads(_pynect_base64.b64decode('${dispatcherConfig}'))
273
+ )
274
+ `;
275
+ await this._addon.runPythonCode(bootstrapCode);
276
+ logger.debug('Python runtime helpers bootstrapped');
277
+ }
278
+ catch (err) {
279
+ logger.error('Failed to bootstrap the Python dispatcher', err);
280
+ throw err;
281
+ }
282
+ }
283
+ // Module Import
284
+ /**
285
+ * Import a Python module and return a PyProxy.
286
+ *
287
+ * @example
288
+ * ```typescript
289
+ * const pd = await runtime.import('pandas');
290
+ * const df = await pd.read_csv('data.csv');
291
+ * ```
292
+ */
293
+ async import(moduleName) {
294
+ this._ensureRunning();
295
+ logger.debug(`Importing Python module: ${moduleName}`);
296
+ const result = await this._addon.importModule(moduleName);
297
+ if (!result.success) {
298
+ if (result.error) {
299
+ throw (0, error_translator_1.translatePythonError)({
300
+ type: result.error.type,
301
+ message: result.error.message,
302
+ traceback: result.error.traceback || '',
303
+ });
304
+ }
305
+ throw new Error(`Failed to import Python module '${moduleName}'`);
306
+ }
307
+ if (!result.objectId) {
308
+ throw new Error(`Module '${moduleName}' imported but no object ID returned`);
309
+ }
310
+ // Run plugin hooks
311
+ await this._pluginManager.onModuleImported(moduleName, result.objectId);
312
+ // Create PyModule
313
+ const module = py_module_1.PyModule.fromRef(result.objectId, moduleName, this._addon, this._config.callTimeout, this._config.executionTimeout);
314
+ logger.debug(`Module '${moduleName}' imported (id=${result.objectId})`);
315
+ return module;
316
+ }
317
+ /**
318
+ * Import multiple modules at once (concurrent).
319
+ */
320
+ async importAll(moduleNames) {
321
+ const modules = await Promise.all(moduleNames.map(async (name) => [name, await this.import(name)]));
322
+ return Object.fromEntries(modules);
323
+ }
324
+ /**
325
+ * Call a JSON-compatible Python function in a killable child process.
326
+ * This is a process boundary, not an operating-system sandbox.
327
+ */
328
+ async callIsolated(moduleName, functionName, args = [], options = {}) {
329
+ this._ensureRunning();
330
+ if (!this._isolatedWorker) {
331
+ throw new Error('Isolated calls are disabled; initialize with isolation.enabled: true.');
332
+ }
333
+ return this._isolatedWorker.call(moduleName, functionName, args, options);
334
+ }
335
+ // Code Execution
336
+ /**
337
+ * Evaluate a Python expression.
338
+ */
339
+ async eval(expression) {
340
+ this._ensureRunning();
341
+ this._ensureUnsafeCodeAllowed('eval');
342
+ const result = await this._addon.evalPython(expression);
343
+ if (!result.success) {
344
+ if (result.error) {
345
+ throw (0, error_translator_1.translatePythonError)({
346
+ type: result.error.type,
347
+ message: result.error.message,
348
+ traceback: result.error.traceback || '',
349
+ });
350
+ }
351
+ throw new Error('Python eval failed');
352
+ }
353
+ if (result.isObject && result.objectId) {
354
+ return py_proxy_1.PyProxy._createFromObjectId(result.objectId, [], this._addon, this._config.callTimeout, this._config.executionTimeout);
355
+ }
356
+ if (result.resultJson !== undefined) {
357
+ try {
358
+ return JSON.parse(result.resultJson);
359
+ }
360
+ catch {
361
+ return result.resultJson;
362
+ }
363
+ }
364
+ return null;
365
+ }
366
+ /**
367
+ * Execute Python statements.
368
+ */
369
+ async exec(code) {
370
+ this._ensureRunning();
371
+ this._ensureUnsafeCodeAllowed('exec');
372
+ const result = await this._addon.runPythonCode(code);
373
+ if (!result.success && result.error) {
374
+ throw (0, error_translator_1.translatePythonError)({
375
+ type: result.error.type,
376
+ message: result.error.message,
377
+ traceback: result.error.traceback || '',
378
+ });
379
+ }
380
+ }
381
+ /**
382
+ * Run a Python script file.
383
+ */
384
+ async runFile(filePath) {
385
+ this._ensureRunning();
386
+ this._ensureUnsafeCodeAllowed('runFile');
387
+ const result = await this._addon.runPythonFile(filePath);
388
+ if (!result.success) {
389
+ if (result.error) {
390
+ throw (0, error_translator_1.translatePythonError)({
391
+ type: result.error.type,
392
+ message: result.error.message,
393
+ traceback: result.error.traceback || '',
394
+ });
395
+ }
396
+ throw new Error('Failed to run Python file');
397
+ }
398
+ return null;
399
+ }
400
+ // Context Management
401
+ /**
402
+ * Create an isolated Python execution context.
403
+ */
404
+ async createContext() {
405
+ this._ensureRunning();
406
+ this._ensureUnsafeCodeAllowed('createContext');
407
+ return py_context_1.PyContext.create(this._addon);
408
+ }
409
+ // Package Management
410
+ /**
411
+ * Install Python packages into the active environment.
412
+ */
413
+ async installPackages(packages) {
414
+ this._ensureRunning();
415
+ if (!this._config.allowPackageInstall) {
416
+ throw new Error('Runtime package installation is disabled; set allowPackageInstall: true.');
417
+ }
418
+ const installer = new package_installer_1.PackageInstaller({
419
+ pythonExecutable: this._pythonExecutable,
420
+ cwd: this._config.projectRoot,
421
+ });
422
+ await installer.install(packages);
423
+ }
424
+ // Memory Management
425
+ /**
426
+ * Get current memory statistics.
427
+ */
428
+ getMemoryStats() {
429
+ this._ensureRunning();
430
+ return this._addon.getMemoryStats();
431
+ }
432
+ /**
433
+ * Trigger Python garbage collection.
434
+ */
435
+ async collectGarbage() {
436
+ this._ensureRunning();
437
+ await this._addon.collectGarbage();
438
+ }
439
+ // Direct Addon Access
440
+ /**
441
+ * Get the underlying native addon.
442
+ * Advanced use only.
443
+ */
444
+ getAddon() {
445
+ this._ensureUnsafeCodeAllowed('getAddon');
446
+ return this._addon;
447
+ }
448
+ // State
449
+ isRunning() {
450
+ return this._running;
451
+ }
452
+ getConfig() {
453
+ return { ...this._config };
454
+ }
455
+ // Shutdown
456
+ /**
457
+ * Gracefully shut down the Python runtime.
458
+ * Releases all Python objects and finalizes the interpreter.
459
+ */
460
+ async shutdown() {
461
+ if (!this._running) {
462
+ return;
463
+ }
464
+ logger.info('Shutting down PyRuntime...');
465
+ // Stop memory monitoring
466
+ this._memoryMonitor.stopMonitoring();
467
+ await this._isolatedWorker?.close();
468
+ this._isolatedWorker = undefined;
469
+ // Finalize Python interpreter
470
+ try {
471
+ await this._addon.runPythonCode('import pynect_dispatcher as _d; _d.shutdown()');
472
+ await this._addon.finalizePython();
473
+ this._running = false;
474
+ logger.success('PyRuntime shut down');
475
+ }
476
+ catch (err) {
477
+ logger.error('Error during Python finalization', err);
478
+ throw err;
479
+ }
480
+ }
481
+ /**
482
+ * Synchronous shutdown (for process.on('exit') handler).
483
+ * Best-effort only - may not complete all cleanup.
484
+ */
485
+ shutdownSync() {
486
+ if (!this._running) {
487
+ return;
488
+ }
489
+ this._running = false;
490
+ this._memoryMonitor.stopMonitoring();
491
+ this._isolatedWorker?.closeSync();
492
+ this._isolatedWorker = undefined;
493
+ // Cannot await here - best effort
494
+ logger.debug('Synchronous shutdown initiated');
495
+ }
496
+ // Private Helpers
497
+ _ensureRunning() {
498
+ if (!this._running) {
499
+ throw new error_translator_1.PynectShutdownError('PyRuntime has been shut down. Create a new runtime with PyRuntime.create().');
500
+ }
501
+ }
502
+ _ensureUnsafeCodeAllowed(operation) {
503
+ if (!this._config.allowUnsafeCode) {
504
+ throw new Error(`${operation} is disabled by default; set allowUnsafeCode: true for trusted local code.`);
505
+ }
506
+ }
507
+ _parseBytes(str) {
508
+ const match = str.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)?$/i);
509
+ if (!match) {
510
+ return 1_073_741_824;
511
+ }
512
+ const value = parseFloat(match[1]);
513
+ const unit = (match[2] ?? 'B').toUpperCase();
514
+ const units = {
515
+ B: 1, KB: 1024, MB: 1024 ** 2, GB: 1024 ** 3, TB: 1024 ** 4,
516
+ };
517
+ return Math.floor(value * (units[unit] ?? 1));
518
+ }
519
+ }
520
+ exports.PyRuntime = PyRuntime;
521
+ function pathsEqual(left, right) {
522
+ const normalize = (value) => {
523
+ const resolved = path_1.default.resolve(value);
524
+ return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
525
+ };
526
+ return normalize(left) === normalize(right);
527
+ }
528
+ //# sourceMappingURL=py-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"py-runtime.js","sourceRoot":"","sources":["../../src/core/py-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function isPythonModuleName(value: string): boolean;
2
+ export declare function assertPythonPackageSpec(spec: string): void;
3
+ //# sourceMappingURL=executables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executables.d.ts","sourceRoot":"","sources":["../../src/env/executables.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1D"}