@exla/rudder 0.0.0-stage → 3.4.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.
- package/LICENSE +100 -0
- package/README.md +733 -2
- package/assets/rudder.icns +0 -0
- package/assets/sounds/NOTICE.md +8 -0
- package/assets/sounds/ping.mp3 +0 -0
- package/dist/agent-attention.d.ts +5 -0
- package/dist/agent-attention.js +54 -0
- package/dist/agent-attention.js.map +1 -0
- package/dist/analytics.d.ts +36 -0
- package/dist/analytics.js +178 -0
- package/dist/analytics.js.map +1 -0
- package/dist/attach-session.d.ts +91 -0
- package/dist/attach-session.js +290 -0
- package/dist/attach-session.js.map +1 -0
- package/dist/auth.d.ts +36 -0
- package/dist/auth.js +397 -0
- package/dist/auth.js.map +1 -0
- package/dist/backends.d.ts +3 -0
- package/dist/backends.js +638 -0
- package/dist/backends.js.map +1 -0
- package/dist/board/board.css +1 -0
- package/dist/board/board.js +2 -0
- package/dist/board/daemon.d.ts +39 -0
- package/dist/board/daemon.js +1510 -0
- package/dist/board/daemon.js.map +1 -0
- package/dist/brain.d.ts +24 -0
- package/dist/brain.js +244 -0
- package/dist/brain.js.map +1 -0
- package/dist/bus.d.ts +9 -0
- package/dist/bus.js +23 -0
- package/dist/bus.js.map +1 -0
- package/dist/checkout-sync.d.ts +35 -0
- package/dist/checkout-sync.js +247 -0
- package/dist/checkout-sync.js.map +1 -0
- package/dist/cloud.d.ts +51 -0
- package/dist/cloud.js +4672 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codex-binary.d.ts +12 -0
- package/dist/codex-binary.js +184 -0
- package/dist/codex-binary.js.map +1 -0
- package/dist/context-audit.d.ts +21 -0
- package/dist/context-audit.js +109 -0
- package/dist/context-audit.js.map +1 -0
- package/dist/daemon.d.ts +27 -0
- package/dist/daemon.js +203 -0
- package/dist/daemon.js.map +1 -0
- package/dist/effort.d.ts +9 -0
- package/dist/effort.js +72 -0
- package/dist/effort.js.map +1 -0
- package/dist/feedback.d.ts +46 -0
- package/dist/feedback.js +173 -0
- package/dist/feedback.js.map +1 -0
- package/dist/gc.d.ts +3 -0
- package/dist/gc.js +262 -0
- package/dist/gc.js.map +1 -0
- package/dist/git.d.ts +31 -0
- package/dist/git.js +455 -0
- package/dist/git.js.map +1 -0
- package/dist/goal.d.ts +33 -0
- package/dist/goal.js +95 -0
- package/dist/goal.js.map +1 -0
- package/dist/graph.d.ts +93 -0
- package/dist/graph.js +372 -0
- package/dist/graph.js.map +1 -0
- package/dist/handoff.d.ts +110 -0
- package/dist/handoff.js +565 -0
- package/dist/handoff.js.map +1 -0
- package/dist/improve/advisor.d.ts +10 -0
- package/dist/improve/advisor.js +115 -0
- package/dist/improve/advisor.js.map +1 -0
- package/dist/improve/collect.d.ts +49 -0
- package/dist/improve/collect.js +274 -0
- package/dist/improve/collect.js.map +1 -0
- package/dist/improve/gate.d.ts +17 -0
- package/dist/improve/gate.js +60 -0
- package/dist/improve/gate.js.map +1 -0
- package/dist/improve/index.d.ts +9 -0
- package/dist/improve/index.js +376 -0
- package/dist/improve/index.js.map +1 -0
- package/dist/improve/judge.d.ts +32 -0
- package/dist/improve/judge.js +114 -0
- package/dist/improve/judge.js.map +1 -0
- package/dist/improve/mine.d.ts +31 -0
- package/dist/improve/mine.js +192 -0
- package/dist/improve/mine.js.map +1 -0
- package/dist/improve/propose.d.ts +51 -0
- package/dist/improve/propose.js +150 -0
- package/dist/improve/propose.js.map +1 -0
- package/dist/improve/rank.d.ts +16 -0
- package/dist/improve/rank.js +49 -0
- package/dist/improve/rank.js.map +1 -0
- package/dist/improve/schedule.d.ts +1 -0
- package/dist/improve/schedule.js +95 -0
- package/dist/improve/schedule.js.map +1 -0
- package/dist/improve/ship.d.ts +25 -0
- package/dist/improve/ship.js +82 -0
- package/dist/improve/ship.js.map +1 -0
- package/dist/improve/state.d.ts +157 -0
- package/dist/improve/state.js +264 -0
- package/dist/improve/state.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/jj-binary.d.ts +36 -0
- package/dist/jj-binary.js +143 -0
- package/dist/jj-binary.js.map +1 -0
- package/dist/jj.d.ts +163 -0
- package/dist/jj.js +926 -0
- package/dist/jj.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +110 -0
- package/dist/logger.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +1366 -0
- package/dist/main.js.map +1 -0
- package/dist/migration.d.ts +82 -0
- package/dist/migration.js +198 -0
- package/dist/migration.js.map +1 -0
- package/dist/models.d.ts +9 -0
- package/dist/models.js +623 -0
- package/dist/models.js.map +1 -0
- package/dist/move-home.d.ts +82 -0
- package/dist/move-home.js +472 -0
- package/dist/move-home.js.map +1 -0
- package/dist/native/darwin-arm64/rudder-native +0 -0
- package/dist/native/darwin-x64/rudder-native +0 -0
- package/dist/native/linux-x64/rudder-native +0 -0
- package/dist/native-agents.d.ts +8 -0
- package/dist/native-agents.js +178 -0
- package/dist/native-agents.js.map +1 -0
- package/dist/native-binary.d.ts +4 -0
- package/dist/native-binary.js +140 -0
- package/dist/native-binary.js.map +1 -0
- package/dist/onboarding.d.ts +11 -0
- package/dist/onboarding.js +111 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/paste-bridge.d.ts +36 -0
- package/dist/paste-bridge.js +279 -0
- package/dist/paste-bridge.js.map +1 -0
- package/dist/plan-mode.d.ts +2 -0
- package/dist/plan-mode.js +22 -0
- package/dist/plan-mode.js.map +1 -0
- package/dist/planner.d.ts +27 -0
- package/dist/planner.js +587 -0
- package/dist/planner.js.map +1 -0
- package/dist/predict.d.ts +67 -0
- package/dist/predict.js +369 -0
- package/dist/predict.js.map +1 -0
- package/dist/qr.d.ts +13 -0
- package/dist/qr.js +377 -0
- package/dist/qr.js.map +1 -0
- package/dist/report.d.ts +74 -0
- package/dist/report.js +412 -0
- package/dist/report.js.map +1 -0
- package/dist/rudder-md.d.ts +33 -0
- package/dist/rudder-md.js +142 -0
- package/dist/rudder-md.js.map +1 -0
- package/dist/run-manager.d.ts +62 -0
- package/dist/run-manager.js +1400 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/scheduler.d.ts +128 -0
- package/dist/scheduler.js +955 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/state.d.ts +127 -0
- package/dist/state.js +704 -0
- package/dist/state.js.map +1 -0
- package/dist/surfaces.d.ts +91 -0
- package/dist/surfaces.js +460 -0
- package/dist/surfaces.js.map +1 -0
- package/dist/task-summary.d.ts +30 -0
- package/dist/task-summary.js +472 -0
- package/dist/task-summary.js.map +1 -0
- package/dist/types.d.ts +492 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usage.d.ts +198 -0
- package/dist/usage.js +830 -0
- package/dist/usage.js.map +1 -0
- package/dist/util.d.ts +73 -0
- package/dist/util.js +399 -0
- package/dist/util.js.map +1 -0
- package/dist/version-check.d.ts +16 -0
- package/dist/version-check.js +269 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +68 -4
- package/scripts/copy-native.mjs +89 -0
- package/scripts/postinstall.mjs +34 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { CODEX_RUDDER_PLANNER_CONFIG_ARGS, CODEX_RUDDER_WORKER_CONFIG_ARGS } from "./codex-binary.js";
|
|
2
|
+
import { normalizeEffortForBackend } from "./effort.js";
|
|
3
|
+
import { PLAN_MODE_CONTRACT } from "./plan-mode.js";
|
|
4
|
+
import { CODEX_DEFAULT_MODEL, lastUsedCodexModelSync, liveCodexModel } from "./state.js";
|
|
5
|
+
import { taskDisplayLabel } from "./task-summary.js";
|
|
6
|
+
import { shellQuote, stripRudderPromptWrappers } from "./util.js";
|
|
7
|
+
export function nativeAgentCommand(params) {
|
|
8
|
+
const mode = params.mode ?? params.run.mode ?? "execute";
|
|
9
|
+
const prompt = stripRudderPromptWrappers(params.prompt);
|
|
10
|
+
const args = mode === "plan"
|
|
11
|
+
? planArgs(params.run, prompt, params.codexCommand)
|
|
12
|
+
: params.run.backend === "codex"
|
|
13
|
+
? codexArgs(params.run, prompt, params.contract, params.codexCommand)
|
|
14
|
+
: params.run.backend === "opencode"
|
|
15
|
+
? opencodeArgs(params.run, prompt, params.contract)
|
|
16
|
+
: claudeArgs(params.run, prompt, params.contract);
|
|
17
|
+
return args.map(shellQuote).join(" ");
|
|
18
|
+
}
|
|
19
|
+
function claudeArgs(run, prompt, contract) {
|
|
20
|
+
const model = run.model || "sonnet";
|
|
21
|
+
const effort = normalizeEffortForBackend("claude", run.effort);
|
|
22
|
+
const sessionId = run.session?.nativeSessionId;
|
|
23
|
+
return compact([
|
|
24
|
+
"env",
|
|
25
|
+
"CLAUDE_CODE_NO_FLICKER=0",
|
|
26
|
+
"claude",
|
|
27
|
+
"--model",
|
|
28
|
+
model,
|
|
29
|
+
effort ? "--effort" : undefined,
|
|
30
|
+
effort,
|
|
31
|
+
"--permission-mode",
|
|
32
|
+
"bypassPermissions",
|
|
33
|
+
"--dangerously-skip-permissions",
|
|
34
|
+
"--append-system-prompt",
|
|
35
|
+
contract,
|
|
36
|
+
"--name",
|
|
37
|
+
paneTitle(run),
|
|
38
|
+
sessionId ? "--session-id" : undefined,
|
|
39
|
+
sessionId,
|
|
40
|
+
prompt,
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* opencode's interactive TUI: `--auto` approves what is not explicitly denied (the
|
|
45
|
+
* worker is already isolated in its own workspace), `--prompt` carries the first
|
|
46
|
+
* turn. Models are `provider/model`; an empty model uses opencode's own default.
|
|
47
|
+
*/
|
|
48
|
+
function opencodeArgs(run, prompt, contract) {
|
|
49
|
+
return compact([
|
|
50
|
+
"opencode",
|
|
51
|
+
"--auto",
|
|
52
|
+
run.model ? "-m" : undefined,
|
|
53
|
+
run.model || undefined,
|
|
54
|
+
"--prompt",
|
|
55
|
+
[contract, "", prompt].join("\n"),
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
function codexArgs(run, prompt, contract, codexCommand = "codex") {
|
|
59
|
+
const model = liveCodexModel(run.model) || lastUsedCodexModelSync() || CODEX_DEFAULT_MODEL;
|
|
60
|
+
const effort = normalizeEffortForBackend("codex", run.effort);
|
|
61
|
+
return [
|
|
62
|
+
"env",
|
|
63
|
+
"CODEX_RUDDER_SCROLLBACK_SAFE=1",
|
|
64
|
+
codexCommand,
|
|
65
|
+
"--no-alt-screen",
|
|
66
|
+
"--model",
|
|
67
|
+
model,
|
|
68
|
+
"--dangerously-bypass-approvals-and-sandbox",
|
|
69
|
+
"--enable",
|
|
70
|
+
"goals",
|
|
71
|
+
...CODEX_RUDDER_WORKER_CONFIG_ARGS,
|
|
72
|
+
effort ? "-c" : undefined,
|
|
73
|
+
effort ? `model_reasoning_effort="${effort}"` : undefined,
|
|
74
|
+
"--cd",
|
|
75
|
+
run.workspace.path,
|
|
76
|
+
[contract, "", prompt].join("\n"),
|
|
77
|
+
].filter((value) => Boolean(value));
|
|
78
|
+
}
|
|
79
|
+
function planArgs(run, prompt, codexCommand) {
|
|
80
|
+
return run.backend === "codex"
|
|
81
|
+
? codexPlanArgs(run, prompt, codexCommand)
|
|
82
|
+
: claudePlanArgs(run, prompt);
|
|
83
|
+
}
|
|
84
|
+
function claudePlanArgs(run, prompt) {
|
|
85
|
+
const model = run.model || "sonnet";
|
|
86
|
+
const effort = normalizeEffortForBackend("claude", run.effort);
|
|
87
|
+
return compact([
|
|
88
|
+
"env",
|
|
89
|
+
"CLAUDE_CODE_NO_FLICKER=0",
|
|
90
|
+
"claude",
|
|
91
|
+
"--model",
|
|
92
|
+
model,
|
|
93
|
+
effort ? "--effort" : undefined,
|
|
94
|
+
effort,
|
|
95
|
+
"--permission-mode",
|
|
96
|
+
"default",
|
|
97
|
+
"--tools",
|
|
98
|
+
CLAUDE_PLAN_TOOLS.join(","),
|
|
99
|
+
"--allowedTools",
|
|
100
|
+
CLAUDE_PLAN_TOOLS.join(","),
|
|
101
|
+
"--disallowedTools",
|
|
102
|
+
CLAUDE_PLAN_DISALLOWED_TOOLS.join(","),
|
|
103
|
+
"--append-system-prompt",
|
|
104
|
+
PLAN_MODE_CONTRACT,
|
|
105
|
+
"--name",
|
|
106
|
+
`plan:${paneTitle(run)}`,
|
|
107
|
+
prompt,
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
function codexPlanArgs(run, prompt, codexCommand = "codex") {
|
|
111
|
+
const model = liveCodexModel(run.model) || lastUsedCodexModelSync() || CODEX_DEFAULT_MODEL;
|
|
112
|
+
const effort = normalizeEffortForBackend("codex", run.effort);
|
|
113
|
+
return compact([
|
|
114
|
+
"env",
|
|
115
|
+
"CODEX_RUDDER_SCROLLBACK_SAFE=1",
|
|
116
|
+
codexCommand,
|
|
117
|
+
"--no-alt-screen",
|
|
118
|
+
"--model",
|
|
119
|
+
model,
|
|
120
|
+
"--sandbox",
|
|
121
|
+
"read-only",
|
|
122
|
+
"--ask-for-approval",
|
|
123
|
+
"never",
|
|
124
|
+
"--enable",
|
|
125
|
+
"goals",
|
|
126
|
+
"--search",
|
|
127
|
+
...CODEX_RUDDER_PLANNER_CONFIG_ARGS,
|
|
128
|
+
effort ? "-c" : undefined,
|
|
129
|
+
effort ? `model_reasoning_effort="${effort}"` : undefined,
|
|
130
|
+
"--cd",
|
|
131
|
+
run.workspace.path,
|
|
132
|
+
`${PLAN_MODE_CONTRACT}\n\n${prompt}`,
|
|
133
|
+
]);
|
|
134
|
+
}
|
|
135
|
+
function paneTitle(run) {
|
|
136
|
+
const words = taskDisplayLabel(run, 34);
|
|
137
|
+
return `${run.backend}:${words || run.id.slice(0, 12)}`;
|
|
138
|
+
}
|
|
139
|
+
function compact(values) {
|
|
140
|
+
return values.filter((value) => Boolean(value));
|
|
141
|
+
}
|
|
142
|
+
const CLAUDE_PLAN_TOOLS = [
|
|
143
|
+
"Read",
|
|
144
|
+
"Grep",
|
|
145
|
+
"Glob",
|
|
146
|
+
"LS",
|
|
147
|
+
"WebSearch",
|
|
148
|
+
"WebFetch",
|
|
149
|
+
];
|
|
150
|
+
const CLAUDE_PLAN_DISALLOWED_TOOLS = [
|
|
151
|
+
"Edit",
|
|
152
|
+
"Write",
|
|
153
|
+
"MultiEdit",
|
|
154
|
+
"NotebookEdit",
|
|
155
|
+
"Bash",
|
|
156
|
+
"Bash(rm *)",
|
|
157
|
+
"Bash(mv *)",
|
|
158
|
+
"Bash(cp *)",
|
|
159
|
+
"Bash(mkdir *)",
|
|
160
|
+
"Bash(touch *)",
|
|
161
|
+
"Bash(chmod *)",
|
|
162
|
+
"Bash(chown *)",
|
|
163
|
+
"Bash(git add*)",
|
|
164
|
+
"Bash(git commit*)",
|
|
165
|
+
"Bash(git checkout*)",
|
|
166
|
+
"Bash(git switch*)",
|
|
167
|
+
"Bash(git reset*)",
|
|
168
|
+
"Bash(git clean*)",
|
|
169
|
+
"Bash(git merge*)",
|
|
170
|
+
"Bash(git rebase*)",
|
|
171
|
+
"Bash(git push*)",
|
|
172
|
+
"Bash(fly deploy*)",
|
|
173
|
+
"Bash(fly secrets set*)",
|
|
174
|
+
"Bash(fly secrets unset*)",
|
|
175
|
+
"Bash(fly scale*)",
|
|
176
|
+
"Bash(fly apps destroy*)",
|
|
177
|
+
];
|
|
178
|
+
//# sourceMappingURL=native-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-agents.js","sourceRoot":"","sources":["../src/native-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function nativePlatformKey(platform?: NodeJS.Platform, arch?: NodeJS.Architecture): string;
|
|
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;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const nativeBinaryBaseName = "rudder-native";
|
|
5
|
+
export function nativePlatformKey(platform = process.platform, arch = process.arch) {
|
|
6
|
+
return `${platform}-${arch}`;
|
|
7
|
+
}
|
|
8
|
+
export function resolveNativeBinaryPath() {
|
|
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;
|
|
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.
|
|
19
|
+
path.resolve(moduleDir, "native", nativeBinaryName),
|
|
20
|
+
path.resolve(moduleDir, "..", "target", "release", nativeBinaryName),
|
|
21
|
+
path.resolve(moduleDir, "..", "native", "target", "release", nativeBinaryName),
|
|
22
|
+
];
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
if (isExecutableFile(candidate) && isUsableNativeBinary(candidate, platform, arch)) {
|
|
25
|
+
return candidate;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
function isExecutableFile(file) {
|
|
31
|
+
try {
|
|
32
|
+
fs.accessSync(file, fs.constants.X_OK);
|
|
33
|
+
return fs.statSync(file).isFile();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
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
|
+
}
|
|
140
|
+
//# sourceMappingURL=native-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-binary.js","sourceRoot":"","sources":["../src/native-binary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type CloudRepoSummary = {
|
|
2
|
+
repo: string;
|
|
3
|
+
agents: number;
|
|
4
|
+
};
|
|
5
|
+
export type OnboardingOptions = {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
/** The account's repos on its cloud machine; null when not signed in. */
|
|
8
|
+
cloudRepos?: () => Promise<CloudRepoSummary[] | null>;
|
|
9
|
+
};
|
|
10
|
+
export declare function onboardingInteractive(json?: boolean): boolean;
|
|
11
|
+
export declare function runLaptopOnboarding(options?: OnboardingOptions): Promise<void>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// A new computer, right after `rudder login` (and from `rudder doctor`): can it
|
|
2
|
+
// run agents, and what is already waiting in the cloud? Claude Code and Codex
|
|
3
|
+
// are offered for install and their own sign-in, at a y/N prompt, only on an
|
|
4
|
+
// interactive terminal. Their logins are never copied from the cloud vault:
|
|
5
|
+
// both rotate refresh tokens, and a shared copy signs one side out.
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import readline from "node:readline/promises";
|
|
8
|
+
import { commandEnv, commandExists } from "./util.js";
|
|
9
|
+
const AGENT_CLIS = [
|
|
10
|
+
{
|
|
11
|
+
command: "claude",
|
|
12
|
+
label: "Claude Code",
|
|
13
|
+
install: ["npm", "i", "-g", "@anthropic-ai/claude-code"],
|
|
14
|
+
login: ["claude", "auth", "login"],
|
|
15
|
+
signedIn: () => {
|
|
16
|
+
const status = spawnSync("claude", ["auth", "status", "--json"], { encoding: "utf8", timeout: 20_000, env: commandEnv() });
|
|
17
|
+
try {
|
|
18
|
+
return Boolean(JSON.parse(status.stdout).loggedIn);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
command: "codex",
|
|
27
|
+
label: "Codex",
|
|
28
|
+
install: ["npm", "i", "-g", "@openai/codex"],
|
|
29
|
+
login: ["codex", "login"],
|
|
30
|
+
signedIn: () => spawnSync("codex", ["login", "status"], { stdio: "ignore", timeout: 20_000, env: commandEnv() }).status === 0,
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
export function onboardingInteractive(json) {
|
|
34
|
+
return !json && Boolean(process.stdin.isTTY && process.stdout.isTTY) && process.env.RUDDER_SKIP_ONBOARDING !== "1";
|
|
35
|
+
}
|
|
36
|
+
async function confirm(question) {
|
|
37
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
38
|
+
try {
|
|
39
|
+
return /^y(es)?$/i.test((await rl.question(`${question} [y/N] `)).trim());
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
rl.close();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function run(argv) {
|
|
46
|
+
console.log(`$ ${argv.join(" ")}`);
|
|
47
|
+
return spawnSync(argv[0], argv.slice(1), { stdio: "inherit", env: commandEnv() }).status === 0;
|
|
48
|
+
}
|
|
49
|
+
async function offerInstall(cli) {
|
|
50
|
+
if (!(await confirm(`Install ${cli.label} now (${cli.install.join(" ")})?`))) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (!run(cli.install) || !commandExists(cli.command)) {
|
|
54
|
+
console.log(`${cli.label} did not install. Try \`${cli.install.join(" ")}\` yourself (it may need sudo, or a Node version manager).`);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
async function offerLogin(cli) {
|
|
60
|
+
if (await confirm(`Sign in to ${cli.label} now (${cli.login.join(" ")})?`)) {
|
|
61
|
+
run(cli.login);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(`Later: \`${cli.login.join(" ")}\`.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function runLaptopOnboarding(options = {}) {
|
|
68
|
+
if (!onboardingInteractive(options.json)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
console.log("");
|
|
72
|
+
const installed = AGENT_CLIS.filter((cli) => commandExists(cli.command));
|
|
73
|
+
if (installed.length === 0) {
|
|
74
|
+
console.log("Rudder runs agents through Claude Code or Codex, and neither is installed here.");
|
|
75
|
+
for (const cli of AGENT_CLIS) {
|
|
76
|
+
if (await offerInstall(cli)) {
|
|
77
|
+
await offerLogin(cli);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
for (const cli of installed) {
|
|
83
|
+
if (cli.signedIn()) {
|
|
84
|
+
console.log(`${cli.label}: signed in.`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(`${cli.label}: installed, not signed in on this computer.`);
|
|
88
|
+
await offerLogin(cli);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!AGENT_CLIS.some((cli) => commandExists(cli.command))) {
|
|
93
|
+
console.log("Install one later with `npm i -g @anthropic-ai/claude-code` or `npm i -g @openai/codex`.");
|
|
94
|
+
}
|
|
95
|
+
const repos = options.cloudRepos ? await options.cloudRepos().catch(() => null) : null;
|
|
96
|
+
if (!repos) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log("");
|
|
100
|
+
if (repos.length === 0) {
|
|
101
|
+
console.log("Nothing on your cloud machine yet. Run `rudder cloud` in a repo here, or add one from the phone app.");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
console.log(`On your cloud machine (${repos.length} ${repos.length === 1 ? "repo" : "repos"}):`);
|
|
105
|
+
for (const repo of repos) {
|
|
106
|
+
console.log(` ${repo.repo}${repo.agents ? ` ${repo.agents} ${repo.agents === 1 ? "agent" : "agents"}` : ""}`);
|
|
107
|
+
}
|
|
108
|
+
const example = repos[0].repo.split("/").pop();
|
|
109
|
+
console.log(`\`rudder cloud sync ${example}\` clones one into ~/code with its work.`);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,6EAA6E;AAC7E,4EAA4E;AAC5E,oEAAoE;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAUtD,MAAM,UAAU,GAAe;IAC7B;QACE,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,2BAA2B,CAAC;QACxD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;QAClC,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAC3H,IAAI,CAAC;gBACH,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC;QAC5C,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;QACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC;KAC9H;CACF,CAAC;AAUF,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;AACrH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,QAAgB;IACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,IAAc;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAa;IACvC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,2BAA2B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QACtI,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAa;IACrC,IAAI,MAAM,OAAO,CAAC,cAAc,GAAG,CAAC,KAAK,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAA6B,EAAE;IACvE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,cAAc,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,8CAA8C,CAAC,CAAC;gBACxE,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAC;QACpH,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IACjG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,0CAA0C,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const PASTE_UPLOAD_MAX_BYTES: number;
|
|
2
|
+
export type ClipboardContents = {
|
|
3
|
+
files: string[];
|
|
4
|
+
} | {
|
|
5
|
+
image: string;
|
|
6
|
+
} | null;
|
|
7
|
+
export type PasteBridgeOptions = {
|
|
8
|
+
send: (data: Buffer) => void;
|
|
9
|
+
/** Upload one local file, resolve to its path on the cloud machine. */
|
|
10
|
+
upload: (file: string, name: string) => Promise<string>;
|
|
11
|
+
readClipboard?: () => Promise<ClipboardContents>;
|
|
12
|
+
status?: (text: string | null) => void;
|
|
13
|
+
};
|
|
14
|
+
/** Ctrl+V, as a plain control byte or in the kitty keyboard encoding. */
|
|
15
|
+
export declare function isCtrlV(data: Buffer): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* The local files a paste names, or null when it is anything else. Every
|
|
18
|
+
* token must be an existing regular file, so a pasted snippet that merely
|
|
19
|
+
* mentions a path is never rewritten. Handles what terminals produce for a
|
|
20
|
+
* drop: 'quoted', "quoted", backslash-escaped spaces, file:// urls.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pastedLocalFiles(text: string, home?: string): string[] | null;
|
|
23
|
+
export declare class PasteBridge {
|
|
24
|
+
private readonly options;
|
|
25
|
+
/** Pass everything straight through (a target that cannot take uploads). */
|
|
26
|
+
disabled: boolean;
|
|
27
|
+
private busy;
|
|
28
|
+
private pending;
|
|
29
|
+
constructor(options: PasteBridgeOptions);
|
|
30
|
+
/** Every keystroke chunk for the cloud goes through here, in order. */
|
|
31
|
+
forward(data: Buffer): void;
|
|
32
|
+
private jobFor;
|
|
33
|
+
private fromClipboard;
|
|
34
|
+
private uploadAll;
|
|
35
|
+
}
|
|
36
|
+
export declare function readLocalClipboard(): Promise<ClipboardContents>;
|