codeloop-mcp-server 0.1.68 → 0.1.69
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/dist/auth/critical_floors.d.ts.map +1 -1
- package/dist/auth/critical_floors.js +4 -0
- package/dist/auth/critical_floors.js.map +1 -1
- package/dist/runners/base.d.ts +4 -1
- package/dist/runners/base.d.ts.map +1 -1
- package/dist/runners/base.js +60 -5
- package/dist/runners/base.js.map +1 -1
- package/dist/runners/flutter.d.ts.map +1 -1
- package/dist/runners/flutter.js +48 -41
- package/dist/runners/flutter.js.map +1 -1
- package/dist/runners/flutter_cache.d.ts +4 -0
- package/dist/runners/flutter_cache.d.ts.map +1 -1
- package/dist/runners/flutter_cache.js +12 -1
- package/dist/runners/flutter_cache.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critical_floors.d.ts","sourceRoot":"","sources":["../../src/auth/critical_floors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"critical_floors.d.ts","sourceRoot":"","sources":["../../src/auth/critical_floors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,EA6G1C,CAAC"}
|
|
@@ -116,6 +116,10 @@ export const CRITICAL_FLOORS = [
|
|
|
116
116
|
min_version: "0.1.66",
|
|
117
117
|
reason: "codeloop_verify could HANG FOREVER on Flutter projects — the three primary Flutter runners (flutter analyze, flutter test, flutter test integration_test/) all called runCommand WITHOUT a timeout, so any one of them could block the whole verify (and the MCP response, which only returns when the entire sequential pipeline finishes) indefinitely. The dominant trigger: `flutter test integration_test/` is launched with NO `-d` device flag and NO device probe, so when no emulator/simulator/device is booted the Flutter CLI waits forever for one — the user saw verify 'hang at here for 10 mins' on a fresh Flutter project with no device. `flutter analyze` could likewise stall on an implicit `pub get` over a slow/blocked network, and a brand-new machine could even block on Flutter's first-run analytics consent prompt. (The later deep-internal duplicates static_analysis `flutter analyze` and coverage `flutter test --coverage` already had 4-/5-min caps, but they never ran because the un-timed primary trio came first.) 0.1.66 fixes it: every primary Flutter runner now passes a wall-clock timeout (analyze 4 min, test 5 min, integration_test 6 min) — on expiry runCommand SIGKILLs and returns exit_code 124, which the runner surfaces as an explicit FAILED result with a clear note ('killed after N min … waiting on a cold emulator/device or a stalled pub get — boot a device or run flutter pub get, then re-verify') instead of a silent freeze — and all three now run with CI=true so Flutter never blocks on its first-run analytics/consent prompt. CRUCIALLY, 0.1.66 also fixes the runCommand watchdog itself: commands were spawned via `shell: true`, so killing the direct child only reaped the `/bin/sh -c …` wrapper, NOT the grandchild it forked (flutter is a bash script that spawns dart) — the grandchild kept the stdout pipe open so the `close` event never fired and the promise hung forever, defeating the timeout. The watchdog now makes the timed child a process-group leader (detached on POSIX) and SIGKILLs the ENTIRE group via process.kill(-pid) (taskkill /T /F on Windows), with a 1.5s safety net that force-settles the promise even if `close` is somehow withheld. Without this, every timeout added above would have been silently ineffective on real Flutter (and any shell-wrapped) commands.",
|
|
118
118
|
},
|
|
119
|
+
{
|
|
120
|
+
min_version: "0.1.69",
|
|
121
|
+
reason: "codeloop_verify STILL hung on real Flutter projects even after the 0.1.68 dedup (recurrence #2, confirmed from a live 0.1.68 WedCheese run) — two gaps remained. (A) DUPLICATE TEST SUITE: when a project has NO integration_test/ directory, the integration runner fell back to `flutter test test/`, which re-ran the EXACT same suite the primary flutter_test runner had just executed. On a normal project that only wasted time; on a project whose test/ suite hangs it burned a SECOND full timeout back-to-back with the first. The integration runner now SKIPS entirely when there is no integration_test/ directory (golden/widget tests in test/ are already covered by the flutter_test runner and need no device); it only runs for a real integration_test/ dir on a booted device. (B) LEAKED-ISOLATE HANG: the dominant real cause on WedCheese was a non-terminating TEST — the test body passes (assertions print) but the Dart isolate never exits because a Timer/Timer.periodic, an unclosed StreamController, or a Firebase/Firestore listener was never disposed, so `flutter test` hangs until the wall-clock timeout SIGKILLs it (exit 124) — wasting the FULL 5-6 min EVERY run. 0.1.69 adds a completion-settle watchdog to runCommand: when the streamed output matches a strong end-of-work marker (`flutter test` prints 'All tests passed!' / 'Some tests failed.' exactly once at the end) but the process then fails to exit, CodeLoop force-closes the process tree ~30s after the marker and resolves exit_code 0 with the REAL parsed pass/fail plus a note naming the leaked-resource cause and pointing the developer to dispose it in tearDown() — instead of blocking the MCP response for the entire timeout. A natural exit within the grace window is unaffected, so well-behaved suites are unchanged. The Flutter timeout note is also rewritten to name the non-terminating-test root cause first. NOTE: CodeLoop cannot FIX the leaked resource in the user's test — it now recovers fast and tells the developer exactly what to fix.",
|
|
122
|
+
},
|
|
119
123
|
{
|
|
120
124
|
min_version: "0.1.68",
|
|
121
125
|
reason: "codeloop_verify STILL effectively hung for many minutes on real Flutter projects (recurrence past 0.1.66/0.1.67) — the 0.1.66 timeouts and 0.1.67 device probe stopped any SINGLE Flutter command from blocking forever, but a scope:'full' verify still fired FOUR heavyweight Flutter invocations back-to-back on one blocking MCP response: the primary runners ran `flutter analyze` then `flutter test`, and the deep-internal code-quality layer then ran `flutter analyze` AGAIN (static_analysis) and `flutter test --coverage` AGAIN (coverage). On a real app each pays the implicit `pub get` + dill-compile cost (1-4 min apiece), so verify blocked for ~7-18 min with zero feedback — which an agent/user correctly reads as 'still hanging' even though no command is technically stuck (the per-command timeouts only cap a TRUE hang, never the duplicate work). 0.1.68 introduces a per-verify-run Flutter command memo cache (runners/flutter_cache.ts, reset at the top of every runVerify): the primary analyze runner and the deep-internal static_analysis runner now share ONE `flutter analyze`, and the primary test runner runs `flutter test --coverage` (a strict superset of plain test, same compact-reporter parsing) so the deep-internal coverage runner reuses the freshly-written coverage/lcov.info via discoverReport() instead of launching a second `flutter test`. Net: 4 heavy Flutter runs collapse to 2, roughly halving wall-clock time and removing the perceived hang. ALSO in 0.1.68: codeloop_init_project no longer reports a confusing 'Created 0 files, merged N configs' when re-run on an already-initialized project — it reads .codeloop/config.json up front, returns a new already_initialized:true flag, and emits an unambiguous 'CodeLoop was ALREADY initialized … proceed directly to codeloop_verify' message so an agent stops looping on init when the project was set up on a previous run or by another machine sharing the repo.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critical_floors.js","sourceRoot":"","sources":["../../src/auth/critical_floors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AASH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,ufAAuf;KAC1f;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,4hBAA4hB;KACriB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,yvBAAyvB;KAClwB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,kxBAAkxB;KACrxB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,0/BAA0/B;KAC7/B;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,0iCAA0iC;KAC7iC;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gqDAAgqD;KACnqD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,uqDAAuqD;KAC1qD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,w+EAAw+E;KAC3+E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,88EAA88E;KACj9E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,uiEAAuiE;KAC1iE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u/DAAu/D;KAC1/D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,k3DAAk3D;KACr3D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,oiDAAoiD;KACviD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,g3CAAg3C;KACn3C;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,srFAAsrF;KACzrF;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gwEAAgwE;KACnwE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,84EAA84E;KACj5E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gwEAAgwE;KACnwE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u4DAAu4D;KAC14D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u/FAAu/F;KAC1/F;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"critical_floors.js","sourceRoot":"","sources":["../../src/auth/critical_floors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AASH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,ufAAuf;KAC1f;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,4hBAA4hB;KACriB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,yvBAAyvB;KAClwB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,kxBAAkxB;KACrxB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,0/BAA0/B;KAC7/B;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,0iCAA0iC;KAC7iC;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gqDAAgqD;KACnqD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,uqDAAuqD;KAC1qD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,w+EAAw+E;KAC3+E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,88EAA88E;KACj9E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,uiEAAuiE;KAC1iE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u/DAAu/D;KAC1/D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,k3DAAk3D;KACr3D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,oiDAAoiD;KACviD;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,g3CAAg3C;KACn3C;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,srFAAsrF;KACzrF;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gwEAAgwE;KACnwE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,84EAA84E;KACj5E;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,gwEAAgwE;KACnwE;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,09DAA09D;KAC79D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u4DAAu4D;KAC14D;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,MAAM,EACJ,u/FAAu/F;KAC1/F;CACF,CAAC"}
|
package/dist/runners/base.d.ts
CHANGED
|
@@ -12,7 +12,10 @@ export interface RunnerResult {
|
|
|
12
12
|
}
|
|
13
13
|
export declare function makeSkippedResult(runnerName: string, reason: string): RunnerResult;
|
|
14
14
|
export declare function checkToolAvailable(command: string): Promise<boolean>;
|
|
15
|
-
export declare function runCommand(cmd: string, args: string[], cwd: string, logPath?: string, extraEnv?: Record<string, string>, timeoutMs?: number
|
|
15
|
+
export declare function runCommand(cmd: string, args: string[], cwd: string, logPath?: string, extraEnv?: Record<string, string>, timeoutMs?: number, settle?: {
|
|
16
|
+
pattern: RegExp;
|
|
17
|
+
graceMs: number;
|
|
18
|
+
}): Promise<{
|
|
16
19
|
exit_code: number;
|
|
17
20
|
stdout: string;
|
|
18
21
|
stderr: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,CAad;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1E;AA2CD,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAOjC,SAAS,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,CAad;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1E;AA2CD,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAOjC,SAAS,CAAC,EAAE,MAAM,EAelB,MAAM,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAiRrF"}
|
package/dist/runners/base.js
CHANGED
|
@@ -76,7 +76,22 @@ export async function runCommand(cmd, args, cwd, logPath, extraEnv,
|
|
|
76
76
|
// that legitimately run long. Callers that wrap UI-tooling probes (e.g.
|
|
77
77
|
// window_manager.swift / osascript / xdotool) should pass 15-30s so a
|
|
78
78
|
// hung helper can't block a vitest suite past its own per-test timeout.
|
|
79
|
-
timeoutMs
|
|
79
|
+
timeoutMs,
|
|
80
|
+
// Optional "completion settle" watchdog. Some long-running commands PRINT a
|
|
81
|
+
// strong end-of-work marker but then fail to EXIT — the classic leaked-async
|
|
82
|
+
// hang where an undisposed Timer / Timer.periodic / StreamController /
|
|
83
|
+
// Firebase listener keeps the process's event loop alive AFTER the work is
|
|
84
|
+
// logically done. `flutter test` is the canonical case: it prints
|
|
85
|
+
// "All tests passed!" / "Some tests failed." at the very end, yet a leaked
|
|
86
|
+
// isolate makes it hang until `timeoutMs` SIGKILLs it (exit 124, 5-6 min
|
|
87
|
+
// wasted EVERY run). When `settle.pattern` matches the streamed output we
|
|
88
|
+
// start a short grace timer; if the process still hasn't closed when it
|
|
89
|
+
// fires, we kill the tree and resolve with exit_code 0 (the buffered output
|
|
90
|
+
// already carries the real pass/fail counts) plus an explanatory note. A
|
|
91
|
+
// natural exit within the grace window is completely unaffected, so this
|
|
92
|
+
// never changes behaviour for well-behaved commands — it only rescues the
|
|
93
|
+
// leaked-resource hang.
|
|
94
|
+
settle) {
|
|
80
95
|
const start = Date.now();
|
|
81
96
|
return new Promise((resolve) => {
|
|
82
97
|
// ── Windows PowerShell -Command quoting fix ─────────────────────
|
|
@@ -197,7 +212,9 @@ timeoutMs) {
|
|
|
197
212
|
child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
|
|
198
213
|
let timedOut = false;
|
|
199
214
|
let settled = false;
|
|
215
|
+
let settledEarly = false;
|
|
200
216
|
let timer = null;
|
|
217
|
+
let settleTimer = null;
|
|
201
218
|
let forceResolveTimer = null;
|
|
202
219
|
// Kill the whole process tree, not just the direct child. On POSIX the
|
|
203
220
|
// child is a group leader (detached, see useProcessGroup) so a negative
|
|
@@ -249,6 +266,8 @@ timeoutMs) {
|
|
|
249
266
|
settled = true;
|
|
250
267
|
if (timer)
|
|
251
268
|
clearTimeout(timer);
|
|
269
|
+
if (settleTimer)
|
|
270
|
+
clearTimeout(settleTimer);
|
|
252
271
|
if (forceResolveTimer)
|
|
253
272
|
clearTimeout(forceResolveTimer);
|
|
254
273
|
const duration_ms = Date.now() - start;
|
|
@@ -260,26 +279,62 @@ timeoutMs) {
|
|
|
260
279
|
}
|
|
261
280
|
catch { /* best-effort */ }
|
|
262
281
|
}
|
|
282
|
+
// settledEarly => the command logically finished (its completion marker
|
|
283
|
+
// was printed) but the process had to be force-closed because it leaked
|
|
284
|
+
// an async resource. The buffered output holds the true pass/fail, so we
|
|
285
|
+
// resolve exit_code 0 (NOT 124 / 1) and let the caller parse it.
|
|
286
|
+
const effectiveCode = settledEarly ? 0 : timedOut ? 124 : code ?? 1;
|
|
287
|
+
const settleNote = `[runCommand] command reported completion but did not exit within ` +
|
|
288
|
+
`${settle?.graceMs}ms — force-closed. A leaked async resource (an ` +
|
|
289
|
+
`undisposed Timer/Timer.periodic, an unclosed StreamController, or a ` +
|
|
290
|
+
`Firebase/Firestore listener) was keeping the process alive after the ` +
|
|
291
|
+
`work finished. Dispose it (e.g. in tearDown()) so the process exits ` +
|
|
292
|
+
`on its own.`;
|
|
263
293
|
if (logPath) {
|
|
264
294
|
try {
|
|
265
295
|
mkdirSync(dirname(logPath), { recursive: true });
|
|
266
296
|
writeFileSync(logPath, `$ ${cmd} ${args.join(" ")}\n` +
|
|
267
|
-
`exit_code: ${
|
|
297
|
+
`exit_code: ${effectiveCode}\n` +
|
|
268
298
|
`duration_ms: ${duration_ms}\n\n` +
|
|
269
299
|
`--- stdout ---\n${stdout}\n` +
|
|
270
|
-
`--- stderr ---\n${stderr}\n`
|
|
300
|
+
`--- stderr ---\n${stderr}\n` +
|
|
301
|
+
(settledEarly ? `\n--- note ---\n${settleNote}\n` : ""));
|
|
271
302
|
}
|
|
272
303
|
catch { /* best-effort */ }
|
|
273
304
|
}
|
|
274
305
|
resolve({
|
|
275
|
-
exit_code:
|
|
306
|
+
exit_code: effectiveCode,
|
|
276
307
|
stdout,
|
|
277
308
|
stderr: timedOut
|
|
278
309
|
? `${stderr}\n[runCommand] timed out after ${timeoutMs}ms — SIGKILLed`
|
|
279
|
-
:
|
|
310
|
+
: settledEarly
|
|
311
|
+
? `${stderr}\n${settleNote}`
|
|
312
|
+
: stderr,
|
|
280
313
|
duration_ms,
|
|
281
314
|
});
|
|
282
315
|
};
|
|
316
|
+
// Completion-settle watchdog: arm a grace timer the first time the output
|
|
317
|
+
// matches `settle.pattern`. Registered as a SECOND data listener (after
|
|
318
|
+
// killTree + finish exist) so the original push-only handlers above are
|
|
319
|
+
// untouched. If the process closes naturally before the grace fires this
|
|
320
|
+
// is a no-op; otherwise we kill the tree and force-settle.
|
|
321
|
+
if (settle) {
|
|
322
|
+
const onSettleData = (chunk) => {
|
|
323
|
+
if (settleTimer || settled)
|
|
324
|
+
return;
|
|
325
|
+
if (settle.pattern.test(chunk.toString("utf-8"))) {
|
|
326
|
+
settleTimer = setTimeout(() => {
|
|
327
|
+
if (settled)
|
|
328
|
+
return;
|
|
329
|
+
settledEarly = true;
|
|
330
|
+
killTree();
|
|
331
|
+
forceResolveTimer = setTimeout(() => finish(0), 1500);
|
|
332
|
+
}, settle.graceMs);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
child.stdout.on("data", onSettleData);
|
|
336
|
+
child.stderr.on("data", onSettleData);
|
|
337
|
+
}
|
|
283
338
|
timer =
|
|
284
339
|
timeoutMs && timeoutMs > 0
|
|
285
340
|
? setTimeout(() => {
|
package/dist/runners/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAe5B,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,MAAc;IAEd,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,CAAC,CAAC;QACb,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,oEAAoE;IACpE,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACrD,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACvD,iEAAiE;IACjE,kCAAkC;IAClC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC;IAC1E,mEAAmE;IACnE,sBAAsB;IACtB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,gEAAgE;IAChE,oEAAoE;IACpE,mBAAmB;IACnB,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,IAAc,EACd,GAAW,EACX,OAAgB,EAChB,QAAiC;AACjC,0EAA0E;AAC1E,sEAAsE;AACtE,uEAAuE;AACvE,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AACxE,SAAkB;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flutter.d.ts","sourceRoot":"","sources":["../../src/runners/flutter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"flutter.d.ts","sourceRoot":"","sources":["../../src/runners/flutter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAsC9C,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CA2CvB;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAiDvB;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAmGvB"}
|
package/dist/runners/flutter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { runCommand, checkToolAvailable, makeSkippedResult } from "./base.js";
|
|
2
|
-
import { runFlutterAnalyzeOnce, runFlutterTestCoverageOnce } from "./flutter_cache.js";
|
|
2
|
+
import { runFlutterAnalyzeOnce, runFlutterTestCoverageOnce, FLUTTER_TEST_SETTLE } from "./flutter_cache.js";
|
|
3
3
|
import { existsSync } from "fs";
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
// Wall-clock watchdogs for the Flutter verify commands. Before this, all
|
|
@@ -19,12 +19,16 @@ const INTEGRATION_TIMEOUT_MS = 360_000; // 6 min
|
|
|
19
19
|
const NONINTERACTIVE_ENV = { CI: "true" };
|
|
20
20
|
function timeoutNote(cmd, timeoutMs) {
|
|
21
21
|
const mins = Math.round(timeoutMs / 60_000);
|
|
22
|
-
return (`[CodeLoop] \`${cmd}\` was killed after ${mins} min (timeout). ` +
|
|
23
|
-
`
|
|
24
|
-
`
|
|
25
|
-
`
|
|
26
|
-
`
|
|
27
|
-
`
|
|
22
|
+
return (`[CodeLoop] \`${cmd}\` was killed after ${mins} min (timeout). Most likely ` +
|
|
23
|
+
`one of: (1) a NON-TERMINATING TEST — the test body passes (assertions ` +
|
|
24
|
+
`print ✅) but the Dart isolate never exits because a Timer/Timer.periodic, ` +
|
|
25
|
+
`an unclosed StreamController, or a Firebase/Firestore listener was never ` +
|
|
26
|
+
`disposed; the tell-tale sign is the log shows tests completing yet the ` +
|
|
27
|
+
`process hangs to the timeout. Find the offending test and dispose the ` +
|
|
28
|
+
`resource in tearDown(). (2) an implicit \`flutter pub get\` stalling on ` +
|
|
29
|
+
`the network — run it manually first. (3) for integration_test/, no booted ` +
|
|
30
|
+
`device — boot an emulator/simulator (or run \`-d chrome\`/desktop). Then ` +
|
|
31
|
+
`re-verify.`);
|
|
28
32
|
}
|
|
29
33
|
export async function runFlutterAnalyze(cwd, logPath) {
|
|
30
34
|
if (!existsSync(join(cwd, "pubspec.yaml"))) {
|
|
@@ -111,11 +115,19 @@ export async function runFlutterTest(cwd, logPath) {
|
|
|
111
115
|
export async function runFlutterIntegrationTest(cwd, logPath) {
|
|
112
116
|
const integrationDir = join(cwd, "integration_test");
|
|
113
117
|
const hasIntegration = existsSync(integrationDir);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
// No dedicated integration_test/ directory: the ENTIRE test/ suite (unit,
|
|
119
|
+
// widget AND golden tests) is ALREADY executed by the flutter_test runner
|
|
120
|
+
// earlier in this same verify run. The old code fell back to running
|
|
121
|
+
// `flutter test test/` here — re-running the IDENTICAL suite a second time.
|
|
122
|
+
// On a normal project that just doubled the wall-clock cost; on a project
|
|
123
|
+
// whose test/ suite hangs (e.g. a test that leaks a Timer/StreamController/
|
|
124
|
+
// Firebase listener so the Dart isolate never exits — the WedCheese case)
|
|
125
|
+
// it burned a SECOND full timeout back-to-back with the first. Skip it:
|
|
126
|
+
// golden/widget tests need no device and gain nothing from a duplicate pass.
|
|
127
|
+
// Only a real integration_test/ directory (driven on a booted device)
|
|
128
|
+
// justifies a separate run here.
|
|
129
|
+
if (!hasIntegration) {
|
|
130
|
+
return makeSkippedResult("flutter_integration_test", "No integration_test/ directory — the test/ suite (incl. golden/widget tests) is already run by the flutter_test runner, so it is not re-run here.");
|
|
119
131
|
}
|
|
120
132
|
if (!(await checkToolAvailable("flutter"))) {
|
|
121
133
|
return makeSkippedResult("flutter_integration_test", "flutter not found on PATH");
|
|
@@ -125,37 +137,32 @@ export async function runFlutterIntegrationTest(cwd, logPath) {
|
|
|
125
137
|
// (the 0.1.66 timeout caps that at 6 min, but a 6-min stall is still a bad
|
|
126
138
|
// experience). Probe first: if nothing is booted, DON'T run the command —
|
|
127
139
|
// return a skipped result whose directive PUSHES the agent to open the
|
|
128
|
-
// Android emulator and/or iOS simulator the user tests on.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
stdout: "",
|
|
150
|
-
stderr: directive,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
140
|
+
// Android emulator and/or iOS simulator the user tests on.
|
|
141
|
+
const { probeBootedDevices, detectMobileTargets, buildOpenSimulatorsDirective } = await import("./device_probe.js");
|
|
142
|
+
const booted = await probeBootedDevices();
|
|
143
|
+
if (!booted.any) {
|
|
144
|
+
const directive = buildOpenSimulatorsDirective({
|
|
145
|
+
booted,
|
|
146
|
+
targets: detectMobileTargets(cwd),
|
|
147
|
+
context: "verify-integration",
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
runner_name: "flutter_integration_test",
|
|
151
|
+
available: true,
|
|
152
|
+
exit_code: 0,
|
|
153
|
+
passed: 0,
|
|
154
|
+
failed: 0,
|
|
155
|
+
skipped: 1,
|
|
156
|
+
log_path: logPath,
|
|
157
|
+
duration_ms: 0,
|
|
158
|
+
stdout: "",
|
|
159
|
+
stderr: directive,
|
|
160
|
+
};
|
|
153
161
|
}
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
const result = await runCommand("flutter", args, cwd, logPath, NONINTERACTIVE_ENV, INTEGRATION_TIMEOUT_MS);
|
|
162
|
+
const args = ["test", "integration_test/", "--reporter=compact"];
|
|
163
|
+
const result = await runCommand("flutter", args, cwd, logPath, NONINTERACTIVE_ENV, INTEGRATION_TIMEOUT_MS, FLUTTER_TEST_SETTLE);
|
|
157
164
|
if (result.exit_code === 124) {
|
|
158
|
-
const note = timeoutNote(
|
|
165
|
+
const note = timeoutNote("flutter test integration_test/", INTEGRATION_TIMEOUT_MS);
|
|
159
166
|
return {
|
|
160
167
|
runner_name: "flutter_integration_test",
|
|
161
168
|
available: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flutter.js","sourceRoot":"","sources":["../../src/runners/flutter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"flutter.js","sourceRoot":"","sources":["../../src/runners/flutter.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,10 @@ type CmdResult = {
|
|
|
30
30
|
stderr: string;
|
|
31
31
|
duration_ms: number;
|
|
32
32
|
};
|
|
33
|
+
export declare const FLUTTER_TEST_SETTLE: {
|
|
34
|
+
pattern: RegExp;
|
|
35
|
+
graceMs: number;
|
|
36
|
+
};
|
|
33
37
|
/** Clear memoized Flutter results. MUST be called at the start of each verify run. */
|
|
34
38
|
export declare function resetFlutterRunCache(): void;
|
|
35
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flutter_cache.d.ts","sourceRoot":"","sources":["../../src/runners/flutter_cache.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"flutter_cache.d.ts","sourceRoot":"","sources":["../../src/runners/flutter_cache.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAkBF,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAUF,sFAAsF;AACtF,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAOD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAavF;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAc5F"}
|
|
@@ -6,6 +6,17 @@ const NONINTERACTIVE_ENV = { CI: "true" };
|
|
|
6
6
|
// 6-min headroom the integration runner uses rather than the 5-min test cap.
|
|
7
7
|
const ANALYZE_TIMEOUT_MS = 240_000; // 4 min
|
|
8
8
|
const TEST_COVERAGE_TIMEOUT_MS = 360_000; // 6 min
|
|
9
|
+
// Completion-settle for `flutter test`: the compact reporter prints exactly one
|
|
10
|
+
// of these lines at the VERY END of the run. If the process then refuses to
|
|
11
|
+
// exit (a leaked Timer/StreamController/Firebase listener keeping the Dart
|
|
12
|
+
// isolate alive — the WedCheese hang), we force-close it `graceMs` after the
|
|
13
|
+
// marker instead of burning the full 6-min timeout. The grace is generous
|
|
14
|
+
// enough for legitimate post-test work (e.g. `--coverage` dumping lcov) to
|
|
15
|
+
// finish on a well-behaved suite, so this only ever rescues a true hang.
|
|
16
|
+
export const FLUTTER_TEST_SETTLE = {
|
|
17
|
+
pattern: /All tests passed!|Some tests failed\./,
|
|
18
|
+
graceMs: 30_000,
|
|
19
|
+
};
|
|
9
20
|
let cache = null;
|
|
10
21
|
/** Clear memoized Flutter results. MUST be called at the start of each verify run. */
|
|
11
22
|
export function resetFlutterRunCache() {
|
|
@@ -42,7 +53,7 @@ export function runFlutterAnalyzeOnce(cwd, logPath) {
|
|
|
42
53
|
export function runFlutterTestCoverageOnce(cwd, logPath) {
|
|
43
54
|
const c = ensure(cwd);
|
|
44
55
|
if (!c.testCoverage) {
|
|
45
|
-
c.testCoverage = runCommand("flutter", ["test", "--coverage", "--reporter=compact"], cwd, logPath, NONINTERACTIVE_ENV, TEST_COVERAGE_TIMEOUT_MS);
|
|
56
|
+
c.testCoverage = runCommand("flutter", ["test", "--coverage", "--reporter=compact"], cwd, logPath, NONINTERACTIVE_ENV, TEST_COVERAGE_TIMEOUT_MS, FLUTTER_TEST_SETTLE);
|
|
46
57
|
}
|
|
47
58
|
return c.testCoverage;
|
|
48
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flutter_cache.js","sourceRoot":"","sources":["../../src/runners/flutter_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAoCvC,gFAAgF;AAChF,MAAM,kBAAkB,GAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAElE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,QAAQ;AAC5C,MAAM,wBAAwB,GAAG,OAAO,CAAC,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"flutter_cache.js","sourceRoot":"","sources":["../../src/runners/flutter_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAoCvC,gFAAgF;AAChF,MAAM,kBAAkB,GAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAElE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,QAAQ;AAC5C,MAAM,wBAAwB,GAAG,OAAO,CAAC,CAAC,QAAQ;AAElD,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,MAAM;CAChB,CAAC;AAQF,IAAI,KAAK,GAA2B,IAAI,CAAC;AAEzC,sFAAsF;AACtF,MAAM,UAAU,oBAAoB;IAClC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;QAAE,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,OAAgB;IACjE,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,OAAO,GAAG,UAAU,CACpB,SAAS,EACT,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAC/B,GAAG,EACH,OAAO,EACP,kBAAkB,EAClB,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAW,EAAE,OAAgB;IACtE,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;QACpB,CAAC,CAAC,YAAY,GAAG,UAAU,CACzB,SAAS,EACT,CAAC,MAAM,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAC5C,GAAG,EACH,OAAO,EACP,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC,YAAY,CAAC;AACxB,CAAC"}
|
package/package.json
CHANGED