aibroker 0.60.1 → 0.61.0
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 +21 -33
- package/dist/adapters/iterm/core.d.ts +29 -0
- package/dist/adapters/iterm/core.d.ts.map +1 -1
- package/dist/adapters/iterm/core.js +69 -0
- package/dist/adapters/iterm/core.js.map +1 -1
- package/dist/adapters/iterm/dictation.d.ts +1 -1
- package/dist/adapters/iterm/dictation.d.ts.map +1 -1
- package/dist/adapters/iterm/dictation.js +5 -6
- package/dist/adapters/iterm/dictation.js.map +1 -1
- package/dist/adapters/iterm/sessions.d.ts.map +1 -1
- package/dist/adapters/iterm/sessions.js +11 -0
- package/dist/adapters/iterm/sessions.js.map +1 -1
- package/dist/adapters/kokoro/media.d.ts +1 -1
- package/dist/adapters/kokoro/media.d.ts.map +1 -1
- package/dist/adapters/kokoro/media.js +4 -3
- package/dist/adapters/kokoro/media.js.map +1 -1
- package/dist/adapters/kokoro/tts.d.ts +1 -1
- package/dist/adapters/kokoro/tts.d.ts.map +1 -1
- package/dist/adapters/kokoro/tts.js +15 -3
- package/dist/adapters/kokoro/tts.js.map +1 -1
- package/dist/adapters/pailot/gateway.d.ts.map +1 -1
- package/dist/adapters/pailot/gateway.js +7 -5
- package/dist/adapters/pailot/gateway.js.map +1 -1
- package/dist/backend/api.d.ts.map +1 -1
- package/dist/backend/api.js +2 -1
- package/dist/backend/api.js.map +1 -1
- package/dist/core/bins.d.ts +25 -0
- package/dist/core/bins.d.ts.map +1 -0
- package/dist/core/bins.js +59 -0
- package/dist/core/bins.js.map +1 -0
- package/dist/core/env-bootstrap.js +2 -7
- package/dist/core/env-bootstrap.js.map +1 -1
- package/dist/core/log.d.ts +2 -0
- package/dist/core/log.d.ts.map +1 -1
- package/dist/core/log.js +7 -0
- package/dist/core/log.js.map +1 -1
- package/dist/core/private-file.d.ts +10 -0
- package/dist/core/private-file.d.ts.map +1 -0
- package/dist/core/private-file.js +30 -0
- package/dist/core/private-file.js.map +1 -0
- package/dist/core/service-env.d.ts +10 -0
- package/dist/core/service-env.d.ts.map +1 -0
- package/dist/core/service-env.js +18 -0
- package/dist/core/service-env.js.map +1 -0
- package/dist/core/session-discovery.d.ts +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +1 -1
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/daemon/audit.d.ts.map +1 -1
- package/dist/daemon/audit.js +4 -3
- package/dist/daemon/audit.js.map +1 -1
- package/dist/daemon/cli.d.ts +3 -1
- package/dist/daemon/cli.d.ts.map +1 -1
- package/dist/daemon/cli.js +45 -48
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +16 -6
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/daemon-control.d.ts +51 -0
- package/dist/daemon/daemon-control.d.ts.map +1 -0
- package/dist/daemon/daemon-control.js +182 -0
- package/dist/daemon/daemon-control.js.map +1 -0
- package/dist/daemon/doctor.d.ts +21 -0
- package/dist/daemon/doctor.d.ts.map +1 -0
- package/dist/daemon/doctor.js +134 -0
- package/dist/daemon/doctor.js.map +1 -0
- package/dist/daemon/funnel-watchdog.d.ts.map +1 -1
- package/dist/daemon/funnel-watchdog.js +8 -8
- package/dist/daemon/funnel-watchdog.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +24 -4
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/launch-cli.d.ts +67 -1
- package/dist/daemon/launch-cli.d.ts.map +1 -1
- package/dist/daemon/launch-cli.js +138 -35
- package/dist/daemon/launch-cli.js.map +1 -1
- package/dist/daemon/manage.d.ts +18 -0
- package/dist/daemon/manage.d.ts.map +1 -1
- package/dist/daemon/manage.js +41 -27
- package/dist/daemon/manage.js.map +1 -1
- package/dist/daemon/screenshot.d.ts.map +1 -1
- package/dist/daemon/screenshot.js +43 -0
- package/dist/daemon/screenshot.js.map +1 -1
- package/dist/daemon/send-cli.d.ts +9 -0
- package/dist/daemon/send-cli.d.ts.map +1 -0
- package/dist/daemon/send-cli.js +55 -0
- package/dist/daemon/send-cli.js.map +1 -0
- package/dist/daemon/session-content.d.ts +2 -2
- package/dist/daemon/session-content.d.ts.map +1 -1
- package/dist/daemon/session-content.js +23 -3
- package/dist/daemon/session-content.js.map +1 -1
- package/dist/daemon/sessions.d.ts +29 -0
- package/dist/daemon/sessions.d.ts.map +1 -1
- package/dist/daemon/sessions.js +160 -63
- package/dist/daemon/sessions.js.map +1 -1
- package/dist/daemon/setup.d.ts +86 -0
- package/dist/daemon/setup.d.ts.map +1 -0
- package/dist/daemon/setup.js +470 -0
- package/dist/daemon/setup.js.map +1 -0
- package/dist/daemon/status-format.d.ts +4 -0
- package/dist/daemon/status-format.d.ts.map +1 -0
- package/dist/daemon/status-format.js +22 -0
- package/dist/daemon/status-format.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ipc/validate.d.ts +2 -0
- package/dist/ipc/validate.d.ts.map +1 -1
- package/dist/ipc/validate.js +2 -1
- package/dist/ipc/validate.js.map +1 -1
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/transport/index.d.ts +2 -1
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +6 -0
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/iterm.d.ts +4 -1
- package/dist/transport/iterm.d.ts.map +1 -1
- package/dist/transport/iterm.js +26 -0
- package/dist/transport/iterm.js.map +1 -1
- package/dist/transport/policy.d.ts +24 -0
- package/dist/transport/policy.d.ts.map +1 -0
- package/dist/transport/policy.js +41 -0
- package/dist/transport/policy.js.map +1 -0
- package/dist/transport/screen.d.ts +11 -0
- package/dist/transport/screen.d.ts.map +1 -1
- package/dist/transport/screen.js +19 -0
- package/dist/transport/screen.js.map +1 -1
- package/dist/transport/session-transport.d.ts +27 -0
- package/dist/transport/session-transport.d.ts.map +1 -1
- package/dist/transport/session-transport.js +6 -1
- package/dist/transport/session-transport.js.map +1 -1
- package/dist/transport/sync-facade.d.ts +19 -0
- package/dist/transport/sync-facade.d.ts.map +1 -1
- package/dist/transport/sync-facade.js +38 -8
- package/dist/transport/sync-facade.js.map +1 -1
- package/dist/transport/tmux.d.ts +15 -1
- package/dist/transport/tmux.d.ts.map +1 -1
- package/dist/transport/tmux.js +52 -4
- package/dist/transport/tmux.js.map +1 -1
- package/package.json +4 -2
- package/templates/systemd/aibroker.service +22 -0
|
@@ -7,38 +7,87 @@
|
|
|
7
7
|
* hold the tool — that is the whole problem — so the capability has to be
|
|
8
8
|
* reachable from a script and from a bare prompt, which means a CLI verb.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* A directory opens a plain Claude Code session there through the active
|
|
11
|
+
* transport (a tmux window on Linux, an iTerm tab on macOS); a bare PAI project
|
|
12
|
+
* name keeps going through `pai_launch`. The transport call runs in this
|
|
13
|
+
* process, not the daemon: the caller's $TMUX says which tmux session is "here",
|
|
14
|
+
* and it works while the daemon is down, which is when restoring matters.
|
|
15
|
+
*
|
|
16
|
+
* It prints the session id because the caller's next move is almost
|
|
11
17
|
* always to manage or arm the thing it just created, and that needs the id.
|
|
12
18
|
*/
|
|
19
|
+
import { existsSync, statSync } from "node:fs";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
import { basename, resolve } from "node:path";
|
|
13
22
|
import { WatcherClient } from "../ipc/client.js";
|
|
23
|
+
import { resolveBin } from "../core/bins.js";
|
|
24
|
+
import { selectTransport } from "../transport/index.js";
|
|
14
25
|
import { DAEMON_SOCKET_PATH } from "./index.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
/** `[--name N] <target>` in any order. */
|
|
27
|
+
export function parseLaunchArgs(args) {
|
|
28
|
+
let name;
|
|
29
|
+
const rest = [];
|
|
30
|
+
for (let i = 0; i < args.length; i++) {
|
|
31
|
+
if (args[i] === "--name")
|
|
32
|
+
name = args[++i];
|
|
33
|
+
else if (args[i].startsWith("--name="))
|
|
34
|
+
name = args[i].slice(7);
|
|
35
|
+
else
|
|
36
|
+
rest.push(args[i]);
|
|
20
37
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return;
|
|
38
|
+
return { target: rest[0], name };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Directory or PAI project? A path-like argument (`/x`, `./x`, `~/x`, `a/b`)
|
|
42
|
+
* is always a directory. A bare word stays a PAI project wherever PAI exists —
|
|
43
|
+
* on macOS `launch whazaa` must keep meaning the project even when a `whazaa`
|
|
44
|
+
* directory sits in the working directory — and is a directory otherwise.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveLaunchTarget(target, nameOverride, deps) {
|
|
47
|
+
const pathLike = /[\\/]/.test(target) || target.startsWith(".") || target.startsWith("~");
|
|
48
|
+
const bare = !pathLike;
|
|
49
|
+
if (bare && deps.paiPresent())
|
|
50
|
+
return { kind: "pai", name: target };
|
|
51
|
+
const expanded = target === "~" ? deps.home : target.startsWith("~/") ? deps.home + target.slice(1) : target;
|
|
52
|
+
const dir = resolve(deps.cwd, expanded);
|
|
53
|
+
if (!deps.isDir(dir)) {
|
|
54
|
+
throw new Error(bare
|
|
55
|
+
? `"${target}" is not a directory here and PAI is not installed, so it is not a project name either`
|
|
56
|
+
: `"${target}" is not a directory`);
|
|
41
57
|
}
|
|
58
|
+
return { kind: "dir", dir, name: nameOverride || basename(dir) };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Attach before spawning. Launching is not the point — HAVING a session for
|
|
62
|
+
* this project is, and a second pane in the same repository is worse than no
|
|
63
|
+
* pane at all: two agents claiming the same issues, committing over each
|
|
64
|
+
* other, neither aware of the other. The recovery case cannot tell in advance
|
|
65
|
+
* whether the machine restarted or the caller simply asked twice, so the only
|
|
66
|
+
* safe shape is idempotent.
|
|
67
|
+
*
|
|
68
|
+
* Match on paiName, which is the project identity the daemon assigns, rather
|
|
69
|
+
* than on the terminal's title, which carries spinner glyphs and process
|
|
70
|
+
* names and would match a bare shell sitting in the same directory. A launched
|
|
71
|
+
* directory session has no paiName yet, so it is matched by its name or its
|
|
72
|
+
* directory — but only when it is a live Claude, never a shell.
|
|
73
|
+
*/
|
|
74
|
+
export function findRunning(rows, name, dir) {
|
|
75
|
+
const lower = name.toLowerCase();
|
|
76
|
+
return rows.find((r) => (r.paiName && r.paiName.toLowerCase() === lower) ||
|
|
77
|
+
(r.kind === "claude" &&
|
|
78
|
+
((r.name ?? "").toLowerCase() === lower || (dir !== undefined && r.cwd === dir))));
|
|
79
|
+
}
|
|
80
|
+
const liveDeps = () => ({
|
|
81
|
+
transport: selectTransport,
|
|
82
|
+
sessions: async () => {
|
|
83
|
+
try {
|
|
84
|
+
const res = (await new WatcherClient(DAEMON_SOCKET_PATH).call_raw("sessions", {}));
|
|
85
|
+
return Array.isArray(res) ? res : (res?.sessions ?? []);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
},
|
|
42
91
|
/*
|
|
43
92
|
* call_raw returns the handler's RESULT, not the {ok, result} envelope the
|
|
44
93
|
* handler writes — the client unwraps it and throws on failure. Checking for
|
|
@@ -48,19 +97,73 @@ export async function runLaunch(args) {
|
|
|
48
97
|
* Success is a session id coming back; anything else is a failure to say out
|
|
49
98
|
* loud.
|
|
50
99
|
*/
|
|
51
|
-
|
|
100
|
+
paiLaunch: async (name) => (await new WatcherClient(DAEMON_SOCKET_PATH).call_raw("pai_launch", { name })),
|
|
101
|
+
isDir: (p) => existsSync(p) && statSync(p).isDirectory(),
|
|
102
|
+
paiPresent: () => resolveBin("pai") !== "pai",
|
|
103
|
+
cwd: process.cwd(),
|
|
104
|
+
home: homedir(),
|
|
105
|
+
out: (l) => console.log(l),
|
|
106
|
+
});
|
|
107
|
+
/** Returns the process exit code. */
|
|
108
|
+
export async function launch(args, deps) {
|
|
109
|
+
const { target, name: nameArg } = parseLaunchArgs(args);
|
|
110
|
+
if (!target) {
|
|
111
|
+
console.error("Usage: aibroker launch <dir|pai-project> [--name N]");
|
|
112
|
+
return 1;
|
|
113
|
+
}
|
|
114
|
+
let resolved;
|
|
52
115
|
try {
|
|
53
|
-
|
|
116
|
+
resolved = resolveLaunchTarget(target, nameArg, deps);
|
|
54
117
|
}
|
|
55
118
|
catch (err) {
|
|
56
|
-
console.error(`Could not launch
|
|
57
|
-
|
|
119
|
+
console.error(`Could not launch: ${err instanceof Error ? err.message : String(err)}`);
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
const rows = await deps.sessions();
|
|
123
|
+
const already = findRunning(rows, resolved.name, resolved.kind === "dir" ? resolved.dir : undefined);
|
|
124
|
+
if (already) {
|
|
125
|
+
deps.out(`${already.paiName ?? already.name ?? resolved.name} is already running — attached, nothing launched.`);
|
|
126
|
+
deps.out(` ${already.transport ?? "iterm"} ${already.sessionId}`);
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
if (resolved.kind === "pai") {
|
|
130
|
+
let res;
|
|
131
|
+
try {
|
|
132
|
+
res = await deps.paiLaunch(resolved.name);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
console.error(`Could not launch ${resolved.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
if (!res?.itermSessionId) {
|
|
139
|
+
console.error(`Could not launch ${resolved.name}: the daemon returned no session`);
|
|
140
|
+
return 1;
|
|
141
|
+
}
|
|
142
|
+
deps.out(`Launched ${res.name ?? resolved.name}`);
|
|
143
|
+
deps.out(` iterm ${res.itermSessionId}`);
|
|
144
|
+
return 0;
|
|
58
145
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
146
|
+
let res = null;
|
|
147
|
+
try {
|
|
148
|
+
res = deps.transport().launch({ dir: resolved.dir, name: resolved.name });
|
|
62
149
|
}
|
|
63
|
-
|
|
64
|
-
|
|
150
|
+
catch (err) {
|
|
151
|
+
console.error(`Could not launch ${resolved.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
if (!res) {
|
|
155
|
+
console.error(`Could not launch ${resolved.name}: the terminal host refused (is tmux installed?)`);
|
|
156
|
+
return 1;
|
|
157
|
+
}
|
|
158
|
+
deps.out(`Launched ${resolved.name} in ${resolved.dir}`);
|
|
159
|
+
deps.out(` ${res.transport} ${res.id} (${res.where})`);
|
|
160
|
+
if (res.attach)
|
|
161
|
+
deps.out(` attach: ${res.attach}`);
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
export async function runLaunch(args) {
|
|
165
|
+
const code = await launch(args, liveDeps());
|
|
166
|
+
if (code !== 0)
|
|
167
|
+
process.exit(code);
|
|
65
168
|
}
|
|
66
169
|
//# sourceMappingURL=launch-cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-cli.js","sourceRoot":"","sources":["../../src/daemon/launch-cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"launch-cli.js","sourceRoot":"","sources":["../../src/daemon/launch-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/manage.d.ts
CHANGED
|
@@ -632,6 +632,24 @@ export declare function screenLease(m: ManagedSession, now: number): {
|
|
|
632
632
|
* what the first computation found is how the two descriptions drift apart.
|
|
633
633
|
*/
|
|
634
634
|
export declare function blockedReason(m: Pick<ManagedSession, "armFailStreak" | "stuckSince" | "lastChangeAt">, content: string, now: number): string | null;
|
|
635
|
+
/** A failure must last this long, continuously, before the operator is paged. */
|
|
636
|
+
export declare const ENUMERATION_ALERT_AFTER_MS = 120000;
|
|
637
|
+
export interface EnumerationEpisode {
|
|
638
|
+
/** When the current failure episode began; null while reliable. */
|
|
639
|
+
since: number | null;
|
|
640
|
+
/** Whether an alert went out for this episode. */
|
|
641
|
+
alerted: boolean;
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Pure decision for one tick: a transient failure (an osascript hitting the
|
|
645
|
+
* LaunchServices window) clears within a tick or two and must not page anyone;
|
|
646
|
+
* only a sustained one alerts, once, and only that one earns a recovery line.
|
|
647
|
+
*/
|
|
648
|
+
export declare function enumerationStep(ep: EnumerationEpisode, now: number, reliable: boolean): {
|
|
649
|
+
ep: EnumerationEpisode;
|
|
650
|
+
action: "none" | "alert" | "recovered";
|
|
651
|
+
downMs: number;
|
|
652
|
+
};
|
|
635
653
|
export declare function startManagerLoop(): void;
|
|
636
654
|
export interface ManageResult {
|
|
637
655
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manage.d.ts","sourceRoot":"","sources":["../../src/daemon/manage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"manage.d.ts","sourceRoot":"","sources":["../../src/daemon/manage.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/manage.js
CHANGED
|
@@ -27,6 +27,8 @@ import { log } from "../core/log.js";
|
|
|
27
27
|
import { timeCall } from "../core/call-timing.js";
|
|
28
28
|
import { readSessionContent } from "./session-content.js";
|
|
29
29
|
import { typeIntoSession, pasteTextIntoSession, sendControlU, sendEnterKey, escapeInputMode, wasLastEnumerationReliable } from "../transport/sync-facade.js";
|
|
30
|
+
import { findItermBundleIdImpostors } from "../adapters/iterm/core.js";
|
|
31
|
+
import { processCwd } from "../core/bins.js";
|
|
30
32
|
import { discoverLiveSessions } from "../core/session-discovery.js";
|
|
31
33
|
import { hasPailotClients } from "../adapters/pailot/gateway.js";
|
|
32
34
|
import { getAibpBridge } from "../core/state.js";
|
|
@@ -935,11 +937,7 @@ function repoRootForSession(sessionId) {
|
|
|
935
937
|
}
|
|
936
938
|
function repoRootFor(pid) {
|
|
937
939
|
try {
|
|
938
|
-
const
|
|
939
|
-
encoding: "utf8",
|
|
940
|
-
timeout: 4_000,
|
|
941
|
-
});
|
|
942
|
-
const cwd = cwdOut.split("\n").find((l) => l.startsWith("n"))?.slice(1);
|
|
940
|
+
const cwd = processCwd(pid);
|
|
943
941
|
if (!cwd)
|
|
944
942
|
return null;
|
|
945
943
|
const root = execFileSync("/usr/bin/env", ["git", "-C", cwd, "rev-parse", "--show-toplevel"], {
|
|
@@ -1277,16 +1275,7 @@ export function usageFromLines(lines) {
|
|
|
1277
1275
|
* call per session per tick rather than once per caller.
|
|
1278
1276
|
*/
|
|
1279
1277
|
function sessionCwd(claudePid) {
|
|
1280
|
-
|
|
1281
|
-
const cwdOut = execFileSync("/usr/sbin/lsof", ["-p", claudePid, "-a", "-d", "cwd", "-Fn"], {
|
|
1282
|
-
encoding: "utf8",
|
|
1283
|
-
timeout: 4_000,
|
|
1284
|
-
});
|
|
1285
|
-
return cwdOut.split("\n").find((l) => l.startsWith("n"))?.slice(1) ?? null;
|
|
1286
|
-
}
|
|
1287
|
-
catch {
|
|
1288
|
-
return null;
|
|
1289
|
-
}
|
|
1278
|
+
return processCwd(claudePid);
|
|
1290
1279
|
}
|
|
1291
1280
|
/**
|
|
1292
1281
|
* The transcript directory for a session's own project, derived from its cwd.
|
|
@@ -2289,12 +2278,26 @@ function beat() {
|
|
|
2289
2278
|
*/
|
|
2290
2279
|
const DIALOG_EVERY_TICKS = 3;
|
|
2291
2280
|
let tickCount = 0;
|
|
2281
|
+
/** A failure must last this long, continuously, before the operator is paged. */
|
|
2282
|
+
export const ENUMERATION_ALERT_AFTER_MS = 120_000;
|
|
2292
2283
|
/**
|
|
2293
|
-
*
|
|
2294
|
-
*
|
|
2295
|
-
*
|
|
2284
|
+
* Pure decision for one tick: a transient failure (an osascript hitting the
|
|
2285
|
+
* LaunchServices window) clears within a tick or two and must not page anyone;
|
|
2286
|
+
* only a sustained one alerts, once, and only that one earns a recovery line.
|
|
2296
2287
|
*/
|
|
2297
|
-
|
|
2288
|
+
export function enumerationStep(ep, now, reliable) {
|
|
2289
|
+
if (reliable) {
|
|
2290
|
+
const downMs = ep.since === null ? 0 : now - ep.since;
|
|
2291
|
+
return { ep: { since: null, alerted: false }, action: ep.alerted ? "recovered" : "none", downMs };
|
|
2292
|
+
}
|
|
2293
|
+
const since = ep.since ?? now;
|
|
2294
|
+
const downMs = now - since;
|
|
2295
|
+
if (!ep.alerted && downMs >= ENUMERATION_ALERT_AFTER_MS) {
|
|
2296
|
+
return { ep: { since, alerted: true }, action: "alert", downMs };
|
|
2297
|
+
}
|
|
2298
|
+
return { ep: { since, alerted: ep.alerted }, action: "none", downMs };
|
|
2299
|
+
}
|
|
2300
|
+
let enumerationEpisode = { since: null, alerted: false };
|
|
2298
2301
|
function answerBlockingDialogs() {
|
|
2299
2302
|
if (Object.keys(state).length === 0)
|
|
2300
2303
|
return;
|
|
@@ -2319,16 +2322,27 @@ async function tick() {
|
|
|
2319
2322
|
// empty machine — reported "ok" with 0 sessions is exactly the silent
|
|
2320
2323
|
// failure this exists to catch. Reuses the flag every `sessions`/`status`
|
|
2321
2324
|
// caller already sets; no separate probe.
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2325
|
+
const reliable = wasLastEnumerationReliable();
|
|
2326
|
+
if (!reliable && enumerationEpisode.since === null)
|
|
2327
|
+
log("[manage] iTerm enumeration unreliable — episode started, alerting only if it lasts");
|
|
2328
|
+
const step = enumerationStep(enumerationEpisode, now, reliable);
|
|
2329
|
+
enumerationEpisode = step.ep;
|
|
2330
|
+
if (step.action === "alert") {
|
|
2331
|
+
let text = "iTerm session enumeration is failing (AppleScript errors) for over 2 minutes — the session list may be empty or stale until this clears.";
|
|
2332
|
+
const impostors = findItermBundleIdImpostors();
|
|
2333
|
+
if (impostors.length) {
|
|
2334
|
+
const named = impostors.map((i) => `pid ${i.pid} (${i.executablePath})`).join(", ");
|
|
2335
|
+
text += ` Found ${named} registered under iTerm's bundle id — a process spawned with iTerm's __CFBundleIdentifier; killing it restores enumeration.`;
|
|
2327
2336
|
}
|
|
2337
|
+
alertOperator(text);
|
|
2338
|
+
log(`[manage] iTerm enumeration unreliable — alerted the operator${impostors.length ? ` (impostors: ${impostors.map((i) => i.pid).join(", ")})` : ""}`);
|
|
2339
|
+
}
|
|
2340
|
+
else if (step.action === "recovered") {
|
|
2341
|
+
alertOperator(`iTerm session enumeration recovered after ${Math.round(step.downMs / 1000)}s.`);
|
|
2342
|
+
log("[manage] iTerm enumeration recovered — alerted the operator");
|
|
2328
2343
|
}
|
|
2329
|
-
else if (
|
|
2330
|
-
|
|
2331
|
-
log("[manage] iTerm enumeration recovered");
|
|
2344
|
+
else if (reliable && step.downMs > 0) {
|
|
2345
|
+
log(`[manage] iTerm enumeration recovered after ${Math.round(step.downMs / 1000)}s — no alert sent`);
|
|
2332
2346
|
}
|
|
2333
2347
|
if (++tickCount % DIALOG_EVERY_TICKS === 0) {
|
|
2334
2348
|
try {
|