@viraatdas/rudder 2.10.18 → 2.10.20

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.
@@ -1 +1,4 @@
1
+ export declare function nativePlatformKey(platform?: NodeJS.Platform, arch?: NodeJS.Architecture): string;
1
2
  export declare function resolveNativeBinaryPath(): string | undefined;
3
+ export declare function resolveNativeBinaryPathFrom(moduleDir: string, platform?: NodeJS.Platform, arch?: NodeJS.Architecture): string | undefined;
4
+ export declare function isUsableNativeBinary(file: string, platform?: NodeJS.Platform, arch?: NodeJS.Architecture): boolean;
@@ -1,16 +1,27 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- const nativeBinaryName = "rudder-native";
4
+ const nativeBinaryBaseName = "rudder-native";
5
+ export function nativePlatformKey(platform = process.platform, arch = process.arch) {
6
+ return `${platform}-${arch}`;
7
+ }
5
8
  export function resolveNativeBinaryPath() {
6
9
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
10
+ return resolveNativeBinaryPathFrom(moduleDir);
11
+ }
12
+ export function resolveNativeBinaryPathFrom(moduleDir, platform = process.platform, arch = process.arch) {
13
+ const nativeBinaryName = platform === "win32" ? `${nativeBinaryBaseName}.exe` : nativeBinaryBaseName;
7
14
  const candidates = [
15
+ path.resolve(moduleDir, "native", nativePlatformKey(platform, arch), nativeBinaryName),
16
+ // Legacy package layout. Keep it as a fallback for local checkouts, but only
17
+ // if the file header matches this host so a macOS binary is never launched
18
+ // on Linux as /bin/sh input.
8
19
  path.resolve(moduleDir, "native", nativeBinaryName),
9
20
  path.resolve(moduleDir, "..", "target", "release", nativeBinaryName),
10
21
  path.resolve(moduleDir, "..", "native", "target", "release", nativeBinaryName),
11
22
  ];
12
23
  for (const candidate of candidates) {
13
- if (isExecutableFile(candidate)) {
24
+ if (isExecutableFile(candidate) && isUsableNativeBinary(candidate, platform, arch)) {
14
25
  return candidate;
15
26
  }
16
27
  }
@@ -25,4 +36,105 @@ function isExecutableFile(file) {
25
36
  return false;
26
37
  }
27
38
  }
39
+ export function isUsableNativeBinary(file, platform = process.platform, arch = process.arch) {
40
+ if (process.env.RUDDER_SKIP_NATIVE_BINARY_CHECK === "1") {
41
+ return true;
42
+ }
43
+ let header;
44
+ try {
45
+ header = fs.readFileSync(file);
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ if (platform === "linux") {
51
+ return isElfForArch(header, arch);
52
+ }
53
+ if (platform === "darwin") {
54
+ return isMachOForArch(header, arch);
55
+ }
56
+ if (platform === "win32") {
57
+ return header.length >= 2 && header[0] === 0x4d && header[1] === 0x5a;
58
+ }
59
+ return true;
60
+ }
61
+ function isElfForArch(header, arch) {
62
+ if (header.length < 20 || header[0] !== 0x7f || header[1] !== 0x45 || header[2] !== 0x4c || header[3] !== 0x46) {
63
+ return false;
64
+ }
65
+ const elfClass = header[4];
66
+ const littleEndian = header[5] !== 2;
67
+ const machine = littleEndian ? header.readUInt16LE(18) : header.readUInt16BE(18);
68
+ const expected = elfMachineForArch(arch);
69
+ if (expected === undefined) {
70
+ return true;
71
+ }
72
+ if ((arch === "x64" || arch === "arm64") && elfClass !== 2) {
73
+ return false;
74
+ }
75
+ return machine === expected;
76
+ }
77
+ function elfMachineForArch(arch) {
78
+ switch (arch) {
79
+ case "x64":
80
+ return 62;
81
+ case "arm64":
82
+ return 183;
83
+ case "arm":
84
+ return 40;
85
+ case "ia32":
86
+ return 3;
87
+ default:
88
+ return undefined;
89
+ }
90
+ }
91
+ function isMachOForArch(header, arch) {
92
+ if (header.length < 8) {
93
+ return false;
94
+ }
95
+ const expected = machCpuTypeForArch(arch);
96
+ const magicLe = header.readUInt32LE(0);
97
+ const magicBe = header.readUInt32BE(0);
98
+ const thinLe = magicLe === 0xfeedface || magicLe === 0xfeedfacf;
99
+ const thinBe = magicBe === 0xfeedface || magicBe === 0xfeedfacf;
100
+ if (thinLe || thinBe) {
101
+ if (expected === undefined) {
102
+ return true;
103
+ }
104
+ const cpuType = thinLe ? header.readInt32LE(4) : header.readInt32BE(4);
105
+ return cpuType === expected;
106
+ }
107
+ const fatBe = magicBe === 0xcafebabe || magicBe === 0xcafebabf;
108
+ if (fatBe) {
109
+ if (expected === undefined) {
110
+ return true;
111
+ }
112
+ const archCount = Math.min(header.readUInt32BE(4), 32);
113
+ const entrySize = magicBe === 0xcafebabf ? 32 : 20;
114
+ for (let index = 0; index < archCount; index += 1) {
115
+ const offset = 8 + index * entrySize;
116
+ if (header.length < offset + 4) {
117
+ return false;
118
+ }
119
+ if (header.readInt32BE(offset) === expected) {
120
+ return true;
121
+ }
122
+ }
123
+ }
124
+ return false;
125
+ }
126
+ function machCpuTypeForArch(arch) {
127
+ switch (arch) {
128
+ case "x64":
129
+ return 0x01000007;
130
+ case "arm64":
131
+ return 0x0100000c;
132
+ case "arm":
133
+ return 12;
134
+ case "ia32":
135
+ return 7;
136
+ default:
137
+ return undefined;
138
+ }
139
+ }
28
140
  //# sourceMappingURL=native-binary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"native-binary.js","sourceRoot":"","sources":["../src/native-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,UAAU,uBAAuB;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC;KAC/E,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"native-binary.js","sourceRoot":"","sources":["../src/native-binary.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viraatdas/rudder",
3
- "version": "2.10.18",
3
+ "version": "2.10.20",
4
4
  "description": "A Claude Code-style terminal app for running coding agents with worktree-isolated runs.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://rudder.viraat.dev",
@@ -20,7 +20,7 @@
20
20
  "check": "tsc -p tsconfig.json --noEmit",
21
21
  "test": "tsc -p tsconfig.json && npm run chmod-cli && node --test tests/*.test.mjs",
22
22
  "test:worker-scroll": "cargo test --manifest-path native/Cargo.toml top_origin_scroll_region_history_scrolls_like_terminal_scrollback && cargo test --manifest-path native/Cargo.toml worker_wheel && cargo test --manifest-path native/Cargo.toml wheel_scroll && cargo test --manifest-path native/Cargo.toml worker_page && cargo test --manifest-path native/Cargo.toml codex_alternate_screen_page_key",
23
- "copy-native": "node -e \"const fs=require('fs');const path=require('path');const sources=[path.join('target','release','rudder-native'),path.join('native','target','release','rudder-native')];const src=sources.find((candidate)=>fs.existsSync(candidate));const dest=path.join('dist','native','rudder-native');if(src){fs.mkdirSync(path.dirname(dest),{recursive:true});fs.copyFileSync(src,dest);fs.chmodSync(dest,0o755);}else if(fs.existsSync(dest)){fs.unlinkSync(dest);}\"",
23
+ "copy-native": "node scripts/copy-native.mjs",
24
24
  "chmod-cli": "node -e \"require('fs').chmodSync('dist/index.js',0o755)\"",
25
25
  "prepack": "npm run build",
26
26
  "postinstall": "node scripts/postinstall.mjs",
@@ -29,6 +29,7 @@
29
29
  "files": [
30
30
  "dist/",
31
31
  "assets/",
32
+ "scripts/copy-native.mjs",
32
33
  "scripts/postinstall.mjs",
33
34
  "README.md",
34
35
  "package.json"
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ const nativeBinaryBase = "rudder-native";
6
+ const nativeBinaryName = process.platform === "win32" ? `${nativeBinaryBase}.exe` : nativeBinaryBase;
7
+ const platformKey = `${process.platform}-${process.arch}`;
8
+ const distNativeDir = path.join("dist", "native");
9
+
10
+ function copyExecutable(src, dest) {
11
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
12
+ fs.copyFileSync(src, dest);
13
+ if (process.platform !== "win32") {
14
+ fs.chmodSync(dest, 0o755);
15
+ }
16
+ }
17
+
18
+ function copyCurrentBuild() {
19
+ const sources = [
20
+ path.join("target", "release", nativeBinaryName),
21
+ path.join("native", "target", "release", nativeBinaryName),
22
+ ];
23
+ const src = sources.find((candidate) => fs.existsSync(candidate));
24
+ if (!src) {
25
+ return false;
26
+ }
27
+ copyExecutable(src, path.join(distNativeDir, platformKey, nativeBinaryName));
28
+ return true;
29
+ }
30
+
31
+ function copyPrebuiltArtifacts() {
32
+ const root = process.env.RUDDER_NATIVE_PREBUILTS;
33
+ if (!root || !fs.existsSync(root)) {
34
+ return 0;
35
+ }
36
+ let copied = 0;
37
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
38
+ if (!entry.isDirectory()) {
39
+ continue;
40
+ }
41
+ const key = entry.name.replace(/^rudder-native-/, "");
42
+ const dir = path.join(root, entry.name);
43
+ const candidates = [
44
+ path.join(dir, "rudder-native"),
45
+ path.join(dir, "rudder-native.exe"),
46
+ path.join(dir, key, "rudder-native"),
47
+ path.join(dir, key, "rudder-native.exe"),
48
+ path.join(dir, "native-dist", key, "rudder-native"),
49
+ path.join(dir, "native-dist", key, "rudder-native.exe"),
50
+ ];
51
+ const src = candidates.find((candidate) => fs.existsSync(candidate)) ?? findNestedNativeBinary(dir);
52
+ if (!src) {
53
+ continue;
54
+ }
55
+ const name = src.endsWith(".exe") ? "rudder-native.exe" : "rudder-native";
56
+ copyExecutable(src, path.join(distNativeDir, key, name));
57
+ copied += 1;
58
+ }
59
+ return copied;
60
+ }
61
+
62
+ function findNestedNativeBinary(dir) {
63
+ const pending = [{ dir, depth: 0 }];
64
+ while (pending.length > 0) {
65
+ const current = pending.pop();
66
+ if (!current || current.depth > 4) {
67
+ continue;
68
+ }
69
+ for (const entry of fs.readdirSync(current.dir, { withFileTypes: true })) {
70
+ const full = path.join(current.dir, entry.name);
71
+ if (entry.isFile() && (entry.name === "rudder-native" || entry.name === "rudder-native.exe")) {
72
+ return full;
73
+ }
74
+ if (entry.isDirectory()) {
75
+ pending.push({ dir: full, depth: current.depth + 1 });
76
+ }
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+
82
+ function removeLegacyFlatBinary() {
83
+ fs.rmSync(path.join(distNativeDir, "rudder-native"), { force: true });
84
+ fs.rmSync(path.join(distNativeDir, "rudder-native.exe"), { force: true });
85
+ }
86
+
87
+ copyCurrentBuild();
88
+ copyPrebuiltArtifacts();
89
+ removeLegacyFlatBinary();