litmus-cli 1.4.93 → 1.4.95

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 (104) hide show
  1. package/README.md +48 -0
  2. package/dist/commands/connect.d.ts +6 -2
  3. package/dist/commands/connect.d.ts.map +1 -1
  4. package/dist/commands/connect.js +222 -35
  5. package/dist/commands/connect.js.map +1 -1
  6. package/dist/commands/forward.d.ts +7 -1
  7. package/dist/commands/forward.d.ts.map +1 -1
  8. package/dist/commands/forward.js +8 -7
  9. package/dist/commands/forward.js.map +1 -1
  10. package/dist/commands/init.d.ts.map +1 -1
  11. package/dist/commands/init.js +25 -6
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/lib/ai-tracking.d.ts +8 -0
  14. package/dist/lib/ai-tracking.d.ts.map +1 -1
  15. package/dist/lib/ai-tracking.js +79 -3
  16. package/dist/lib/ai-tracking.js.map +1 -1
  17. package/dist/lib/api.d.ts +1 -0
  18. package/dist/lib/api.d.ts.map +1 -1
  19. package/dist/lib/api.js +12 -4
  20. package/dist/lib/api.js.map +1 -1
  21. package/dist/lib/capture-selftest.d.ts +9 -0
  22. package/dist/lib/capture-selftest.d.ts.map +1 -1
  23. package/dist/lib/capture-selftest.js +27 -2
  24. package/dist/lib/capture-selftest.js.map +1 -1
  25. package/dist/lib/connect-skills.d.ts +1 -0
  26. package/dist/lib/connect-skills.d.ts.map +1 -1
  27. package/dist/lib/connect-skills.js +1 -1
  28. package/dist/lib/connect-skills.js.map +1 -1
  29. package/dist/lib/desktop-readiness.d.ts +9 -0
  30. package/dist/lib/desktop-readiness.d.ts.map +1 -0
  31. package/dist/lib/desktop-readiness.js +131 -0
  32. package/dist/lib/desktop-readiness.js.map +1 -0
  33. package/dist/lib/editor-foreground.d.ts +6 -0
  34. package/dist/lib/editor-foreground.d.ts.map +1 -0
  35. package/dist/lib/editor-foreground.js +38 -0
  36. package/dist/lib/editor-foreground.js.map +1 -0
  37. package/dist/lib/environment-checks.d.ts +2 -0
  38. package/dist/lib/environment-checks.d.ts.map +1 -1
  39. package/dist/lib/environment-checks.js +4 -2
  40. package/dist/lib/environment-checks.js.map +1 -1
  41. package/dist/lib/file-monitor.d.ts +18 -0
  42. package/dist/lib/file-monitor.d.ts.map +1 -0
  43. package/dist/lib/file-monitor.js +87 -0
  44. package/dist/lib/file-monitor.js.map +1 -0
  45. package/dist/lib/hook-logger.cjs +22 -10
  46. package/dist/lib/hosted-capture.d.ts +1 -1
  47. package/dist/lib/hosted-capture.d.ts.map +1 -1
  48. package/dist/lib/hosted-capture.js +22 -12
  49. package/dist/lib/hosted-capture.js.map +1 -1
  50. package/dist/lib/init-location.d.ts +4 -0
  51. package/dist/lib/init-location.d.ts.map +1 -0
  52. package/dist/lib/init-location.js +36 -0
  53. package/dist/lib/init-location.js.map +1 -0
  54. package/dist/lib/installed-tools.d.ts +29 -0
  55. package/dist/lib/installed-tools.d.ts.map +1 -0
  56. package/dist/lib/installed-tools.js +159 -0
  57. package/dist/lib/installed-tools.js.map +1 -0
  58. package/dist/lib/portal-launcher-background.d.ts +13 -0
  59. package/dist/lib/portal-launcher-background.d.ts.map +1 -0
  60. package/dist/lib/portal-launcher-background.js +51 -0
  61. package/dist/lib/portal-launcher-background.js.map +1 -0
  62. package/dist/lib/portal-launcher-worker.d.ts +2 -0
  63. package/dist/lib/portal-launcher-worker.d.ts.map +1 -0
  64. package/dist/lib/portal-launcher-worker.js +43 -0
  65. package/dist/lib/portal-launcher-worker.js.map +1 -0
  66. package/dist/lib/portal-launcher.d.ts +43 -0
  67. package/dist/lib/portal-launcher.d.ts.map +1 -0
  68. package/dist/lib/portal-launcher.js +408 -0
  69. package/dist/lib/portal-launcher.js.map +1 -0
  70. package/dist/lib/prepared-desktop.d.ts +7 -0
  71. package/dist/lib/prepared-desktop.d.ts.map +1 -0
  72. package/dist/lib/prepared-desktop.js +35 -0
  73. package/dist/lib/prepared-desktop.js.map +1 -0
  74. package/dist/lib/prepared-editor.d.ts +26 -0
  75. package/dist/lib/prepared-editor.d.ts.map +1 -0
  76. package/dist/lib/prepared-editor.js +150 -0
  77. package/dist/lib/prepared-editor.js.map +1 -0
  78. package/dist/lib/schemas.d.ts +1 -0
  79. package/dist/lib/schemas.d.ts.map +1 -1
  80. package/dist/lib/schemas.js +2 -0
  81. package/dist/lib/schemas.js.map +1 -1
  82. package/dist/lib/ssh-client.d.ts +12 -0
  83. package/dist/lib/ssh-client.d.ts.map +1 -1
  84. package/dist/lib/ssh-client.js +1 -1
  85. package/dist/lib/ssh-client.js.map +1 -1
  86. package/dist/lib/ssh-config-file.d.ts +3 -0
  87. package/dist/lib/ssh-config-file.d.ts.map +1 -1
  88. package/dist/lib/ssh-config-file.js +42 -0
  89. package/dist/lib/ssh-config-file.js.map +1 -1
  90. package/dist/lib/tracker.d.ts +1 -0
  91. package/dist/lib/tracker.d.ts.map +1 -1
  92. package/dist/lib/tracker.js +4 -2
  93. package/dist/lib/tracker.js.map +1 -1
  94. package/dist/lib/vscode-server-preparation.d.ts +7 -0
  95. package/dist/lib/vscode-server-preparation.d.ts.map +1 -0
  96. package/dist/lib/vscode-server-preparation.js +78 -0
  97. package/dist/lib/vscode-server-preparation.js.map +1 -0
  98. package/dist/lib/watcher.js +98 -77
  99. package/dist/lib/watcher.js.map +1 -1
  100. package/dist/lib/workspace-start-wait.d.ts +23 -0
  101. package/dist/lib/workspace-start-wait.d.ts.map +1 -0
  102. package/dist/lib/workspace-start-wait.js +50 -0
  103. package/dist/lib/workspace-start-wait.js.map +1 -0
  104. package/package.json +1 -1
@@ -0,0 +1,131 @@
1
+ /** Remote desktop runtime and recorder capability checks, shared with ENG-3576. */
2
+ import { spawn } from "child_process";
3
+ import { configSetsRemoteCommand } from "./ssh-client.js";
4
+ /** Validate remote configuration without printing credentials or candidate content. */
5
+ export function desktopAppConfigurationScript(app) {
6
+ const common = `import json,os,pathlib,tomllib,urllib.parse
7
+ home=pathlib.Path.home()
8
+ def require(ok):
9
+ if not ok: raise ValueError("Desktop app configuration is incomplete")
10
+ proxy=urllib.parse.urlparse(os.environ.get("HTTPS_PROXY",""))
11
+ require(proxy.scheme in ("http","https") and bool(proxy.hostname))
12
+ ca=pathlib.Path(os.environ.get("NODE_EXTRA_CA_CERTS","/nonexistent"))
13
+ require(ca.is_file() and os.access(ca,os.R_OK))
14
+ `;
15
+ if (app === "claude")
16
+ return common + `s=json.loads((home/".claude/settings.json").read_text())
17
+ require(isinstance(s,dict) and s.get("disableAllHooks") is not True)
18
+ h=s.get("hooks",{})
19
+ command="node /opt/litmus/lib/hook-logger.cjs claude /home/candidate/workspace --hosted-workspace /home/candidate"
20
+ for event in ("UserPromptSubmit","Stop"):
21
+ entries=[e for g in h.get(event,[]) if g.get("matcher") is None for e in g.get("hooks",[]) if e.get("command")==command and e.get("type")=="command" and isinstance(e.get("timeout"),(int,float)) and e["timeout"]>=15 and not e.get("async",False)]
22
+ require(len(entries)==1)
23
+ env=s.get("env",{})
24
+ require(isinstance(env,dict) and env.get("CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC")=="1")
25
+ for key in ("HTTPS_PROXY","HTTP_PROXY","NODE_EXTRA_CA_CERTS"):
26
+ require(key not in env or env[key]==os.environ.get(key))
27
+ # Authentication may be supplied by Desktop sign-in. If workspace pre-auth is set,
28
+ # both its route and credential must be present; never print either value.
29
+ base=os.environ.get("ANTHROPIC_BASE_URL","")
30
+ if base:
31
+ require(urllib.parse.urlparse(base).scheme in ("http","https") and bool(urllib.parse.urlparse(base).hostname))
32
+ require(bool(os.environ.get("ANTHROPIC_AUTH_TOKEN") or os.environ.get("ANTHROPIC_API_KEY")))
33
+ print("ready")
34
+ `;
35
+ return common + `config=tomllib.loads((home/".codex/config.toml").read_text())
36
+ require(config.get("check_for_update_on_startup") is False)
37
+ require(config.get("sandbox_mode")=="danger-full-access")
38
+ require(config.get("features",{}).get("hooks") is not False)
39
+ daemon=json.loads((home/".codex/app-server-daemon/settings.json").read_text())
40
+ require(daemon.get("updater",{}).get("autoUpdateEnabled") is False)
41
+ provider=config.get("model_provider")
42
+ if provider=="litmus":
43
+ route=config.get("model_providers",{}).get("litmus",{})
44
+ require(route.get("wire_api")=="responses")
45
+ url=urllib.parse.urlparse(route.get("base_url",""))
46
+ require(url.scheme in ("http","https") and bool(url.hostname))
47
+ require(bool(os.environ.get(route.get("env_key",""))))
48
+ require(route.get("http_headers",{}).get("X-Litmus-Client")=="codex")
49
+ else:
50
+ # Personal account sign-in is supported; an unknown provider is not our config.
51
+ require(provider in (None,"openai"))
52
+ # Desktop performs personal sign-in after opening the remote workspace.
53
+ # A fresh workspace intentionally has no auth.json yet.
54
+ print("ready")
55
+ `;
56
+ }
57
+ function shellQuote(value) { return "'" + value.replace(/'/g, "'\\''") + "'"; }
58
+ /** Exercise the baked recorder, since a valid hook command can still point to an
59
+ * older image that records prose but drops desktop tool calls and results. */
60
+ export function desktopAppCaptureScript(app) {
61
+ const rows = app === "claude" ? [
62
+ { type: "user", message: { content: "desktop capture capability check" } },
63
+ { type: "assistant", message: { content: [{ type: "tool_use", id: "litmus-capability", name: "Bash", input: { command: "true" } }] } },
64
+ { type: "user", message: { content: [{ type: "tool_result", tool_use_id: "litmus-capability", content: "ok" }] } },
65
+ ] : [
66
+ { type: "event_msg", payload: { type: "user_message", message: "desktop capture capability check" } },
67
+ { type: "response_item", payload: { type: "function_call", call_id: "litmus-capability", name: "exec_command", arguments: "{}" } },
68
+ { type: "response_item", payload: { type: "function_call_output", call_id: "litmus-capability", output: "ok" } },
69
+ ];
70
+ const transcript = rows.map(row => JSON.stringify(row)).join("\n");
71
+ return `const assert = require('node:assert/strict');
72
+ const { parseToolEvidence } = require('/opt/litmus/lib/hook-logger.cjs');
73
+ assert.equal(typeof parseToolEvidence, 'function');
74
+ const trace = parseToolEvidence(${JSON.stringify(transcript)}, ${JSON.stringify(app)});
75
+ assert.equal(trace.version, 1);
76
+ assert.equal(trace.complete, true);
77
+ assert.equal(trace.records.length, 2);
78
+ assert.equal(trace.records[0].kind, 'call');
79
+ assert.equal(trace.records[0].id, 'litmus-capability');
80
+ assert.equal(trace.records[0].input.text, ${JSON.stringify(app === "claude" ? '{"command":"true"}' : "{}")});
81
+ assert.equal(trace.records[1].kind, 'result');
82
+ assert.equal(trace.records[1].id, 'litmus-capability');
83
+ assert.equal(trace.records[1].output.text, 'ok');`;
84
+ }
85
+ export function desktopAppProbeCommand(app) {
86
+ const configuration = `python3 -c ${shellQuote(desktopAppConfigurationScript(app))}`;
87
+ const capture = `node -e ${shellQuote(desktopAppCaptureScript(app))} >/dev/null 2>&1`;
88
+ if (app === "codex") {
89
+ // Reuse the image's exact hook/requirements/node verifier, including root ownership,
90
+ // rather than maintaining another approximation of its shell command contract.
91
+ return "bash -lc 'command -v codex >/dev/null && codex app-server --help >/dev/null 2>&1' && python3 /opt/litmus/lib/install_codex_hook.py verify --expect-root-owned --expect-node >/dev/null 2>&1 && test -r /opt/litmus/lib/hook-logger.cjs && " + capture + " && " + configuration;
92
+ }
93
+ return "command -v node >/dev/null && test -r /opt/litmus/lib/hook-logger.cjs && " + capture + " && " + configuration;
94
+ }
95
+ export async function desktopRuntimeReady(alias, app, signal) {
96
+ if (!/^litmus-[a-zA-Z0-9-]+$/.test(alias))
97
+ return Promise.resolve(false);
98
+ const options = ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10", "-o", "LogLevel=ERROR"];
99
+ if (configSetsRemoteCommand(alias))
100
+ options.push("-o", "RemoteCommand=none");
101
+ const ready = await new Promise(resolve => {
102
+ try {
103
+ const child = spawn("ssh", [...options, alias, desktopAppProbeCommand(app)], {
104
+ stdio: "ignore", windowsHide: true, signal, timeout: 20000,
105
+ });
106
+ child.once("error", () => resolve(false));
107
+ child.once("exit", code => resolve(code === 0));
108
+ }
109
+ catch {
110
+ resolve(false);
111
+ }
112
+ });
113
+ if (!ready || app !== "claude")
114
+ return ready;
115
+ // Desktop uploads its helper over SFTP; a working SSH shell alone is insufficient.
116
+ return new Promise(resolve => {
117
+ try {
118
+ const child = spawn("sftp", [...options, "-b", "-", alias], {
119
+ stdio: ["pipe", "ignore", "ignore"], windowsHide: true, signal, timeout: 15000,
120
+ });
121
+ child.stdin.on("error", () => { });
122
+ child.stdin.end("pwd\nquit\n");
123
+ child.once("error", () => resolve(false));
124
+ child.once("exit", code => resolve(code === 0));
125
+ }
126
+ catch {
127
+ resolve(false);
128
+ }
129
+ });
130
+ }
131
+ //# sourceMappingURL=desktop-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-readiness.js","sourceRoot":"","sources":["../../src/lib/desktop-readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ChildProcess } from "child_process";
2
+ /** Use the installation we dispatched to, including Homebrew/PATH symlinks. */
3
+ export declare function editorAppBundle(command: string): string | null;
4
+ /** A zero exit acknowledges the folder request; spawning alone does not. */
5
+ export declare function waitForEditorDispatch(child: Pick<ChildProcess, "once" | "removeListener">, activate: () => void, timeoutMs?: number): Promise<void>;
6
+ //# sourceMappingURL=editor-foreground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-foreground.d.ts","sourceRoot":"","sources":["../../src/lib/editor-foreground.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9D;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAAC,EACpD,QAAQ,EAAE,MAAM,IAAI,EACpB,SAAS,SAAQ,GAChB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,38 @@
1
+ import { realpathSync } from "fs";
2
+ import { whichOnPath } from "./wsl.js";
3
+ /** Use the installation we dispatched to, including Homebrew/PATH symlinks. */
4
+ export function editorAppBundle(command) {
5
+ try {
6
+ const resolved = realpathSync(whichOnPath(command, process.env.PATH) ?? command);
7
+ const match = resolved.match(/^(.*\.app)\/Contents\/Resources\/app\/bin\/(?:code|cursor)$/);
8
+ return match?.[1] ?? null;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ /** A zero exit acknowledges the folder request; spawning alone does not. */
15
+ export function waitForEditorDispatch(child, activate, timeoutMs = 5000) {
16
+ return new Promise((resolve) => {
17
+ const finish = () => {
18
+ clearTimeout(timer);
19
+ child.removeListener("exit", onExit);
20
+ child.removeListener("error", finish);
21
+ resolve();
22
+ };
23
+ const onExit = (code, signal) => {
24
+ try {
25
+ if (code === 0 && signal === null)
26
+ activate();
27
+ }
28
+ finally {
29
+ finish();
30
+ }
31
+ };
32
+ // Referenced intentionally: the portal helper must survive until dispatch.
33
+ const timer = setTimeout(finish, timeoutMs);
34
+ child.once("exit", onExit);
35
+ child.once("error", finish);
36
+ });
37
+ }
38
+ //# sourceMappingURL=editor-foreground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-foreground.js","sourceRoot":"","sources":["../../src/lib/editor-foreground.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAA;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAC3F,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,qBAAqB,CACnC,KAAoD,EACpD,QAAoB,EACpB,SAAS,GAAG,IAAK;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACpC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACrC,OAAO,EAAE,CAAA;QACX,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,MAAqB,EAAE,EAAE;YAC5D,IAAI,CAAC;gBACH,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI;oBAAE,QAAQ,EAAE,CAAA;YAC/C,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAA;YACV,CAAC;QACH,CAAC,CAAA;QACD,2EAA2E;QAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { rmSync } from "fs";
1
2
  /**
2
3
  * Environment checks shared by `litmus setup-check` (pre-init, ENG-2300) and
3
4
  * `litmus doctor` (post-init repair, ENG-1446).
@@ -105,6 +106,7 @@ export declare function checkWatcherBoot(opts?: {
105
106
  export declare function stopSmokeWatcher(dir: string, opts?: {
106
107
  kill?: (pid: number, signal: NodeJS.Signals) => void;
107
108
  graceMs?: number;
109
+ remove?: typeof rmSync;
108
110
  }): Promise<{
109
111
  exited: boolean;
110
112
  how: "sentinel" | "sigterm" | "sigkill" | "never_started" | "survived";
@@ -1 +1 @@
1
- {"version":3,"file":"environment-checks.d.ts","sourceRoot":"","sources":["../../src/lib/environment-checks.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,sBAAsB,CAAA;IAC9B,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,eAAO,MAAM,iBAAiB,qCAAqC,CAAA;AAEnE,mDAAmD;AACnD,eAAO,MAAM,cAAc,iDAAiD,CAAA;AAS5E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAwB,GAAG,gBAAgB,CAYpF;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAA;AAE5I,wBAAsB,cAAc,CAAC,SAAS,GAAE,SAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlF;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAC/B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+BjC;AAID;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB5B;AAID,wBAAgB,QAAQ,CAAC,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAgF,GAAG,gBAAgB,CAclJ;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkEjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACpF,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,UAAU,CAAA;CAAE,CAAC,CAyCtG;AAID;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC1C,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS9B"}
1
+ {"version":3,"file":"environment-checks.d.ts","sourceRoot":"","sources":["../../src/lib/environment-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,MAAM,EAAiB,MAAM,IAAI,CAAA;AAOhF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,sBAAsB,CAAA;IAC9B,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,eAAO,MAAM,iBAAiB,qCAAqC,CAAA;AAEnE,mDAAmD;AACnD,eAAO,MAAM,cAAc,iDAAiD,CAAA;AAS5E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAwB,GAAG,gBAAgB,CAYpF;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAA;AAE5I,wBAAsB,cAAc,CAAC,SAAS,GAAE,SAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlF;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAC/B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+BjC;AAID;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB5B;AAID,wBAAgB,QAAQ,CAAC,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAgF,GAAG,gBAAgB,CAclJ;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkEjC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAA;CAAO,GAC5G,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,UAAU,CAAA;CAAE,CAAC,CA2CtG;AAID;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC1C,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS9B"}
@@ -252,9 +252,11 @@ export async function stopSmokeWatcher(dir, opts = {}) {
252
252
  };
253
253
  const remove = () => {
254
254
  try {
255
- rmSync(dir, { recursive: true, force: true });
255
+ // Windows may retain a handle briefly after process exit. Retry transient
256
+ // EPERM/EBUSY/ENOTEMPTY failures before leaving cleanup to the OS.
257
+ (opts.remove ?? rmSync)(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
256
258
  }
257
- catch { /* a still-held handle on Windows; the OS temp cleaner takes it */ }
259
+ catch { /* persistent external handle; the OS temp cleaner takes it */ }
258
260
  };
259
261
  if (!alive()) {
260
262
  remove();
@@ -1 +1 @@
1
- {"version":3,"file":"environment-checks.js","sourceRoot":"","sources":["../../src/lib/environment-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAChF,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AA2CpF,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAEzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,kCAAkC,CAAA;AAEnE,mDAAmD;AACnD,MAAM,CAAC,MAAM,cAAc,GAAG,8CAA8C,CAAA;AAE5E,MAAM,mBAAmB,GAAG,IAAK,CAAA;AACjC,MAAM,iBAAiB,GAAG,IAAK,CAAA;AAC/B,gHAAgH;AAChH,MAAM,cAAc,GAAG,IAAK,CAAA;AAE5B,wEAAwE;AAExE,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAW,OAAO,CAAC,OAAO;IAChE,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uCAAuC,OAAO,GAAG,EAAE,CAAA;IACpG,CAAC;IACD,IAAI,eAAe,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,YAAY,OAAO,kCAAkC,gBAAgB,iDAAiD;SAC/H,CAAA;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,OAAO,EAAE,EAAE,CAAA;AACtE,CAAC;AAED,wEAAwE;AAExE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9G,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;IACvB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAS,GAAc,KAAK;IAC/D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACjG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACpE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAA;IACxD,IAAI,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAC1F,OAAO,IAAI,CAAC,OAAO,CAAA;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAI,GAGtC,EAAE;IACJ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,WAAW,CAAA;IAC/C,8EAA8E;IAC9E,iFAAiF;IACjF,IAAI,wCAAwC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,SAAS,qBAAqB,EAAE,CAAA;IACrG,CAAC;IACD,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,EAAE,CAAA;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oEAAoE;QACpE,mEAAmE;QACnE,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,eAAe,SAAS,sDAAsD;YACtF,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAA;IACH,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oDAAoD,MAAM,cAAc,EAAE,CAAA;IAClI,CAAC;IACD,IAAI,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,eAAe,SAAS,eAAe,MAAM,qBAAqB,iBAAiB,wCAAwC;SACpI,CAAA;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,SAAS,YAAY,EAAE,CAAA;AAC5F,CAAC;AAED,wEAAwE;AAExE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAI1C;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IAChC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAA;IAC9D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;QACpG,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAA;QAC1B,MAAM,IAAI,GAAG,EAAE,GAAG,cAAc,CAAA;QAChC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;gBACV,CAAC,CAAC,mCAAmC,EAAE,wEAAwE;gBAC/G,CAAC,CAAC,0BAA0B,EAAE,KAAK;YACrC,OAAO,EAAE,OAAO,GAAG,YAAY,GAAG,CAAC,MAAM,EAAE;SAC5C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,2HAA2H;YACnI,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC3E,CAAA;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,QAAQ,CAAC,IAAI,GAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9H,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAA;QACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;IAC7F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sEAAsE;QACtE,qDAAqD;QACrD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,6FAA6F;YACrG,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAA;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AAExE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAI,GAGvC,EAAE;IACJ,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAA;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,sJAAsJ;YAC9J,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC1D,CAAA;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IAEnD,MAAM,UAAU,GAAG,GAAW,EAAE;QAC9B,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAA;QAC3B,CAAC;IACH,CAAC,CAAA;IAED,IAAI,WAAW,GAAwD,IAAI,CAAA;IAC3E,MAAM,QAAQ,GAAG,CAAC,KAAuB,EAAoB,EAAE;QAC7D,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,GAAG,KAAK,UAAU,IAAI,WAAW,CAAC,GAAG,KAAK,eAAe;YAAE,OAAO,KAAK,CAAA;QACvG,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM;YAC7B,CAAC,CAAC,oEAAoE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE;YACrG,CAAC,CAAC,sDAAsD,GAAG,oBAAoB,CAAA;QACjF,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAClF,CAAC,CAAA;IACD,IAAI,MAAwB,CAAA;IAC5B,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,YAAY,CAAC,GAAG,CAAC,CAAA;QAEjB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC7E,MAAM,IAAI,GAAG,OAAO,KAAK,MAAM,CAAA;QAE/B,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mCAAmC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAA;QAChH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;YACzB,MAAM,YAAY,GAAG,wDAAwD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACxF,MAAM,GAAG;gBACP,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,IAAI;oBACV,CAAC,CAAC,YAAY;wBACZ,CAAC,CAAC,8PAA8P;wBAChQ,CAAC,CAAC,4GAA4G;oBAChH,CAAC,CAAC,8KAA8K;gBAClL,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG;YACP,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,2GAA2G;YACnH,OAAO,EAAE,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,EAAE;SAChF,CAAA;IACH,CAAC;YAAS,CAAC;QACT,WAAW,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAA;AACzB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,IAAI,GAA+E,EAAE;IAErF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAK,CAAA;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAE3C,MAAM,KAAK,GAAG,GAAY,EAAE;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAA;IAC3C,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,KAAK,EAAE,EAAU,EAAoB,EAAE;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;QAChC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAA;YACzB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,CAAC;QAAC,MAAM,CAAC,CAAC,kEAAkE,CAAC,CAAC;IAChF,CAAC,CAAA;IAED,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACb,MAAM,EAAE,CAAA;QACR,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE,CAAA;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IACzC,IAAI,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,CAAA;IAAC,CAAC;IAEtF,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAA;IACvC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzD,IAAI,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAAC,CAAC;QACrF,IAAI,CAAC;YAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzD,IAAI,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;QAAC,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAA;AAC3C,CAAC;AAED,wEAAwE;AAExE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAG1C;IACC,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,MAAM,IAAI,GAAG,CAAC,CAAmB,EAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;IAC/E,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACxB,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,CAAA;IAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;IAChB,IAAI,CAAC,MAAM,oBAAoB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC3D,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAA;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"environment-checks.js","sourceRoot":"","sources":["../../src/lib/environment-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare function fileMonitorPolicy(platform?: NodeJS.Platform, wsl?: boolean): {
2
+ polling: boolean;
3
+ };
4
+ /** A running process is not proof that file changes reach our event handler. */
5
+ export declare function startFileMonitor(options: {
6
+ directory: string;
7
+ ignored: (relative: string) => boolean;
8
+ /** Special signals such as AI artifact dotfiles still reach the caller. */
9
+ observed?: (relative: string) => boolean;
10
+ onEvent: (type: "change" | "rename", relative: string) => void;
11
+ onError: (error: Error) => void;
12
+ polling?: boolean;
13
+ timeoutMs?: number;
14
+ }): {
15
+ ready: Promise<void>;
16
+ close(): Promise<void>;
17
+ };
18
+ //# sourceMappingURL=file-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-monitor.d.ts","sourceRoot":"","sources":["../../src/lib/file-monitor.ts"],"names":[],"mappings":"AAMA,wBAAgB,iBAAiB,CAAC,QAAQ,kBAAmB,EAAE,GAAG,UAAU;IAGjE,OAAO;EACjB;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACtC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;;;EAmEA"}
@@ -0,0 +1,87 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { randomUUID } from "crypto";
4
+ import { watch } from "chokidar";
5
+ import { isWsl } from "./wsl.js";
6
+ export function fileMonitorPolicy(platform = process.platform, wsl = isWsl()) {
7
+ // WSL can miss Windows-side writes on mounted drives. Poll there too;
8
+ // filtering before discovery keeps dependency trees out of the scan.
9
+ return { polling: platform === "win32" || (platform === "linux" && wsl) };
10
+ }
11
+ /** A running process is not proof that file changes reach our event handler. */
12
+ export function startFileMonitor(options) {
13
+ const excluded = (relative) => options.ignored(relative) && !options.observed?.(relative);
14
+ const probeName = `.litmus-watch-probe-${randomUUID()}`;
15
+ const probePath = path.join(options.directory, probeName);
16
+ let settled = false;
17
+ let closed = false;
18
+ let probeCreated = false;
19
+ let resolveReady;
20
+ let rejectReady;
21
+ const ready = new Promise((resolve, reject) => { resolveReady = resolve; rejectReady = reject; });
22
+ const cleanup = () => fs.promises.unlink(probePath).catch(() => { });
23
+ const fail = (error) => {
24
+ if (closed)
25
+ return;
26
+ if (!settled) {
27
+ settled = true;
28
+ clearTimeout(timer);
29
+ rejectReady(error);
30
+ void cleanup();
31
+ }
32
+ options.onError(error);
33
+ };
34
+ const watcher = watch(options.directory, {
35
+ ignoreInitial: true,
36
+ followSymlinks: false,
37
+ usePolling: options.polling ?? fileMonitorPolicy().polling,
38
+ interval: 500,
39
+ binaryInterval: 1000,
40
+ ignored: (file) => {
41
+ const relative = path.relative(options.directory, file);
42
+ return relative !== "" && relative !== probeName && excluded(relative);
43
+ },
44
+ });
45
+ const timer = setTimeout(() => fail(new Error("File watcher did not observe its startup probe before the deadline")), options.timeoutMs ?? 4000);
46
+ const event = (type, file) => {
47
+ const relative = path.relative(options.directory, file);
48
+ // Never put synthetic probe creation or cleanup in candidate activity.
49
+ if (relative === probeName) {
50
+ if (!settled && probeCreated) {
51
+ settled = true;
52
+ clearTimeout(timer);
53
+ void cleanup().then(resolveReady);
54
+ }
55
+ return;
56
+ }
57
+ if (!closed && !excluded(relative))
58
+ options.onEvent(type, relative);
59
+ };
60
+ watcher.on("add", file => event("rename", file));
61
+ watcher.on("change", file => event("change", file));
62
+ watcher.on("unlink", file => event("rename", file));
63
+ watcher.on("error", error => fail(error instanceof Error ? error : new Error(String(error))));
64
+ watcher.once("ready", () => {
65
+ if (closed || settled)
66
+ return;
67
+ probeCreated = true;
68
+ void fs.promises.writeFile(probePath, "file capture probe\n", { flag: "wx" }).then(() => {
69
+ if (closed || settled)
70
+ void cleanup();
71
+ }, fail);
72
+ });
73
+ return {
74
+ ready,
75
+ async close() {
76
+ closed = true;
77
+ clearTimeout(timer);
78
+ if (!settled) {
79
+ settled = true;
80
+ rejectReady(new Error("File watcher closed before verification"));
81
+ }
82
+ await watcher.close();
83
+ await cleanup();
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=file-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-monitor.js","sourceRoot":"","sources":["../../src/lib/file-monitor.ts"],"names":[],"mappings":"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"}
@@ -589,13 +589,23 @@ function sessionOverMarked(litmusDir) {
589
589
  * `{ sessionOver }`, true only when the server refused the token for good.
590
590
  */
591
591
  function uploadEvent(config, event) {
592
- if (!config || !config.token || !config.backendUrl) return Promise.resolve({ sessionOver: false })
592
+ const started = Date.now()
593
+ // Probe-only stderr is captured by doctor, never sent for ordinary AI turns.
594
+ const probe = event?.type === "capture_selftest_probe"
595
+ const result = (sessionOver, outcome, status = null, code = null) => {
596
+ const delivery = { outcome, status, code, elapsedMs: Date.now() - started }
597
+ if (probe) process.stderr.write("LITMUS_PROBE_DELIVERY " + JSON.stringify(delivery) + "\n")
598
+ return { sessionOver, delivery }
599
+ }
600
+ const safeCode = error => ["ENOTFOUND", "EAI_AGAIN", "ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "CERT_HAS_EXPIRED", "UNABLE_TO_VERIFY_LEAF_SIGNATURE", "ERR_TLS_CERT_ALTNAME_INVALID"].includes(error?.code) ? error.code : null
601
+ if (!config || !config.token || !config.backendUrl) return Promise.resolve(result(false, "configuration_missing"))
593
602
 
594
603
  let url
595
604
  try {
596
605
  url = new URL(`${config.backendUrl}/cli/activity`)
606
+ if (!["http:", "https:"].includes(url.protocol)) throw new Error("Unsupported protocol")
597
607
  } catch {
598
- return Promise.resolve({ sessionOver: false }) // malformed backendUrl — nothing to do
608
+ return Promise.resolve(result(false, "invalid_url")) // malformed backendUrl — nothing to do
599
609
  }
600
610
 
601
611
  const body = JSON.stringify({ events: [event] })
@@ -605,11 +615,12 @@ function uploadEvent(config, event) {
605
615
  let settled = false
606
616
  let guard = null
607
617
  let sessionOver = false
608
- const done = () => {
618
+ let status = null
619
+ const done = (outcome = "transport_error", code = null) => {
609
620
  if (settled) return
610
621
  settled = true
611
622
  if (guard) clearTimeout(guard)
612
- resolve({ sessionOver })
623
+ resolve(result(sessionOver, outcome, status, code))
613
624
  }
614
625
 
615
626
  const req = reqFn(url, {
@@ -634,7 +645,7 @@ function uploadEvent(config, event) {
634
645
  // A 4xx body is kept (capped) because it is the only place the server says
635
646
  // the assessment is over for good (ENG-2768, see isFinalRefusal).
636
647
  req.on("response", (res) => {
637
- const status = res.statusCode || 0
648
+ status = res.statusCode || 0
638
649
  const chunks = []
639
650
  let kept = 0
640
651
  res.on("data", (chunk) => {
@@ -645,14 +656,15 @@ function uploadEvent(config, event) {
645
656
  })
646
657
  res.on("end", () => {
647
658
  if (chunks.length) sessionOver = isFinalRefusal(status, Buffer.concat(chunks).toString("utf8"))
648
- done()
659
+ done(status >= 200 && status < 300 ? "delivered" : "http_error")
649
660
  })
650
- res.on("error", done)
661
+ res.on("error", error => done("response_error", safeCode(error)))
662
+ res.on("aborted", () => done("response_aborted"))
651
663
  })
652
- req.on("error", done) // network down, DNS, refused, destroyed
653
- req.on("timeout", () => { req.destroy(); done() })
664
+ req.on("error", error => done("transport_error", safeCode(error))) // network down, DNS, refused, destroyed
665
+ req.on("timeout", () => { req.destroy(); done("timeout") })
654
666
  // Backstop in case none of the above fires (a socket wedged before connect).
655
- guard = setTimeout(() => { try { req.destroy() } catch { /* already gone */ } done() }, UPLOAD_TIMEOUT_MS)
667
+ guard = setTimeout(() => { try { req.destroy() } catch { /* already gone */ } done("timeout") }, UPLOAD_TIMEOUT_MS)
656
668
  req.end(body)
657
669
  })
658
670
  }
@@ -15,7 +15,7 @@ export declare function acquireCaptureLock(lock: string): () => void;
15
15
  * The loopback guard carries no protocol/data and is released by the OS on crash.
16
16
  * A fixed per-lock port ensures contenders cannot bind independent guards.
17
17
  */
18
- export declare function acquireCaptureSetupLock(lock: string): Promise<() => Promise<void>>;
18
+ export declare function acquireCaptureSetupLock(lock: string, waitMs?: number): Promise<() => Promise<void>>;
19
19
  /** Reconcile legacy hook registrations before opening a machine-wide window.
20
20
  * No PID inference: a stopped watcher does not mean the assessment ended.
21
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-capture.d.ts","sourceRoot":"","sources":["../../src/lib/hosted-capture.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAMhD,eAAO,MAAM,iCAAiC,oBAAoB,CAAA;AAClE,eAAO,MAAM,yBAAyB,iZAAiZ,CAAA;AACvb,eAAO,MAAM,mBAAmB,QAA4D,CAAA;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAKpE;AACD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAWjM;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CA6B3D;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAgBxF;AAED;;GAEG;AACH,wBAAsB,kCAAkC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C/G;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CA4EvI"}
1
+ {"version":3,"file":"hosted-capture.d.ts","sourceRoot":"","sources":["../../src/lib/hosted-capture.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAMhD,eAAO,MAAM,iCAAiC,oBAAoB,CAAA;AAClE,eAAO,MAAM,yBAAyB,iZAAiZ,CAAA;AACvb,eAAO,MAAM,mBAAmB,QAA4D,CAAA;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAKpE;AACD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAWjM;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CA6B3D;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAyBpG;AAED;;GAEG;AACH,wBAAsB,kCAAkC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C/G;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CA6EvI"}
@@ -99,17 +99,24 @@ export function acquireCaptureLock(lock) {
99
99
  * The loopback guard carries no protocol/data and is released by the OS on crash.
100
100
  * A fixed per-lock port ensures contenders cannot bind independent guards.
101
101
  */
102
- export async function acquireCaptureSetupLock(lock) {
102
+ export async function acquireCaptureSetupLock(lock, waitMs = 0) {
103
103
  const port = 49152 + parseInt(createHash("sha256").update(path.join(realpathSync(path.dirname(lock)), path.basename(lock))).digest("hex").slice(0, 8), 16) % 16384;
104
104
  const guard = createServer(socket => socket.destroy());
105
- try {
106
- await new Promise((resolve, reject) => {
107
- guard.once("error", reject);
108
- guard.listen({ host: "127.0.0.1", port, exclusive: true }, () => { guard.removeListener("error", reject); resolve(); });
109
- });
110
- }
111
- catch {
112
- throw new Error("Capture setup is already running, or its local coordination port is occupied. Retry after the other setup or application closes.");
105
+ const deadline = Date.now() + waitMs;
106
+ while (true) {
107
+ try {
108
+ await new Promise((resolve, reject) => {
109
+ guard.once("error", reject);
110
+ guard.listen({ host: "127.0.0.1", port, exclusive: true }, () => { guard.removeListener("error", reject); resolve(); });
111
+ });
112
+ break;
113
+ }
114
+ catch (error) {
115
+ if (error.code !== "EADDRINUSE" || Date.now() >= deadline) {
116
+ throw new Error("Capture setup is already running, or its local coordination port is occupied. Retry after the other setup or application closes.");
117
+ }
118
+ await new Promise(resolve => setTimeout(resolve, Math.min(250, deadline - Date.now())));
119
+ }
113
120
  }
114
121
  let releaseFile;
115
122
  try {
@@ -243,7 +250,8 @@ export async function startHostedCapture(meta, token, apiBase) {
243
250
  // One machine-wide window: never silently mix two candidates' conversations.
244
251
  const lock = `${HOSTED_CAPTURE_FILE}.lock`;
245
252
  mkdirSync(path.dirname(lock), { recursive: true, mode: 0o700 });
246
- const releaseLock = await acquireCaptureSetupLock(lock);
253
+ // Different editor launches share this setup, but retain independent openers.
254
+ const releaseLock = await acquireCaptureSetupLock(lock, meta.launcherBetaEnabled === true ? 30000 : 0);
247
255
  try {
248
256
  pruneOrphanedCaptureRegistrations();
249
257
  let prior = {};
@@ -279,7 +287,8 @@ export async function startHostedCapture(meta, token, apiBase) {
279
287
  atomicPrivateJson(HOSTED_CAPTURE_FILE, registration);
280
288
  return;
281
289
  }
282
- console.log(`\n${HOSTED_CAPTURE_DISCLOSURE}\n`);
290
+ if (meta.launcherBetaEnabled !== true)
291
+ console.log(`\n${HOSTED_CAPTURE_DISCLOSURE}\n`);
283
292
  const setupId = randomUUID();
284
293
  const requestStarted = Date.now();
285
294
  const lease = await captureLease(meta.backendUrl, token, true);
@@ -314,7 +323,8 @@ export async function startHostedCapture(meta, token, apiBase) {
314
323
  const missing = [!hooks.codexInstalled && "Codex", !hooks.geminiInstalled && "Gemini"].filter(Boolean);
315
324
  if (missing.length)
316
325
  console.log(`Capture hooks could not be installed for: ${missing.join(", ")}. Use another supported tool or contact support.`);
317
- console.log("Local capture enabled for Claude Code, Codex, Cursor and Gemini where supported.");
326
+ if (meta.launcherBetaEnabled !== true)
327
+ console.log("Local capture enabled for Claude Code, Codex, Cursor and Gemini where supported.");
318
328
  return () => rollbackPreparedCapture(projectDir, setupId);
319
329
  }
320
330
  catch (error) {