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.
- package/README.md +48 -0
- package/dist/commands/connect.d.ts +6 -2
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +222 -35
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/forward.d.ts +7 -1
- package/dist/commands/forward.d.ts.map +1 -1
- package/dist/commands/forward.js +8 -7
- package/dist/commands/forward.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +25 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/ai-tracking.d.ts +8 -0
- package/dist/lib/ai-tracking.d.ts.map +1 -1
- package/dist/lib/ai-tracking.js +79 -3
- package/dist/lib/ai-tracking.js.map +1 -1
- package/dist/lib/api.d.ts +1 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +12 -4
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/capture-selftest.d.ts +9 -0
- package/dist/lib/capture-selftest.d.ts.map +1 -1
- package/dist/lib/capture-selftest.js +27 -2
- package/dist/lib/capture-selftest.js.map +1 -1
- package/dist/lib/connect-skills.d.ts +1 -0
- package/dist/lib/connect-skills.d.ts.map +1 -1
- package/dist/lib/connect-skills.js +1 -1
- package/dist/lib/connect-skills.js.map +1 -1
- package/dist/lib/desktop-readiness.d.ts +9 -0
- package/dist/lib/desktop-readiness.d.ts.map +1 -0
- package/dist/lib/desktop-readiness.js +131 -0
- package/dist/lib/desktop-readiness.js.map +1 -0
- package/dist/lib/editor-foreground.d.ts +6 -0
- package/dist/lib/editor-foreground.d.ts.map +1 -0
- package/dist/lib/editor-foreground.js +38 -0
- package/dist/lib/editor-foreground.js.map +1 -0
- package/dist/lib/environment-checks.d.ts +2 -0
- package/dist/lib/environment-checks.d.ts.map +1 -1
- package/dist/lib/environment-checks.js +4 -2
- package/dist/lib/environment-checks.js.map +1 -1
- package/dist/lib/file-monitor.d.ts +18 -0
- package/dist/lib/file-monitor.d.ts.map +1 -0
- package/dist/lib/file-monitor.js +87 -0
- package/dist/lib/file-monitor.js.map +1 -0
- package/dist/lib/hook-logger.cjs +22 -10
- package/dist/lib/hosted-capture.d.ts +1 -1
- package/dist/lib/hosted-capture.d.ts.map +1 -1
- package/dist/lib/hosted-capture.js +22 -12
- package/dist/lib/hosted-capture.js.map +1 -1
- package/dist/lib/init-location.d.ts +4 -0
- package/dist/lib/init-location.d.ts.map +1 -0
- package/dist/lib/init-location.js +36 -0
- package/dist/lib/init-location.js.map +1 -0
- package/dist/lib/installed-tools.d.ts +29 -0
- package/dist/lib/installed-tools.d.ts.map +1 -0
- package/dist/lib/installed-tools.js +159 -0
- package/dist/lib/installed-tools.js.map +1 -0
- package/dist/lib/portal-launcher-background.d.ts +13 -0
- package/dist/lib/portal-launcher-background.d.ts.map +1 -0
- package/dist/lib/portal-launcher-background.js +51 -0
- package/dist/lib/portal-launcher-background.js.map +1 -0
- package/dist/lib/portal-launcher-worker.d.ts +2 -0
- package/dist/lib/portal-launcher-worker.d.ts.map +1 -0
- package/dist/lib/portal-launcher-worker.js +43 -0
- package/dist/lib/portal-launcher-worker.js.map +1 -0
- package/dist/lib/portal-launcher.d.ts +43 -0
- package/dist/lib/portal-launcher.d.ts.map +1 -0
- package/dist/lib/portal-launcher.js +408 -0
- package/dist/lib/portal-launcher.js.map +1 -0
- package/dist/lib/prepared-desktop.d.ts +7 -0
- package/dist/lib/prepared-desktop.d.ts.map +1 -0
- package/dist/lib/prepared-desktop.js +35 -0
- package/dist/lib/prepared-desktop.js.map +1 -0
- package/dist/lib/prepared-editor.d.ts +26 -0
- package/dist/lib/prepared-editor.d.ts.map +1 -0
- package/dist/lib/prepared-editor.js +150 -0
- package/dist/lib/prepared-editor.js.map +1 -0
- package/dist/lib/schemas.d.ts +1 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +2 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/ssh-client.d.ts +12 -0
- package/dist/lib/ssh-client.d.ts.map +1 -1
- package/dist/lib/ssh-client.js +1 -1
- package/dist/lib/ssh-client.js.map +1 -1
- package/dist/lib/ssh-config-file.d.ts +3 -0
- package/dist/lib/ssh-config-file.d.ts.map +1 -1
- package/dist/lib/ssh-config-file.js +42 -0
- package/dist/lib/ssh-config-file.js.map +1 -1
- package/dist/lib/tracker.d.ts +1 -0
- package/dist/lib/tracker.d.ts.map +1 -1
- package/dist/lib/tracker.js +4 -2
- package/dist/lib/tracker.js.map +1 -1
- package/dist/lib/vscode-server-preparation.d.ts +7 -0
- package/dist/lib/vscode-server-preparation.d.ts.map +1 -0
- package/dist/lib/vscode-server-preparation.js +78 -0
- package/dist/lib/vscode-server-preparation.js.map +1 -0
- package/dist/lib/watcher.js +98 -77
- package/dist/lib/watcher.js.map +1 -1
- package/dist/lib/workspace-start-wait.d.ts +23 -0
- package/dist/lib/workspace-start-wait.d.ts.map +1 -0
- package/dist/lib/workspace-start-wait.js +50 -0
- package/dist/lib/workspace-start-wait.js.map +1 -0
- 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":"
|
|
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
|
-
|
|
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 { /*
|
|
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":"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"}
|
|
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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"}
|
package/dist/lib/hook-logger.cjs
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|