@exla/rudder 0.0.0-stage → 3.4.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.
Files changed (181) 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 +392 -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 +48 -0
  36. package/dist/cloud.js +4596 -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/paste-bridge.d.ts +36 -0
  135. package/dist/paste-bridge.js +279 -0
  136. package/dist/paste-bridge.js.map +1 -0
  137. package/dist/plan-mode.d.ts +2 -0
  138. package/dist/plan-mode.js +22 -0
  139. package/dist/plan-mode.js.map +1 -0
  140. package/dist/planner.d.ts +27 -0
  141. package/dist/planner.js +587 -0
  142. package/dist/planner.js.map +1 -0
  143. package/dist/predict.d.ts +67 -0
  144. package/dist/predict.js +369 -0
  145. package/dist/predict.js.map +1 -0
  146. package/dist/report.d.ts +74 -0
  147. package/dist/report.js +412 -0
  148. package/dist/report.js.map +1 -0
  149. package/dist/rudder-md.d.ts +33 -0
  150. package/dist/rudder-md.js +142 -0
  151. package/dist/rudder-md.js.map +1 -0
  152. package/dist/run-manager.d.ts +62 -0
  153. package/dist/run-manager.js +1400 -0
  154. package/dist/run-manager.js.map +1 -0
  155. package/dist/scheduler.d.ts +128 -0
  156. package/dist/scheduler.js +955 -0
  157. package/dist/scheduler.js.map +1 -0
  158. package/dist/state.d.ts +127 -0
  159. package/dist/state.js +704 -0
  160. package/dist/state.js.map +1 -0
  161. package/dist/surfaces.d.ts +91 -0
  162. package/dist/surfaces.js +460 -0
  163. package/dist/surfaces.js.map +1 -0
  164. package/dist/task-summary.d.ts +30 -0
  165. package/dist/task-summary.js +472 -0
  166. package/dist/task-summary.js.map +1 -0
  167. package/dist/types.d.ts +492 -0
  168. package/dist/types.js +2 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/usage.d.ts +198 -0
  171. package/dist/usage.js +830 -0
  172. package/dist/usage.js.map +1 -0
  173. package/dist/util.d.ts +73 -0
  174. package/dist/util.js +399 -0
  175. package/dist/util.js.map +1 -0
  176. package/dist/version-check.d.ts +16 -0
  177. package/dist/version-check.js +269 -0
  178. package/dist/version-check.js.map +1 -0
  179. package/package.json +68 -4
  180. package/scripts/copy-native.mjs +89 -0
  181. package/scripts/postinstall.mjs +34 -0
@@ -0,0 +1,30 @@
1
+ export declare function summarizeTask(task: string, maxChars?: number): string;
2
+ export declare function taskDisplayLabel(run: {
3
+ task: string;
4
+ taskSummary?: string;
5
+ }, maxChars?: number): string;
6
+ /**
7
+ * Resolve an Anthropic API key from the environment or the saved anthropic auth
8
+ * profile. Returns "" when none is available.
9
+ */
10
+ export declare function resolveAnthropicApiKey(): Promise<string>;
11
+ /**
12
+ * Generic single-shot LLM text call reused by the planner. Tries the Anthropic
13
+ * API (when a key is available) then falls back to the `claude` CLI, mirroring
14
+ * llmSummarizeTask's degradation path. Throws only when neither path is usable
15
+ * AND no output was produced, so callers can surface a clear error.
16
+ */
17
+ export declare function callTextModel(params: {
18
+ model: string;
19
+ system: string;
20
+ user: string;
21
+ maxTokens?: number;
22
+ timeoutMs?: number;
23
+ }): Promise<string>;
24
+ export declare function llmSummarizeTask(task: string): Promise<string | null>;
25
+ /**
26
+ * Redact token/key/secret-shaped values from free text. Exported for the
27
+ * improvement loop, which must strip secrets from session telemetry before
28
+ * any model call (docs/continual-improvement.md §3).
29
+ */
30
+ export declare function redactTaskSummarySecrets(value: string): string;
@@ -0,0 +1,472 @@
1
+ const DEFAULT_MAX_CHARS = 56;
2
+ const LEADING_PATTERNS = [
3
+ /^(?:ok(?:ay)?|hey)[, ]+/i,
4
+ /^(?:also\s+)?(?:please\s+)?(?:can|could|would)\s+(?:you|u)\s+/i,
5
+ /^(?:also\s+)?(?:please\s+)?(?:can|could|would)\s+we\s+/i,
6
+ /^(?:please\s+)+/i,
7
+ /^(?:i\s+)?(?:need|want)\s+(?:you\s+)?to\s+/i,
8
+ /^(?:we\s+)?(?:need|should|have)\s+to\s+/i,
9
+ /^another thing(?: for you to work on)? is\s+/i,
10
+ /^the task is\s+/i,
11
+ ];
12
+ const STOP_WORDS = new Set([
13
+ "a",
14
+ "an",
15
+ "and",
16
+ "are",
17
+ "as",
18
+ "at",
19
+ "be",
20
+ "but",
21
+ "by",
22
+ "for",
23
+ "from",
24
+ "gets",
25
+ "have",
26
+ "in",
27
+ "is",
28
+ "it",
29
+ "its",
30
+ "just",
31
+ "of",
32
+ "on",
33
+ "or",
34
+ "put",
35
+ "puts",
36
+ "putting",
37
+ "right",
38
+ "so",
39
+ "than",
40
+ "that",
41
+ "the",
42
+ "then",
43
+ "this",
44
+ "to",
45
+ "user",
46
+ "what",
47
+ "when",
48
+ "where",
49
+ "with",
50
+ "you",
51
+ "your",
52
+ ]);
53
+ export function summarizeTask(task, maxChars = DEFAULT_MAX_CHARS) {
54
+ const original = normalizeTaskText(redactTaskSummarySecrets(task));
55
+ if (!original) {
56
+ return "agent";
57
+ }
58
+ let summary = stripLeadingScaffolding(original);
59
+ summary = normalizeTaskText(summary)
60
+ .replace(/\blsited\b/gi, "listed")
61
+ .replace(/\brihgt\b/gi, "right")
62
+ .replace(/\bthe task that (?:the )?user (?:puts|types|enters|entered)\b/gi, "the user task")
63
+ .replace(/\btask that (?:the )?user (?:puts|types|enters|entered)\b/gi, "user task")
64
+ .replace(/\band then (?:that's|that is) what gets (?:listed|shown|displayed) on\b/gi, "for")
65
+ .replace(/\s+(?:right now|currently|at the moment|for now)\b.*$/i, "")
66
+ .replace(/\s+/g, " ")
67
+ .trim();
68
+ summary = firstSentence(summary) || summary || original;
69
+ summary = stripTerminalPunctuation(summary);
70
+ if (summary.length <= maxChars) {
71
+ return summary;
72
+ }
73
+ const compact = compactTitle(summary, maxChars);
74
+ return compact || truncate(summary, maxChars);
75
+ }
76
+ export function taskDisplayLabel(run, maxChars = DEFAULT_MAX_CHARS) {
77
+ const stored = normalizeTaskText(run.taskSummary ?? "");
78
+ return truncate(stored || summarizeTask(run.task, maxChars), maxChars);
79
+ }
80
+ function stripLeadingScaffolding(value) {
81
+ let current = value;
82
+ let changed = true;
83
+ while (changed) {
84
+ changed = false;
85
+ for (const pattern of LEADING_PATTERNS) {
86
+ const next = current.replace(pattern, "").trim();
87
+ if (next !== current) {
88
+ current = next;
89
+ changed = true;
90
+ }
91
+ }
92
+ }
93
+ return current;
94
+ }
95
+ function firstSentence(value) {
96
+ const match = value.match(/^(.{12,}?[.!?])(?:\s|$)/);
97
+ return match ? match[1] : value;
98
+ }
99
+ function compactTitle(value, maxChars) {
100
+ const words = value.match(/[A-Za-z0-9_./-]+/g) ?? [];
101
+ const selected = [];
102
+ for (const word of words) {
103
+ const normalized = word.toLowerCase();
104
+ if (STOP_WORDS.has(normalized)) {
105
+ continue;
106
+ }
107
+ selected.push(word);
108
+ const joined = selected.join(" ");
109
+ if (joined.length >= maxChars - 1 || selected.length >= 8) {
110
+ break;
111
+ }
112
+ }
113
+ const compact = stripTerminalPunctuation(selected.join(" "));
114
+ return compact && compact.length < value.length ? truncate(compact, maxChars) : "";
115
+ }
116
+ function normalizeTaskText(value) {
117
+ return value.replace(/\s+/g, " ").trim();
118
+ }
119
+ function stripTerminalPunctuation(value) {
120
+ return value.replace(/[.!?]+$/g, "").trim();
121
+ }
122
+ function truncate(value, maxChars) {
123
+ if (value.length <= maxChars) {
124
+ return value;
125
+ }
126
+ return `${value.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;
127
+ }
128
+ const LLM_TITLE_MAX = 80;
129
+ function cleanLlmTitle(raw) {
130
+ const text = raw.trim();
131
+ if (!text)
132
+ return null;
133
+ const jsonTitle = titleFromJsonOutput(text);
134
+ if (jsonTitle)
135
+ return jsonTitle;
136
+ return cleanLlmTitleText(text);
137
+ }
138
+ function cleanLlmTitleText(raw) {
139
+ let text = raw;
140
+ // Strip enclosing quotes (straight + smart) and trailing punctuation.
141
+ text = text.replace(/^["'`“”‘’]+/, "");
142
+ text = text.replace(/["'`“”‘’]+$/, "");
143
+ text = text.replace(/[.!?]+$/g, "").trim();
144
+ if (!text)
145
+ return null;
146
+ // Some models prefix with "Title:". Drop common label prefixes.
147
+ text = text.replace(/^(?:title|summary)\s*:\s*/i, "").trim();
148
+ if (!text)
149
+ return null;
150
+ // Take only the first line to avoid multi-paragraph responses.
151
+ text = text.split(/\r?\n/)[0]?.trim() ?? "";
152
+ if (!text)
153
+ return null;
154
+ if (text.length > LLM_TITLE_MAX) {
155
+ text = text.slice(0, LLM_TITLE_MAX).trimEnd();
156
+ }
157
+ return text;
158
+ }
159
+ function titleFromJsonOutput(raw) {
160
+ const start = raw.indexOf("{");
161
+ const end = raw.lastIndexOf("}");
162
+ if (start < 0 || end < start) {
163
+ return null;
164
+ }
165
+ try {
166
+ const value = JSON.parse(raw.slice(start, end + 1));
167
+ return typeof value.title === "string" ? cleanLlmTitleText(value.title.trim()) : null;
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ }
173
+ const SUMMARY_PROMPT_PREFIX = "Summarize this coding agent task for a compact sidebar label. Return exactly one JSON object and no markdown: {\"title\":\"5-8 word imperative title\"}. No quotes inside the title, no trailing punctuation.\n\nTask: ";
174
+ async function summarizeViaApiKey(task, apiKey) {
175
+ try {
176
+ const response = await fetch("https://api.anthropic.com/v1/messages", {
177
+ method: "POST",
178
+ headers: {
179
+ "content-type": "application/json",
180
+ "x-api-key": apiKey,
181
+ "anthropic-version": "2023-06-01",
182
+ },
183
+ body: JSON.stringify({
184
+ model: "claude-haiku-4-5-20251001",
185
+ max_tokens: 50,
186
+ system: "Summarize coding tasks for compact sidebar labels. Return exactly one JSON object with a title string and no markdown.",
187
+ messages: [{ role: "user", content: task }],
188
+ }),
189
+ });
190
+ if (!response.ok) {
191
+ return null;
192
+ }
193
+ const data = (await response.json());
194
+ const first = data.content?.find((block) => typeof block?.text === "string");
195
+ return cleanLlmTitle(first?.text ?? "");
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ async function summarizeViaClaudeCli(task) {
202
+ const { spawn } = await import("node:child_process");
203
+ return await new Promise((resolve) => {
204
+ let settled = false;
205
+ const finish = (val) => {
206
+ if (!settled) {
207
+ settled = true;
208
+ resolve(val);
209
+ }
210
+ };
211
+ let child;
212
+ try {
213
+ child = spawn("claude", ["-p", "--model", "claude-haiku-4-5-20251001"], { stdio: ["pipe", "pipe", "ignore"] });
214
+ }
215
+ catch {
216
+ finish(null);
217
+ return;
218
+ }
219
+ let out = "";
220
+ const timer = setTimeout(() => {
221
+ try {
222
+ child.kill("SIGTERM");
223
+ }
224
+ catch {
225
+ // ignore
226
+ }
227
+ finish(null);
228
+ }, 20000);
229
+ child.stdout?.on("data", (d) => {
230
+ out += d.toString("utf8");
231
+ });
232
+ child.on("exit", () => {
233
+ clearTimeout(timer);
234
+ finish(cleanLlmTitle(out));
235
+ });
236
+ child.on("error", () => {
237
+ clearTimeout(timer);
238
+ finish(null);
239
+ });
240
+ try {
241
+ child.stdin?.write(`${SUMMARY_PROMPT_PREFIX}${task}`);
242
+ child.stdin?.end();
243
+ }
244
+ catch {
245
+ // ignore — child error handler will fire
246
+ }
247
+ });
248
+ }
249
+ /**
250
+ * Resolve an Anthropic API key from the environment or the saved anthropic auth
251
+ * profile. Returns "" when none is available.
252
+ */
253
+ export async function resolveAnthropicApiKey() {
254
+ let apiKey = process.env.ANTHROPIC_API_KEY ?? "";
255
+ if (!apiKey) {
256
+ try {
257
+ const { backendEnv } = await import("./backends.js");
258
+ const env = await backendEnv("anthropic");
259
+ apiKey = env.ANTHROPIC_API_KEY ?? "";
260
+ }
261
+ catch {
262
+ // ignore — caller falls through to the claude CLI path
263
+ }
264
+ }
265
+ return apiKey;
266
+ }
267
+ async function callModelViaApiKey(params) {
268
+ try {
269
+ const response = await fetch("https://api.anthropic.com/v1/messages", {
270
+ method: "POST",
271
+ headers: {
272
+ "content-type": "application/json",
273
+ "x-api-key": params.apiKey,
274
+ "anthropic-version": "2023-06-01",
275
+ },
276
+ body: JSON.stringify({
277
+ model: params.model,
278
+ max_tokens: params.maxTokens,
279
+ system: params.system,
280
+ messages: [{ role: "user", content: params.user }],
281
+ }),
282
+ });
283
+ if (!response.ok) {
284
+ return null;
285
+ }
286
+ const data = (await response.json());
287
+ return (data.content ?? [])
288
+ .filter((block) => typeof block?.text === "string")
289
+ .map((block) => block.text)
290
+ .join("")
291
+ .trim();
292
+ }
293
+ catch {
294
+ return null;
295
+ }
296
+ }
297
+ async function callModelViaClaudeCli(params) {
298
+ const { spawn } = await import("node:child_process");
299
+ return await new Promise((resolve) => {
300
+ let settled = false;
301
+ const finish = (val) => {
302
+ if (!settled) {
303
+ settled = true;
304
+ resolve(val);
305
+ }
306
+ };
307
+ let child;
308
+ try {
309
+ child = spawn("claude", ["-p", "--model", params.model, "--append-system-prompt", params.system], { stdio: ["pipe", "pipe", "ignore"] });
310
+ }
311
+ catch {
312
+ finish(null);
313
+ return;
314
+ }
315
+ let out = "";
316
+ const timer = setTimeout(() => {
317
+ try {
318
+ child.kill("SIGTERM");
319
+ }
320
+ catch {
321
+ // ignore
322
+ }
323
+ finish(null);
324
+ }, params.timeoutMs);
325
+ child.stdout?.on("data", (d) => {
326
+ out += d.toString("utf8");
327
+ });
328
+ child.on("exit", () => {
329
+ clearTimeout(timer);
330
+ finish(out.trim() || null);
331
+ });
332
+ child.on("error", () => {
333
+ clearTimeout(timer);
334
+ finish(null);
335
+ });
336
+ try {
337
+ child.stdin?.write(params.user);
338
+ child.stdin?.end();
339
+ }
340
+ catch {
341
+ // ignore — child error handler will fire
342
+ }
343
+ });
344
+ }
345
+ /**
346
+ * Generic single-shot LLM text call reused by the planner. Tries the Anthropic
347
+ * API (when a key is available) then falls back to the `claude` CLI, mirroring
348
+ * llmSummarizeTask's degradation path. Throws only when neither path is usable
349
+ * AND no output was produced, so callers can surface a clear error.
350
+ */
351
+ export async function callTextModel(params) {
352
+ // TEST-ONLY deterministic hook: when RUDDER_FAKE_MODEL_OUTPUT is set, return it
353
+ // verbatim (or, if it begins with "@", the contents of that file) instead of
354
+ // calling any real model. This lets the end-to-end orchestrator test drive the
355
+ // real planner code path (planTask -> parsePlanBlock -> scaffoldPlan) with a
356
+ // canned RUDDER_PLAN_TASKS block, so a run is repeatable and needs no auth.
357
+ const fake = process.env.RUDDER_FAKE_MODEL_OUTPUT;
358
+ if (fake !== undefined && fake !== "") {
359
+ if (fake.startsWith("@")) {
360
+ const { readFile } = await import("node:fs/promises");
361
+ return await readFile(fake.slice(1), "utf8");
362
+ }
363
+ return fake;
364
+ }
365
+ const maxTokens = params.maxTokens ?? 2048;
366
+ const timeoutMs = params.timeoutMs ?? 60000;
367
+ const apiKey = await resolveAnthropicApiKey();
368
+ if (apiKey) {
369
+ const text = await callModelViaApiKey({
370
+ apiKey,
371
+ model: params.model,
372
+ system: params.system,
373
+ user: params.user,
374
+ maxTokens,
375
+ });
376
+ if (text) {
377
+ return text;
378
+ }
379
+ }
380
+ const { commandExists } = await import("./util.js");
381
+ if (commandExists("claude")) {
382
+ const text = await callModelViaClaudeCli({
383
+ model: params.model,
384
+ system: params.system,
385
+ user: params.user,
386
+ timeoutMs,
387
+ });
388
+ if (text) {
389
+ return text;
390
+ }
391
+ }
392
+ throw new Error("No planning model available: set ANTHROPIC_API_KEY (or sign in so a key is in your auth profile), or install the `claude` CLI.");
393
+ }
394
+ export async function llmSummarizeTask(task) {
395
+ const trimmed = normalizeTaskText(redactTaskSummarySecrets(task));
396
+ if (!trimmed) {
397
+ return null;
398
+ }
399
+ // Fast path: direct Anthropic API if an API key is sitting in env or in the
400
+ // user's saved anthropic auth profile. ~1s per call.
401
+ let apiKey = process.env.ANTHROPIC_API_KEY ?? "";
402
+ if (!apiKey) {
403
+ try {
404
+ const { backendEnv } = await import("./backends.js");
405
+ const env = await backendEnv("anthropic");
406
+ apiKey = env.ANTHROPIC_API_KEY ?? "";
407
+ }
408
+ catch {
409
+ // ignore — fall through to CLI fallback
410
+ }
411
+ }
412
+ if (apiKey) {
413
+ const title = await summarizeViaApiKey(trimmed, apiKey);
414
+ if (title)
415
+ return title;
416
+ }
417
+ // Fallback: shell out to the `claude` CLI itself. Slower (~3-5s) but works
418
+ // for users who authenticate via the macOS Keychain / claude login flow
419
+ // instead of a raw API key. Runs in the background relative to the dashboard
420
+ // so the user does not feel the latency.
421
+ return await summarizeViaClaudeCli(trimmed);
422
+ }
423
+ /**
424
+ * Redact token/key/secret-shaped values from free text. Exported for the
425
+ * improvement loop, which must strip secrets from session telemetry before
426
+ * any model call (docs/continual-improvement.md §3).
427
+ */
428
+ export function redactTaskSummarySecrets(value) {
429
+ return value
430
+ .split(/\s+/)
431
+ .filter(Boolean)
432
+ .map(redactSecretToken)
433
+ .join(" ");
434
+ }
435
+ function redactSecretToken(raw) {
436
+ const trimmed = raw.replace(/^[`"'([{]+|[`"',;)\]}]+$/g, "");
437
+ const eq = trimmed.indexOf("=");
438
+ if (eq > 0) {
439
+ const key = trimmed.slice(0, eq);
440
+ const secret = trimmed.slice(eq + 1);
441
+ if (looksLikeSecretKey(key) &&
442
+ (looksLikeSecretValue(secret) || looksLikePlausibleSecretValue(secret))) {
443
+ return raw.replace(secret, "[redacted]");
444
+ }
445
+ }
446
+ if (looksLikeSecretValue(trimmed)) {
447
+ return raw.replace(trimmed, "[redacted]");
448
+ }
449
+ return raw;
450
+ }
451
+ function looksLikeSecretKey(key) {
452
+ return /token|api_key|apikey|secret|password/i.test(key);
453
+ }
454
+ function looksLikeSecretValue(value) {
455
+ const lower = value.toLowerCase();
456
+ const hasSecretPrefix = lower.includes("api_") ||
457
+ lower.startsWith("sk-") ||
458
+ lower.startsWith("xox") ||
459
+ lower.startsWith("ghp_") ||
460
+ lower.startsWith("gho_") ||
461
+ lower.startsWith("github_pat_");
462
+ const longMixed = value.length >= 24 &&
463
+ /[A-Za-z]/.test(value) &&
464
+ /[0-9_.-]/.test(value);
465
+ return hasSecretPrefix || longMixed;
466
+ }
467
+ function looksLikePlausibleSecretValue(value) {
468
+ return (value.length >= 10 &&
469
+ /[A-Za-z0-9]/.test(value) &&
470
+ /[0-9_.\-/]/.test(value));
471
+ }
472
+ //# sourceMappingURL=task-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-summary.js","sourceRoot":"","sources":["../src/task-summary.ts"],"names":[],"mappings":"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"}