claude-ide-bridge 2.25.34 → 2.25.40

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/README.md CHANGED
@@ -14,6 +14,8 @@ Install the companion extension, start the bridge, open Claude. That's it. Claud
14
14
  Claude Code ──── bridge ──── VS Code extension ──── your editor state
15
15
  ```
16
16
 
17
+ ![claude-ide-bridge demo](demo.gif)
18
+
17
19
  **Works from your phone.** SSH into your dev machine, send a message, watch Claude fix bugs and run tests on your home machine while you're away.
18
20
 
19
21
  ## Pick your path
@@ -1,5 +1,7 @@
1
1
  export type { ActivityEntry, ActivityListener, LifecycleEntry, TimelineEntry, } from "./activityTypes.js";
2
2
  import type { ActivityEntry, ActivityListener, TimelineEntry } from "./activityTypes.js";
3
+ /** Default sliding window for co-occurrence (5 minutes). */
4
+ export declare const DEFAULT_CO_OCCURRENCE_WINDOW_MS: number;
3
5
  export declare class ActivityLog {
4
6
  private entries;
5
7
  private lifecycleEntries;
@@ -7,6 +9,11 @@ export declare class ActivityLog {
7
9
  private maxEntries;
8
10
  private persistPath;
9
11
  private readonly listeners;
12
+ /**
13
+ * Per-tool bounded ring of duration samples used for percentile computation.
14
+ * Capped at MAX_DURATION_SAMPLES per tool to bound memory.
15
+ */
16
+ private readonly durationSamples;
10
17
  constructor(maxEntries?: number);
11
18
  /**
12
19
  * Subscribe to real-time activity events.
@@ -39,4 +46,26 @@ export declare class ActivityLog {
39
46
  avgDurationMs: number;
40
47
  errors: number;
41
48
  }>;
49
+ /**
50
+ * Per-tool percentiles (p50/p95/p99) computed from the bounded duration
51
+ * sample buffer. Returns null for any tool with fewer than 2 samples.
52
+ */
53
+ percentiles(): Record<string, {
54
+ p50: number;
55
+ p95: number;
56
+ p99: number;
57
+ sampleCount: number;
58
+ }>;
59
+ /** Nearest-rank percentile from a pre-sorted array. */
60
+ private _percentileValue;
61
+ /**
62
+ * Tool-pair co-occurrence within a sliding time window.
63
+ * Counts how many times tool B was called within `windowMs` after tool A,
64
+ * across all entries in the in-memory buffer. Pairs are ordered (A < B
65
+ * alphabetically) to avoid double-counting. Returns sorted by count desc.
66
+ */
67
+ coOccurrence(windowMs?: number): {
68
+ pair: string;
69
+ count: number;
70
+ }[];
42
71
  }
@@ -5,6 +5,10 @@ function escapeLabelValue(s) {
5
5
  }
6
6
  const MAX_PERSIST_LINES = 10_000;
7
7
  const MAX_PERSIST_BYTES = 1024 * 1024; // 1MB
8
+ /** Max duration samples kept per tool for percentile calculation. */
9
+ const MAX_DURATION_SAMPLES = 1_000;
10
+ /** Default sliding window for co-occurrence (5 minutes). */
11
+ export const DEFAULT_CO_OCCURRENCE_WINDOW_MS = 5 * 60 * 1_000;
8
12
  export class ActivityLog {
9
13
  entries = [];
10
14
  lifecycleEntries = [];
@@ -12,6 +16,11 @@ export class ActivityLog {
12
16
  maxEntries;
13
17
  persistPath;
14
18
  listeners = new Set();
19
+ /**
20
+ * Per-tool bounded ring of duration samples used for percentile computation.
21
+ * Capped at MAX_DURATION_SAMPLES per tool to bound memory.
22
+ */
23
+ durationSamples = new Map();
15
24
  constructor(maxEntries = 500) {
16
25
  this.maxEntries = maxEntries;
17
26
  this.persistPath = null;
@@ -144,6 +153,17 @@ export class ActivityLog {
144
153
  };
145
154
  this.entries.push(entry);
146
155
  this._appendToDisk("tool", entry);
156
+ // Accumulate duration sample for percentile tracking
157
+ let samples = this.durationSamples.get(tool);
158
+ if (!samples) {
159
+ samples = [];
160
+ this.durationSamples.set(tool, samples);
161
+ }
162
+ samples.push(durationMs);
163
+ if (samples.length > MAX_DURATION_SAMPLES * 1.2) {
164
+ // Batch eviction: keep newest MAX_DURATION_SAMPLES to amortise splice cost
165
+ this.durationSamples.set(tool, samples.slice(-MAX_DURATION_SAMPLES));
166
+ }
147
167
  for (const listener of this.listeners) {
148
168
  try {
149
169
  listener("tool", entry);
@@ -249,5 +269,62 @@ export class ActivityLog {
249
269
  }
250
270
  return result;
251
271
  }
272
+ /**
273
+ * Per-tool percentiles (p50/p95/p99) computed from the bounded duration
274
+ * sample buffer. Returns null for any tool with fewer than 2 samples.
275
+ */
276
+ percentiles() {
277
+ const result = {};
278
+ for (const [tool, raw] of this.durationSamples) {
279
+ if (raw.length < 2)
280
+ continue;
281
+ const sorted = [...raw].sort((a, b) => a - b);
282
+ const n = sorted.length;
283
+ result[tool] = {
284
+ p50: this._percentileValue(sorted, 50),
285
+ p95: this._percentileValue(sorted, 95),
286
+ p99: this._percentileValue(sorted, 99),
287
+ sampleCount: n,
288
+ };
289
+ }
290
+ return result;
291
+ }
292
+ /** Nearest-rank percentile from a pre-sorted array. */
293
+ _percentileValue(sorted, pct) {
294
+ const idx = Math.ceil((pct / 100) * sorted.length) - 1;
295
+ return Math.round(sorted[Math.max(0, idx)] ?? 0);
296
+ }
297
+ /**
298
+ * Tool-pair co-occurrence within a sliding time window.
299
+ * Counts how many times tool B was called within `windowMs` after tool A,
300
+ * across all entries in the in-memory buffer. Pairs are ordered (A < B
301
+ * alphabetically) to avoid double-counting. Returns sorted by count desc.
302
+ */
303
+ coOccurrence(windowMs = DEFAULT_CO_OCCURRENCE_WINDOW_MS) {
304
+ const counts = new Map();
305
+ // entries are chronological; use two-pointer sliding window
306
+ const n = this.entries.length;
307
+ for (let i = 0; i < n; i++) {
308
+ const a = this.entries[i];
309
+ if (!a)
310
+ continue;
311
+ const tA = new Date(a.timestamp).getTime();
312
+ for (let j = i + 1; j < n; j++) {
313
+ const b = this.entries[j];
314
+ if (!b)
315
+ continue;
316
+ const tB = new Date(b.timestamp).getTime();
317
+ if (tB - tA > windowMs)
318
+ break; // sorted chronologically — safe to break
319
+ if (a.tool === b.tool)
320
+ continue; // skip self-pairs
321
+ const key = a.tool < b.tool ? `${a.tool}|${b.tool}` : `${b.tool}|${a.tool}`;
322
+ counts.set(key, (counts.get(key) ?? 0) + 1);
323
+ }
324
+ }
325
+ return [...counts.entries()]
326
+ .map(([pair, count]) => ({ pair, count }))
327
+ .sort((a, b) => b.count - a.count);
328
+ }
252
329
  }
253
330
  //# sourceMappingURL=activityLog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activityLog.js","sourceRoot":"","sources":["../src/activityLog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activityLog.js","sourceRoot":"","sources":["../src/activityLog.ts"],"names":[],"mappings":"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"}
@@ -108,6 +108,17 @@ export interface OnTestRunPolicy extends PromptSource {
108
108
  /** Minimum ms between triggers. Enforced minimum: 5000. */
109
109
  cooldownMs: number;
110
110
  }
111
+ export interface OnTestPassAfterFailurePolicy extends PromptSource {
112
+ enabled: boolean;
113
+ /**
114
+ * Fired when a test run transitions from failing → passing for the same runner.
115
+ * Per-runner state is tracked so vitest passing after a jest failure does NOT
116
+ * trigger — only the runner that was previously failing then passes triggers the hook.
117
+ * Placeholders (inline prompt only): {{runner}}, {{passed}}, {{total}}
118
+ */
119
+ /** Minimum ms between triggers. Enforced minimum: 5000. */
120
+ cooldownMs: number;
121
+ }
111
122
  /** Minimal test run result passed to handleTestRun — avoids importing TestResult from tool files. */
112
123
  export interface TestRunResult {
113
124
  runners: string[];
@@ -278,6 +289,8 @@ export interface AutomationPolicy {
278
289
  onInstructionsLoaded?: OnInstructionsLoadedPolicy;
279
290
  /** Fired after every runTests call (or only on failures, depending on onFailureOnly). */
280
291
  onTestRun?: OnTestRunPolicy;
292
+ /** Fired when a test run transitions from failing → passing for the same runner. */
293
+ onTestPassAfterFailure?: OnTestPassAfterFailurePolicy;
281
294
  /** Fired after every successful gitCommit call. */
282
295
  onGitCommit?: OnGitCommitPolicy;
283
296
  /** Fired after every successful gitPush call. */
@@ -338,6 +351,15 @@ export declare class AutomationHooks {
338
351
  private activeFileChangedTasks;
339
352
  /** Active task ID for the test-run handler (workspace-global). */
340
353
  private activeTestRunTaskId;
354
+ /** Active task ID for the test-pass-after-failure handler (workspace-global). */
355
+ private activeTestPassAfterFailureTaskId;
356
+ /**
357
+ * Per-runner last outcome — used to detect fail→pass transitions.
358
+ * Key: runner name (e.g. "vitest", "jest"). Value: "pass" | "fail".
359
+ * Stored separately per runner so a vitest pass doesn't incorrectly trigger
360
+ * when a jest run was the one that previously failed.
361
+ */
362
+ private lastTestOutcomeByRunner;
341
363
  /** Active task ID for the git-commit handler (workspace-global). */
342
364
  private activeGitCommitTaskId;
343
365
  /** Active task ID for the git-push handler (workspace-global). */
@@ -414,6 +436,11 @@ export declare class AutomationHooks {
414
436
  * Triggers an automation task when tests fail (or on every run if onFailureOnly is false).
415
437
  */
416
438
  handleTestRun(result: TestRunResult): void;
439
+ /**
440
+ * Internal — fires onTestPassAfterFailure when a specific runner transitions
441
+ * from failing → passing. Called from handleTestRun after outcome state update.
442
+ */
443
+ private _handleTestPassAfterFailure;
417
444
  /**
418
445
  * Called after a successful gitCommit tool call.
419
446
  * Fires the onGitCommit automation hook if configured.
@@ -475,6 +502,10 @@ export declare class AutomationHooks {
475
502
  onFailureOnly: boolean;
476
503
  cooldownMs: number;
477
504
  } | null;
505
+ onTestPassAfterFailure: {
506
+ enabled: boolean;
507
+ cooldownMs: number;
508
+ } | null;
478
509
  onGitCommit: {
479
510
  enabled: boolean;
480
511
  cooldownMs: number;
@@ -326,6 +326,24 @@ export function loadPolicy(filePath) {
326
326
  }
327
327
  }
328
328
  }
329
+ // Validate onTestPassAfterFailure
330
+ if (policy.onTestPassAfterFailure !== undefined) {
331
+ const tpaf = policy.onTestPassAfterFailure;
332
+ if (typeof tpaf !== "object" || tpaf === null) {
333
+ throw new Error(`"onTestPassAfterFailure" must be an object`);
334
+ }
335
+ if (typeof tpaf.enabled !== "boolean") {
336
+ throw new Error(`"onTestPassAfterFailure.enabled" must be a boolean`);
337
+ }
338
+ validatePromptSource("onTestPassAfterFailure", tpaf);
339
+ if (typeof tpaf.cooldownMs !== "number" ||
340
+ !Number.isFinite(tpaf.cooldownMs)) {
341
+ throw new Error(`"onTestPassAfterFailure.cooldownMs" must be a number`);
342
+ }
343
+ if (tpaf.cooldownMs < MIN_COOLDOWN_MS) {
344
+ tpaf.cooldownMs = MIN_COOLDOWN_MS;
345
+ }
346
+ }
329
347
  // Validate onGitCommit
330
348
  if (policy.onGitCommit !== undefined) {
331
349
  const gc = policy.onGitCommit;
@@ -558,6 +576,15 @@ export class AutomationHooks {
558
576
  activeFileChangedTasks = new Map();
559
577
  /** Active task ID for the test-run handler (workspace-global). */
560
578
  activeTestRunTaskId = null;
579
+ /** Active task ID for the test-pass-after-failure handler (workspace-global). */
580
+ activeTestPassAfterFailureTaskId = null;
581
+ /**
582
+ * Per-runner last outcome — used to detect fail→pass transitions.
583
+ * Key: runner name (e.g. "vitest", "jest"). Value: "pass" | "fail".
584
+ * Stored separately per runner so a vitest pass doesn't incorrectly trigger
585
+ * when a jest run was the one that previously failed.
586
+ */
587
+ lastTestOutcomeByRunner = new Map();
561
588
  /** Active task ID for the git-commit handler (workspace-global). */
562
589
  activeGitCommitTaskId = null;
563
590
  /** Active task ID for the git-push handler (workspace-global). */
@@ -1121,10 +1148,20 @@ export class AutomationHooks {
1121
1148
  * Triggers an automation task when tests fail (or on every run if onFailureOnly is false).
1122
1149
  */
1123
1150
  handleTestRun(result) {
1151
+ const failureCount = result.summary.failed + result.summary.errored;
1152
+ // Update per-runner outcome state unconditionally so onTestPassAfterFailure
1153
+ // can detect fail→pass transitions even when onTestRun is disabled/absent.
1154
+ for (const runner of result.runners) {
1155
+ const prev = this.lastTestOutcomeByRunner.get(runner);
1156
+ const current = failureCount === 0 ? "pass" : "fail";
1157
+ this.lastTestOutcomeByRunner.set(runner, current);
1158
+ if (prev === "fail" && current === "pass") {
1159
+ this._handleTestPassAfterFailure(result, runner);
1160
+ }
1161
+ }
1124
1162
  const cfg = this.policy.onTestRun;
1125
1163
  if (!cfg?.enabled)
1126
1164
  return;
1127
- const failureCount = result.summary.failed + result.summary.errored;
1128
1165
  // Honour onFailureOnly: skip trigger when all tests pass
1129
1166
  if (cfg.onFailureOnly && failureCount === 0)
1130
1167
  return;
@@ -1208,6 +1245,67 @@ export class AutomationHooks {
1208
1245
  this.log(`[automation] failed to enqueue test-run task: ${err instanceof Error ? err.message : String(err)}`);
1209
1246
  }
1210
1247
  }
1248
+ /**
1249
+ * Internal — fires onTestPassAfterFailure when a specific runner transitions
1250
+ * from failing → passing. Called from handleTestRun after outcome state update.
1251
+ */
1252
+ _handleTestPassAfterFailure(result, runner) {
1253
+ const cfg = this.policy.onTestPassAfterFailure;
1254
+ if (!cfg?.enabled)
1255
+ return;
1256
+ // Loop guard: skip if a task is still pending/running
1257
+ if (this.activeTestPassAfterFailureTaskId) {
1258
+ const existing = this.orchestrator.getTask(this.activeTestPassAfterFailureTaskId);
1259
+ if (existing &&
1260
+ (existing.status === "pending" || existing.status === "running")) {
1261
+ this.log(`[automation] skipping test-pass-after-failure — task ${this.activeTestPassAfterFailureTaskId.slice(0, 8)} still active`);
1262
+ return;
1263
+ }
1264
+ this.activeTestPassAfterFailureTaskId = null;
1265
+ }
1266
+ // Cooldown check (workspace-global key)
1267
+ const key = "testPassAfterFailure:global";
1268
+ const now = Date.now();
1269
+ const last = this.lastTrigger.get(key) ?? 0;
1270
+ if (now - last < cfg.cooldownMs) {
1271
+ this.log(`[automation] cooldown active for test-pass-after-failure (${cfg.cooldownMs - (now - last)}ms remaining)`);
1272
+ return;
1273
+ }
1274
+ this._pruneLastTrigger(now);
1275
+ let prompt;
1276
+ if (cfg.promptName) {
1277
+ const resolved = this._resolveNamedPrompt(cfg.promptName, cfg.promptArgs ?? {}, {
1278
+ runner,
1279
+ passed: String(result.summary.passed),
1280
+ total: String(result.summary.total),
1281
+ });
1282
+ if (resolved === null)
1283
+ return;
1284
+ prompt = resolved;
1285
+ }
1286
+ else {
1287
+ const nonce = crypto.randomBytes(6).toString("hex");
1288
+ prompt =
1289
+ (cfg.prompt ?? "")
1290
+ .replace(/\{\{runner\}\}/g, untrustedBlock("TEST RUNNER", runner, nonce))
1291
+ .replace(/\{\{passed\}\}/g, String(result.summary.passed))
1292
+ .replace(/\{\{total\}\}/g, String(result.summary.total)) ?? "";
1293
+ }
1294
+ prompt = truncatePrompt(buildHookMetadata("onTestPassAfterFailure") + prompt);
1295
+ try {
1296
+ const taskId = this._enqueueAutomationTask({
1297
+ prompt,
1298
+ triggerSource: "onTestPassAfterFailure",
1299
+ hookCfg: cfg,
1300
+ });
1301
+ this.lastTrigger.set(key, now);
1302
+ this.activeTestPassAfterFailureTaskId = taskId;
1303
+ this.log(`[automation] triggered test-pass-after-failure task ${taskId.slice(0, 8)} (runner: ${runner})`);
1304
+ }
1305
+ catch (err) {
1306
+ this.log(`[automation] failed to enqueue test-pass-after-failure task: ${err instanceof Error ? err.message : String(err)}`);
1307
+ }
1308
+ }
1211
1309
  /**
1212
1310
  * Called after a successful gitCommit tool call.
1213
1311
  * Fires the onGitCommit automation hook if configured.
@@ -1829,6 +1927,12 @@ export class AutomationHooks {
1829
1927
  cooldownMs: p.onTestRun.cooldownMs,
1830
1928
  }
1831
1929
  : null,
1930
+ onTestPassAfterFailure: p.onTestPassAfterFailure
1931
+ ? {
1932
+ enabled: p.onTestPassAfterFailure.enabled,
1933
+ cooldownMs: p.onTestPassAfterFailure.cooldownMs,
1934
+ }
1935
+ : null,
1832
1936
  onGitCommit: p.onGitCommit
1833
1937
  ? {
1834
1938
  enabled: p.onGitCommit.enabled,