aibroker 0.59.0 → 0.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/iterm/sessions.d.ts +28 -0
- package/dist/adapters/iterm/sessions.d.ts.map +1 -1
- package/dist/adapters/iterm/sessions.js +65 -0
- package/dist/adapters/iterm/sessions.js.map +1 -1
- package/dist/adapters/pailot/gateway.d.ts.map +1 -1
- package/dist/adapters/pailot/gateway.js +46 -11
- package/dist/adapters/pailot/gateway.js.map +1 -1
- package/dist/core/hybrid.d.ts +10 -1
- package/dist/core/hybrid.d.ts.map +1 -1
- package/dist/core/hybrid.js +50 -15
- package/dist/core/hybrid.js.map +1 -1
- package/dist/core/persistence.d.ts +51 -2
- package/dist/core/persistence.d.ts.map +1 -1
- package/dist/core/persistence.js +45 -1
- package/dist/core/persistence.js.map +1 -1
- package/dist/core/session-discovery.d.ts +8 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +20 -5
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-match.d.ts +23 -0
- package/dist/core/session-match.d.ts.map +1 -1
- package/dist/core/session-match.js +25 -11
- package/dist/core/session-match.js.map +1 -1
- package/dist/daemon/cli.js +3 -0
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/commands.d.ts.map +1 -1
- package/dist/daemon/commands.js +8 -0
- package/dist/daemon/commands.js.map +1 -1
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +65 -9
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/dispatch.d.ts +21 -1
- package/dist/daemon/dispatch.d.ts.map +1 -1
- package/dist/daemon/dispatch.js +58 -16
- package/dist/daemon/dispatch.js.map +1 -1
- package/dist/daemon/inbound.d.ts +4 -0
- package/dist/daemon/inbound.d.ts.map +1 -1
- package/dist/daemon/inbound.js +134 -29
- package/dist/daemon/inbound.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +32 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/manage.d.ts.map +1 -1
- package/dist/daemon/manage.js +22 -1
- package/dist/daemon/manage.js.map +1 -1
- package/dist/daemon/session-content.d.ts.map +1 -1
- package/dist/daemon/session-content.js +4 -2
- package/dist/daemon/session-content.js.map +1 -1
- package/dist/daemon/todoist-webhook.d.ts.map +1 -1
- package/dist/daemon/todoist-webhook.js +3 -1
- package/dist/daemon/todoist-webhook.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 +6 -1
- package/dist/ipc/validate.js.map +1 -1
- package/dist/transport/screen.d.ts.map +1 -1
- package/dist/transport/screen.js +30 -4
- package/dist/transport/screen.js.map +1 -1
- package/package.json +2 -2
package/dist/core/hybrid.d.ts
CHANGED
|
@@ -24,6 +24,12 @@ export interface HybridSession {
|
|
|
24
24
|
createdAt: number;
|
|
25
25
|
/** Backend-specific ID: "api-N" for API sessions, iTerm2 UUID for visual */
|
|
26
26
|
backendSessionId: string;
|
|
27
|
+
/**
|
|
28
|
+
* Measured at the last discovery: a Claude process owns this tab's tty.
|
|
29
|
+
* Undefined when discovery could not measure it. Used to settle name
|
|
30
|
+
* collisions — see syncFromLive.
|
|
31
|
+
*/
|
|
32
|
+
isClaude?: boolean;
|
|
27
33
|
}
|
|
28
34
|
export declare class HybridSessionManager {
|
|
29
35
|
readonly apiBackend: APIBackend;
|
|
@@ -46,6 +52,7 @@ export declare class HybridSessionManager {
|
|
|
46
52
|
name: string;
|
|
47
53
|
paiName?: string | null;
|
|
48
54
|
tabTitle?: string | null;
|
|
55
|
+
isClaude?: boolean;
|
|
49
56
|
}>): void;
|
|
50
57
|
/**
|
|
51
58
|
* Change how long one enumeration is reused for.
|
|
@@ -59,7 +66,7 @@ export declare class HybridSessionManager {
|
|
|
59
66
|
/** Create a new headless (API) session. Delegates to APIBackend. */
|
|
60
67
|
createApiSession(name: string, cwd: string): HybridSession;
|
|
61
68
|
/** Register a visual (iTerm2) session. The transport creates the tab and passes the ID. */
|
|
62
|
-
registerVisualSession(name: string, cwd: string, itermSessionId: string): HybridSession;
|
|
69
|
+
registerVisualSession(name: string, cwd: string, itermSessionId: string, isClaude?: boolean): HybridSession;
|
|
63
70
|
/** Switch to session by 1-based display index. Returns the session or undefined. */
|
|
64
71
|
switchToIndex(index: number): HybridSession | undefined;
|
|
65
72
|
/** Remove session by 1-based display index. For API sessions, also ends in APIBackend. */
|
|
@@ -73,6 +80,8 @@ export declare class HybridSessionManager {
|
|
|
73
80
|
* Call with the set of live iTerm2 session IDs from snapshotAllSessions().
|
|
74
81
|
*/
|
|
75
82
|
pruneDeadVisualSessions(liveIds: Set<string>): number;
|
|
83
|
+
/** Drop the visual row at `i`, keeping the active index pointing at the same session. */
|
|
84
|
+
private removeVisualAt;
|
|
76
85
|
/** Update the name of a session identified by its backend ID. */
|
|
77
86
|
updateName(backendSessionId: string, newName: string): void;
|
|
78
87
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/core/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/core/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAoBpD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAmH;IACpI,wFAAwF;IACxF,OAAO,CAAC,mBAAmB,CAAS;IACpC,4EAA4E;IAC5E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAoB;gBAE1B,UAAU,EAAE,UAAU;IAIlC;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;IAIxI;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMnC,oEAAoE;IACpE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAkB1D,2FAA2F;IAC3F,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,aAAa;IAkB3G,oFAAoF;IACpF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAYvD,0FAA0F;IAC1F,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAiCvD,6EAA6E;IAC7E,kBAAkB,IAAI,IAAI;IAW1B,0DAA0D;IAC1D,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;IAED;;;OAGG;IACH,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM;IAcrD,yFAAyF;IACzF,OAAO,CAAC,cAAc;IAStB,iEAAiE;IACjE,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ3D;;;;;;OAMG;IACH,YAAY,IAAI,aAAa,EAAE;IAK/B;;;;;;;;OAQG;IACH,aAAa,IAAI,aAAa,EAAE;IAIhC;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,YAAY;IAmFpB,4CAA4C;IAC5C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAMpD;;;;;;;;OAQG;IACH,iBAAiB,IAAI,MAAM;IAqB3B;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,GAAG,IAAI;CASpC;AAED,wEAAwE;AACxE,eAAO,IAAI,aAAa,EAAE,oBAAoB,GAAG,IAAW,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAErE"}
|
package/dist/core/hybrid.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { log } from "./log.js";
|
|
13
13
|
import { activeItermSessionId } from "./state.js";
|
|
14
|
+
import { wasLastEnumerationReliable } from "../transport/sync-facade.js";
|
|
14
15
|
/**
|
|
15
16
|
* How long one enumeration is reused for.
|
|
16
17
|
*
|
|
@@ -77,7 +78,7 @@ export class HybridSessionManager {
|
|
|
77
78
|
return session;
|
|
78
79
|
}
|
|
79
80
|
/** Register a visual (iTerm2) session. The transport creates the tab and passes the ID. */
|
|
80
|
-
registerVisualSession(name, cwd, itermSessionId) {
|
|
81
|
+
registerVisualSession(name, cwd, itermSessionId, isClaude) {
|
|
81
82
|
const session = {
|
|
82
83
|
id: `h-${this.nextNum++}`,
|
|
83
84
|
name,
|
|
@@ -85,6 +86,7 @@ export class HybridSessionManager {
|
|
|
85
86
|
kind: "visual",
|
|
86
87
|
createdAt: Date.now(),
|
|
87
88
|
backendSessionId: itermSessionId,
|
|
89
|
+
isClaude,
|
|
88
90
|
};
|
|
89
91
|
this.sessions.push(session);
|
|
90
92
|
this._activeIndex = this.sessions.length - 1;
|
|
@@ -161,22 +163,25 @@ export class HybridSessionManager {
|
|
|
161
163
|
for (let i = this.sessions.length - 1; i >= 0; i--) {
|
|
162
164
|
const s = this.sessions[i];
|
|
163
165
|
if (s.kind === "visual" && !liveIds.has(s.backendSessionId)) {
|
|
164
|
-
this.
|
|
166
|
+
this.removeVisualAt(i);
|
|
165
167
|
pruned++;
|
|
166
168
|
log(`HybridManager: pruned dead visual session "${s.name}" (${s.backendSessionId.slice(0, 8)}...)`);
|
|
167
|
-
// Adjust active index
|
|
168
|
-
if (i < this._activeIndex) {
|
|
169
|
-
this._activeIndex--;
|
|
170
|
-
}
|
|
171
|
-
else if (i === this._activeIndex) {
|
|
172
|
-
this._activeIndex = Math.min(this._activeIndex, this.sessions.length - 1);
|
|
173
|
-
}
|
|
174
169
|
}
|
|
175
170
|
}
|
|
176
171
|
if (this.sessions.length === 0)
|
|
177
172
|
this._activeIndex = -1;
|
|
178
173
|
return pruned;
|
|
179
174
|
}
|
|
175
|
+
/** Drop the visual row at `i`, keeping the active index pointing at the same session. */
|
|
176
|
+
removeVisualAt(i) {
|
|
177
|
+
this.sessions.splice(i, 1);
|
|
178
|
+
if (i < this._activeIndex) {
|
|
179
|
+
this._activeIndex--;
|
|
180
|
+
}
|
|
181
|
+
else if (i === this._activeIndex) {
|
|
182
|
+
this._activeIndex = Math.min(this._activeIndex, this.sessions.length - 1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
180
185
|
/** Update the name of a session identified by its backend ID. */
|
|
181
186
|
updateName(backendSessionId, newName) {
|
|
182
187
|
const s = this.sessions.find(s => s.backendSessionId === backendSessionId);
|
|
@@ -249,25 +254,55 @@ export class HybridSessionManager {
|
|
|
249
254
|
let live;
|
|
250
255
|
try {
|
|
251
256
|
live = this.discover();
|
|
252
|
-
this.lastDiscoveryFailed = false;
|
|
253
257
|
}
|
|
254
258
|
catch (e) {
|
|
255
259
|
this.lastDiscoveryFailed = true;
|
|
256
260
|
log(`HybridManager: discovery failed, keeping the known list — ${e instanceof Error ? e.message : String(e)}`);
|
|
257
261
|
return;
|
|
258
262
|
}
|
|
263
|
+
// A failed osascript enumeration does not throw here — it returns []
|
|
264
|
+
// indistinguishable from a genuinely empty machine unless this is checked.
|
|
265
|
+
// Treating it as a real empty would prune every known session on a
|
|
266
|
+
// transient iTerm fault; see wasLastEnumerationReliable().
|
|
267
|
+
if (!wasLastEnumerationReliable()) {
|
|
268
|
+
this.lastDiscoveryFailed = true;
|
|
269
|
+
log("HybridManager: enumeration unreliable, keeping the known list");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
this.lastDiscoveryFailed = false;
|
|
259
273
|
const liveIds = new Set(live.map((s) => s.id));
|
|
260
274
|
this.pruneDeadVisualSessions(liveIds);
|
|
261
275
|
const known = new Set(this.sessions.map((s) => s.backendSessionId));
|
|
262
|
-
|
|
276
|
+
// displayName -> index of the row holding it. First sighting wins UNLESS a
|
|
277
|
+
// later same-name tab is measured running Claude while the registered one
|
|
278
|
+
// is not: two tabs answering to one name must not bind it to the corpse.
|
|
279
|
+
// On 2026-09-26 a stale tab stole a live session's persisted name, the
|
|
280
|
+
// daemon restart bound the name to it, and both daily sweeps parked on the
|
|
281
|
+
// shell it became — the live holder was never registered under its name.
|
|
282
|
+
const seen = new Map();
|
|
263
283
|
const activeBefore = this.activeSession;
|
|
264
284
|
for (const snap of live) {
|
|
265
285
|
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
266
|
-
|
|
286
|
+
const held = seen.get(displayName);
|
|
287
|
+
if (held !== undefined) {
|
|
288
|
+
const holder = this.sessions[held];
|
|
289
|
+
if (snap.isClaude === true && holder?.isClaude !== true && holder?.kind === "visual") {
|
|
290
|
+
this.removeVisualAt(held);
|
|
291
|
+
this.registerVisualSession(displayName, "", snap.id, snap.isClaude);
|
|
292
|
+
seen.set(displayName, this.sessions.length - 1);
|
|
293
|
+
}
|
|
267
294
|
continue;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
295
|
+
}
|
|
296
|
+
const registered = this.sessions.findIndex((s) => s.backendSessionId === snap.id);
|
|
297
|
+
if (registered >= 0) {
|
|
298
|
+
// Already in the registry (a gateway/command registration, or an earlier
|
|
299
|
+
// sync) — the row stays; only its claim on the name is recorded.
|
|
300
|
+
seen.set(displayName, registered);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
this.registerVisualSession(displayName, "", snap.id, snap.isClaude);
|
|
304
|
+
seen.set(displayName, this.sessions.length - 1);
|
|
305
|
+
}
|
|
271
306
|
}
|
|
272
307
|
// registerVisualSession moves the selection to whatever it just added.
|
|
273
308
|
// Discovery is not a selection, so put it back where the user left it —
|
package/dist/core/hybrid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/core/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/core/hybrid.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,12 +25,46 @@ export declare function saveSessionRegistry(): void;
|
|
|
25
25
|
type SessionNamesStore = Record<string, string>;
|
|
26
26
|
/** Drop the cached name store (used when the app dir changes, and by tests). */
|
|
27
27
|
export declare function resetSessionNamesCache(): void;
|
|
28
|
+
/**
|
|
29
|
+
* What a claim on an already-held name found, so the caller can report it.
|
|
30
|
+
*
|
|
31
|
+
* `heldBy` is the live session id that owns the name — reported, not repaired
|
|
32
|
+
* here: only the caller knows whether its failure is worth a toast, an IPC
|
|
33
|
+
* error, or just a log line.
|
|
34
|
+
*/
|
|
35
|
+
export interface NameClaimResult {
|
|
36
|
+
ok: boolean;
|
|
37
|
+
heldBy?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Is a store key a live session right now? Wired by the daemon at startup;
|
|
41
|
+
* "unknown" when unwired (CLI, tests) or when the enumeration has nothing to
|
|
42
|
+
* say — an empty or failed enumeration must not read as "every holder is gone".
|
|
43
|
+
*
|
|
44
|
+
* "live" — the id (or its aibrokerId) is in the current snapshot
|
|
45
|
+
* "gone" — the snapshot answered and does not contain it
|
|
46
|
+
* "unknown" — no probe, or the enumeration came back empty/failed
|
|
47
|
+
*/
|
|
48
|
+
export type HolderLiveness = (key: string) => "live" | "gone" | "unknown";
|
|
49
|
+
/** Wire/unwire the liveness oracle the theft guard asks. Tests use this too. */
|
|
50
|
+
export declare function setHolderLivenessProbe(fn: HolderLiveness | null): void;
|
|
28
51
|
/**
|
|
29
52
|
* Persist a user-chosen name for an iTerm2 session.
|
|
30
53
|
* @param itermSessionId - the raw iTerm2 session UUID (e.g. "942A4044-...")
|
|
31
54
|
* @param name - the user-set name
|
|
55
|
+
*
|
|
56
|
+
* ONE NAME, ONE LIVE HOLDER. On 2026-09-26 21:07 a second iTerm tab registered
|
|
57
|
+
* over MCP under a name a live session had held since 2026-09-24; the store
|
|
58
|
+
* then mapped the name to both ids, a daemon restart bound it to the newcomer,
|
|
59
|
+
* and when that tab dropped to a shell the dispatcher probed the corpse,
|
|
60
|
+
* declared the name unreachable, and parked both daily sweeps — the real
|
|
61
|
+
* session was never tried. So a claim is refused while another LIVE session
|
|
62
|
+
* holds the name; succession requires the old holder to be verifiably gone,
|
|
63
|
+
* and a gone holder's binding is dropped rather than left to shadow the name.
|
|
64
|
+
* Unknown liveness keeps the old binding (it may still be live) and allows the
|
|
65
|
+
* write — resolution prefers the live holder either way.
|
|
32
66
|
*/
|
|
33
|
-
export declare function setPersistentSessionName(itermSessionId: string, name: string):
|
|
67
|
+
export declare function setPersistentSessionName(itermSessionId: string, name: string): NameClaimResult;
|
|
34
68
|
/**
|
|
35
69
|
* Drop names whose session no longer exists.
|
|
36
70
|
*
|
|
@@ -48,9 +82,24 @@ export declare function setPersistentSessionName(itermSessionId: string, name: s
|
|
|
48
82
|
* reads identically to "every session ended", and pruning would erase every
|
|
49
83
|
* name the user has ever assigned. So an empty set prunes nothing.
|
|
50
84
|
*
|
|
85
|
+
* `opts.prunable` scopes WHICH keys may ever be dropped. The daemon's
|
|
86
|
+
* enumeration tick passes an iTerm-UUID test: durable-id keys (tmux
|
|
87
|
+
* @aibroker_id) survive a tmux server being down, so absence from one
|
|
88
|
+
* enumeration is not evidence about them. Keys the filter rejects are skipped
|
|
89
|
+
* entirely — no miss recorded, nothing removed.
|
|
90
|
+
*
|
|
51
91
|
* Returns the number of entries removed, for the caller to log.
|
|
52
92
|
*/
|
|
53
|
-
export declare function pruneSessionNames(liveIds: Iterable<string
|
|
93
|
+
export declare function pruneSessionNames(liveIds: Iterable<string>, opts?: {
|
|
94
|
+
prunable?: (key: string) => boolean;
|
|
95
|
+
}): number;
|
|
96
|
+
/**
|
|
97
|
+
* A store key in iTerm's session-UUID shape. The daemon's enumeration tick
|
|
98
|
+
* prunes only keys that pass this: a tmux durable id (@aibroker_id) keys a
|
|
99
|
+
* name that is MEANT to outlive pane churn and server restarts, so absence
|
|
100
|
+
* from one enumeration says nothing about it.
|
|
101
|
+
*/
|
|
102
|
+
export declare const ITERM_UUID_KEY: RegExp;
|
|
54
103
|
/**
|
|
55
104
|
* Get the user-chosen persistent name for an iTerm2 session, or undefined.
|
|
56
105
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/core/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AAM1E;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ3C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AA4CD,eAAO,MAAM,oBAAoB,EAAE,WAUlC,CAAC;AAEF,wBAAgB,eAAe,IAAI,WAAW,CAS7C;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAE1D;AAID,wBAAgB,mBAAmB,IAAI,IAAI,CAgC1C;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AASD,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAkChD,gFAAgF;AAChF,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/core/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AAM1E;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ3C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AA4CD,eAAO,MAAM,oBAAoB,EAAE,WAUlC,CAAC;AAEF,wBAAgB,eAAe,IAAI,WAAW,CAS7C;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAE1D;AAID,wBAAgB,mBAAmB,IAAI,IAAI,CAgC1C;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AASD,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAkChD,gFAAgF;AAChF,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAG1E,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAEtE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAgB9F;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GACjD,MAAM,CAwCR;AAYD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAkF,CAAC;AA0B9G;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,iBAAiB,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,EAAE,EAAE,MAAM,EACV,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,GAAG,IAAI,CAGf;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAIxE"}
|
package/dist/core/persistence.js
CHANGED
|
@@ -169,15 +169,44 @@ function saveSessionNames() {
|
|
|
169
169
|
export function resetSessionNamesCache() {
|
|
170
170
|
_sessionNames = null;
|
|
171
171
|
}
|
|
172
|
+
let _holderLiveness = null;
|
|
173
|
+
/** Wire/unwire the liveness oracle the theft guard asks. Tests use this too. */
|
|
174
|
+
export function setHolderLivenessProbe(fn) {
|
|
175
|
+
_holderLiveness = fn;
|
|
176
|
+
}
|
|
172
177
|
/**
|
|
173
178
|
* Persist a user-chosen name for an iTerm2 session.
|
|
174
179
|
* @param itermSessionId - the raw iTerm2 session UUID (e.g. "942A4044-...")
|
|
175
180
|
* @param name - the user-set name
|
|
181
|
+
*
|
|
182
|
+
* ONE NAME, ONE LIVE HOLDER. On 2026-09-26 21:07 a second iTerm tab registered
|
|
183
|
+
* over MCP under a name a live session had held since 2026-09-24; the store
|
|
184
|
+
* then mapped the name to both ids, a daemon restart bound it to the newcomer,
|
|
185
|
+
* and when that tab dropped to a shell the dispatcher probed the corpse,
|
|
186
|
+
* declared the name unreachable, and parked both daily sweeps — the real
|
|
187
|
+
* session was never tried. So a claim is refused while another LIVE session
|
|
188
|
+
* holds the name; succession requires the old holder to be verifiably gone,
|
|
189
|
+
* and a gone holder's binding is dropped rather than left to shadow the name.
|
|
190
|
+
* Unknown liveness keeps the old binding (it may still be live) and allows the
|
|
191
|
+
* write — resolution prefers the live holder either way.
|
|
176
192
|
*/
|
|
177
193
|
export function setPersistentSessionName(itermSessionId, name) {
|
|
178
194
|
const store = loadSessionNames();
|
|
195
|
+
const others = Object.entries(store).filter(([id, n]) => n === name && id !== itermSessionId);
|
|
196
|
+
if (_holderLiveness && others.length > 0) {
|
|
197
|
+
const liveHolder = others.find(([id]) => _holderLiveness(id) === "live");
|
|
198
|
+
if (liveHolder) {
|
|
199
|
+
log(`Persisted names: refused to give "${name}" to ${itermSessionId.slice(0, 8)} — held by live session ${liveHolder[0].slice(0, 8)}`);
|
|
200
|
+
return { ok: false, heldBy: liveHolder[0] };
|
|
201
|
+
}
|
|
202
|
+
for (const [id] of others) {
|
|
203
|
+
if (_holderLiveness(id) === "gone")
|
|
204
|
+
delete store[id];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
179
207
|
store[itermSessionId] = name;
|
|
180
208
|
saveSessionNames();
|
|
209
|
+
return { ok: true };
|
|
181
210
|
}
|
|
182
211
|
/**
|
|
183
212
|
* Drop names whose session no longer exists.
|
|
@@ -196,9 +225,15 @@ export function setPersistentSessionName(itermSessionId, name) {
|
|
|
196
225
|
* reads identically to "every session ended", and pruning would erase every
|
|
197
226
|
* name the user has ever assigned. So an empty set prunes nothing.
|
|
198
227
|
*
|
|
228
|
+
* `opts.prunable` scopes WHICH keys may ever be dropped. The daemon's
|
|
229
|
+
* enumeration tick passes an iTerm-UUID test: durable-id keys (tmux
|
|
230
|
+
* @aibroker_id) survive a tmux server being down, so absence from one
|
|
231
|
+
* enumeration is not evidence about them. Keys the filter rejects are skipped
|
|
232
|
+
* entirely — no miss recorded, nothing removed.
|
|
233
|
+
*
|
|
199
234
|
* Returns the number of entries removed, for the caller to log.
|
|
200
235
|
*/
|
|
201
|
-
export function pruneSessionNames(liveIds) {
|
|
236
|
+
export function pruneSessionNames(liveIds, opts = {}) {
|
|
202
237
|
const live = new Set(liveIds);
|
|
203
238
|
if (live.size === 0)
|
|
204
239
|
return 0;
|
|
@@ -221,6 +256,8 @@ export function pruneSessionNames(liveIds) {
|
|
|
221
256
|
const misses = loadPruneMisses();
|
|
222
257
|
let removed = 0;
|
|
223
258
|
for (const id of Object.keys(store)) {
|
|
259
|
+
if (opts.prunable && !opts.prunable(id))
|
|
260
|
+
continue;
|
|
224
261
|
if (live.has(id)) {
|
|
225
262
|
delete misses[id];
|
|
226
263
|
continue;
|
|
@@ -246,6 +283,13 @@ export function pruneSessionNames(liveIds) {
|
|
|
246
283
|
* is what happened.
|
|
247
284
|
*/
|
|
248
285
|
const PRUNE_AFTER_CONSECUTIVE_MISSES = 3;
|
|
286
|
+
/**
|
|
287
|
+
* A store key in iTerm's session-UUID shape. The daemon's enumeration tick
|
|
288
|
+
* prunes only keys that pass this: a tmux durable id (@aibroker_id) keys a
|
|
289
|
+
* name that is MEANT to outlive pane churn and server restarts, so absence
|
|
290
|
+
* from one enumeration says nothing about it.
|
|
291
|
+
*/
|
|
292
|
+
export const ITERM_UUID_KEY = /^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/;
|
|
249
293
|
/**
|
|
250
294
|
* Consecutive-miss counters, beside the store rather than inside it.
|
|
251
295
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/core/persistence.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/core/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,10 @@
|
|
|
19
19
|
* "did not look" unless the code refuses to say "none" without looking.
|
|
20
20
|
*
|
|
21
21
|
* So discovery lives here, both readers call it, and nobody has to remember to
|
|
22
|
-
* populate anything first.
|
|
22
|
+
* populate anything first. HybridManager grew its own "keep the known list on
|
|
23
|
+
* a bad enumeration" guard directly; every OTHER caller of this function was
|
|
24
|
+
* still getting the raw `[]` an unreadable iTerm produces. The guard belongs
|
|
25
|
+
* here instead, once, so every reader inherits it.
|
|
23
26
|
*/
|
|
24
27
|
import { snapshotAllSessions } from "../adapters/iterm/core.js";
|
|
25
28
|
export type LiveSession = ReturnType<typeof snapshotAllSessions>[0];
|
|
@@ -29,6 +32,10 @@ export type LiveSession = ReturnType<typeof snapshotAllSessions>[0];
|
|
|
29
32
|
* `snapshotAllSessions()` has returned `paiName: null` since 0.7.10 — the
|
|
30
33
|
* authoritative source is the persistent store — so a caller that skips this
|
|
31
34
|
* step gets tab titles where it expects names.
|
|
35
|
+
*
|
|
36
|
+
* A failed enumeration (`wasLastSnapshotReliable()` false) replays the last
|
|
37
|
+
* good list instead of the `[]` iTerm hands back on an osascript fault — an
|
|
38
|
+
* unreadable machine must not read as an empty one (see file header).
|
|
32
39
|
*/
|
|
33
40
|
export declare function discoverLiveSessions(opts?: {
|
|
34
41
|
fresh?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-discovery.d.ts","sourceRoot":"","sources":["../../src/core/session-discovery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-discovery.d.ts","sourceRoot":"","sources":["../../src/core/session-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,mBAAmB,EAA2B,MAAM,2BAA2B,CAAC;AAGzF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;AAIpE;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,WAAW,EAAE,CAgBlF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAM1D"}
|
|
@@ -19,24 +19,39 @@
|
|
|
19
19
|
* "did not look" unless the code refuses to say "none" without looking.
|
|
20
20
|
*
|
|
21
21
|
* So discovery lives here, both readers call it, and nobody has to remember to
|
|
22
|
-
* populate anything first.
|
|
22
|
+
* populate anything first. HybridManager grew its own "keep the known list on
|
|
23
|
+
* a bad enumeration" guard directly; every OTHER caller of this function was
|
|
24
|
+
* still getting the raw `[]` an unreadable iTerm produces. The guard belongs
|
|
25
|
+
* here instead, once, so every reader inherits it.
|
|
23
26
|
*/
|
|
24
|
-
import { snapshotAllSessions } from "../adapters/iterm/core.js";
|
|
27
|
+
import { snapshotAllSessions, wasLastSnapshotReliable } from "../adapters/iterm/core.js";
|
|
25
28
|
import { getAllPersistentSessionNames, lookupPersistentName } from "./persistence.js";
|
|
29
|
+
let lastGoodSnapshots = [];
|
|
26
30
|
/**
|
|
27
31
|
* Live sessions, with their PAI names filled in.
|
|
28
32
|
*
|
|
29
33
|
* `snapshotAllSessions()` has returned `paiName: null` since 0.7.10 — the
|
|
30
34
|
* authoritative source is the persistent store — so a caller that skips this
|
|
31
35
|
* step gets tab titles where it expects names.
|
|
36
|
+
*
|
|
37
|
+
* A failed enumeration (`wasLastSnapshotReliable()` false) replays the last
|
|
38
|
+
* good list instead of the `[]` iTerm hands back on an osascript fault — an
|
|
39
|
+
* unreadable machine must not read as an empty one (see file header).
|
|
32
40
|
*/
|
|
33
41
|
export function discoverLiveSessions(opts = {}) {
|
|
34
42
|
const snaps = snapshotAllSessions(opts);
|
|
35
43
|
const persistentNames = getAllPersistentSessionNames();
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
if (wasLastSnapshotReliable()) {
|
|
45
|
+
for (const snap of snaps) {
|
|
46
|
+
snap.paiName = lookupPersistentName(persistentNames, snap.id, snap.aibrokerId);
|
|
47
|
+
}
|
|
48
|
+
lastGoodSnapshots = snaps;
|
|
49
|
+
return snaps;
|
|
38
50
|
}
|
|
39
|
-
return
|
|
51
|
+
return lastGoodSnapshots.map((snap) => ({
|
|
52
|
+
...snap,
|
|
53
|
+
paiName: lookupPersistentName(persistentNames, snap.id, snap.aibrokerId),
|
|
54
|
+
}));
|
|
40
55
|
}
|
|
41
56
|
/**
|
|
42
57
|
* Is this tab something a person would call a session?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-discovery.js","sourceRoot":"","sources":["../../src/core/session-discovery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-discovery.js","sourceRoot":"","sources":["../../src/core/session-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAItF,IAAI,iBAAiB,GAAkB,EAAE,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA4B,EAAE;IACjE,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;IAEvD,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjF,CAAC;QACD,iBAAiB,GAAG,KAAK,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,IAAI;QACP,OAAO,EAAE,oBAAoB,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC;KACzE,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiB;IAC/C,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -25,6 +25,12 @@ export interface SessionCandidate {
|
|
|
25
25
|
id: string;
|
|
26
26
|
name: string;
|
|
27
27
|
paiName?: string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Measured "a Claude process owns this tty" (ps scan), undefined when the
|
|
30
|
+
* measurement could not be made. `prefer` rankings use it to keep a live
|
|
31
|
+
* holder of a name ahead of a same-name shell tab.
|
|
32
|
+
*/
|
|
33
|
+
isClaude?: boolean;
|
|
28
34
|
}
|
|
29
35
|
/** How a name was matched, weakest last. Reported so a fuzzy hit is visible. */
|
|
30
36
|
export type MatchKind = "exact" | "normalised" | "substring";
|
|
@@ -77,6 +83,23 @@ export interface MatchOptions {
|
|
|
77
83
|
*/
|
|
78
84
|
prefer?: (s: SessionCandidate) => number;
|
|
79
85
|
}
|
|
86
|
+
export interface MatchHit {
|
|
87
|
+
session: SessionCandidate;
|
|
88
|
+
label: string;
|
|
89
|
+
kind: MatchKind;
|
|
90
|
+
score: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* EVERY session the references resolve to, best first.
|
|
94
|
+
*
|
|
95
|
+
* A name is not a promise only one tab ever carries it. On 2026-09-26 a second
|
|
96
|
+
* tab registered a name a live session already held, and the single-hit
|
|
97
|
+
* resolver handed back the newcomer — which later sat at a shell while the real
|
|
98
|
+
* session was never asked. Callers that are about to deliver probe the whole
|
|
99
|
+
* list and take the first one that answers; matchSession() below remains the
|
|
100
|
+
* "just give me one" read.
|
|
101
|
+
*/
|
|
102
|
+
export declare function matchAllSessions(references: string[], sessions: SessionCandidate[], opts?: MatchOptions): MatchHit[];
|
|
80
103
|
/**
|
|
81
104
|
* Resolve any of `references` to a session.
|
|
82
105
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-match.d.ts","sourceRoot":"","sources":["../../src/core/session-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session-match.d.ts","sourceRoot":"","sources":["../../src/core/session-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,CAAC;AAI7D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,GAC1C,MAAM,GAAG,SAAS,CAIpB;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,IAAI,GAAE,YAAiB,GACtB,QAAQ,EAAE,CAgCZ;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,IAAI,GAAE,YAAiB,GACtB;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAGtE"}
|
|
@@ -64,25 +64,28 @@ export function labelOf(s) {
|
|
|
64
64
|
export function normaliseLabel(s) {
|
|
65
65
|
return s
|
|
66
66
|
.toLowerCase()
|
|
67
|
-
.replace(/\s*\((?:node|-?[a-z]*sh|python\d*|bash)\)\s*$/i, "")
|
|
67
|
+
.replace(/\s*\((?:node|claude|-?[a-z]*sh|python\d*|bash)\)\s*$/i, "")
|
|
68
68
|
.replace(/^[^\p{L}\p{N}]+/u, "")
|
|
69
69
|
.replace(/[\s_-]+/g, " ")
|
|
70
70
|
.trim();
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
*
|
|
73
|
+
* EVERY session the references resolve to, best first.
|
|
74
74
|
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
75
|
+
* A name is not a promise only one tab ever carries it. On 2026-09-26 a second
|
|
76
|
+
* tab registered a name a live session already held, and the single-hit
|
|
77
|
+
* resolver handed back the newcomer — which later sat at a shell while the real
|
|
78
|
+
* session was never asked. Callers that are about to deliver probe the whole
|
|
79
|
+
* list and take the first one that answers; matchSession() below remains the
|
|
80
|
+
* "just give me one" read.
|
|
78
81
|
*/
|
|
79
|
-
export function
|
|
82
|
+
export function matchAllSessions(references, sessions, opts = {}) {
|
|
80
83
|
const kinds = opts.kinds ?? ["exact", "normalised"];
|
|
81
84
|
const prefer = opts.prefer ?? (() => 0);
|
|
82
85
|
const refs = references.filter(Boolean).map((r) => ({ raw: r.toLowerCase(), norm: normaliseLabel(r) }));
|
|
83
86
|
if (refs.length === 0)
|
|
84
|
-
return
|
|
85
|
-
|
|
87
|
+
return [];
|
|
88
|
+
const hits = [];
|
|
86
89
|
for (const s of sessions) {
|
|
87
90
|
const label = labelOf(s);
|
|
88
91
|
if (!label)
|
|
@@ -106,10 +109,21 @@ export function matchSession(references, sessions, opts = {}) {
|
|
|
106
109
|
if (!kind)
|
|
107
110
|
continue;
|
|
108
111
|
// Preference dominates: 100 leaves room for every match kind beneath it.
|
|
109
|
-
|
|
110
|
-
if (!best || score > best.score)
|
|
111
|
-
best = { session: s, label, kind, score };
|
|
112
|
+
hits.push({ session: s, label, kind, score: prefer(s) * 100 + KIND_RANK[kind] });
|
|
112
113
|
}
|
|
114
|
+
// Stable descending: equal scores keep enumeration order, which is what the
|
|
115
|
+
// single-hit resolver did before this existed.
|
|
116
|
+
return hits.sort((a, b) => b.score - a.score);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolve any of `references` to a session.
|
|
120
|
+
*
|
|
121
|
+
* Substring is opt-in for a reason: a project called `sl` would otherwise match
|
|
122
|
+
* every session whose title happens to contain those letters, and for dispatch
|
|
123
|
+
* a wrong match spawns nothing and delivers to the wrong place instead.
|
|
124
|
+
*/
|
|
125
|
+
export function matchSession(references, sessions, opts = {}) {
|
|
126
|
+
const best = matchAllSessions(references, sessions, opts)[0];
|
|
113
127
|
return best ? { session: best.session, label: best.label, kind: best.kind } : null;
|
|
114
128
|
}
|
|
115
129
|
//# sourceMappingURL=session-match.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-match.js","sourceRoot":"","sources":["../../src/core/session-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"session-match.js","sourceRoot":"","sources":["../../src/core/session-match.ts"],"names":[],"mappings":"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"}
|