@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.
Files changed (187) hide show
  1. package/LICENSE +100 -0
  2. package/README.md +733 -2
  3. package/assets/rudder.icns +0 -0
  4. package/assets/sounds/NOTICE.md +8 -0
  5. package/assets/sounds/ping.mp3 +0 -0
  6. package/dist/agent-attention.d.ts +5 -0
  7. package/dist/agent-attention.js +54 -0
  8. package/dist/agent-attention.js.map +1 -0
  9. package/dist/analytics.d.ts +36 -0
  10. package/dist/analytics.js +178 -0
  11. package/dist/analytics.js.map +1 -0
  12. package/dist/attach-session.d.ts +91 -0
  13. package/dist/attach-session.js +290 -0
  14. package/dist/attach-session.js.map +1 -0
  15. package/dist/auth.d.ts +36 -0
  16. package/dist/auth.js +397 -0
  17. package/dist/auth.js.map +1 -0
  18. package/dist/backends.d.ts +3 -0
  19. package/dist/backends.js +638 -0
  20. package/dist/backends.js.map +1 -0
  21. package/dist/board/board.css +1 -0
  22. package/dist/board/board.js +2 -0
  23. package/dist/board/daemon.d.ts +39 -0
  24. package/dist/board/daemon.js +1510 -0
  25. package/dist/board/daemon.js.map +1 -0
  26. package/dist/brain.d.ts +24 -0
  27. package/dist/brain.js +244 -0
  28. package/dist/brain.js.map +1 -0
  29. package/dist/bus.d.ts +9 -0
  30. package/dist/bus.js +23 -0
  31. package/dist/bus.js.map +1 -0
  32. package/dist/checkout-sync.d.ts +35 -0
  33. package/dist/checkout-sync.js +247 -0
  34. package/dist/checkout-sync.js.map +1 -0
  35. package/dist/cloud.d.ts +51 -0
  36. package/dist/cloud.js +4672 -0
  37. package/dist/cloud.js.map +1 -0
  38. package/dist/codex-binary.d.ts +12 -0
  39. package/dist/codex-binary.js +184 -0
  40. package/dist/codex-binary.js.map +1 -0
  41. package/dist/context-audit.d.ts +21 -0
  42. package/dist/context-audit.js +109 -0
  43. package/dist/context-audit.js.map +1 -0
  44. package/dist/daemon.d.ts +27 -0
  45. package/dist/daemon.js +203 -0
  46. package/dist/daemon.js.map +1 -0
  47. package/dist/effort.d.ts +9 -0
  48. package/dist/effort.js +72 -0
  49. package/dist/effort.js.map +1 -0
  50. package/dist/feedback.d.ts +46 -0
  51. package/dist/feedback.js +173 -0
  52. package/dist/feedback.js.map +1 -0
  53. package/dist/gc.d.ts +3 -0
  54. package/dist/gc.js +262 -0
  55. package/dist/gc.js.map +1 -0
  56. package/dist/git.d.ts +31 -0
  57. package/dist/git.js +455 -0
  58. package/dist/git.js.map +1 -0
  59. package/dist/goal.d.ts +33 -0
  60. package/dist/goal.js +95 -0
  61. package/dist/goal.js.map +1 -0
  62. package/dist/graph.d.ts +93 -0
  63. package/dist/graph.js +372 -0
  64. package/dist/graph.js.map +1 -0
  65. package/dist/handoff.d.ts +110 -0
  66. package/dist/handoff.js +565 -0
  67. package/dist/handoff.js.map +1 -0
  68. package/dist/improve/advisor.d.ts +10 -0
  69. package/dist/improve/advisor.js +115 -0
  70. package/dist/improve/advisor.js.map +1 -0
  71. package/dist/improve/collect.d.ts +49 -0
  72. package/dist/improve/collect.js +274 -0
  73. package/dist/improve/collect.js.map +1 -0
  74. package/dist/improve/gate.d.ts +17 -0
  75. package/dist/improve/gate.js +60 -0
  76. package/dist/improve/gate.js.map +1 -0
  77. package/dist/improve/index.d.ts +9 -0
  78. package/dist/improve/index.js +376 -0
  79. package/dist/improve/index.js.map +1 -0
  80. package/dist/improve/judge.d.ts +32 -0
  81. package/dist/improve/judge.js +114 -0
  82. package/dist/improve/judge.js.map +1 -0
  83. package/dist/improve/mine.d.ts +31 -0
  84. package/dist/improve/mine.js +192 -0
  85. package/dist/improve/mine.js.map +1 -0
  86. package/dist/improve/propose.d.ts +51 -0
  87. package/dist/improve/propose.js +150 -0
  88. package/dist/improve/propose.js.map +1 -0
  89. package/dist/improve/rank.d.ts +16 -0
  90. package/dist/improve/rank.js +49 -0
  91. package/dist/improve/rank.js.map +1 -0
  92. package/dist/improve/schedule.d.ts +1 -0
  93. package/dist/improve/schedule.js +95 -0
  94. package/dist/improve/schedule.js.map +1 -0
  95. package/dist/improve/ship.d.ts +25 -0
  96. package/dist/improve/ship.js +82 -0
  97. package/dist/improve/ship.js.map +1 -0
  98. package/dist/improve/state.d.ts +157 -0
  99. package/dist/improve/state.js +264 -0
  100. package/dist/improve/state.js.map +1 -0
  101. package/dist/index.d.ts +2 -0
  102. package/dist/index.js +88 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/jj-binary.d.ts +36 -0
  105. package/dist/jj-binary.js +143 -0
  106. package/dist/jj-binary.js.map +1 -0
  107. package/dist/jj.d.ts +163 -0
  108. package/dist/jj.js +926 -0
  109. package/dist/jj.js.map +1 -0
  110. package/dist/logger.d.ts +22 -0
  111. package/dist/logger.js +110 -0
  112. package/dist/logger.js.map +1 -0
  113. package/dist/main.d.ts +3 -0
  114. package/dist/main.js +1366 -0
  115. package/dist/main.js.map +1 -0
  116. package/dist/migration.d.ts +82 -0
  117. package/dist/migration.js +198 -0
  118. package/dist/migration.js.map +1 -0
  119. package/dist/models.d.ts +9 -0
  120. package/dist/models.js +623 -0
  121. package/dist/models.js.map +1 -0
  122. package/dist/move-home.d.ts +82 -0
  123. package/dist/move-home.js +472 -0
  124. package/dist/move-home.js.map +1 -0
  125. package/dist/native/darwin-arm64/rudder-native +0 -0
  126. package/dist/native/darwin-x64/rudder-native +0 -0
  127. package/dist/native/linux-x64/rudder-native +0 -0
  128. package/dist/native-agents.d.ts +8 -0
  129. package/dist/native-agents.js +178 -0
  130. package/dist/native-agents.js.map +1 -0
  131. package/dist/native-binary.d.ts +4 -0
  132. package/dist/native-binary.js +140 -0
  133. package/dist/native-binary.js.map +1 -0
  134. package/dist/onboarding.d.ts +11 -0
  135. package/dist/onboarding.js +111 -0
  136. package/dist/onboarding.js.map +1 -0
  137. package/dist/paste-bridge.d.ts +36 -0
  138. package/dist/paste-bridge.js +279 -0
  139. package/dist/paste-bridge.js.map +1 -0
  140. package/dist/plan-mode.d.ts +2 -0
  141. package/dist/plan-mode.js +22 -0
  142. package/dist/plan-mode.js.map +1 -0
  143. package/dist/planner.d.ts +27 -0
  144. package/dist/planner.js +587 -0
  145. package/dist/planner.js.map +1 -0
  146. package/dist/predict.d.ts +67 -0
  147. package/dist/predict.js +369 -0
  148. package/dist/predict.js.map +1 -0
  149. package/dist/qr.d.ts +13 -0
  150. package/dist/qr.js +377 -0
  151. package/dist/qr.js.map +1 -0
  152. package/dist/report.d.ts +74 -0
  153. package/dist/report.js +412 -0
  154. package/dist/report.js.map +1 -0
  155. package/dist/rudder-md.d.ts +33 -0
  156. package/dist/rudder-md.js +142 -0
  157. package/dist/rudder-md.js.map +1 -0
  158. package/dist/run-manager.d.ts +62 -0
  159. package/dist/run-manager.js +1400 -0
  160. package/dist/run-manager.js.map +1 -0
  161. package/dist/scheduler.d.ts +128 -0
  162. package/dist/scheduler.js +955 -0
  163. package/dist/scheduler.js.map +1 -0
  164. package/dist/state.d.ts +127 -0
  165. package/dist/state.js +704 -0
  166. package/dist/state.js.map +1 -0
  167. package/dist/surfaces.d.ts +91 -0
  168. package/dist/surfaces.js +460 -0
  169. package/dist/surfaces.js.map +1 -0
  170. package/dist/task-summary.d.ts +30 -0
  171. package/dist/task-summary.js +472 -0
  172. package/dist/task-summary.js.map +1 -0
  173. package/dist/types.d.ts +492 -0
  174. package/dist/types.js +2 -0
  175. package/dist/types.js.map +1 -0
  176. package/dist/usage.d.ts +198 -0
  177. package/dist/usage.js +830 -0
  178. package/dist/usage.js.map +1 -0
  179. package/dist/util.d.ts +73 -0
  180. package/dist/util.js +399 -0
  181. package/dist/util.js.map +1 -0
  182. package/dist/version-check.d.ts +16 -0
  183. package/dist/version-check.js +269 -0
  184. package/dist/version-check.js.map +1 -0
  185. package/package.json +68 -4
  186. package/scripts/copy-native.mjs +89 -0
  187. package/scripts/postinstall.mjs +34 -0
@@ -0,0 +1,173 @@
1
+ // ---------------------------------------------------------------------------
2
+ // `/feedback` (dashboard) and `rudder feedback "..."` (CLI).
3
+ //
4
+ // A one-line gripe is only actionable with a little context, so a report carries
5
+ // what was on screen in structure rather than in prose: version, platform, the
6
+ // backend/model in play, how many agents were running, the last few notices, the
7
+ // last error. It never carries prompts, diffs, or file contents.
8
+ //
9
+ // Three destinations, in order of durability:
10
+ // 1. a local JSON file — always written first, so a report is never lost to a
11
+ // network failure or a missing `gh`;
12
+ // 2. a PostHog `feedback` event — puts the complaint next to the usage data
13
+ // that produced it;
14
+ // 3. a GitHub issue via `gh`, when it is installed and authenticated — a queue
15
+ // that gets worked through rather than a metric that gets admired.
16
+ //
17
+ // Free text is REDACTED before it leaves the machine: a GitHub issue is public
18
+ // and a notice routinely contains an absolute path.
19
+ // ---------------------------------------------------------------------------
20
+ import fs from "node:fs";
21
+ import os from "node:os";
22
+ import path from "node:path";
23
+ import { capture, projectHash } from "./analytics.js";
24
+ import { dashboardRoot } from "./handoff.js";
25
+ import { commandExists, runCommand, runCommandSync } from "./util.js";
26
+ const DEFAULT_FEEDBACK_REPO = "exla-ai/rudder";
27
+ /**
28
+ * Strip anything that identifies a machine or a person from free text: home
29
+ * directories, absolute paths, and token-shaped strings. A GitHub issue is
30
+ * public, so this runs before every send — not only before PostHog.
31
+ */
32
+ export function redactText(text, home = os.homedir()) {
33
+ let out = text.replace(/\r/g, "");
34
+ if (home && home.length > 1) {
35
+ out = out.split(home).join("~");
36
+ }
37
+ // Home-relative paths, collapsed BEFORE the absolute-path pass so the leading
38
+ // "~" does not survive as "~<path>".
39
+ out = out.replace(/~(?:\/[A-Za-z0-9._-]+)+\/?/g, "<path>");
40
+ // Absolute paths (including the /private/var forms macOS hands out).
41
+ out = out.replace(/(?:\/[A-Za-z0-9._~-]+){2,}\/?/g, (match) => match.length > 3 ? "<path>" : match);
42
+ out = out.replace(/\b(sk-[A-Za-z0-9_-]{8,}|ghp_[A-Za-z0-9]{8,}|phc_[A-Za-z0-9]{8,}|xox[baprs]-[A-Za-z0-9-]{8,})\b/g, "<redacted>");
43
+ return out.trim();
44
+ }
45
+ export function feedbackDir(repoRoot) {
46
+ return path.join(repoRoot, ".rudder", "feedback");
47
+ }
48
+ /**
49
+ * Where issues get filed. A fork should collect its OWN feedback, so this reads
50
+ * the checkout's GitHub origin and only falls back to Rudder upstream when there
51
+ * is no GitHub remote to infer.
52
+ */
53
+ export function feedbackRepo(repoRoot) {
54
+ const override = process.env.RUDDER_FEEDBACK_REPO?.trim();
55
+ if (override) {
56
+ return override;
57
+ }
58
+ const remote = runCommandSync("git", ["remote", "get-url", "origin"], {
59
+ cwd: repoRoot,
60
+ allowFailure: true,
61
+ });
62
+ return parseGithubSlug(remote.stdout) ?? DEFAULT_FEEDBACK_REPO;
63
+ }
64
+ /** `owner/repo` from any GitHub remote form (https, ssh, with or without .git). */
65
+ export function parseGithubSlug(remote) {
66
+ const match = /github\.com[:/]+([^/\s]+)\/([^/\s]+?)(?:\.git)?\s*$/.exec(remote.trim());
67
+ if (!match) {
68
+ return undefined;
69
+ }
70
+ return `${match[1]}/${match[2]}`;
71
+ }
72
+ export async function submitFeedback(options) {
73
+ const repoRoot = options.repoRoot ?? dashboardRoot();
74
+ const text = options.text.trim();
75
+ if (!text) {
76
+ throw new Error('Nothing to send. Usage: rudder feedback "merge asked twice and did nothing"');
77
+ }
78
+ const context = options.context ?? {};
79
+ const redacted = redactText(text);
80
+ const notices = (context.notices ?? []).slice(-3).map((notice) => redactText(notice));
81
+ const lastError = context.lastError ? redactText(context.lastError) : undefined;
82
+ const skipped = [];
83
+ // 1. Local first: whatever else fails, the report exists.
84
+ const dir = feedbackDir(repoRoot);
85
+ fs.mkdirSync(dir, { recursive: true });
86
+ const localPath = path.join(dir, `${Date.now()}.json`);
87
+ fs.writeFileSync(localPath, `${JSON.stringify({
88
+ text,
89
+ redacted,
90
+ context: { ...context, notices, lastError },
91
+ createdAt: new Date().toISOString(),
92
+ }, null, 2)}\n`);
93
+ // 2. PostHog: the aggregate view.
94
+ const posthog = await capture("feedback", {
95
+ text: redacted,
96
+ backend: context.backend,
97
+ model: context.model,
98
+ effort: context.effort,
99
+ agents: context.agents,
100
+ agents_running: context.agentsRunning,
101
+ focus: context.focus,
102
+ view: context.view,
103
+ plan_active: context.planActive,
104
+ last_error: lastError,
105
+ notice_count: notices.length,
106
+ project: projectHash(repoRoot),
107
+ });
108
+ if (!posthog) {
109
+ skipped.push("telemetry is off, so nothing was sent to the usage project");
110
+ }
111
+ // 3. GitHub: the triage queue. Optional by design — `gh` is not a dependency.
112
+ let issueUrl;
113
+ if (options.issue === false) {
114
+ skipped.push("issue skipped (--no-issue)");
115
+ }
116
+ else if (!commandExists("gh")) {
117
+ skipped.push("gh not installed, so no issue was filed");
118
+ }
119
+ else {
120
+ const auth = await runCommand("gh", ["auth", "status"], { allowFailure: true });
121
+ if (auth.code !== 0) {
122
+ skipped.push("gh is not authenticated (`gh auth login`), so no issue was filed");
123
+ }
124
+ else {
125
+ const body = issueBody(redacted, { ...context, notices, lastError });
126
+ const created = await runCommand("gh", [
127
+ "issue",
128
+ "create",
129
+ "--repo",
130
+ feedbackRepo(repoRoot),
131
+ "--title",
132
+ `feedback: ${issueTitle(redacted)}`,
133
+ "--body",
134
+ body,
135
+ ], { allowFailure: true });
136
+ const url = created.stdout.trim().split(/\s+/).find((token) => token.startsWith("http"));
137
+ if (created.code === 0 && url) {
138
+ issueUrl = url;
139
+ }
140
+ else {
141
+ skipped.push("gh could not create the issue");
142
+ }
143
+ }
144
+ }
145
+ return { localPath, posthog, issueUrl, skipped };
146
+ }
147
+ export function issueTitle(text) {
148
+ const firstLine = text.split("\n").find((line) => line.trim().length > 0) ?? "report";
149
+ return firstLine.trim().slice(0, 72);
150
+ }
151
+ export function issueBody(text, context) {
152
+ const rows = [];
153
+ const push = (label, value) => {
154
+ if (value !== undefined && value !== "") {
155
+ rows.push(`- ${label}: ${value}`);
156
+ }
157
+ };
158
+ push("backend", context.backend);
159
+ push("model", context.model);
160
+ push("effort", context.effort);
161
+ push("agents", context.agents);
162
+ push("running", context.agentsRunning);
163
+ push("focus", context.focus);
164
+ push("view", context.view);
165
+ push("plan active", context.planActive);
166
+ push("last error", context.lastError);
167
+ const notices = context.notices ?? [];
168
+ const noticeBlock = notices.length
169
+ ? `\n\nRecent notices:\n${notices.map((notice) => `- ${notice}`).join("\n")}`
170
+ : "";
171
+ return `${text}\n\nContext (auto-collected, paths redacted):\n${rows.join("\n")}${noticeBlock}\n\n_Filed by \`rudder feedback\`._`;
172
+ }
173
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"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"}
package/dist/gc.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function runGc(options?: {
2
+ dryRun?: boolean;
3
+ }): Promise<void>;
package/dist/gc.js ADDED
@@ -0,0 +1,262 @@
1
+ import fsp from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { RUDDER_CODEX_RELEASE } from "./codex-binary.js";
4
+ import { findRepoRoot } from "./git.js";
5
+ import { LOG_KEEP_ROTATED, LOG_MAX_BYTES, logsDir } from "./logger.js";
6
+ import { AGENT_WORKSPACES_DIR, LEGACY_AGENT_WORKSPACES_DIR, loadRunRecord, runsDir } from "./state.js";
7
+ import { pathExists, rudderHome } from "./util.js";
8
+ const DAY_MS = 24 * 60 * 60 * 1000;
9
+ const PERF_TTL_MS = 3 * DAY_MS;
10
+ const SIGNAL_TTL_MS = 7 * DAY_MS;
11
+ const RUN_TTL_MS = 30 * DAY_MS;
12
+ export async function runGc(options = {}) {
13
+ const dryRun = Boolean(options.dryRun);
14
+ const home = rudderHome();
15
+ const repoRoot = safeRepoRoot();
16
+ const candidates = [
17
+ ...await perfLogCandidates(home),
18
+ ...await signalCandidates(home),
19
+ ...await daemonLogCandidates(home),
20
+ ...await oldBinaryCandidates(home),
21
+ ...await finishedRunCandidates(repoRoot),
22
+ ...await nestedWorkspaceRunCandidates(repoRoot),
23
+ ];
24
+ let removed = 0;
25
+ for (const candidate of candidates) {
26
+ removed += candidate.bytes;
27
+ if (!dryRun) {
28
+ await fsp.rm(candidate.path, { recursive: true, force: true }).catch(() => undefined);
29
+ }
30
+ }
31
+ const grouped = groupCandidates(candidates);
32
+ console.log(dryRun ? "rudder gc dry run" : "rudder gc");
33
+ if (candidates.length === 0) {
34
+ console.log(" nothing to clean");
35
+ return;
36
+ }
37
+ for (const [category, bytes] of grouped) {
38
+ const count = candidates.filter((candidate) => candidate.category === category).length;
39
+ console.log(` ${category}: ${formatBytes(bytes)} in ${count} item(s)`);
40
+ }
41
+ console.log(`${dryRun ? "would recover" : "recovered"} ${formatBytes(removed)}`);
42
+ }
43
+ async function perfLogCandidates(home) {
44
+ const entries = await fileEntries(home, (name) => isPerfLog(name));
45
+ const sorted = entries.sort((a, b) => b.mtimeMs - a.mtimeMs);
46
+ return sorted
47
+ .map((entry, index) => {
48
+ const tooOld = Date.now() - entry.mtimeMs > PERF_TTL_MS;
49
+ const tooMany = index >= 2;
50
+ const tooLarge = entry.bytes > LOG_MAX_BYTES;
51
+ if (!tooOld && !tooMany && !tooLarge)
52
+ return null;
53
+ return {
54
+ category: "perf logs",
55
+ path: entry.path,
56
+ bytes: entry.bytes,
57
+ reason: tooOld ? "ttl" : tooMany ? "excess" : "oversize",
58
+ };
59
+ })
60
+ .filter((candidate) => Boolean(candidate));
61
+ }
62
+ async function signalCandidates(home) {
63
+ const dir = path.join(home, "signals");
64
+ const entries = await fileEntries(dir, () => true);
65
+ return entries
66
+ .filter((entry) => Date.now() - entry.mtimeMs > SIGNAL_TTL_MS)
67
+ .map((entry) => ({
68
+ category: "signals",
69
+ path: entry.path,
70
+ bytes: entry.bytes,
71
+ reason: "ttl",
72
+ }));
73
+ }
74
+ async function daemonLogCandidates(home) {
75
+ const dir = logsDir();
76
+ if (!dir.startsWith(home)) {
77
+ return [];
78
+ }
79
+ const entries = await fileEntries(dir, (name) => name.endsWith(".log") || name.endsWith(".ndjson") || /\.log\.\d+$/.test(name) || /\.ndjson\.\d+$/.test(name));
80
+ const byBase = new Map();
81
+ for (const entry of entries) {
82
+ const base = entry.path.replace(/\.\d+$/, "");
83
+ byBase.set(base, [...(byBase.get(base) ?? []), entry]);
84
+ }
85
+ const candidates = [];
86
+ for (const [, group] of byBase) {
87
+ const sorted = group.sort((a, b) => b.mtimeMs - a.mtimeMs);
88
+ sorted.forEach((entry, index) => {
89
+ if (entry.bytes <= LOG_MAX_BYTES && index <= LOG_KEEP_ROTATED) {
90
+ return;
91
+ }
92
+ candidates.push({
93
+ category: "daemon logs",
94
+ path: entry.path,
95
+ bytes: entry.bytes,
96
+ reason: entry.bytes > LOG_MAX_BYTES ? "oversize" : "excess",
97
+ });
98
+ });
99
+ }
100
+ return candidates;
101
+ }
102
+ async function oldBinaryCandidates(home) {
103
+ const root = path.join(home, "bin", "codex");
104
+ const entries = await fsp.readdir(root, { withFileTypes: true }).catch(() => []);
105
+ const candidates = [];
106
+ for (const entry of entries) {
107
+ if (!entry.isDirectory() || entry.name === RUDDER_CODEX_RELEASE) {
108
+ continue;
109
+ }
110
+ const fullPath = path.join(root, entry.name);
111
+ candidates.push({
112
+ category: "old binaries",
113
+ path: fullPath,
114
+ bytes: await pathSize(fullPath),
115
+ reason: "superseded",
116
+ });
117
+ }
118
+ return candidates;
119
+ }
120
+ async function finishedRunCandidates(repoRoot) {
121
+ if (!repoRoot) {
122
+ return [];
123
+ }
124
+ const dir = runsDir(repoRoot);
125
+ const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
126
+ const candidates = [];
127
+ for (const entry of entries) {
128
+ if (!entry.isDirectory())
129
+ continue;
130
+ const run = await loadRunRecord(repoRoot, entry.name);
131
+ if (!run || !canCollectRunRecord(run))
132
+ continue;
133
+ const stamp = Date.parse(run.updatedAt || run.createdAt);
134
+ if (Number.isFinite(stamp) && Date.now() - stamp < RUN_TTL_MS)
135
+ continue;
136
+ if (run.workspace.enabled && run.workspace.path && await pathExists(run.workspace.path)) {
137
+ continue;
138
+ }
139
+ const fullPath = path.join(dir, entry.name);
140
+ candidates.push({
141
+ category: "finished runs",
142
+ path: fullPath,
143
+ bytes: await pathSize(fullPath),
144
+ reason: "ttl",
145
+ });
146
+ }
147
+ return candidates;
148
+ }
149
+ async function nestedWorkspaceRunCandidates(repoRoot) {
150
+ if (!repoRoot) {
151
+ return [];
152
+ }
153
+ // Both the current and pre-rename workspace directories: a repo that ran an
154
+ // older Rudder still has reclaimable workspaces under the legacy path.
155
+ const runsDirs = [];
156
+ for (const dir of [AGENT_WORKSPACES_DIR, LEGACY_AGENT_WORKSPACES_DIR]) {
157
+ runsDirs.push(...(await findNestedRunsDirs(path.join(repoRoot, dir))));
158
+ }
159
+ const candidates = [];
160
+ for (const dir of runsDirs) {
161
+ const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
162
+ for (const entry of entries) {
163
+ if (!entry.isDirectory())
164
+ continue;
165
+ const fullPath = path.join(dir, entry.name);
166
+ const stat = await fsp.stat(fullPath).catch(() => null);
167
+ if (!stat || Date.now() - stat.mtimeMs < RUN_TTL_MS)
168
+ continue;
169
+ candidates.push({
170
+ category: "agent workspaces",
171
+ path: fullPath,
172
+ bytes: await pathSize(fullPath),
173
+ reason: "ttl",
174
+ });
175
+ }
176
+ }
177
+ return candidates;
178
+ }
179
+ function canCollectRunRecord(run) {
180
+ return run.status === "merged" || run.status === "completed" || run.status === "failed" || run.status === "cancelled";
181
+ }
182
+ async function findNestedRunsDirs(root) {
183
+ const out = [];
184
+ async function walk(dir, depth) {
185
+ if (depth > 6)
186
+ return;
187
+ const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
188
+ for (const entry of entries) {
189
+ if (!entry.isDirectory())
190
+ continue;
191
+ const fullPath = path.join(dir, entry.name);
192
+ if (entry.name === "runs" && path.basename(path.dirname(fullPath)) === ".rudder") {
193
+ out.push(fullPath);
194
+ continue;
195
+ }
196
+ await walk(fullPath, depth + 1);
197
+ }
198
+ }
199
+ await walk(root, 0);
200
+ return out;
201
+ }
202
+ async function fileEntries(dir, predicate) {
203
+ const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
204
+ const out = [];
205
+ for (const entry of entries) {
206
+ if (!entry.isFile() || !predicate(entry.name))
207
+ continue;
208
+ const fullPath = path.join(dir, entry.name);
209
+ const stat = await fsp.stat(fullPath).catch(() => null);
210
+ if (!stat)
211
+ continue;
212
+ out.push({ path: fullPath, bytes: stat.size, mtimeMs: stat.mtimeMs });
213
+ }
214
+ return out;
215
+ }
216
+ async function pathSize(filePath) {
217
+ const stat = await fsp.stat(filePath).catch(() => null);
218
+ if (!stat)
219
+ return 0;
220
+ if (stat.isFile())
221
+ return stat.size;
222
+ if (!stat.isDirectory())
223
+ return 0;
224
+ const entries = await fsp.readdir(filePath, { withFileTypes: true }).catch(() => []);
225
+ let total = 0;
226
+ for (const entry of entries) {
227
+ total += await pathSize(path.join(filePath, entry.name));
228
+ }
229
+ return total;
230
+ }
231
+ function isPerfLog(name) {
232
+ return name === "native-perf.ndjson"
233
+ || name.startsWith("native-perf.ndjson.")
234
+ || (name.startsWith("native-perf-") && name.includes(".ndjson"));
235
+ }
236
+ function groupCandidates(candidates) {
237
+ const grouped = new Map();
238
+ for (const candidate of candidates) {
239
+ grouped.set(candidate.category, (grouped.get(candidate.category) ?? 0) + candidate.bytes);
240
+ }
241
+ return [...grouped.entries()];
242
+ }
243
+ function safeRepoRoot() {
244
+ try {
245
+ return findRepoRoot();
246
+ }
247
+ catch {
248
+ return null;
249
+ }
250
+ }
251
+ function formatBytes(bytes) {
252
+ if (bytes < 1024)
253
+ return `${bytes} B`;
254
+ const kib = bytes / 1024;
255
+ if (kib < 1024)
256
+ return `${kib.toFixed(1)} KiB`;
257
+ const mib = kib / 1024;
258
+ if (mib < 1024)
259
+ return `${mib.toFixed(1)} MiB`;
260
+ return `${(mib / 1024).toFixed(1)} GiB`;
261
+ }
262
+ //# sourceMappingURL=gc.js.map
package/dist/gc.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.js","sourceRoot":"","sources":["../src/gc.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import type { MergeStrategy, RunRecord } from "./types.js";
2
+ export type RebaseResult = {
3
+ success: boolean;
4
+ baseRef: string;
5
+ conflictedFiles: string[];
6
+ error?: string;
7
+ };
8
+ export declare function findRepoRoot(cwd?: string): string;
9
+ export declare function isGitRepo(cwd: string): boolean;
10
+ export declare function currentBranch(repoRoot: string): Promise<string>;
11
+ export declare function currentCommit(repoRoot: string): Promise<string>;
12
+ export declare function gitStatus(repoRoot: string): Promise<string[]>;
13
+ export declare function gitDiff(repoRoot: string): Promise<string>;
14
+ export declare function hasChanges(repoRoot: string): Promise<boolean>;
15
+ export declare function workspaceStatus(run: RunRecord): Promise<string[]>;
16
+ export declare function workspaceDiff(run: RunRecord): Promise<string>;
17
+ export declare function runHasChanges(run: RunRecord): Promise<boolean>;
18
+ export declare function processAlive(pid: number | undefined): boolean;
19
+ export declare function runProcessAlive(run: RunRecord): boolean;
20
+ export declare function activeRunsForCheckout(repoRoot: string, checkoutPath: string): Promise<RunRecord[]>;
21
+ export declare function conflictedFiles(repoRoot: string): Promise<string[]>;
22
+ export declare function worktreeList(repoRoot: string): Promise<string>;
23
+ export declare function removeGitWorktree(repoRoot: string, targetPath: string, force?: boolean): Promise<void>;
24
+ export declare function mergeGitRunIntoCurrentBranch(run: RunRecord, allowDirty?: boolean, strategy?: MergeStrategy): Promise<RunRecord>;
25
+ export declare function syncGitRunWorktree(run: RunRecord, baseBranch: string): Promise<RunRecord>;
26
+ export declare function rebaseWorktreeOntoBase(params: {
27
+ repoRoot: string;
28
+ worktreePath: string;
29
+ baseBranch: string;
30
+ }): Promise<RebaseResult>;
31
+ export declare function resolveRebaseBaseRef(repoRoot: string, baseBranch: string): Promise<string>;