pynect 0.0.0 → 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.
- package/LICENSE +1 -1
- package/README.md +476 -2
- package/SECURITY.md +34 -0
- package/binding.gyp +60 -0
- package/dist/cli/codegen.d.ts +3 -0
- package/dist/cli/codegen.d.ts.map +1 -0
- package/dist/cli/codegen.js +543 -0
- package/dist/cli/codegen.js.map +1 -0
- package/dist/cli/sync.d.ts +3 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +48 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/project.d.ts +57 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +176 -0
- package/dist/config/project.js.map +1 -0
- package/dist/core/IsolatedWorker.d.ts +39 -0
- package/dist/core/IsolatedWorker.d.ts.map +1 -0
- package/dist/core/IsolatedWorker.js +178 -0
- package/dist/core/IsolatedWorker.js.map +1 -0
- package/dist/core/PyCallable.d.ts +67 -0
- package/dist/core/PyCallable.d.ts.map +1 -0
- package/dist/core/PyCallable.js +104 -0
- package/dist/core/PyCallable.js.map +1 -0
- package/dist/core/PyContext.d.ts +76 -0
- package/dist/core/PyContext.d.ts.map +1 -0
- package/dist/core/PyContext.js +239 -0
- package/dist/core/PyContext.js.map +1 -0
- package/dist/core/PyIterator.d.ts +84 -0
- package/dist/core/PyIterator.d.ts.map +1 -0
- package/dist/core/PyIterator.js +243 -0
- package/dist/core/PyIterator.js.map +1 -0
- package/dist/core/PyModule.d.ts +53 -0
- package/dist/core/PyModule.d.ts.map +1 -0
- package/dist/core/PyModule.js +162 -0
- package/dist/core/PyModule.js.map +1 -0
- package/dist/core/PyProxy.d.ts +75 -0
- package/dist/core/PyProxy.d.ts.map +1 -0
- package/dist/core/PyProxy.js +563 -0
- package/dist/core/PyProxy.js.map +1 -0
- package/dist/core/PyRuntime.d.ts +112 -0
- package/dist/core/PyRuntime.d.ts.map +1 -0
- package/dist/core/PyRuntime.js +546 -0
- package/dist/core/PyRuntime.js.map +1 -0
- package/dist/env/PackageInstaller.d.ts +232 -0
- package/dist/env/PackageInstaller.d.ts.map +1 -0
- package/dist/env/PackageInstaller.js +628 -0
- package/dist/env/PackageInstaller.js.map +1 -0
- package/dist/env/ProjectEnvironment.d.ts +63 -0
- package/dist/env/ProjectEnvironment.d.ts.map +1 -0
- package/dist/env/ProjectEnvironment.js +379 -0
- package/dist/env/ProjectEnvironment.js.map +1 -0
- package/dist/env/PyfigAdapter.d.ts +32 -0
- package/dist/env/PyfigAdapter.d.ts.map +1 -0
- package/dist/env/PyfigAdapter.js +10 -0
- package/dist/env/PyfigAdapter.js.map +1 -0
- package/dist/env/PythonDetector.d.ts +48 -0
- package/dist/env/PythonDetector.d.ts.map +1 -0
- package/dist/env/PythonDetector.js +182 -0
- package/dist/env/PythonDetector.js.map +1 -0
- package/dist/env/PythonProvisioner.d.ts +16 -0
- package/dist/env/PythonProvisioner.d.ts.map +1 -0
- package/dist/env/PythonProvisioner.js +42 -0
- package/dist/env/PythonProvisioner.js.map +1 -0
- package/dist/env/VenvManager.d.ts +55 -0
- package/dist/env/VenvManager.d.ts.map +1 -0
- package/dist/env/VenvManager.js +153 -0
- package/dist/env/VenvManager.js.map +1 -0
- package/dist/env/executables.d.ts +3 -0
- package/dist/env/executables.d.ts.map +1 -0
- package/dist/env/executables.js +14 -0
- package/dist/env/executables.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +393 -0
- package/dist/index.js.map +1 -0
- package/dist/native/NativeAddonLoader.d.ts +11 -0
- package/dist/native/NativeAddonLoader.d.ts.map +1 -0
- package/dist/native/NativeAddonLoader.js +75 -0
- package/dist/native/NativeAddonLoader.js.map +1 -0
- package/dist/plugins/Plugin.interface.d.ts +41 -0
- package/dist/plugins/Plugin.interface.d.ts.map +1 -0
- package/dist/plugins/Plugin.interface.js +12 -0
- package/dist/plugins/Plugin.interface.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +26 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +174 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.js +41 -0
- package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.js +57 -0
- package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.js +50 -0
- package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +12 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/serialization/DataFrameBridge.d.ts +141 -0
- package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
- package/dist/serialization/DataFrameBridge.js +355 -0
- package/dist/serialization/DataFrameBridge.js.map +1 -0
- package/dist/serialization/MsgPackSerializer.d.ts +45 -0
- package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
- package/dist/serialization/MsgPackSerializer.js +242 -0
- package/dist/serialization/MsgPackSerializer.js.map +1 -0
- package/dist/serialization/NumpyBridge.d.ts +96 -0
- package/dist/serialization/NumpyBridge.d.ts.map +1 -0
- package/dist/serialization/NumpyBridge.js +323 -0
- package/dist/serialization/NumpyBridge.js.map +1 -0
- package/dist/serialization/Serializer.d.ts +78 -0
- package/dist/serialization/Serializer.d.ts.map +1 -0
- package/dist/serialization/Serializer.js +281 -0
- package/dist/serialization/Serializer.js.map +1 -0
- package/dist/types/addon.d.ts +131 -0
- package/dist/types/addon.d.ts.map +1 -0
- package/dist/types/addon.js +32 -0
- package/dist/types/addon.js.map +1 -0
- package/dist/types/config.d.ts +233 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +60 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/python.d.ts +235 -0
- package/dist/types/python.d.ts.map +1 -0
- package/dist/types/python.js +7 -0
- package/dist/types/python.js.map +1 -0
- package/dist/utils/ErrorTranslator.d.ts +83 -0
- package/dist/utils/ErrorTranslator.d.ts.map +1 -0
- package/dist/utils/ErrorTranslator.js +210 -0
- package/dist/utils/ErrorTranslator.js.map +1 -0
- package/dist/utils/Locking.d.ts +3 -0
- package/dist/utils/Locking.d.ts.map +1 -0
- package/dist/utils/Locking.js +10 -0
- package/dist/utils/Locking.js.map +1 -0
- package/dist/utils/Logger.d.ts +27 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +115 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +43 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +143 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/package.json +92 -17
- package/python/ast_inspector.py +248 -0
- package/python/error_handler.py +432 -0
- package/python/isolated_worker.py +94 -0
- package/python/pynect_dispatcher.py +382 -0
- package/python/pynect_runtime.py +574 -0
- package/python/serializer.py +373 -0
- package/python/type_inspector.py +315 -0
- package/scripts/build-native.js +50 -0
- package/scripts/cli.js +21 -0
- package/scripts/ensure-native.js +85 -0
- package/scripts/postinstall.js +40 -0
- package/scripts/pyfig.js +113 -0
- package/scripts/python-provisioner.js +23 -0
- package/scripts/smoke-python-boundary.js +103 -0
- package/src/native/NativeAddonLoader.ts +98 -0
- package/src/native/gil_guard.cpp +25 -0
- package/src/native/gil_guard.h +174 -0
- package/src/native/pynect_addon.cpp +942 -0
- package/src/native/python_bridge.cpp +904 -0
- package/src/native/python_bridge.h +263 -0
- package/src/native/thread_pool.cpp +375 -0
- package/src/native/thread_pool.h +185 -0
- package/src/native/type_converter.cpp +906 -0
- package/src/native/type_converter.h +271 -0
- package/index.d.ts +0 -3
- package/index.js +0 -3
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadOrBuildNativeAddon = loadOrBuildNativeAddon;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
/**
|
|
11
|
+
* Load an addon built for the selected Python, compiling it through the active
|
|
12
|
+
* JavaScript runtime when no exact match exists.
|
|
13
|
+
*/
|
|
14
|
+
function loadOrBuildNativeAddon(options) {
|
|
15
|
+
let initialError = new Error('Native rebuild explicitly requested.');
|
|
16
|
+
if (process.env['PYNECT_FORCE_BUILD'] !== '1') {
|
|
17
|
+
try {
|
|
18
|
+
return loadMatchingLocalAddon(options);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
initialError = error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const packageRoot = path_1.default.resolve(__dirname, '..', '..');
|
|
25
|
+
const script = path_1.default.join(packageRoot, 'scripts', 'ensure-native.js');
|
|
26
|
+
const result = (0, child_process_1.spawnSync)(process.execPath, [script], {
|
|
27
|
+
cwd: packageRoot,
|
|
28
|
+
env: {
|
|
29
|
+
...process.env,
|
|
30
|
+
PYNECT_PROJECT_ROOT: options.projectRoot,
|
|
31
|
+
PYNECT_PYTHON: options.pythonExecutable,
|
|
32
|
+
},
|
|
33
|
+
stdio: 'inherit',
|
|
34
|
+
windowsHide: true,
|
|
35
|
+
});
|
|
36
|
+
if (result.error) {
|
|
37
|
+
throw new Error(`Could not launch the native builder with ${process.execPath}: ${result.error.message}`, { cause: initialError });
|
|
38
|
+
}
|
|
39
|
+
if (result.status !== 0) {
|
|
40
|
+
throw new Error(`Pynect could not load or build its native addon with ${process.execPath}. ` +
|
|
41
|
+
'Install a C++ toolchain or provide a compatible prebuilt addon.', { cause: initialError });
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return loadMatchingLocalAddon(options);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new Error('Pynect built the native addon, but the active runtime could not load it.', {
|
|
48
|
+
cause: error,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function loadMatchingLocalAddon(options) {
|
|
53
|
+
const packageRoot = path_1.default.resolve(__dirname, '..', '..');
|
|
54
|
+
const metadataPath = path_1.default.join(packageRoot, 'build', 'pynect-python.json');
|
|
55
|
+
let metadata;
|
|
56
|
+
try {
|
|
57
|
+
metadata = JSON.parse(fs_1.default.readFileSync(metadataPath, 'utf8'));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Native build metadata is unavailable at ${metadataPath}.`, { cause: error });
|
|
61
|
+
}
|
|
62
|
+
if (metadata.schemaVersion !== 1 ||
|
|
63
|
+
normalizePath(metadata.pythonExecutable) !== normalizePath(options.pythonExecutable)) {
|
|
64
|
+
throw new Error(`Native addon Python ${metadata.pythonExecutable} does not match selected Python ` +
|
|
65
|
+
`${options.pythonExecutable}.`);
|
|
66
|
+
}
|
|
67
|
+
const addonPath = path_1.default.join(packageRoot, 'build', metadata.buildType === 'Debug' ? 'Debug' : 'Release', 'pynect_addon.node');
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
69
|
+
return require(addonPath);
|
|
70
|
+
}
|
|
71
|
+
function normalizePath(value) {
|
|
72
|
+
const resolved = path_1.default.resolve(value);
|
|
73
|
+
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=NativeAddonLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeAddonLoader.js","sourceRoot":"","sources":["../../src/native/NativeAddonLoader.ts"],"names":[],"mappings":";;;;;AAcA,wDA2CC;AAzDD,gDAAwB;AACxB,4CAAoB;AACpB,iDAA0C;AAQ1C;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAgC;IACrE,IAAI,YAAY,GAAY,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,GAAG,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;QACnD,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,mBAAmB,EAAE,OAAO,CAAC,WAAW;YACxC,aAAa,EAAE,OAAO,CAAC,gBAAgB;SACxC;QACD,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,4CAA4C,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EACvF,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,wDAAwD,OAAO,CAAC,QAAQ,IAAI;YAC5E,iEAAiE,EACjE,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0EAA0E,EAAE;YAC1F,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAQD,SAAS,sBAAsB,CAAC,OAAgC;IAC9D,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC3E,IAAI,QAA6B,CAAC;IAClC,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAwB,CAAC;IACtF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,IACE,QAAQ,CAAC,aAAa,KAAK,CAAC;QAC5B,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,EACpF,CAAC;QACD,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,gBAAgB,kCAAkC;YAClF,GAAG,OAAO,CAAC,gBAAgB,GAAG,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CACzB,WAAW,EACX,OAAO,EACP,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACpD,mBAAmB,CACpB,CAAC;IACF,8DAA8D;IAC9D,OAAO,OAAO,CAAC,SAAS,CAAgB,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - Plugin Interface
|
|
3
|
+
*
|
|
4
|
+
* Every pynect plugin must implement this interface. Plugins can:
|
|
5
|
+
* - Transform Python object values as they cross the JS boundary
|
|
6
|
+
* - Register custom type mappings
|
|
7
|
+
* - Hook into lifecycle events (init, shutdown)
|
|
8
|
+
* - Add convenience methods to PyProxy instances
|
|
9
|
+
*/
|
|
10
|
+
import type { SerializedValue } from '../types/python';
|
|
11
|
+
export type PythonTypeName = string;
|
|
12
|
+
export interface PluginInitContext {
|
|
13
|
+
runtimeVersion: string;
|
|
14
|
+
pythonVersion: {
|
|
15
|
+
major: number;
|
|
16
|
+
minor: number;
|
|
17
|
+
patch: number;
|
|
18
|
+
};
|
|
19
|
+
registerTypeHandler(typeName: PythonTypeName, handler: TypeTransformHandler): void;
|
|
20
|
+
}
|
|
21
|
+
export type TypeTransformHandler = (raw: SerializedValue, typeHint: string, metadata: Record<string, unknown>) => unknown | null;
|
|
22
|
+
export interface PynectPlugin {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly version: string;
|
|
25
|
+
readonly supportedModules: readonly string[];
|
|
26
|
+
readonly handledTypes?: readonly PythonTypeName[];
|
|
27
|
+
readonly description?: string;
|
|
28
|
+
readonly homepage?: string;
|
|
29
|
+
onInit?(ctx: PluginInitContext): Promise<void> | void;
|
|
30
|
+
onShutdown?(): Promise<void> | void;
|
|
31
|
+
onModuleImported?(moduleName: string, moduleOid: number): Promise<void> | void;
|
|
32
|
+
transformResult?: TypeTransformHandler;
|
|
33
|
+
serializeValue?(value: unknown, targetTypeName?: string): SerializedValue | null;
|
|
34
|
+
}
|
|
35
|
+
export interface PluginRegistration {
|
|
36
|
+
plugin: PynectPlugin;
|
|
37
|
+
active: boolean;
|
|
38
|
+
loadedAt: number;
|
|
39
|
+
modulesBound: Set<string>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=Plugin.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.interface.d.ts","sourceRoot":"","sources":["../../src/plugins/Plugin.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpF;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,GAAG,EAAO,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,GAAG,IAAI,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAc,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAW,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAK,SAAS,cAAc,EAAE,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAS,MAAM,CAAC;IAElC,MAAM,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAwB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,IAA2C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,gBAAgB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE/E,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAQ,YAAY,CAAC;IAC3B,MAAM,EAAQ,OAAO,CAAC;IACtB,QAAQ,EAAM,MAAM,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - Plugin Interface
|
|
4
|
+
*
|
|
5
|
+
* Every pynect plugin must implement this interface. Plugins can:
|
|
6
|
+
* - Transform Python object values as they cross the JS boundary
|
|
7
|
+
* - Register custom type mappings
|
|
8
|
+
* - Hook into lifecycle events (init, shutdown)
|
|
9
|
+
* - Add convenience methods to PyProxy instances
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=Plugin.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.interface.js","sourceRoot":"","sources":["../../src/plugins/Plugin.interface.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - PluginManager
|
|
3
|
+
*
|
|
4
|
+
* Manages registration, lifecycle, and dispatch of pynect plugins.
|
|
5
|
+
* PyRuntime holds a single PluginManager instance.
|
|
6
|
+
*/
|
|
7
|
+
import type { PynectPlugin, PluginRegistration, PluginInitContext } from './Plugin.interface';
|
|
8
|
+
import type { SerializedValue } from '../types/python';
|
|
9
|
+
export declare class PluginManager {
|
|
10
|
+
private readonly _plugins;
|
|
11
|
+
private readonly _typeMap;
|
|
12
|
+
private readonly _moduleMap;
|
|
13
|
+
register(plugin: PynectPlugin): this;
|
|
14
|
+
registerBuiltins(): Promise<void>;
|
|
15
|
+
initAll(ctx: PluginInitContext): Promise<void>;
|
|
16
|
+
shutdownAll(): Promise<void>;
|
|
17
|
+
onModuleImported(moduleName: string, moduleOid: number): Promise<void>;
|
|
18
|
+
transformResult(value: SerializedValue, typeName: string, metadata?: Record<string, unknown>): unknown | null;
|
|
19
|
+
serializeValue(value: unknown, targetTypeName?: string): SerializedValue | null;
|
|
20
|
+
get names(): string[];
|
|
21
|
+
getPlugin(name: string): PluginRegistration | undefined;
|
|
22
|
+
get active(): PluginRegistration[];
|
|
23
|
+
get all(): PluginRegistration[];
|
|
24
|
+
isActive(name: string): boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=PluginManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../src/plugins/PluginManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EAGlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuD;IAChF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;IAIhE,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IA+B9B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5E,eAAe,CACb,KAAK,EAAK,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,GAAG,IAAI;IAajB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAe/E,IAAI,KAAK,IAAI,MAAM,EAAE,CAAsC;IAC3D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IACvD,IAAI,MAAM,IAAI,kBAAkB,EAAE,CAAgE;IAClG,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAwC;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAChC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PluginManager
|
|
4
|
+
*
|
|
5
|
+
* Manages registration, lifecycle, and dispatch of pynect plugins.
|
|
6
|
+
* PyRuntime holds a single PluginManager instance.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.PluginManager = void 0;
|
|
43
|
+
const Logger_1 = require("../utils/Logger");
|
|
44
|
+
const logger = new Logger_1.Logger('PluginManager');
|
|
45
|
+
class PluginManager {
|
|
46
|
+
_plugins = new Map();
|
|
47
|
+
_typeMap = new Map();
|
|
48
|
+
_moduleMap = new Map();
|
|
49
|
+
// Registration
|
|
50
|
+
register(plugin) {
|
|
51
|
+
if (this._plugins.has(plugin.name)) {
|
|
52
|
+
logger.debug(`Plugin already registered: ${plugin.name}; skipping`);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
const entry = {
|
|
56
|
+
plugin,
|
|
57
|
+
active: false,
|
|
58
|
+
loadedAt: Date.now(),
|
|
59
|
+
modulesBound: new Set(),
|
|
60
|
+
};
|
|
61
|
+
this._plugins.set(plugin.name, entry);
|
|
62
|
+
for (const typeName of plugin.handledTypes ?? []) {
|
|
63
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
64
|
+
if (plugin.transformResult) {
|
|
65
|
+
handlers.push(plugin.transformResult.bind(plugin));
|
|
66
|
+
}
|
|
67
|
+
this._typeMap.set(typeName, handlers);
|
|
68
|
+
}
|
|
69
|
+
for (const mod of plugin.supportedModules) {
|
|
70
|
+
const list = this._moduleMap.get(mod) ?? [];
|
|
71
|
+
list.push(plugin);
|
|
72
|
+
this._moduleMap.set(mod, list);
|
|
73
|
+
}
|
|
74
|
+
logger.debug(`Registered plugin: ${plugin.name} v${plugin.version}`);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
async registerBuiltins() {
|
|
78
|
+
const [{ PandasPlugin }, { NumpyPlugin }, { TorchPlugin }] = await Promise.all([
|
|
79
|
+
Promise.resolve().then(() => __importStar(require('./builtin/PandasPlugin'))),
|
|
80
|
+
Promise.resolve().then(() => __importStar(require('./builtin/NumpyPlugin'))),
|
|
81
|
+
Promise.resolve().then(() => __importStar(require('./builtin/TorchPlugin'))),
|
|
82
|
+
]);
|
|
83
|
+
this.register(new PandasPlugin());
|
|
84
|
+
this.register(new NumpyPlugin());
|
|
85
|
+
this.register(new TorchPlugin());
|
|
86
|
+
}
|
|
87
|
+
// Lifecycle
|
|
88
|
+
async initAll(ctx) {
|
|
89
|
+
const extCtx = {
|
|
90
|
+
...ctx,
|
|
91
|
+
registerTypeHandler: (typeName, handler) => {
|
|
92
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
93
|
+
handlers.push(handler);
|
|
94
|
+
this._typeMap.set(typeName, handlers);
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
for (const [name, entry] of this._plugins) {
|
|
98
|
+
try {
|
|
99
|
+
await entry.plugin.onInit?.(extCtx);
|
|
100
|
+
entry.active = true;
|
|
101
|
+
logger.debug(`Initialised plugin: ${name}`);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.warn(`Plugin ${name} init failed (non-fatal): ${err}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async shutdownAll() {
|
|
109
|
+
for (const [name, entry] of this._plugins) {
|
|
110
|
+
if (!entry.active) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await entry.plugin.onShutdown?.();
|
|
115
|
+
entry.active = false;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logger.warn(`Plugin ${name} shutdown error (non-fatal): ${err}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async onModuleImported(moduleName, moduleOid) {
|
|
123
|
+
const plugins = this._moduleMap.get(moduleName) ?? [];
|
|
124
|
+
for (const plugin of plugins) {
|
|
125
|
+
try {
|
|
126
|
+
await plugin.onModuleImported?.(moduleName, moduleOid);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
logger.warn(`Plugin ${plugin.name} onModuleImported error: ${err}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Transform chain
|
|
134
|
+
transformResult(value, typeName, metadata = {}) {
|
|
135
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
136
|
+
for (const handler of handlers) {
|
|
137
|
+
try {
|
|
138
|
+
const result = handler(value, typeName, metadata);
|
|
139
|
+
if (result !== null) {
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
logger.warn(`Type transform error for ${typeName}: ${err}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
serializeValue(value, targetTypeName) {
|
|
150
|
+
for (const [, entry] of this._plugins) {
|
|
151
|
+
if (!entry.active || !entry.plugin.serializeValue) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const result = entry.plugin.serializeValue(value, targetTypeName);
|
|
156
|
+
if (result !== null) {
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
logger.warn(`Plugin serialize error: ${err}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// Introspection
|
|
167
|
+
get names() { return [...this._plugins.keys()]; }
|
|
168
|
+
getPlugin(name) { return this._plugins.get(name); }
|
|
169
|
+
get active() { return [...this._plugins.values()].filter((e) => e.active); }
|
|
170
|
+
get all() { return [...this._plugins.values()]; }
|
|
171
|
+
isActive(name) { return this._plugins.get(name)?.active === true; }
|
|
172
|
+
}
|
|
173
|
+
exports.PluginManager = PluginManager;
|
|
174
|
+
//# sourceMappingURL=PluginManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginManager.js","sourceRoot":"","sources":["../../src/plugins/PluginManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - NumpyPlugin (built-in)
|
|
3
|
+
* Routes ndarray wire objects through NumpyBridge.
|
|
4
|
+
*/
|
|
5
|
+
import type { PynectPlugin, PluginInitContext } from '../Plugin.interface';
|
|
6
|
+
import type { SerializedValue, NumPyArrayResult } from '../../types/python';
|
|
7
|
+
export declare class NumpyPlugin implements PynectPlugin {
|
|
8
|
+
readonly name = "numpy";
|
|
9
|
+
readonly version = "1.0.0";
|
|
10
|
+
readonly description = "Enhanced NumPy ndarray -> TypedArray mapping";
|
|
11
|
+
readonly supportedModules: readonly ["numpy", "np"];
|
|
12
|
+
readonly handledTypes: readonly ["ndarray", "matrix", "MaskedArray"];
|
|
13
|
+
onInit(ctx: PluginInitContext): void;
|
|
14
|
+
transformResult(raw: SerializedValue, typeHint: string): NumPyArrayResult | null;
|
|
15
|
+
private _handle;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=NumpyPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumpyPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/builtin/NumpyPlugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO5E,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,WAAuB;IACpC,QAAQ,CAAC,OAAO,WAAoB;IACpC,QAAQ,CAAC,WAAW,kDAAuD;IAC3E,QAAQ,CAAC,gBAAgB,2BAA4B;IACrD,QAAQ,CAAC,YAAY,gDAAqD;IAE1E,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAKpC,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAKhF,OAAO,CAAC,OAAO;CAIhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - NumpyPlugin (built-in)
|
|
4
|
+
* Routes ndarray wire objects through NumpyBridge.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.NumpyPlugin = void 0;
|
|
8
|
+
const NumpyBridge_1 = require("../../serialization/NumpyBridge");
|
|
9
|
+
const Logger_1 = require("../../utils/Logger");
|
|
10
|
+
const logger = new Logger_1.Logger('NumpyPlugin');
|
|
11
|
+
const bridge = new NumpyBridge_1.NumpyBridge();
|
|
12
|
+
class NumpyPlugin {
|
|
13
|
+
name = 'numpy';
|
|
14
|
+
version = '1.0.0';
|
|
15
|
+
description = 'Enhanced NumPy ndarray -> TypedArray mapping';
|
|
16
|
+
supportedModules = ['numpy', 'np'];
|
|
17
|
+
handledTypes = ['ndarray', 'matrix', 'MaskedArray'];
|
|
18
|
+
onInit(ctx) {
|
|
19
|
+
for (const t of this.handledTypes) {
|
|
20
|
+
ctx.registerTypeHandler(t, this._handle.bind(this));
|
|
21
|
+
}
|
|
22
|
+
logger.debug('NumpyPlugin initialised');
|
|
23
|
+
}
|
|
24
|
+
transformResult(raw, typeHint) {
|
|
25
|
+
if (this.handledTypes.includes(typeHint)) {
|
|
26
|
+
return this._handle(raw, typeHint, {});
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
_handle(raw, _type, _meta) {
|
|
31
|
+
try {
|
|
32
|
+
return bridge.deserialize(raw);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
logger.warn(`ndarray deserialization error: ${err}`);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.NumpyPlugin = NumpyPlugin;
|
|
41
|
+
//# sourceMappingURL=NumpyPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumpyPlugin.js","sourceRoot":"","sources":["../../../src/plugins/builtin/NumpyPlugin.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,iEAA8D;AAC9D,+CAA4C;AAE5C,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,aAAa,CAAC,CAAC;AACzC,MAAM,MAAM,GAAG,IAAI,yBAAW,EAAE,CAAC;AAEjC,MAAa,WAAW;IACb,IAAI,GAAe,OAAO,CAAC;IAC3B,OAAO,GAAY,OAAO,CAAC;IAC3B,WAAW,GAAQ,8CAA8C,CAAC;IAClE,gBAAgB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAU,CAAC;IAC5C,YAAY,GAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;IAE1E,MAAM,CAAC,GAAsB;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAAA,GAAG,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAA,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAC,GAAoB,EAAE,QAAgB;QACpD,IAAK,IAAI,CAAC,YAAkC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAAA,CAAC;QAC1G,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO,CAAC,GAAoB,EAAE,KAAc,EAAE,KAA+B;QACnF,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACpF,CAAC;CACF;AArBD,kCAqBC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - PandasPlugin (built-in)
|
|
3
|
+
* Intercepts DataFrame/Series wire objects and routes through DataFrameBridge.
|
|
4
|
+
*/
|
|
5
|
+
import type { PynectPlugin, PluginInitContext } from '../Plugin.interface';
|
|
6
|
+
import type { SerializedValue, DataFrameResult, SeriesResult } from '../../types/python';
|
|
7
|
+
export declare class PandasPlugin implements PynectPlugin {
|
|
8
|
+
readonly name = "pandas";
|
|
9
|
+
readonly version = "1.0.0";
|
|
10
|
+
readonly description = "Enhanced pandas DataFrame and Series support";
|
|
11
|
+
readonly supportedModules: readonly ["pandas", "pd"];
|
|
12
|
+
readonly handledTypes: readonly ["DataFrame", "Series", "DataFrameGroupBy", "SeriesGroupBy"];
|
|
13
|
+
onInit(ctx: PluginInitContext): void;
|
|
14
|
+
onModuleImported(moduleName: string): void;
|
|
15
|
+
transformResult(raw: SerializedValue, typeHint: string): DataFrameResult | SeriesResult | null;
|
|
16
|
+
private _handleDF;
|
|
17
|
+
private _handleSeries;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=PandasPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PandasPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/builtin/PandasPlugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOzF,qBAAa,YAAa,YAAW,YAAY;IAC/C,QAAQ,CAAC,IAAI,YAAwB;IACrC,QAAQ,CAAC,OAAO,WAAoB;IACpC,QAAQ,CAAC,WAAW,kDAAuD;IAC3E,QAAQ,CAAC,gBAAgB,4BAA6B;IACtD,QAAQ,CAAC,YAAY,wEAA6E;IAElG,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAQpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI1C,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,YAAY,GAAG,IAAI;IAM9F,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,aAAa;CAItB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PandasPlugin (built-in)
|
|
4
|
+
* Intercepts DataFrame/Series wire objects and routes through DataFrameBridge.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PandasPlugin = void 0;
|
|
8
|
+
const DataFrameBridge_1 = require("../../serialization/DataFrameBridge");
|
|
9
|
+
const Logger_1 = require("../../utils/Logger");
|
|
10
|
+
const logger = new Logger_1.Logger('PandasPlugin');
|
|
11
|
+
const bridge = new DataFrameBridge_1.DataFrameBridge();
|
|
12
|
+
class PandasPlugin {
|
|
13
|
+
name = 'pandas';
|
|
14
|
+
version = '1.0.0';
|
|
15
|
+
description = 'Enhanced pandas DataFrame and Series support';
|
|
16
|
+
supportedModules = ['pandas', 'pd'];
|
|
17
|
+
handledTypes = ['DataFrame', 'Series', 'DataFrameGroupBy', 'SeriesGroupBy'];
|
|
18
|
+
onInit(ctx) {
|
|
19
|
+
ctx.registerTypeHandler('DataFrame', this._handleDF.bind(this));
|
|
20
|
+
ctx.registerTypeHandler('DataFrameGroupBy', this._handleDF.bind(this));
|
|
21
|
+
ctx.registerTypeHandler('Series', this._handleSeries.bind(this));
|
|
22
|
+
ctx.registerTypeHandler('SeriesGroupBy', this._handleSeries.bind(this));
|
|
23
|
+
logger.debug('PandasPlugin initialised');
|
|
24
|
+
}
|
|
25
|
+
onModuleImported(moduleName) {
|
|
26
|
+
logger.debug(`pandas module imported: ${moduleName}`);
|
|
27
|
+
}
|
|
28
|
+
transformResult(raw, typeHint) {
|
|
29
|
+
if (typeHint === 'DataFrame' || typeHint === 'DataFrameGroupBy') {
|
|
30
|
+
return this._handleDF(raw, typeHint, {});
|
|
31
|
+
}
|
|
32
|
+
if (typeHint === 'Series' || typeHint === 'SeriesGroupBy') {
|
|
33
|
+
return this._handleSeries(raw, typeHint, {});
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
_handleDF(raw, _typeHint, _meta) {
|
|
38
|
+
try {
|
|
39
|
+
return bridge.deserializeDataFrame(raw);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
logger.warn(`DataFrame deserialization error: ${err}`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
_handleSeries(raw, _typeHint, _meta) {
|
|
47
|
+
try {
|
|
48
|
+
return bridge.deserializeSeries(raw);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
logger.warn(`Series deserialization error: ${err}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.PandasPlugin = PandasPlugin;
|
|
57
|
+
//# sourceMappingURL=PandasPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PandasPlugin.js","sourceRoot":"","sources":["../../../src/plugins/builtin/PandasPlugin.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,yEAAsE;AACtE,+CAA4C;AAE5C,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,cAAc,CAAC,CAAC;AAC1C,MAAM,MAAM,GAAG,IAAI,iCAAe,EAAE,CAAC;AAErC,MAAa,YAAY;IACd,IAAI,GAAe,QAAQ,CAAC;IAC5B,OAAO,GAAY,OAAO,CAAC;IAC3B,WAAW,GAAQ,8CAA8C,CAAC;IAClE,gBAAgB,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAU,CAAC;IAC7C,YAAY,GAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAU,CAAC;IAElG,MAAM,CAAC,GAAsB;QAC3B,GAAG,CAAC,mBAAmB,CAAC,WAAW,EAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAY,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,GAAG,CAAC,mBAAmB,CAAC,eAAe,EAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,UAAkB;QACjC,MAAM,CAAC,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,eAAe,CAAC,GAAoB,EAAE,QAAgB;QACpD,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAAA,CAAC;QAC5G,IAAI,QAAQ,KAAK,QAAQ,IAAM,QAAQ,KAAK,eAAe,EAAK,CAAC;YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAAA,CAAC;QAC/G,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,GAAoB,EAAE,SAAkB,EAAE,KAA+B;QACzF,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAChD,OAAO,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACtF,CAAC;IAEO,aAAa,CAAC,GAAoB,EAAE,SAAkB,EAAE,KAA+B;QAC7F,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACnF,CAAC;CACF;AAlCD,oCAkCC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - TorchPlugin (built-in)
|
|
3
|
+
* Handles PyTorch Tensor objects - delegates to NumpyBridge (tensors are NumPy-compatible).
|
|
4
|
+
*/
|
|
5
|
+
import type { PynectPlugin, PluginInitContext } from '../Plugin.interface';
|
|
6
|
+
import type { SerializedValue, NumPyArrayResult } from '../../types/python';
|
|
7
|
+
export type TensorResult = NumPyArrayResult & {
|
|
8
|
+
requiresGrad: boolean;
|
|
9
|
+
isCuda: boolean;
|
|
10
|
+
device: string;
|
|
11
|
+
gradFn: string | null;
|
|
12
|
+
};
|
|
13
|
+
export declare class TorchPlugin implements PynectPlugin {
|
|
14
|
+
readonly name = "torch";
|
|
15
|
+
readonly version = "1.0.0";
|
|
16
|
+
readonly description = "Enhanced PyTorch Tensor support";
|
|
17
|
+
readonly supportedModules: readonly ["torch"];
|
|
18
|
+
readonly handledTypes: readonly ["Tensor"];
|
|
19
|
+
onInit(ctx: PluginInitContext): void;
|
|
20
|
+
transformResult(raw: SerializedValue, typeHint: string, meta: Record<string, unknown>): TensorResult | null;
|
|
21
|
+
private _handle;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=TorchPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TorchPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/builtin/TorchPlugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO5E,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAQ,OAAO,CAAC;IACtB,MAAM,EAAQ,MAAM,CAAC;IACrB,MAAM,EAAQ,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAA;AAED,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,WAAuB;IACpC,QAAQ,CAAC,OAAO,WAAoB;IACpC,QAAQ,CAAC,WAAW,qCAA0C;IAC9D,QAAQ,CAAC,gBAAgB,qBAAsB;IAC/C,QAAQ,CAAC,YAAY,sBAA2B;IAEhD,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAKpC,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,GAAG,IAAI;IAI3G,OAAO,CAAC,OAAO;CAkBhB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - TorchPlugin (built-in)
|
|
4
|
+
* Handles PyTorch Tensor objects - delegates to NumpyBridge (tensors are NumPy-compatible).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TorchPlugin = void 0;
|
|
8
|
+
const NumpyBridge_1 = require("../../serialization/NumpyBridge");
|
|
9
|
+
const Logger_1 = require("../../utils/Logger");
|
|
10
|
+
const logger = new Logger_1.Logger('TorchPlugin');
|
|
11
|
+
const bridge = new NumpyBridge_1.NumpyBridge();
|
|
12
|
+
class TorchPlugin {
|
|
13
|
+
name = 'torch';
|
|
14
|
+
version = '1.0.0';
|
|
15
|
+
description = 'Enhanced PyTorch Tensor support';
|
|
16
|
+
supportedModules = ['torch'];
|
|
17
|
+
handledTypes = ['Tensor'];
|
|
18
|
+
onInit(ctx) {
|
|
19
|
+
ctx.registerTypeHandler('Tensor', this._handle.bind(this));
|
|
20
|
+
logger.debug('TorchPlugin initialised');
|
|
21
|
+
}
|
|
22
|
+
transformResult(raw, typeHint, meta) {
|
|
23
|
+
return typeHint === 'Tensor' ? this._handle(raw, typeHint, meta) : null;
|
|
24
|
+
}
|
|
25
|
+
_handle(raw, _t, meta) {
|
|
26
|
+
try {
|
|
27
|
+
const base = bridge.deserialize(raw);
|
|
28
|
+
if (!base) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const isCuda = Boolean(meta?.['isCuda']);
|
|
32
|
+
if (isCuda) {
|
|
33
|
+
logger.warn('CUDA Tensor: data was copied to CPU for transfer.');
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...base,
|
|
37
|
+
requiresGrad: Boolean(meta?.['requiresGrad']),
|
|
38
|
+
isCuda,
|
|
39
|
+
device: String(meta?.['device'] ?? 'cpu'),
|
|
40
|
+
gradFn: meta?.['gradFn'] !== null && meta?.['gradFn'] !== undefined ? String(meta?.['gradFn']) : null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
logger.warn(`Tensor deserialization error: ${err}`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.TorchPlugin = TorchPlugin;
|
|
50
|
+
//# sourceMappingURL=TorchPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TorchPlugin.js","sourceRoot":"","sources":["../../../src/plugins/builtin/TorchPlugin.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,iEAA8D;AAC9D,+CAA4C;AAE5C,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,aAAa,CAAC,CAAC;AACzC,MAAM,MAAM,GAAG,IAAI,yBAAW,EAAE,CAAC;AASjC,MAAa,WAAW;IACb,IAAI,GAAe,OAAO,CAAC;IAC3B,OAAO,GAAY,OAAO,CAAC;IAC3B,WAAW,GAAQ,iCAAiC,CAAC;IACrD,gBAAgB,GAAG,CAAC,OAAO,CAAU,CAAC;IACtC,YAAY,GAAO,CAAC,QAAQ,CAAU,CAAC;IAEhD,MAAM,CAAC,GAAsB;QAC3B,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAC,GAAoB,EAAE,QAAgB,EAAE,IAA6B;QACnF,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAEO,OAAO,CAAC,GAAoB,EAAE,EAAW,EAAE,IAA8B;QAC/E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAA,OAAO,IAAI,CAAC;YAAA,CAAC;YACzB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBAAA,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAAA,CAAC;YAC/E,OAAO;gBACL,GAAG,IAAI;gBACP,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC;gBAC7C,MAAM;gBACN,MAAM,EAAG,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAC1C,MAAM,EAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;aACvF,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAlCD,kCAkCC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { PynectPlugin, PluginRegistration, PluginInitContext, TypeTransformHandler, PythonTypeName } from './Plugin.interface';
|
|
2
|
+
export { PluginManager } from './PluginManager';
|
|
3
|
+
export { PandasPlugin } from './builtin/PandasPlugin';
|
|
4
|
+
export { NumpyPlugin } from './builtin/NumpyPlugin';
|
|
5
|
+
export { TorchPlugin } from './builtin/TorchPlugin';
|
|
6
|
+
export type { TensorResult } from './builtin/TorchPlugin';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAO,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAO,uBAAuB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TorchPlugin = exports.NumpyPlugin = exports.PandasPlugin = exports.PluginManager = void 0;
|
|
4
|
+
var PluginManager_1 = require("./PluginManager");
|
|
5
|
+
Object.defineProperty(exports, "PluginManager", { enumerable: true, get: function () { return PluginManager_1.PluginManager; } });
|
|
6
|
+
var PandasPlugin_1 = require("./builtin/PandasPlugin");
|
|
7
|
+
Object.defineProperty(exports, "PandasPlugin", { enumerable: true, get: function () { return PandasPlugin_1.PandasPlugin; } });
|
|
8
|
+
var NumpyPlugin_1 = require("./builtin/NumpyPlugin");
|
|
9
|
+
Object.defineProperty(exports, "NumpyPlugin", { enumerable: true, get: function () { return NumpyPlugin_1.NumpyPlugin; } });
|
|
10
|
+
var TorchPlugin_1 = require("./builtin/TorchPlugin");
|
|
11
|
+
Object.defineProperty(exports, "TorchPlugin", { enumerable: true, get: function () { return TorchPlugin_1.TorchPlugin; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":";;;AACA,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,uDAAsD;AAA7C,4GAAA,YAAY,OAAA;AACrB,qDAAqD;AAA5C,0GAAA,WAAW,OAAA;AACpB,qDAAqD;AAA5C,0GAAA,WAAW,OAAA"}
|