aibroker 0.7.10 → 0.7.12
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/core.d.ts +18 -7
- package/dist/adapters/iterm/core.d.ts.map +1 -1
- package/dist/adapters/iterm/core.js +24 -13
- package/dist/adapters/iterm/core.js.map +1 -1
- package/dist/adapters/iterm/sessions.js +4 -4
- 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 +96 -27
- package/dist/adapters/pailot/gateway.js.map +1 -1
- package/dist/adapters/pailot/mqtt-broker.d.ts +5 -0
- package/dist/adapters/pailot/mqtt-broker.d.ts.map +1 -1
- package/dist/adapters/pailot/mqtt-broker.js +60 -6
- package/dist/adapters/pailot/mqtt-broker.js.map +1 -1
- package/dist/adapters/session/backend.js +1 -1
- package/dist/adapters/session/backend.js.map +1 -1
- package/dist/apns/client.d.ts +9 -0
- package/dist/apns/client.d.ts.map +1 -1
- package/dist/apns/client.js +25 -0
- package/dist/apns/client.js.map +1 -1
- package/dist/core/persistence.d.ts +7 -0
- package/dist/core/persistence.d.ts.map +1 -1
- package/dist/core/persistence.js +11 -0
- package/dist/core/persistence.js.map +1 -1
- package/dist/daemon/cli.d.ts +6 -0
- package/dist/daemon/cli.d.ts.map +1 -1
- package/dist/daemon/cli.js +13 -1
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/commands.d.ts.map +1 -1
- package/dist/daemon/commands.js +2 -1
- package/dist/daemon/commands.js.map +1 -1
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +79 -8
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +16 -2
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/ota.d.ts +8 -0
- package/dist/daemon/ota.d.ts.map +1 -0
- package/dist/daemon/ota.js +90 -0
- package/dist/daemon/ota.js.map +1 -0
- package/dist/daemon/session-content.d.ts.map +1 -1
- package/dist/daemon/session-content.js +2 -1
- package/dist/daemon/session-content.js.map +1 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +4 -0
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/server.d.ts.map +1 -1
- package/dist/ipc/server.js +9 -0
- package/dist/ipc/server.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +62 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/transport/index.d.ts +18 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +51 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/iterm.d.ts +21 -0
- package/dist/transport/iterm.d.ts.map +1 -0
- package/dist/transport/iterm.js +55 -0
- package/dist/transport/iterm.js.map +1 -0
- package/dist/transport/session-transport.d.ts +64 -0
- package/dist/transport/session-transport.d.ts.map +1 -0
- package/dist/transport/session-transport.js +17 -0
- package/dist/transport/session-transport.js.map +1 -0
- package/dist/transport/sync-facade.d.ts +52 -0
- package/dist/transport/sync-facade.d.ts.map +1 -0
- package/dist/transport/sync-facade.js +135 -0
- package/dist/transport/sync-facade.js.map +1 -0
- package/dist/transport/tmux.d.ts +53 -0
- package/dist/transport/tmux.d.ts.map +1 -0
- package/dist/transport/tmux.js +254 -0
- package/dist/transport/tmux.js.map +1 -0
- package/dist/types/ipc.d.ts +8 -0
- package/dist/types/ipc.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -25,19 +25,30 @@ export interface SessionSnapshot {
|
|
|
25
25
|
tty: string;
|
|
26
26
|
atPrompt: boolean;
|
|
27
27
|
paiName: string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Durable, transport-stable id. For tmux this is the pane's @aibroker_id
|
|
30
|
+
* (survives server restarts, unlike the volatile %N pane id). For iTerm it is
|
|
31
|
+
* undefined — the GUID in `id` is already stable. Persistent-name lookups key
|
|
32
|
+
* on this when present so a tmux session keeps its name across %N churn.
|
|
33
|
+
*/
|
|
34
|
+
aibrokerId?: string | null;
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
30
37
|
* snapshotAllSessions — Fast enumeration of all iTerm2 sessions.
|
|
31
38
|
*
|
|
32
|
-
* Single AppleScript pass: id, name,
|
|
33
|
-
* ~1.5s for
|
|
39
|
+
* Single AppleScript pass: id, name, tty, tab.title per session.
|
|
40
|
+
* ~1.5s for 16 sessions (vs >30s timeout with the old combined script).
|
|
34
41
|
*
|
|
35
|
-
* What
|
|
42
|
+
* What is still dropped vs the original (kept out for speed):
|
|
36
43
|
* - `is at shell prompt`: adds ~180ms/session (3.3s for 18). Derived from name instead.
|
|
37
|
-
* - `
|
|
38
|
-
*
|
|
39
|
-
* getAllPersistentSessionNames()
|
|
40
|
-
*
|
|
44
|
+
* - `profile name`: ~0.6s overhead, always "Default" in practice.
|
|
45
|
+
* - `variable named "user.paiName"`: paiName is read from ~/.aibroker/session-names.json
|
|
46
|
+
* by the caller via getAllPersistentSessionNames() — authoritative, no iTerm corruption.
|
|
47
|
+
*
|
|
48
|
+
* `tab.title` IS fetched (one variable read, measured ~1.5s total for 16 sessions). It was
|
|
49
|
+
* wrongly dropped in v0.7.10, which collapsed the display precedence `paiName ?? tabTitle ?? name`
|
|
50
|
+
* down to `paiName ?? name` — so any session without a persistent paiName rendered the raw
|
|
51
|
+
* iTerm process string ("claude (node)") instead of its tab title. Restoring it fixes that.
|
|
41
52
|
*
|
|
42
53
|
* atPrompt heuristic: iTerm2's title reporter encodes the foreground process in the
|
|
43
54
|
* tab name — "(node)" = Claude Code running (not at prompt). "(-zsh)", "(-bash)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/adapters/iterm/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,MAAM,GAAG,IAAI,CAQ/E;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI3E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,MAAM,CActG;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQpF;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQvF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAe7E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CA+BjD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAcnE;AAED,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAWxC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA8BjE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/adapters/iterm/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,MAAM,GAAG,IAAI,CAQ/E;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI3E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,MAAM,CActG;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQpF;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQvF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAe7E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CA+BjD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAcnE;AAED,wBAAgB,cAAc,IAAI,OAAO,CAMxC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAWxC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA8BjE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAkDvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqBzC"}
|
|
@@ -160,23 +160,27 @@ export function writeToTty(ttyPath, text) {
|
|
|
160
160
|
/**
|
|
161
161
|
* snapshotAllSessions — Fast enumeration of all iTerm2 sessions.
|
|
162
162
|
*
|
|
163
|
-
* Single AppleScript pass: id, name,
|
|
164
|
-
* ~1.5s for
|
|
163
|
+
* Single AppleScript pass: id, name, tty, tab.title per session.
|
|
164
|
+
* ~1.5s for 16 sessions (vs >30s timeout with the old combined script).
|
|
165
165
|
*
|
|
166
|
-
* What
|
|
166
|
+
* What is still dropped vs the original (kept out for speed):
|
|
167
167
|
* - `is at shell prompt`: adds ~180ms/session (3.3s for 18). Derived from name instead.
|
|
168
|
-
* - `
|
|
169
|
-
*
|
|
170
|
-
* getAllPersistentSessionNames()
|
|
171
|
-
*
|
|
168
|
+
* - `profile name`: ~0.6s overhead, always "Default" in practice.
|
|
169
|
+
* - `variable named "user.paiName"`: paiName is read from ~/.aibroker/session-names.json
|
|
170
|
+
* by the caller via getAllPersistentSessionNames() — authoritative, no iTerm corruption.
|
|
171
|
+
*
|
|
172
|
+
* `tab.title` IS fetched (one variable read, measured ~1.5s total for 16 sessions). It was
|
|
173
|
+
* wrongly dropped in v0.7.10, which collapsed the display precedence `paiName ?? tabTitle ?? name`
|
|
174
|
+
* down to `paiName ?? name` — so any session without a persistent paiName rendered the raw
|
|
175
|
+
* iTerm process string ("claude (node)") instead of its tab title. Restoring it fixes that.
|
|
172
176
|
*
|
|
173
177
|
* atPrompt heuristic: iTerm2's title reporter encodes the foreground process in the
|
|
174
178
|
* tab name — "(node)" = Claude Code running (not at prompt). "(-zsh)", "(-bash)",
|
|
175
179
|
* "(ssh)", bare path names = shell at prompt. Accurate for sessions display.
|
|
176
180
|
*/
|
|
177
181
|
export function snapshotAllSessions() {
|
|
178
|
-
// Fetch id, name, tty. Skip `profile name` (~0.6s
|
|
179
|
-
// `is at shell prompt` (~3.3s
|
|
182
|
+
// Fetch id, name, tty, tab.title. Skip `profile name` (~0.6s) and
|
|
183
|
+
// `is at shell prompt` (~3.3s) — both derived or irrelevant.
|
|
180
184
|
const script = `
|
|
181
185
|
tell application "iTerm2"
|
|
182
186
|
set output to ""
|
|
@@ -186,20 +190,27 @@ tell application "iTerm2"
|
|
|
186
190
|
set sessionId to id of aSession
|
|
187
191
|
set sessionName to name of aSession
|
|
188
192
|
set sessionTty to tty of aSession
|
|
189
|
-
|
|
193
|
+
tell aSession
|
|
194
|
+
try
|
|
195
|
+
set tabTitle to (variable named "tab.title")
|
|
196
|
+
on error
|
|
197
|
+
set tabTitle to ""
|
|
198
|
+
end try
|
|
199
|
+
end tell
|
|
200
|
+
set output to output & sessionId & (ASCII character 9) & sessionName & (ASCII character 9) & sessionTty & (ASCII character 9) & tabTitle & linefeed
|
|
190
201
|
end repeat
|
|
191
202
|
end repeat
|
|
192
203
|
end repeat
|
|
193
204
|
return output
|
|
194
205
|
end tell`;
|
|
195
|
-
// 4s timeout. id+name+tty = ~
|
|
206
|
+
// 4s timeout. id+name+tty+tab.title = ~1.5s for 16 sessions. 4s gives safe headroom.
|
|
196
207
|
const result = runAppleScript(script, 4_000);
|
|
197
208
|
if (!result)
|
|
198
209
|
return [];
|
|
199
210
|
const sessions = [];
|
|
200
211
|
for (const line of result.split("\n").filter(Boolean)) {
|
|
201
212
|
const parts = line.split("\t");
|
|
202
|
-
if (parts.length <
|
|
213
|
+
if (parts.length < 4)
|
|
203
214
|
continue;
|
|
204
215
|
const name = parts[1];
|
|
205
216
|
// Derive atPrompt from name heuristic: "(node)" = Claude Code running (not at prompt).
|
|
@@ -211,7 +222,7 @@ end tell`;
|
|
|
211
222
|
profileName: "Default", // profile name skipped for speed; always "Default" in practice
|
|
212
223
|
tty: parts[2],
|
|
213
224
|
atPrompt,
|
|
214
|
-
tabTitle: null,
|
|
225
|
+
tabTitle: (parts[3] && parts[3] !== "missing value" && parts[3] !== "") ? parts[3] : null,
|
|
215
226
|
// paiName is null here — callers merge from getAllPersistentSessionNames()
|
|
216
227
|
paiName: null,
|
|
217
228
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/adapters/iterm/core.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/adapters/iterm/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { execSync } from "node:child_process";
|
|
|
8
8
|
import { runAppleScript, typeIntoSession, sendKeystrokeToSession, stripItermPrefix, withSessionAppleScript, snapshotAllSessions, } from "./core.js";
|
|
9
9
|
import { log } from "../../core/log.js";
|
|
10
10
|
import { managedSessions, updateSessionTtyCache, } from "../../core/state.js";
|
|
11
|
-
import { getAllPersistentSessionNames } from "../../core/persistence.js";
|
|
11
|
+
import { getAllPersistentSessionNames, lookupPersistentName } from "../../core/persistence.js";
|
|
12
12
|
// ── Session Variable Helpers ──
|
|
13
13
|
function setItermSessionProperty(itermSessionId, body) {
|
|
14
14
|
try {
|
|
@@ -99,8 +99,8 @@ export function listClaudeSessions() {
|
|
|
99
99
|
const sessions = snapshotAllSessions();
|
|
100
100
|
const persistentNames = getAllPersistentSessionNames();
|
|
101
101
|
return sessions
|
|
102
|
-
.filter((s) => s.name.toLowerCase().includes("claude") || persistentNames
|
|
103
|
-
.map((s) => ({ id: s.id, name: persistentNames
|
|
102
|
+
.filter((s) => s.name.toLowerCase().includes("claude") || lookupPersistentName(persistentNames, s.id, s.aibrokerId))
|
|
103
|
+
.map((s) => ({ id: s.id, name: lookupPersistentName(persistentNames, s.id, s.aibrokerId) ?? s.name }));
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
106
|
* Build a full session list with type classification and PAI name resolution.
|
|
@@ -118,7 +118,7 @@ export function getSessionList() {
|
|
|
118
118
|
managedSessions.delete(id);
|
|
119
119
|
}
|
|
120
120
|
return snapshots.map((s) => {
|
|
121
|
-
const paiName = persistentNames
|
|
121
|
+
const paiName = lookupPersistentName(persistentNames, s.id, s.aibrokerId);
|
|
122
122
|
return {
|
|
123
123
|
id: s.id,
|
|
124
124
|
name: paiName ?? s.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/adapters/iterm/sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EACL,cAAc,EAId,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAEL,eAAe,EAIf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAuB,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/adapters/iterm/sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EACL,cAAc,EAId,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAEL,eAAe,EAIf,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAuB,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEpH,iCAAiC;AAEjC,SAAS,uBAAuB,CAAC,cAAsB,EAAE,IAAY;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,sBAAsB,CACnC,cAAc,EACd,wCAAwC,IAAI,wCAAwC,EACpF,EAAE,CACH,CAAC;QACF,QAAQ,CAAC,8BAA8B,MAAM,eAAe,EAAE;YAC5D,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,cAAsB,EAAE,IAAY;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACzF,uBAAuB,CAAC,cAAc,EAAE,yCAAyC,OAAO,GAAG,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,cAAsB,EAAE,IAAY;IAClE,qEAAqE;IACrE,yEAAyE;IACzE,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CACvD,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACpD,GAAG,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC9E,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,cAAsB,EAAE,IAAY;IAChE,2DAA2D;IAC3D,kEAAkE;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB;;;sCAGgC,cAAc;;;kBAGlC,EACZ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CACxD,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjD,QAAQ,CAAC,qCAAqC,GAAG,YAAY,GAAG,EAAE,EAAE;YAClE,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,cAAsB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,sBAAsB,CACnC,cAAc,EACd,wLAAwL,EACxL,WAAW,CACZ,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,8BAA8B,MAAM,eAAe,EAAE;YAC3E,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,2BAA2B;AAE3B,MAAM,UAAU,yBAAyB,CACvC,aAAqB,EACrB,kBAA2B;IAE3B,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG;;;;;;;;;;wBAUO,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;;;;SAOxE,CAAC;IAER,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,wBAAwB;AAExB,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;IACvD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;SACnH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAQ5B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;IAEvD,mBAAmB;IACnB,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1E,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,IAAI;YACvB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAiB,CAAC,CAAC,CAAC,UAAmB;YACxG,OAAO;YACP,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yBAAyB;AAEzB,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAG,QAAQ;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG;;;;;sBAKG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;;SAKzC,CAAC;QACN,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,MAAM,GAAG;;;;;UAKT,QAAQ;;;;;SAKT,CAAC;QACN,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,0BAA0B;AAE1B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,cAAsB,EAAE,OAAO,GAAG,QAAQ;IAC7E,sBAAsB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;IACpD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,eAAe,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,cAAsB;IAChD,MAAM,MAAM,GAAG,sBAAsB,CACnC,cAAc,EACd,iDAAiD,CAClD,CAAC;IACF,cAAc,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../src/adapters/pailot/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../src/adapters/pailot/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoMH;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEzH;AAolBD,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAiCD,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACpE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAkEf;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAiSzG;AAuBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAiDtF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CAwEf;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBnI;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAoM3F"}
|
|
@@ -29,14 +29,29 @@ import { execFile } from "node:child_process";
|
|
|
29
29
|
import { log } from "../../core/log.js";
|
|
30
30
|
import { WHISPER_BIN, WHISPER_MODEL } from "../kokoro/media.js";
|
|
31
31
|
import { setMessageSource, activeItermSessionId, setActiveItermSessionId, lastRoutedSessionId, setLastRoutedSessionId, getAibpBridge, } from "../../core/state.js";
|
|
32
|
-
import { setItermSessionVar, setItermTabName, setItermBadge,
|
|
32
|
+
import { setItermSessionVar, setItermTabName, setItermBadge, createClaudeSession } from "../iterm/sessions.js";
|
|
33
33
|
import { listPaiProjects, launchPaiProject } from "../../daemon/pai-projects.js";
|
|
34
|
-
import { runAppleScript, sendKeystrokeToSession, sendEscapeSequenceToSession
|
|
34
|
+
import { runAppleScript, sendKeystrokeToSession, sendEscapeSequenceToSession } from "../iterm/core.js";
|
|
35
|
+
import { pasteTextIntoSession, snapshotAllSessions, typeIntoSession } from "../../transport/sync-facade.js";
|
|
35
36
|
import { hybridManager } from "../../core/hybrid.js";
|
|
36
37
|
import { mqttPublishText, mqttPublishVoice, mqttPublishImage, mqttPublishTyping, mqttPublishScreenshot, mqttPublishSessions, mqttPublishTranscript, mqttPublishStatus as mqttPubStatus, mqttPublishControl, isMqttRunning, getMqttClientCount, } from "./mqtt-broker.js";
|
|
37
38
|
import { sendPush as apnsSendPush } from "../../apns/client.js";
|
|
38
39
|
import { getAfter as mqGetAfter, getLatestSeq as mqGetLatestSeq } from "./message-queue.js";
|
|
39
40
|
import { addTrace } from "../../daemon/trace-log.js";
|
|
41
|
+
import { getAllPersistentSessionNames, lookupPersistentName } from "../../core/persistence.js";
|
|
42
|
+
/**
|
|
43
|
+
* Enrich snapshots with paiName from the persistent JSON store.
|
|
44
|
+
* snapshotAllSessions() always returns paiName=null since v0.7.10;
|
|
45
|
+
* the authoritative source is ~/.aibroker/session-names.json.
|
|
46
|
+
*/
|
|
47
|
+
function enrichedSnapshots() {
|
|
48
|
+
const snaps = snapshotAllSessions();
|
|
49
|
+
const persistentNames = getAllPersistentSessionNames();
|
|
50
|
+
for (const snap of snaps) {
|
|
51
|
+
snap.paiName = lookupPersistentName(persistentNames, snap.id, snap.aibrokerId);
|
|
52
|
+
}
|
|
53
|
+
return snaps;
|
|
54
|
+
}
|
|
40
55
|
const WS_PORT = parseInt(process.env.PAILOT_PORT ?? "8765", 10);
|
|
41
56
|
// --- State ---
|
|
42
57
|
let wss = null;
|
|
@@ -180,7 +195,7 @@ function handleSyncCommand(ws, args) {
|
|
|
180
195
|
}
|
|
181
196
|
const clientActiveId = typeof args?.activeSessionId === "string" ? args.activeSessionId : undefined;
|
|
182
197
|
// Auto-discover Claude-related iTerm2 tabs so freshly-started daemons can match
|
|
183
|
-
const liveSnapshots =
|
|
198
|
+
const liveSnapshots = enrichedSnapshots();
|
|
184
199
|
const liveIds = new Set(liveSnapshots.map(s => s.id));
|
|
185
200
|
if (liveSnapshots.length > 0) {
|
|
186
201
|
hybridManager.pruneDeadVisualSessions(liveIds);
|
|
@@ -190,7 +205,7 @@ function handleSyncCommand(ws, args) {
|
|
|
190
205
|
for (const snap of liveSnapshots) {
|
|
191
206
|
if (!isClaudeRelated(snap))
|
|
192
207
|
continue;
|
|
193
|
-
const displayName = snap.
|
|
208
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
194
209
|
if (seenTabs.has(displayName))
|
|
195
210
|
continue;
|
|
196
211
|
seenTabs.add(displayName);
|
|
@@ -210,7 +225,7 @@ function handleSyncCommand(ws, args) {
|
|
|
210
225
|
if (idx < 0 && liveIds.has(clientActiveId)) {
|
|
211
226
|
const snap = liveSnapshots.find(s => s.id === clientActiveId);
|
|
212
227
|
if (snap) {
|
|
213
|
-
const displayName = snap.
|
|
228
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
214
229
|
hybridManager.registerVisualSession(displayName, "", clientActiveId);
|
|
215
230
|
sessions = hybridManager.listSessions();
|
|
216
231
|
idx = sessions.findIndex(s => s.backendSessionId === clientActiveId);
|
|
@@ -246,7 +261,7 @@ end tell`)?.trim() ?? "";
|
|
|
246
261
|
if (idx < 0 && liveIds.has(focusedId)) {
|
|
247
262
|
const snap = liveSnapshots.find(s => s.id === focusedId);
|
|
248
263
|
if (snap) {
|
|
249
|
-
const displayName = snap.
|
|
264
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
250
265
|
hybridManager.registerVisualSession(displayName, "", focusedId);
|
|
251
266
|
sessions = hybridManager.listSessions();
|
|
252
267
|
idx = sessions.findIndex(s => s.backendSessionId === focusedId);
|
|
@@ -285,7 +300,7 @@ function handleSessionsCommand(ws) {
|
|
|
285
300
|
// Prune visual sessions whose iTerm2 tabs have been closed.
|
|
286
301
|
// ONLY prune if snapshotAllSessions returns results — an empty result
|
|
287
302
|
// likely means AppleScript failed, not that all sessions are gone.
|
|
288
|
-
const liveSnapshots =
|
|
303
|
+
const liveSnapshots = enrichedSnapshots();
|
|
289
304
|
if (liveSnapshots.length > 0) {
|
|
290
305
|
const liveIds = new Set(liveSnapshots.map(s => s.id));
|
|
291
306
|
hybridManager.pruneDeadVisualSessions(liveIds);
|
|
@@ -298,7 +313,7 @@ function handleSessionsCommand(ws) {
|
|
|
298
313
|
for (const snap of liveSnapshots) {
|
|
299
314
|
if (!isClaudeRelated(snap))
|
|
300
315
|
continue;
|
|
301
|
-
const displayName = snap.
|
|
316
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
302
317
|
if (seenTabs.has(displayName))
|
|
303
318
|
continue; // skip split panes in same tab
|
|
304
319
|
seenTabs.add(displayName);
|
|
@@ -439,28 +454,54 @@ function handleRemoveCommand(ws, args) {
|
|
|
439
454
|
return;
|
|
440
455
|
}
|
|
441
456
|
const target = sessions[idx];
|
|
442
|
-
//
|
|
443
|
-
|
|
444
|
-
|
|
457
|
+
// Clean exit: send "/exit" to the Claude session so it terminates at the
|
|
458
|
+
// source (works for iTerm and tmux — typeIntoSession routes by id). Once CC
|
|
459
|
+
// exits, the tab/pane is back at a shell and enumeration no longer reports a
|
|
460
|
+
// Claude session, so it drops on its own — no record to "delete" and have
|
|
461
|
+
// rediscovered. If the tab was already closed this is a harmless no-op and the
|
|
462
|
+
// prune in handleSessionsCommand removes the ghost.
|
|
463
|
+
if (target.backendSessionId) {
|
|
464
|
+
typeIntoSession(target.backendSessionId, "/exit");
|
|
445
465
|
}
|
|
446
466
|
const removed = hybridManager.removeByIndex(idx + 1);
|
|
447
467
|
if (removed) {
|
|
448
|
-
log(`[PAILot]
|
|
468
|
+
log(`[PAILot] exited ${removed.kind} session "${removed.name}" (${removed.id}) via /exit`);
|
|
449
469
|
}
|
|
450
470
|
// Send updated session list
|
|
451
471
|
handleSessionsCommand(ws);
|
|
452
472
|
}
|
|
473
|
+
/**
|
|
474
|
+
* Guard against the "new" button spawning a burst of tabs. A retained/replayed
|
|
475
|
+
* MQTT command or an app retry can deliver several creates at once; ignore any
|
|
476
|
+
* create within 3s of the last so exactly one session is started.
|
|
477
|
+
*/
|
|
478
|
+
let lastCreateAt = 0;
|
|
479
|
+
function createThrottled() {
|
|
480
|
+
const now = Date.now();
|
|
481
|
+
if (now - lastCreateAt < 3000) {
|
|
482
|
+
log("[PAILot] create throttled — duplicate within 3s ignored");
|
|
483
|
+
return true;
|
|
484
|
+
}
|
|
485
|
+
lastCreateAt = now;
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
453
488
|
function handleCreateCommand(ws, args = {}) {
|
|
454
489
|
const projectName = args.project;
|
|
455
490
|
const path = args.path;
|
|
491
|
+
const requestedName = typeof args.name === "string" ? args.name.trim() : "";
|
|
456
492
|
// PAI project launch — async path
|
|
457
493
|
if (projectName) {
|
|
458
494
|
handleCreateFromProject(ws, projectName);
|
|
459
495
|
return;
|
|
460
496
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
497
|
+
if (createThrottled()) {
|
|
498
|
+
handleSessionsCommand(ws);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
// Launch via clc (the user's launcher: pins model + skip-perms so PAILot can
|
|
502
|
+
// drive the session without a permission prompt). cd into path first if given.
|
|
503
|
+
const command = path ? `cd ${path.replace(/"/g, '\\"')} && clc` : "clc";
|
|
504
|
+
const name = requestedName || (path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude");
|
|
464
505
|
const sessionId = createClaudeSession(command);
|
|
465
506
|
if (!sessionId) {
|
|
466
507
|
sendTo(ws, { type: "error", message: "Failed to create new session" });
|
|
@@ -800,13 +841,13 @@ export function startWsGateway(onMessage) {
|
|
|
800
841
|
// can be tagged with sessionId even before a PAILot client connects.
|
|
801
842
|
if (hybridManager) {
|
|
802
843
|
try {
|
|
803
|
-
const liveSnapshots =
|
|
844
|
+
const liveSnapshots = enrichedSnapshots();
|
|
804
845
|
const knownIds = new Set(hybridManager.listSessions().map(s => s.backendSessionId));
|
|
805
846
|
const seenTabs = new Set();
|
|
806
847
|
for (const snap of liveSnapshots) {
|
|
807
848
|
if (!isClaudeRelated(snap))
|
|
808
849
|
continue;
|
|
809
|
-
const displayName = snap.
|
|
850
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
810
851
|
if (seenTabs.has(displayName))
|
|
811
852
|
continue;
|
|
812
853
|
seenTabs.add(displayName);
|
|
@@ -842,6 +883,8 @@ end tell`)?.trim() ?? "";
|
|
|
842
883
|
log(`PAILot client connected from ${addr}`);
|
|
843
884
|
clients.add(ws);
|
|
844
885
|
clientLastActive.set(ws, Date.now());
|
|
886
|
+
// App is online → user is reading. Clear the home-screen badge.
|
|
887
|
+
import("../../apns/client.js").then(m => m.sendBadgeClear()).catch(() => { });
|
|
845
888
|
ws.on("pong", () => {
|
|
846
889
|
clientLastActive.set(ws, Date.now());
|
|
847
890
|
});
|
|
@@ -878,6 +921,10 @@ end tell`)?.trim() ?? "";
|
|
|
878
921
|
case "rename":
|
|
879
922
|
handleRenameCommand(ws, args);
|
|
880
923
|
return;
|
|
924
|
+
case "refresh":
|
|
925
|
+
// Force a fresh enumeration + prune + re-push (closed tabs drop here).
|
|
926
|
+
handleSessionsCommand(ws);
|
|
927
|
+
return;
|
|
881
928
|
case "remove":
|
|
882
929
|
handleRemoveCommand(ws, args);
|
|
883
930
|
return;
|
|
@@ -914,6 +961,20 @@ end tell`)?.trim() ?? "";
|
|
|
914
961
|
// This is the iTerm session ID the user was viewing when they typed/spoke.
|
|
915
962
|
// We use it for routing instead of guessing from activeItermSessionId.
|
|
916
963
|
const pailotSessionId = typeof msg.sessionId === "string" ? msg.sessionId : undefined;
|
|
964
|
+
// Validate against the live session list. A stale id (e.g. a Claude Code
|
|
965
|
+
// session was restarted and got a new id) would otherwise silently fall
|
|
966
|
+
// back to the active session and the message would land in the wrong tab.
|
|
967
|
+
// Refuse to route, push a fresh session list, and tell the user.
|
|
968
|
+
if (pailotSessionId && hybridManager) {
|
|
969
|
+
const known = hybridManager.listSessions().some(s => s.backendSessionId === pailotSessionId);
|
|
970
|
+
if (!known) {
|
|
971
|
+
log(`[PAILot] Rejecting message — sessionId=${pailotSessionId.slice(0, 8)} is stale (no matching session). Refreshing client list.`);
|
|
972
|
+
mqttPublishControl({ type: "session_not_found", sessionId: pailotSessionId });
|
|
973
|
+
handleMqttCommand("sessions");
|
|
974
|
+
mqttPublishText(pailotSessionId, "⚠️ That session no longer exists on the host. Pick a session from the refreshed list and resend.");
|
|
975
|
+
return;
|
|
976
|
+
}
|
|
977
|
+
}
|
|
917
978
|
// Helper: resolve the routing target for this message.
|
|
918
979
|
// Prefers the explicit PAILot session ID; falls back to active session.
|
|
919
980
|
const routeTarget = pailotSessionId || activeItermSessionId;
|
|
@@ -1102,10 +1163,10 @@ export function broadcastText(text, sessionId, direct) {
|
|
|
1102
1163
|
}
|
|
1103
1164
|
else {
|
|
1104
1165
|
// Fallback: scan iTerm tabs for the session name
|
|
1105
|
-
const snaps =
|
|
1166
|
+
const snaps = enrichedSnapshots();
|
|
1106
1167
|
const snap = snaps.find(s => s.id.startsWith(resolvedSession) || resolvedSession.startsWith(s.id));
|
|
1107
1168
|
if (snap)
|
|
1108
|
-
sessionName = snap.
|
|
1169
|
+
sessionName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
1109
1170
|
}
|
|
1110
1171
|
}
|
|
1111
1172
|
const preview = text.replace(/\s+/g, " ").trim().slice(0, 100);
|
|
@@ -1186,10 +1247,10 @@ export async function broadcastVoice(audioBuffer, transcript, sessionId, direct,
|
|
|
1186
1247
|
voiceSessionName = match.name;
|
|
1187
1248
|
}
|
|
1188
1249
|
else {
|
|
1189
|
-
const snaps =
|
|
1250
|
+
const snaps = enrichedSnapshots();
|
|
1190
1251
|
const snap = snaps.find(s => s.id.startsWith(resolvedSession) || resolvedSession.startsWith(s.id));
|
|
1191
1252
|
if (snap)
|
|
1192
|
-
voiceSessionName = snap.
|
|
1253
|
+
voiceSessionName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
1193
1254
|
}
|
|
1194
1255
|
}
|
|
1195
1256
|
const preview = transcript.replace(/\s+/g, " ").trim().slice(0, 100);
|
|
@@ -1257,9 +1318,10 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1257
1318
|
return;
|
|
1258
1319
|
}
|
|
1259
1320
|
switch (command) {
|
|
1321
|
+
case "refresh":
|
|
1260
1322
|
case "sessions": {
|
|
1261
1323
|
// Prune dead sessions and publish current list via MQTT
|
|
1262
|
-
const liveSnapshots =
|
|
1324
|
+
const liveSnapshots = enrichedSnapshots();
|
|
1263
1325
|
const liveIds = new Set(liveSnapshots.map(s => s.id));
|
|
1264
1326
|
if (liveSnapshots.length > 0) {
|
|
1265
1327
|
hybridManager.pruneDeadVisualSessions(liveIds);
|
|
@@ -1269,7 +1331,7 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1269
1331
|
for (const snap of liveSnapshots) {
|
|
1270
1332
|
if (!isClaudeRelated(snap))
|
|
1271
1333
|
continue;
|
|
1272
|
-
const displayName = snap.
|
|
1334
|
+
const displayName = snap.paiName ?? snap.tabTitle ?? snap.name;
|
|
1273
1335
|
if (seenTabs.has(displayName))
|
|
1274
1336
|
continue;
|
|
1275
1337
|
seenTabs.add(displayName);
|
|
@@ -1377,8 +1439,10 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1377
1439
|
const idx = sessions.findIndex(s => s.backendSessionId === sessionId);
|
|
1378
1440
|
if (idx >= 0) {
|
|
1379
1441
|
const target = sessions[idx];
|
|
1380
|
-
|
|
1381
|
-
|
|
1442
|
+
// Clean exit via "/exit" (routes to iTerm or tmux); enumeration then
|
|
1443
|
+
// drops it. Already-closed tab → harmless no-op + prune.
|
|
1444
|
+
if (target.backendSessionId) {
|
|
1445
|
+
typeIntoSession(target.backendSessionId, "/exit");
|
|
1382
1446
|
}
|
|
1383
1447
|
hybridManager.removeByIndex(idx + 1);
|
|
1384
1448
|
}
|
|
@@ -1387,9 +1451,14 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1387
1451
|
break;
|
|
1388
1452
|
}
|
|
1389
1453
|
case "create": {
|
|
1454
|
+
if (createThrottled()) {
|
|
1455
|
+
handleMqttCommand("sessions");
|
|
1456
|
+
break;
|
|
1457
|
+
}
|
|
1390
1458
|
const path = args.path;
|
|
1391
|
-
const
|
|
1392
|
-
const
|
|
1459
|
+
const requestedName = typeof args.name === "string" ? args.name.trim() : "";
|
|
1460
|
+
const command = path ? `cd ${path.replace(/"/g, '\\"')} && clc` : "clc";
|
|
1461
|
+
const name = requestedName || (path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude");
|
|
1393
1462
|
const sessionId = createClaudeSession(command);
|
|
1394
1463
|
if (!sessionId) {
|
|
1395
1464
|
log("[MQTT] create: failed to create session");
|