pynect 0.0.0-stage → 0.2.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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +478 -2
  3. package/SECURITY.md +34 -0
  4. package/binding.gyp +60 -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 +48 -0
  12. package/dist/cli/sync.js.map +1 -0
  13. package/dist/config/project.d.ts +57 -0
  14. package/dist/config/project.d.ts.map +1 -0
  15. package/dist/config/project.js +176 -0
  16. package/dist/config/project.js.map +1 -0
  17. package/dist/core/IsolatedWorker.d.ts +39 -0
  18. package/dist/core/IsolatedWorker.d.ts.map +1 -0
  19. package/dist/core/IsolatedWorker.js +178 -0
  20. package/dist/core/IsolatedWorker.js.map +1 -0
  21. package/dist/core/PyCallable.d.ts +67 -0
  22. package/dist/core/PyCallable.d.ts.map +1 -0
  23. package/dist/core/PyCallable.js +104 -0
  24. package/dist/core/PyCallable.js.map +1 -0
  25. package/dist/core/PyContext.d.ts +76 -0
  26. package/dist/core/PyContext.d.ts.map +1 -0
  27. package/dist/core/PyContext.js +239 -0
  28. package/dist/core/PyContext.js.map +1 -0
  29. package/dist/core/PyIterator.d.ts +84 -0
  30. package/dist/core/PyIterator.d.ts.map +1 -0
  31. package/dist/core/PyIterator.js +243 -0
  32. package/dist/core/PyIterator.js.map +1 -0
  33. package/dist/core/PyModule.d.ts +53 -0
  34. package/dist/core/PyModule.d.ts.map +1 -0
  35. package/dist/core/PyModule.js +162 -0
  36. package/dist/core/PyModule.js.map +1 -0
  37. package/dist/core/PyProxy.d.ts +75 -0
  38. package/dist/core/PyProxy.d.ts.map +1 -0
  39. package/dist/core/PyProxy.js +563 -0
  40. package/dist/core/PyProxy.js.map +1 -0
  41. package/dist/core/PyRuntime.d.ts +112 -0
  42. package/dist/core/PyRuntime.d.ts.map +1 -0
  43. package/dist/core/PyRuntime.js +546 -0
  44. package/dist/core/PyRuntime.js.map +1 -0
  45. package/dist/env/PackageInstaller.d.ts +232 -0
  46. package/dist/env/PackageInstaller.d.ts.map +1 -0
  47. package/dist/env/PackageInstaller.js +628 -0
  48. package/dist/env/PackageInstaller.js.map +1 -0
  49. package/dist/env/ProjectEnvironment.d.ts +63 -0
  50. package/dist/env/ProjectEnvironment.d.ts.map +1 -0
  51. package/dist/env/ProjectEnvironment.js +379 -0
  52. package/dist/env/ProjectEnvironment.js.map +1 -0
  53. package/dist/env/PyfigAdapter.d.ts +32 -0
  54. package/dist/env/PyfigAdapter.d.ts.map +1 -0
  55. package/dist/env/PyfigAdapter.js +10 -0
  56. package/dist/env/PyfigAdapter.js.map +1 -0
  57. package/dist/env/PythonDetector.d.ts +48 -0
  58. package/dist/env/PythonDetector.d.ts.map +1 -0
  59. package/dist/env/PythonDetector.js +182 -0
  60. package/dist/env/PythonDetector.js.map +1 -0
  61. package/dist/env/PythonProvisioner.d.ts +16 -0
  62. package/dist/env/PythonProvisioner.d.ts.map +1 -0
  63. package/dist/env/PythonProvisioner.js +42 -0
  64. package/dist/env/PythonProvisioner.js.map +1 -0
  65. package/dist/env/VenvManager.d.ts +55 -0
  66. package/dist/env/VenvManager.d.ts.map +1 -0
  67. package/dist/env/VenvManager.js +153 -0
  68. package/dist/env/VenvManager.js.map +1 -0
  69. package/dist/env/executables.d.ts +3 -0
  70. package/dist/env/executables.d.ts.map +1 -0
  71. package/dist/env/executables.js +14 -0
  72. package/dist/env/executables.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 +393 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/native/NativeAddonLoader.d.ts +11 -0
  78. package/dist/native/NativeAddonLoader.d.ts.map +1 -0
  79. package/dist/native/NativeAddonLoader.js +75 -0
  80. package/dist/native/NativeAddonLoader.js.map +1 -0
  81. package/dist/plugins/Plugin.interface.d.ts +41 -0
  82. package/dist/plugins/Plugin.interface.d.ts.map +1 -0
  83. package/dist/plugins/Plugin.interface.js +12 -0
  84. package/dist/plugins/Plugin.interface.js.map +1 -0
  85. package/dist/plugins/PluginManager.d.ts +26 -0
  86. package/dist/plugins/PluginManager.d.ts.map +1 -0
  87. package/dist/plugins/PluginManager.js +174 -0
  88. package/dist/plugins/PluginManager.js.map +1 -0
  89. package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
  90. package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
  91. package/dist/plugins/builtin/NumpyPlugin.js +41 -0
  92. package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
  93. package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
  94. package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
  95. package/dist/plugins/builtin/PandasPlugin.js +57 -0
  96. package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
  97. package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
  98. package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
  99. package/dist/plugins/builtin/TorchPlugin.js +50 -0
  100. package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
  101. package/dist/plugins/index.d.ts +7 -0
  102. package/dist/plugins/index.d.ts.map +1 -0
  103. package/dist/plugins/index.js +12 -0
  104. package/dist/plugins/index.js.map +1 -0
  105. package/dist/serialization/DataFrameBridge.d.ts +141 -0
  106. package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
  107. package/dist/serialization/DataFrameBridge.js +355 -0
  108. package/dist/serialization/DataFrameBridge.js.map +1 -0
  109. package/dist/serialization/MsgPackSerializer.d.ts +45 -0
  110. package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
  111. package/dist/serialization/MsgPackSerializer.js +242 -0
  112. package/dist/serialization/MsgPackSerializer.js.map +1 -0
  113. package/dist/serialization/NumpyBridge.d.ts +96 -0
  114. package/dist/serialization/NumpyBridge.d.ts.map +1 -0
  115. package/dist/serialization/NumpyBridge.js +323 -0
  116. package/dist/serialization/NumpyBridge.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 +233 -0
  126. package/dist/types/config.d.ts.map +1 -0
  127. package/dist/types/config.js +60 -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/ErrorTranslator.d.ts +83 -0
  138. package/dist/utils/ErrorTranslator.d.ts.map +1 -0
  139. package/dist/utils/ErrorTranslator.js +210 -0
  140. package/dist/utils/ErrorTranslator.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/MemoryMonitor.d.ts +43 -0
  150. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  151. package/dist/utils/MemoryMonitor.js +143 -0
  152. package/dist/utils/MemoryMonitor.js.map +1 -0
  153. package/package.json +114 -4
  154. package/python/ast_inspector.py +248 -0
  155. package/python/error_handler.py +432 -0
  156. package/python/isolated_worker.py +94 -0
  157. package/python/pynect_dispatcher.py +382 -0
  158. package/python/pynect_runtime.py +574 -0
  159. package/python/serializer.py +373 -0
  160. package/python/type_inspector.py +315 -0
  161. package/scripts/build-native.js +50 -0
  162. package/scripts/cli.js +21 -0
  163. package/scripts/ensure-native.js +85 -0
  164. package/scripts/postinstall.js +40 -0
  165. package/scripts/pyfig.js +113 -0
  166. package/scripts/python-provisioner.js +23 -0
  167. package/scripts/smoke-python-boundary.js +103 -0
  168. package/src/native/NativeAddonLoader.ts +98 -0
  169. package/src/native/gil_guard.cpp +25 -0
  170. package/src/native/gil_guard.h +174 -0
  171. package/src/native/pynect_addon.cpp +942 -0
  172. package/src/native/python_bridge.cpp +904 -0
  173. package/src/native/python_bridge.h +263 -0
  174. package/src/native/thread_pool.cpp +375 -0
  175. package/src/native/thread_pool.h +185 -0
  176. package/src/native/type_converter.cpp +906 -0
  177. package/src/native/type_converter.h +271 -0
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ /**
3
+ * pynect - PyIterator
4
+ * Wraps a Python iterator for use with JavaScript's for await...of.
5
+ * Provides both async iteration and manual .next() calls.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PyIterator = void 0;
9
+ const ErrorTranslator_1 = require("../utils/ErrorTranslator");
10
+ const PyProxy_1 = require("./PyProxy");
11
+ const Logger_1 = require("../utils/Logger");
12
+ const logger = new Logger_1.Logger('PyIterator');
13
+ /**
14
+ * PyIterator - manages a Python iterator lifecycle.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const iterator = await PyIterator.create(pyList, addon);
19
+ *
20
+ * for await (const item of iterator) {
21
+ * console.log(item);
22
+ * }
23
+ *
24
+ * // Or manually:
25
+ * const { value, done } = await iterator.next();
26
+ * ```
27
+ */
28
+ class PyIterator {
29
+ _iteratorId;
30
+ _addon;
31
+ _objectId;
32
+ _options;
33
+ _done = false;
34
+ _position = 0;
35
+ _destroyed = false;
36
+ constructor(iteratorId, objectId, addon, options = {}) {
37
+ this._iteratorId = iteratorId;
38
+ this._objectId = objectId;
39
+ this._addon = addon;
40
+ this._options = options;
41
+ }
42
+ /**
43
+ * Create a PyIterator from a PyProxy.
44
+ */
45
+ static async create(source, options) {
46
+ const internal = source[PyProxy_1.PYPROXY_INTERNAL];
47
+ const addon = internal.addon;
48
+ const result = await addon.createIterator(internal.objectId, internal.path);
49
+ if (!result.success) {
50
+ if (result.error) {
51
+ throw (0, ErrorTranslator_1.translatePythonError)({
52
+ type: result.error.type,
53
+ message: result.error.message,
54
+ traceback: result.error.traceback || '',
55
+ });
56
+ }
57
+ throw new Error('Failed to create Python iterator');
58
+ }
59
+ let iteratorId;
60
+ try {
61
+ const parsed = JSON.parse(result.resultJson || '{}');
62
+ if (!parsed.iteratorId) {
63
+ throw new Error('no iteratorId');
64
+ }
65
+ iteratorId = parsed.iteratorId;
66
+ }
67
+ catch {
68
+ throw new Error('Failed to parse iterator ID from: ' + result.resultJson);
69
+ }
70
+ return new PyIterator(iteratorId, internal.objectId, addon, options);
71
+ }
72
+ /**
73
+ * Create a PyIterator from an object ID and iterator ID directly.
74
+ */
75
+ static fromIds(iteratorId, objectId, addon, options) {
76
+ return new PyIterator(iteratorId, objectId, addon, options);
77
+ }
78
+ /** Current position in iteration */
79
+ get position() {
80
+ return this._position;
81
+ }
82
+ /** Whether iteration is complete */
83
+ get isDone() {
84
+ return this._done;
85
+ }
86
+ // AsyncIterator Protocol
87
+ async next() {
88
+ if (this._done || this._destroyed) {
89
+ return { value: undefined, done: true };
90
+ }
91
+ // Check limit
92
+ if (this._options.limit && this._position >= this._options.limit) {
93
+ await this.destroy();
94
+ return { value: undefined, done: true };
95
+ }
96
+ try {
97
+ const result = await this._addon.iteratorNext(this._iteratorId);
98
+ if (!result.success) {
99
+ if (result.error) {
100
+ throw (0, ErrorTranslator_1.translatePythonError)({
101
+ type: result.error.type,
102
+ message: result.error.message,
103
+ traceback: result.error.traceback || '',
104
+ });
105
+ }
106
+ this._done = true;
107
+ return { value: undefined, done: true };
108
+ }
109
+ let parsed;
110
+ try {
111
+ parsed = JSON.parse(result.resultJson || '{"done":true}');
112
+ }
113
+ catch {
114
+ this._done = true;
115
+ return { value: undefined, done: true };
116
+ }
117
+ if (parsed.done) {
118
+ this._done = true;
119
+ return { value: undefined, done: true };
120
+ }
121
+ this._position++;
122
+ // Deserialize the value
123
+ const rawValue = parsed.value;
124
+ let value;
125
+ if (rawValue !== null &&
126
+ typeof rawValue === 'object' &&
127
+ '__pyref__' in rawValue) {
128
+ // It's a Python object reference
129
+ if (this._options.wrapObjects !== false) {
130
+ const refId = rawValue.__pyref__;
131
+ value = PyProxy_1.PyProxy._createFromObjectId(refId, [], this._addon);
132
+ }
133
+ else {
134
+ value = rawValue;
135
+ }
136
+ }
137
+ else {
138
+ value = rawValue;
139
+ }
140
+ return { value, done: false };
141
+ }
142
+ catch (err) {
143
+ this._done = true;
144
+ throw err;
145
+ }
146
+ }
147
+ async return(value) {
148
+ await this.destroy();
149
+ return { value: value, done: true };
150
+ }
151
+ async throw(error) {
152
+ await this.destroy();
153
+ throw error;
154
+ }
155
+ // AsyncIterable Protocol
156
+ [Symbol.asyncIterator]() {
157
+ return this;
158
+ }
159
+ // Utilities
160
+ /**
161
+ * Collect all items into an array.
162
+ * Use with care for large iterators!
163
+ */
164
+ async toArray(maxItems = 100000) {
165
+ const items = [];
166
+ for await (const item of this) {
167
+ items.push(item);
168
+ if (items.length >= maxItems) {
169
+ break;
170
+ }
171
+ }
172
+ return items;
173
+ }
174
+ /**
175
+ * Process items in batches.
176
+ */
177
+ async *batch(batchSize) {
178
+ let current = [];
179
+ for await (const item of this) {
180
+ current.push(item);
181
+ if (current.length >= batchSize) {
182
+ yield current;
183
+ current = [];
184
+ }
185
+ }
186
+ if (current.length > 0) {
187
+ yield current;
188
+ }
189
+ }
190
+ /**
191
+ * Map items through a transform function.
192
+ */
193
+ async *map(fn) {
194
+ let i = 0;
195
+ for await (const item of this) {
196
+ yield await fn(item, i++);
197
+ }
198
+ }
199
+ /**
200
+ * Filter items.
201
+ */
202
+ async *filter(fn) {
203
+ let i = 0;
204
+ for await (const item of this) {
205
+ if (await fn(item, i++)) {
206
+ yield item;
207
+ }
208
+ }
209
+ }
210
+ /**
211
+ * Take first N items.
212
+ */
213
+ async take(n) {
214
+ const items = [];
215
+ for await (const item of this) {
216
+ items.push(item);
217
+ if (items.length >= n) {
218
+ break;
219
+ }
220
+ }
221
+ await this.destroy();
222
+ return items;
223
+ }
224
+ /**
225
+ * Destroy the underlying Python iterator (frees resources).
226
+ * Called automatically when iteration completes.
227
+ */
228
+ async destroy() {
229
+ if (this._destroyed) {
230
+ return;
231
+ }
232
+ this._destroyed = true;
233
+ this._done = true;
234
+ try {
235
+ await this._addon.destroyIterator(this._iteratorId);
236
+ }
237
+ catch (err) {
238
+ logger.debug('Error destroying iterator', err);
239
+ }
240
+ }
241
+ }
242
+ exports.PyIterator = PyIterator;
243
+ //# sourceMappingURL=PyIterator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyIterator.js","sourceRoot":"","sources":["../../src/core/PyIterator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * pynect - PyModule
3
+ * Represents a Python module with its full namespace.
4
+ * Inherits from PyProxy but adds module-specific introspection.
5
+ */
6
+ import { PyProxy } from './PyProxy';
7
+ import type { NativeAddon } from '../types/addon';
8
+ import type { PyObjectId, PyModuleInspection } from '../types/python';
9
+ /**
10
+ * PyModule extends PyProxy with module-specific utilities.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const pd = await py.import('pandas');
15
+ * // pd is a PyModule
16
+ * const df = await pd.read_csv('data.csv'); // access module attribute
17
+ * const info = await pd.__pynect_inspect__(); // get module metadata
18
+ * ```
19
+ */
20
+ export declare class PyModule extends PyProxy {
21
+ private readonly _moduleName;
22
+ constructor(objectId: PyObjectId, moduleName: string, addon: NativeAddon, callTimeout?: number, executionTimeout?: number);
23
+ /** The Python module name */
24
+ get moduleName(): string;
25
+ /** Object ID in Python heap */
26
+ get objectId(): PyObjectId;
27
+ /**
28
+ * Inspect the module and return detailed type information.
29
+ */
30
+ inspect(): Promise<PyModuleInspection>;
31
+ /**
32
+ * Get list of public names in the module (dir() equivalent).
33
+ */
34
+ getNames(): Promise<string[]>;
35
+ /**
36
+ * Check if the module has a specific attribute.
37
+ */
38
+ has(name: string): Promise<boolean>;
39
+ /**
40
+ * Get module version string.
41
+ */
42
+ getVersion(): Promise<string | null>;
43
+ /**
44
+ * Reload the module (re-imports from Python).
45
+ */
46
+ reload(): Promise<void>;
47
+ /**
48
+ * Create a PyModule from an existing addon import result.
49
+ */
50
+ static fromRef(objectId: PyObjectId, moduleName: string, addon: NativeAddon, callTimeout?: number, executionTimeout?: number): PyModule;
51
+ toString(): string;
52
+ }
53
+ //# sourceMappingURL=PyModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyModule.d.ts","sourceRoot":"","sources":["../../src/core/PyModule.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAoB,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKtE;;;;;;;;;;GAUG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM;IAY3B,6BAA6B;IAC7B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,+BAA+B;IAC/B,IAAI,QAAQ,IAAI,UAAU,CAEzB;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAqE5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAcnC;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,QAAQ;IAIF,QAAQ,IAAI,MAAM;CAG5B"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * pynect - PyModule
4
+ * Represents a Python module with its full namespace.
5
+ * Inherits from PyProxy but adds module-specific introspection.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PyModule = void 0;
9
+ const PyProxy_1 = require("./PyProxy");
10
+ const Logger_1 = require("../utils/Logger");
11
+ const logger = new Logger_1.Logger('PyModule');
12
+ /**
13
+ * PyModule extends PyProxy with module-specific utilities.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const pd = await py.import('pandas');
18
+ * // pd is a PyModule
19
+ * const df = await pd.read_csv('data.csv'); // access module attribute
20
+ * const info = await pd.__pynect_inspect__(); // get module metadata
21
+ * ```
22
+ */
23
+ class PyModule extends PyProxy_1.PyProxy {
24
+ _moduleName;
25
+ constructor(objectId, moduleName, addon, callTimeout, executionTimeout) {
26
+ super({
27
+ objectId,
28
+ path: [],
29
+ addon,
30
+ callTimeout,
31
+ executionTimeout,
32
+ });
33
+ this._moduleName = moduleName;
34
+ }
35
+ /** The Python module name */
36
+ get moduleName() {
37
+ return this._moduleName;
38
+ }
39
+ /** Object ID in Python heap */
40
+ get objectId() {
41
+ return this[PyProxy_1.PYPROXY_INTERNAL].objectId;
42
+ }
43
+ /**
44
+ * Inspect the module and return detailed type information.
45
+ */
46
+ async inspect() {
47
+ const addon = this[PyProxy_1.PYPROXY_INTERNAL].addon;
48
+ try {
49
+ // Run Python introspection
50
+ const result = await addon.runPythonCode(`
51
+ import json
52
+ import sys
53
+
54
+ def _inspect_module_${this._moduleName.replace(/\./g, '_')}():
55
+ try:
56
+ import ${this._moduleName} as _mod
57
+ import inspect
58
+
59
+ result = {
60
+ 'name': '${this._moduleName}',
61
+ 'file': getattr(_mod, '__file__', None),
62
+ 'docstring': (getattr(_mod, '__doc__', '') or '')[:500],
63
+ 'version': getattr(_mod, '__version__', None),
64
+ 'functions': [],
65
+ 'classes': [],
66
+ 'constants': [],
67
+ 'submodules': [],
68
+ }
69
+
70
+ for name in dir(_mod):
71
+ if name.startswith('_'):
72
+ continue
73
+ try:
74
+ obj = getattr(_mod, name)
75
+ if inspect.ismodule(obj):
76
+ result['submodules'].append(name)
77
+ elif inspect.isclass(obj):
78
+ result['classes'].append({'name': name, 'type': 'class'})
79
+ elif callable(obj):
80
+ result['functions'].append({'name': name, 'type': 'function'})
81
+ else:
82
+ result['constants'].append({'name': name, 'type': type(obj).__name__})
83
+ except Exception:
84
+ pass
85
+
86
+ return result
87
+ except Exception as e:
88
+ return {'name': '${this._moduleName}', 'error': str(e), 'functions': [], 'classes': [], 'constants': [], 'submodules': []}
89
+
90
+ _result = _inspect_module_${this._moduleName.replace(/\./g, '_')}()
91
+ json.dumps(_result)
92
+ `);
93
+ const r = result;
94
+ if (r.success && r.resultJson) {
95
+ const parsed = JSON.parse(r.resultJson.replace(/^"|"$/g, '').replace(/\\"/g, '"'));
96
+ return parsed;
97
+ }
98
+ }
99
+ catch (err) {
100
+ logger.warn(`Failed to inspect module ${this._moduleName}`, err);
101
+ }
102
+ // Return minimal inspection
103
+ return {
104
+ name: this._moduleName,
105
+ docstring: '',
106
+ functions: [],
107
+ classes: [],
108
+ constants: [],
109
+ submodules: [],
110
+ };
111
+ }
112
+ /**
113
+ * Get list of public names in the module (dir() equivalent).
114
+ */
115
+ async getNames() {
116
+ const addon = this[PyProxy_1.PYPROXY_INTERNAL].addon;
117
+ const result = await addon.getObjectKeys(this.objectId);
118
+ const r = result;
119
+ if (r.success && r.resultJson) {
120
+ try {
121
+ return JSON.parse(r.resultJson);
122
+ }
123
+ catch {
124
+ return [];
125
+ }
126
+ }
127
+ return [];
128
+ }
129
+ /**
130
+ * Check if the module has a specific attribute.
131
+ */
132
+ async has(name) {
133
+ const addon = this[PyProxy_1.PYPROXY_INTERNAL].addon;
134
+ return addon.hasAttribute(this.objectId, name);
135
+ }
136
+ /**
137
+ * Get module version string.
138
+ */
139
+ async getVersion() {
140
+ const inspection = await this.inspect();
141
+ return inspection.version ?? null;
142
+ }
143
+ /**
144
+ * Reload the module (re-imports from Python).
145
+ */
146
+ async reload() {
147
+ const addon = this[PyProxy_1.PYPROXY_INTERNAL].addon;
148
+ await addon.reloadModule(this.objectId);
149
+ logger.debug(`Module ${this._moduleName} reloaded`);
150
+ }
151
+ /**
152
+ * Create a PyModule from an existing addon import result.
153
+ */
154
+ static fromRef(objectId, moduleName, addon, callTimeout, executionTimeout) {
155
+ return new PyModule(objectId, moduleName, addon, callTimeout, executionTimeout);
156
+ }
157
+ toString() {
158
+ return `[PyModule '${this._moduleName}' id=${this.objectId}]`;
159
+ }
160
+ }
161
+ exports.PyModule = PyModule;
162
+ //# sourceMappingURL=PyModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyModule.js","sourceRoot":"","sources":["../../src/core/PyModule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * pynect - PyProxy
3
+ *
4
+ * The heart of pynect's JavaScript API.
5
+ * Every Python object is represented as a PyProxy - a JavaScript Proxy that:
6
+ *
7
+ * 1. Intercepts property access -> creates lazy child PyProxy
8
+ * 2. Intercepts function call -> sends to Python worker thread
9
+ * 3. Intercepts `then` -> resolves the proxy chain into a value (makes it awaitable)
10
+ * 4. Intercepts Symbol.iterator -> enables for...of loops
11
+ * 5. Intercepts Symbol.asyncIterator -> enables for await...of loops
12
+ * 6. Intercepts property assignment -> sets Python attribute
13
+ *
14
+ * The key insight: attributes are NOT resolved eagerly. The chain
15
+ * `df.groupby('country').agg({'sales': 'sum'}).reset_index()`
16
+ * creates a chain of PyProxy objects, each recording the operation,
17
+ * and only executes when you `await` the final result.
18
+ */
19
+ import type { NativeAddon, PyCallOptions } from '../types/addon';
20
+ import type { PyObjectId, AttributePath, SerializedValue } from '../types/python';
21
+ export declare const PYPROXY_INTERNAL: unique symbol;
22
+ export declare const PYPROXY_OBJECTID: unique symbol;
23
+ export declare const PYPROXY_PATH: unique symbol;
24
+ export declare const PYNECT_WITH_OPTIONS: unique symbol;
25
+ export type PynectFunction<FunctionType extends (...args: never[]) => Promise<unknown>> = FunctionType & {
26
+ withOptions(options: PyCallOptions, ...args: Parameters<FunctionType>): ReturnType<FunctionType>;
27
+ [PYNECT_WITH_OPTIONS](options: PyCallOptions, ...args: Parameters<FunctionType>): ReturnType<FunctionType>;
28
+ };
29
+ /**
30
+ * Internal state of a PyProxy.
31
+ */
32
+ export interface PyProxyInternal {
33
+ objectId: PyObjectId;
34
+ path: AttributePath;
35
+ addon: NativeAddon;
36
+ callTimeout?: number;
37
+ executionTimeout?: number;
38
+ }
39
+ /**
40
+ * PyProxy - wraps any Python object in JavaScript.
41
+ *
42
+ * Usage:
43
+ * ```typescript
44
+ * const pd = await py.import('pandas');
45
+ * const df = await pd.read_csv('data.csv'); // df is a PyProxy
46
+ * const rows = await df.describe().to_dict('records'); // chained calls
47
+ * ```
48
+ */
49
+ export declare class PyProxy {
50
+ /** Internal state - do not access directly from outside */
51
+ readonly [PYPROXY_INTERNAL]: PyProxyInternal;
52
+ constructor(internal: PyProxyInternal);
53
+ static readonly handler: ProxyHandler<PyProxy>;
54
+ private _resolve;
55
+ callWithOptions(args: unknown[], options?: PyCallOptions, kwargs?: Record<string, unknown>): Promise<unknown>;
56
+ /** Call this Python function with cancellation or timeout overrides. */
57
+ withOptions(options: PyCallOptions, ...args: unknown[]): Promise<unknown>;
58
+ /** Collision-free form of withOptions(). */
59
+ [PYNECT_WITH_OPTIONS](options: PyCallOptions, ...args: unknown[]): Promise<unknown>;
60
+ private _call;
61
+ private _makeAsyncIterator;
62
+ private _setAttr;
63
+ static _createFromObjectId(objectId: PyObjectId, path: AttributePath, addon: NativeAddon, callTimeout?: number, executionTimeout?: number): PyProxy;
64
+ static _deserializeAddonResult(result: unknown, internal: PyProxyInternal): unknown;
65
+ private static _abortError;
66
+ private static _withAbort;
67
+ static _serializeArg(value: unknown): Promise<SerializedValue>;
68
+ static _getTypedArrayDtype(arr: ArrayBufferView): string;
69
+ static _isPlainObject(obj: unknown): boolean;
70
+ }
71
+ /**
72
+ * Check if a value is a PyProxy.
73
+ */
74
+ export declare function isPyProxy(value: unknown): value is PyProxy;
75
+ //# sourceMappingURL=PyProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyProxy.d.ts","sourceRoot":"","sources":["../../src/core/PyProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAoB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAQzB,eAAO,MAAM,gBAAgB,eAA4B,CAAC;AAC1D,eAAO,MAAM,gBAAgB,eAA4B,CAAC;AAC1D,eAAO,MAAM,YAAY,eAAwB,CAAC;AAClD,eAAO,MAAM,mBAAmB,eAAmC,CAAC;AAEpE,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,IACzD,YAAY,GAAG;IACjB,WAAW,CACT,OAAO,EAAE,aAAa,EACtB,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,GAChC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC,mBAAmB,CAAC,CACnB,OAAO,EAAE,aAAa,EACtB,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,GAChC,UAAU,CAAC,YAAY,CAAC,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,qBAAa,OAAO;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC;gBAEjC,QAAQ,EAAE,eAAe;IAkBrC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAiK5C;YAIY,QAAQ;IA8BhB,eAAe,CACnB,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,GAAE,aAAkB,EAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC;IAKnB,wEAAwE;IAClE,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/E,4CAA4C;IACtC,CAAC,mBAAmB,CAAC,CACzB,OAAO,EAAE,aAAa,EACtB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,OAAO,CAAC;YAIL,KAAK;YAwEJ,kBAAkB;YAyEnB,QAAQ;IAetB,MAAM,CAAC,mBAAmB,CACxB,QAAQ,EAAE,UAAU,EACpB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO;IAUV,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,eAAe,GACxB,OAAO;IAqDV,OAAO,CAAC,MAAM,CAAC,WAAW;IAM1B,OAAO,CAAC,MAAM,CAAC,UAAU;WAoCZ,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IA0FpE,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;IAcxD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAK7C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAS1D"}