codeloop-mcp-server 0.1.95 → 0.1.96

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.
@@ -18,4 +18,31 @@ export declare function checkBinaryFreshness(opts: {
18
18
  app_name?: string;
19
19
  cwd: string;
20
20
  }): BinaryFreshnessResult;
21
+ /**
22
+ * 0.1.96 — resolve the on-disk module path of the ACTUALLY-RUNNING process
23
+ * for `appName`, so freshness reflects what the recording will truly capture.
24
+ *
25
+ * Photometry-DB Windows E2E (#14): the configured target pointed at a stale
26
+ * `publish/PhotometryDB-Beta/Photometry DB.exe` (resolved by the directory
27
+ * walk), while the running app was a FRESH Debug build under a subproject
28
+ * dir (`PhotometryDB.UI/bin/Debug/...`) that the walk never reaches. The
29
+ * result was a false "BINARY MISMATCH" that told the agent it was recording
30
+ * stale code. The running process's own module path is the ground truth.
31
+ *
32
+ * Best-effort and bounded: win32 via `Get-Process .Path` (exact ProcessName
33
+ * match), darwin via `ps -axo comm=` (.app bundle / exec basename match).
34
+ * Returns undefined on any failure so callers fall back to the configured
35
+ * path resolver.
36
+ */
37
+ export declare function runningAppBinaryPath(appName: string): Promise<string | undefined>;
38
+ /**
39
+ * 0.1.96 — async freshness that prefers the actually-running process binary
40
+ * over the configured/walked path, eliminating the stale-publish-folder false
41
+ * positive. Falls back to the sync configured-path check when no matching
42
+ * process is running.
43
+ */
44
+ export declare function checkBinaryFreshnessAsync(opts: {
45
+ app_name?: string;
46
+ cwd: string;
47
+ }): Promise<BinaryFreshnessResult>;
21
48
  //# sourceMappingURL=binary_freshness.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"binary_freshness.d.ts","sourceRoot":"","sources":["../../src/evidence/binary_freshness.ts"],"names":[],"mappings":"AAmIA,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAqCxB"}
1
+ {"version":3,"file":"binary_freshness.d.ts","sourceRoot":"","sources":["../../src/evidence/binary_freshness.ts"],"names":[],"mappings":"AAmIA,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAmCD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAOxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqCvF;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,qBAAqB,CAAC,CASjC"}
@@ -129,40 +129,118 @@ function binaryMtime(p) {
129
129
  return 0;
130
130
  }
131
131
  }
132
- export function checkBinaryFreshness(opts) {
133
- if (!opts.app_name)
134
- return { stale: false };
135
- const binPath = resolveBinaryPath(opts.app_name, opts.cwd);
136
- if (!binPath)
137
- return { stale: false };
132
+ /**
133
+ * Compares a SPECIFIC binary path against the newest source mtime. Returns
134
+ * null when the binary can't be statted or there's no source to compare.
135
+ * Shared by the sync (configured-path) and async (running-process) checks.
136
+ */
137
+ function freshnessForBinary(binPath, cwd) {
138
138
  const binMs = binaryMtime(binPath);
139
139
  if (binMs === 0)
140
- return { stale: false };
141
- const newest = newestSourceMtime(opts.cwd);
140
+ return null;
141
+ const newest = newestSourceMtime(cwd);
142
142
  if (!newest)
143
- return { stale: false };
143
+ return null;
144
144
  const lagSeconds = Math.round((newest.mtimeMs - binMs) / 1000);
145
- if (lagSeconds <= FRESHNESS_BUFFER_SECONDS) {
146
- return {
147
- stale: false,
148
- binary_path: binPath,
149
- binary_mtime: new Date(binMs).toISOString(),
150
- newest_source_path: newest.path,
151
- newest_source_mtime: new Date(newest.mtimeMs).toISOString(),
152
- lag_seconds: lagSeconds,
153
- };
154
- }
155
- const lagMin = Math.floor(lagSeconds / 60);
156
- return {
157
- stale: true,
145
+ const base = {
158
146
  binary_path: binPath,
159
147
  binary_mtime: new Date(binMs).toISOString(),
160
148
  newest_source_path: newest.path,
161
149
  newest_source_mtime: new Date(newest.mtimeMs).toISOString(),
162
150
  lag_seconds: lagSeconds,
151
+ };
152
+ if (lagSeconds <= FRESHNESS_BUFFER_SECONDS)
153
+ return { stale: false, ...base };
154
+ const lagMin = Math.floor(lagSeconds / 60);
155
+ return {
156
+ stale: true,
157
+ ...base,
163
158
  reason: `BINARY MISMATCH — the running app at ${binPath} was built ${lagMin} minute(s) before your latest source edit ` +
164
159
  `(${path.basename(newest.path)} @ ${new Date(newest.mtimeMs).toISOString()}). ` +
165
160
  `Rebuild and re-deploy before recording. Re-running codeloop_start_recording without rebuilding will produce evidence against stale code.`,
166
161
  };
167
162
  }
163
+ export function checkBinaryFreshness(opts) {
164
+ if (!opts.app_name)
165
+ return { stale: false };
166
+ const binPath = resolveBinaryPath(opts.app_name, opts.cwd);
167
+ if (!binPath)
168
+ return { stale: false };
169
+ return freshnessForBinary(binPath, opts.cwd) ?? { stale: false };
170
+ }
171
+ /**
172
+ * 0.1.96 — resolve the on-disk module path of the ACTUALLY-RUNNING process
173
+ * for `appName`, so freshness reflects what the recording will truly capture.
174
+ *
175
+ * Photometry-DB Windows E2E (#14): the configured target pointed at a stale
176
+ * `publish/PhotometryDB-Beta/Photometry DB.exe` (resolved by the directory
177
+ * walk), while the running app was a FRESH Debug build under a subproject
178
+ * dir (`PhotometryDB.UI/bin/Debug/...`) that the walk never reaches. The
179
+ * result was a false "BINARY MISMATCH" that told the agent it was recording
180
+ * stale code. The running process's own module path is the ground truth.
181
+ *
182
+ * Best-effort and bounded: win32 via `Get-Process .Path` (exact ProcessName
183
+ * match), darwin via `ps -axo comm=` (.app bundle / exec basename match).
184
+ * Returns undefined on any failure so callers fall back to the configured
185
+ * path resolver.
186
+ */
187
+ export async function runningAppBinaryPath(appName) {
188
+ if (!appName)
189
+ return undefined;
190
+ const norm = (s) => s.replace(/\s+/g, "").toLowerCase();
191
+ const want = norm(appName);
192
+ if (!want)
193
+ return undefined;
194
+ try {
195
+ const { runCommand } = await import("../runners/base.js");
196
+ if (process.platform === "win32") {
197
+ const esc = appName.replace(/'/g, "''");
198
+ const ps = [
199
+ `$wn = ('${esc}' -replace '\\s','').ToLowerInvariant()`,
200
+ "Get-Process | Where-Object { $_.Path -and ((($_.ProcessName -replace '\\s','').ToLowerInvariant()) -eq $wn) } | Select-Object -First 1 -ExpandProperty Path",
201
+ ].join("; ");
202
+ const r = await runCommand("powershell", ["-NoProfile", "-Command", ps], process.cwd(), undefined, undefined, 8000);
203
+ const p = r.stdout
204
+ .split(/\r?\n/)
205
+ .map((s) => s.trim())
206
+ .filter(Boolean)
207
+ .pop();
208
+ return p && existsSync(p) ? p : undefined;
209
+ }
210
+ if (process.platform === "darwin") {
211
+ const r = await runCommand("ps", ["-axo", "comm="], process.cwd(), undefined, undefined, 8000);
212
+ const lines = r.stdout.split(/\r?\n/).map((s) => s.trim()).filter(Boolean);
213
+ for (const line of lines) {
214
+ const bundle = line.match(/\/([^/]+)\.app\//);
215
+ if (bundle && norm(bundle[1]) === want) {
216
+ return line.slice(0, line.indexOf(".app/") + 4);
217
+ }
218
+ if (norm(path.basename(line)) === want && existsSync(line))
219
+ return line;
220
+ }
221
+ return undefined;
222
+ }
223
+ }
224
+ catch {
225
+ /* best-effort */
226
+ }
227
+ return undefined;
228
+ }
229
+ /**
230
+ * 0.1.96 — async freshness that prefers the actually-running process binary
231
+ * over the configured/walked path, eliminating the stale-publish-folder false
232
+ * positive. Falls back to the sync configured-path check when no matching
233
+ * process is running.
234
+ */
235
+ export async function checkBinaryFreshnessAsync(opts) {
236
+ if (!opts.app_name)
237
+ return { stale: false };
238
+ const runningPath = await runningAppBinaryPath(opts.app_name);
239
+ if (runningPath) {
240
+ const res = freshnessForBinary(runningPath, opts.cwd);
241
+ if (res)
242
+ return res;
243
+ }
244
+ return checkBinaryFreshness(opts);
245
+ }
168
246
  //# sourceMappingURL=binary_freshness.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"binary_freshness.js","sourceRoot":"","sources":["../../src/evidence/binary_freshness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binary_freshness.js","sourceRoot":"","sources":["../../src/evidence/binary_freshness.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2170,8 +2170,11 @@ App logs (stdout, logcat, simctl log) are automatically captured alongside the v
2170
2170
  let binaryFreshnessDetails;
2171
2171
  if (targetType === "desktop" && appName) {
2172
2172
  try {
2173
- const { checkBinaryFreshness } = await import("./evidence/binary_freshness.js");
2174
- binaryFreshnessDetails = checkBinaryFreshness({ app_name: appName, cwd });
2173
+ // 0.1.96 prefer the actually-running process binary (E2E #14: the
2174
+ // configured path pointed at a stale publish/ copy while the running
2175
+ // app was a fresh subproject Debug build → false BINARY MISMATCH).
2176
+ const { checkBinaryFreshnessAsync } = await import("./evidence/binary_freshness.js");
2177
+ binaryFreshnessDetails = await checkBinaryFreshnessAsync({ app_name: appName, cwd });
2175
2178
  if (binaryFreshnessDetails.stale) {
2176
2179
  binaryFreshnessWarning = binaryFreshnessDetails.reason;
2177
2180
  const { recordCycleIssue } = await import("./evidence/cycle_issues.js");