2025-07-04 14:42:33 -07:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Brainy CLI Wrapper
|
|
|
|
|
* This script patches the global object to fix TextEncoder issues before loading the CLI
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
console.log('Brainy running in Node.js environment')
|
|
|
|
|
|
|
|
|
|
// Define a custom PlatformNode class that doesn't rely on this.util.TextEncoder
|
|
|
|
|
if (
|
|
|
|
|
typeof global !== 'undefined' &&
|
|
|
|
|
typeof process !== 'undefined' &&
|
|
|
|
|
process.versions &&
|
|
|
|
|
process.versions.node
|
|
|
|
|
) {
|
|
|
|
|
try {
|
|
|
|
|
// Define a PlatformNode class that uses the global TextEncoder/TextDecoder directly
|
|
|
|
|
class PlatformNode {
|
|
|
|
|
constructor() {
|
2025-07-11 11:11:56 -07:00
|
|
|
// Create a util object with necessary methods
|
|
|
|
|
this.util = {
|
|
|
|
|
// Add isFloat32Array and isTypedArray directly to util
|
|
|
|
|
isFloat32Array: (arr) => {
|
|
|
|
|
return !!(
|
|
|
|
|
arr instanceof Float32Array ||
|
|
|
|
|
(arr &&
|
|
|
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
|
|
|
)
|
|
|
|
|
},
|
|
|
|
|
isTypedArray: (arr) => {
|
|
|
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
|
|
|
},
|
|
|
|
|
// Use native TextEncoder and TextDecoder
|
|
|
|
|
TextEncoder: TextEncoder,
|
|
|
|
|
TextDecoder: TextDecoder
|
|
|
|
|
}
|
2025-07-04 14:42:33 -07:00
|
|
|
|
2025-07-11 11:11:56 -07:00
|
|
|
// Initialize TextEncoder/TextDecoder instances
|
2025-07-04 14:42:33 -07:00
|
|
|
this.textEncoder = new TextEncoder()
|
|
|
|
|
this.textDecoder = new TextDecoder()
|
|
|
|
|
}
|
2025-07-07 10:19:04 -07:00
|
|
|
|
|
|
|
|
// Define isFloat32Array directly on the instance
|
|
|
|
|
isFloat32Array(arr) {
|
|
|
|
|
return !!(
|
|
|
|
|
arr instanceof Float32Array ||
|
|
|
|
|
(arr &&
|
|
|
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Define isTypedArray directly on the instance
|
|
|
|
|
isTypedArray(arr) {
|
|
|
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
|
|
|
}
|
2025-07-04 14:42:33 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Assign the PlatformNode class to the global object
|
|
|
|
|
global.PlatformNode = PlatformNode
|
|
|
|
|
|
|
|
|
|
// Also create an instance and assign it to global.platformNode (lowercase p)
|
|
|
|
|
global.platformNode = new PlatformNode()
|
2025-07-11 11:11:56 -07:00
|
|
|
|
|
|
|
|
// Ensure global.util exists and has the necessary methods
|
|
|
|
|
// This is needed because TensorFlow.js might look for these methods in global.util
|
|
|
|
|
if (!global.util) {
|
|
|
|
|
global.util = {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add isFloat32Array method if it doesn't exist
|
|
|
|
|
if (!global.util.isFloat32Array) {
|
|
|
|
|
global.util.isFloat32Array = (arr) => {
|
|
|
|
|
return !!(
|
|
|
|
|
arr instanceof Float32Array ||
|
|
|
|
|
(arr &&
|
|
|
|
|
Object.prototype.toString.call(arr) === '[object Float32Array]')
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add isTypedArray method if it doesn't exist
|
|
|
|
|
if (!global.util.isTypedArray) {
|
|
|
|
|
global.util.isTypedArray = (arr) => {
|
|
|
|
|
return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView))
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-04 14:42:33 -07:00
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('Failed to define global PlatformNode class:', error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Now load and run the actual CLI
|
|
|
|
|
import('./dist/cli.js').catch((err) => {
|
|
|
|
|
console.error('Error loading CLI:', err)
|
|
|
|
|
process.exit(1)
|
|
|
|
|
})
|