aibroker 0.7.11 → 0.7.13
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 +206 -18
- 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/pai-projects.d.ts +1 -1
- package/dist/daemon/pai-projects.d.ts.map +1 -1
- package/dist/daemon/pai-projects.js +34 -16
- package/dist/daemon/pai-projects.js.map +1 -1
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAS,GAAG,KAAK;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE;QACxC,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAsB;IACrD,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,IAAY,EAAE,QAAQ,GAAG,WAAW;IAC5F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,OAAO;;;;gCAIuB,OAAO;EACrC,IAAI;;;;;IAKF,QAAQ;SACH,CAAC;AACV,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,SAAiB;IACzE,MAAM,MAAM,GAAG,sBAAsB,CACnC,SAAS,EACT,0DAA0D,SAAS,qCAAqC,EACxG,oBAAoB,CACrB,CAAC;IACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAiB,EAAE,OAAe;IAC5E,MAAM,MAAM,GAAG,sBAAsB,CACnC,SAAS,EACT,kEAAkE,OAAO,qCAAqC,EAC9G,oBAAoB,CACrB,CAAC;IACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,IAAY;IAC7D,wDAAwD;IACxD,oEAAoE;IACpE,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;IAC9C,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB;IAC1D,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,IAAY;IAClE,8EAA8E;IAC9E,kFAAkF;IAClF,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,sBAAsB,CACvC,SAAS,EACT,0CAA0C,OAAO,qCAAqC,EACtF,oBAAoB,CACrB,CAAC;IACF,OAAO,cAAc,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG;;;;;;;;;;;;;SAaR,CAAC;IAER,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,GAAG,CAAC;YAAE,SAAS;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,yBAAyB,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,MAAM,MAAM,GAAG,sBAAsB,CACnC,SAAS,EACT,gJAAgJ,EAChJ,oBAAoB,CACrB,CAAC;IACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,GAAG,CAAC,WAAW,SAAS,0CAA0C,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,WAAW,SAAS,uBAAuB,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;QAClD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,MAAM,GAAG,sBAAsB,CACnC,SAAS,EACT,0BAA0B,EAC1B,eAAe,CAChB,CAAC;IACF,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,EACJ,CAAC,IAAI,EAAE,yDAAyD,CAAC,EACjE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrC,CAAC;QACF,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAY;IACtD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,iCAAiC,OAAO,GAAG,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;QACpD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,SAAS,CAC3B,IAAI,EACJ,CAAC,IAAI,EAAE,mBAAmB,QAAQ,OAAO,OAAO,EAAE,CAAC,EACnD,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CACpD,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,0BAA0B,OAAO,MAAM,MAAM,IAAI,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,aAAa,OAAO,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAmBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB;IACjC,kEAAkE;IAClE,6DAA6D;IAC7D,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;SAqBR,CAAC;IAER,qFAAqF;IACrF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,uFAAuF;QACvF,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChG,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YACZ,IAAI;YACJ,WAAW,EAAE,SAAS,EAAI,+DAA+D;YACzF,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,QAAQ;YACR,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACzF,2EAA2E;YAC3E,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;SAgBR,CAAC;IACR,kEAAkE;IAClE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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;AAinBD,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,CA6R3F"}
|
|
@@ -29,15 +29,16 @@ 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, killSession } 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";
|
|
40
|
-
import { getAllPersistentSessionNames } from "../../core/persistence.js";
|
|
41
|
+
import { getAllPersistentSessionNames, lookupPersistentName, setPersistentSessionName } from "../../core/persistence.js";
|
|
41
42
|
/**
|
|
42
43
|
* Enrich snapshots with paiName from the persistent JSON store.
|
|
43
44
|
* snapshotAllSessions() always returns paiName=null since v0.7.10;
|
|
@@ -47,7 +48,7 @@ function enrichedSnapshots() {
|
|
|
47
48
|
const snaps = snapshotAllSessions();
|
|
48
49
|
const persistentNames = getAllPersistentSessionNames();
|
|
49
50
|
for (const snap of snaps) {
|
|
50
|
-
snap.paiName = persistentNames
|
|
51
|
+
snap.paiName = lookupPersistentName(persistentNames, snap.id, snap.aibrokerId);
|
|
51
52
|
}
|
|
52
53
|
return snaps;
|
|
53
54
|
}
|
|
@@ -453,28 +454,84 @@ function handleRemoveCommand(ws, args) {
|
|
|
453
454
|
return;
|
|
454
455
|
}
|
|
455
456
|
const target = sessions[idx];
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
|
|
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");
|
|
459
465
|
}
|
|
460
466
|
const removed = hybridManager.removeByIndex(idx + 1);
|
|
461
467
|
if (removed) {
|
|
462
|
-
log(`[PAILot]
|
|
468
|
+
log(`[PAILot] exited ${removed.kind} session "${removed.name}" (${removed.id}) via /exit`);
|
|
463
469
|
}
|
|
464
470
|
// Send updated session list
|
|
465
471
|
handleSessionsCommand(ws);
|
|
466
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
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Poll until an iTerm session is back at a shell prompt (foreground process is no
|
|
490
|
+
* longer node/Claude — atPrompt heuristic), then run cb. Used so a re-home waits
|
|
491
|
+
* for a proper /exit + end-session finalization to finish instead of guessing a
|
|
492
|
+
* fixed delay. Falls through after ~24s so a stuck exit can't hang the tab.
|
|
493
|
+
*/
|
|
494
|
+
function whenAtShellPrompt(sessionId, cb, attempts = 30) {
|
|
495
|
+
const snap = snapshotAllSessions().find(s => s.id === sessionId);
|
|
496
|
+
if ((snap && snap.atPrompt) || attempts <= 0) {
|
|
497
|
+
cb();
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
setTimeout(() => whenAtShellPrompt(sessionId, cb, attempts - 1), 800);
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Build the shell command to launch Claude in `cwd`, replicating PAI's launcher:
|
|
504
|
+
* `claude --name <name>` sets the session label, and the single initial-prompt
|
|
505
|
+
* arg `$'/Name <name>\ngo'` advance-enters the /Name skill (tab + /resume label)
|
|
506
|
+
* then `go` (resume) — deterministic, no timing. `--dangerously-skip-permissions`
|
|
507
|
+
* so PAILot can drive the session without permission prompts.
|
|
508
|
+
*/
|
|
509
|
+
function claudeLaunchCommand(cwd, name) {
|
|
510
|
+
const sq = (s) => `'${s.replace(/'/g, "'\\''")}'`; // POSIX single-quote
|
|
511
|
+
const ansiC = name.replace(/'/g, ""); // keep the $'...' simple
|
|
512
|
+
// Double backslash: createClaudeSession embeds this in an AppleScript string
|
|
513
|
+
// literal, which collapses `\\n` → `\n`; zsh's $'...' then turns `\n` into a
|
|
514
|
+
// real newline so `/Name <name>` and `go` become two queued inputs.
|
|
515
|
+
const prompt = `$'/Name ${ansiC}\\\\ngo'`;
|
|
516
|
+
return `cd ${sq(cwd)} && claude --name ${sq(name)} --dangerously-skip-permissions ${prompt}`;
|
|
517
|
+
}
|
|
467
518
|
function handleCreateCommand(ws, args = {}) {
|
|
468
519
|
const projectName = args.project;
|
|
469
520
|
const path = args.path;
|
|
521
|
+
const requestedName = typeof args.name === "string" ? args.name.trim() : "";
|
|
470
522
|
// PAI project launch — async path
|
|
471
523
|
if (projectName) {
|
|
472
524
|
handleCreateFromProject(ws, projectName);
|
|
473
525
|
return;
|
|
474
526
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
527
|
+
if (createThrottled()) {
|
|
528
|
+
handleSessionsCommand(ws);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
// Launch via clc (the user's launcher: pins model + skip-perms so PAILot can
|
|
532
|
+
// drive the session without a permission prompt). cd into path first if given.
|
|
533
|
+
const command = path ? `cd ${path.replace(/"/g, '\\"')} && clc` : "clc";
|
|
534
|
+
const name = requestedName || (path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude");
|
|
478
535
|
const sessionId = createClaudeSession(command);
|
|
479
536
|
if (!sessionId) {
|
|
480
537
|
sendTo(ws, { type: "error", message: "Failed to create new session" });
|
|
@@ -521,7 +578,7 @@ async function handleCreateFromProject(ws, projectName) {
|
|
|
521
578
|
}
|
|
522
579
|
async function handleProjectsCommand(ws) {
|
|
523
580
|
try {
|
|
524
|
-
const projects = await listPaiProjects();
|
|
581
|
+
const projects = await listPaiProjects(true);
|
|
525
582
|
const list = projects.map(p => ({
|
|
526
583
|
name: p.displayName || p.name,
|
|
527
584
|
slug: p.slug,
|
|
@@ -856,6 +913,8 @@ end tell`)?.trim() ?? "";
|
|
|
856
913
|
log(`PAILot client connected from ${addr}`);
|
|
857
914
|
clients.add(ws);
|
|
858
915
|
clientLastActive.set(ws, Date.now());
|
|
916
|
+
// App is online → user is reading. Clear the home-screen badge.
|
|
917
|
+
import("../../apns/client.js").then(m => m.sendBadgeClear()).catch(() => { });
|
|
859
918
|
ws.on("pong", () => {
|
|
860
919
|
clientLastActive.set(ws, Date.now());
|
|
861
920
|
});
|
|
@@ -892,6 +951,10 @@ end tell`)?.trim() ?? "";
|
|
|
892
951
|
case "rename":
|
|
893
952
|
handleRenameCommand(ws, args);
|
|
894
953
|
return;
|
|
954
|
+
case "refresh":
|
|
955
|
+
// Force a fresh enumeration + prune + re-push (closed tabs drop here).
|
|
956
|
+
handleSessionsCommand(ws);
|
|
957
|
+
return;
|
|
895
958
|
case "remove":
|
|
896
959
|
handleRemoveCommand(ws, args);
|
|
897
960
|
return;
|
|
@@ -928,6 +991,20 @@ end tell`)?.trim() ?? "";
|
|
|
928
991
|
// This is the iTerm session ID the user was viewing when they typed/spoke.
|
|
929
992
|
// We use it for routing instead of guessing from activeItermSessionId.
|
|
930
993
|
const pailotSessionId = typeof msg.sessionId === "string" ? msg.sessionId : undefined;
|
|
994
|
+
// Validate against the live session list. A stale id (e.g. a Claude Code
|
|
995
|
+
// session was restarted and got a new id) would otherwise silently fall
|
|
996
|
+
// back to the active session and the message would land in the wrong tab.
|
|
997
|
+
// Refuse to route, push a fresh session list, and tell the user.
|
|
998
|
+
if (pailotSessionId && hybridManager) {
|
|
999
|
+
const known = hybridManager.listSessions().some(s => s.backendSessionId === pailotSessionId);
|
|
1000
|
+
if (!known) {
|
|
1001
|
+
log(`[PAILot] Rejecting message — sessionId=${pailotSessionId.slice(0, 8)} is stale (no matching session). Refreshing client list.`);
|
|
1002
|
+
mqttPublishControl({ type: "session_not_found", sessionId: pailotSessionId });
|
|
1003
|
+
handleMqttCommand("sessions");
|
|
1004
|
+
mqttPublishText(pailotSessionId, "⚠️ That session no longer exists on the host. Pick a session from the refreshed list and resend.");
|
|
1005
|
+
return;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
931
1008
|
// Helper: resolve the routing target for this message.
|
|
932
1009
|
// Prefers the explicit PAILot session ID; falls back to active session.
|
|
933
1010
|
const routeTarget = pailotSessionId || activeItermSessionId;
|
|
@@ -1271,6 +1348,7 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1271
1348
|
return;
|
|
1272
1349
|
}
|
|
1273
1350
|
switch (command) {
|
|
1351
|
+
case "refresh":
|
|
1274
1352
|
case "sessions": {
|
|
1275
1353
|
// Prune dead sessions and publish current list via MQTT
|
|
1276
1354
|
const liveSnapshots = enrichedSnapshots();
|
|
@@ -1369,6 +1447,10 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1369
1447
|
const sessionId = args.sessionId;
|
|
1370
1448
|
const name = args.name;
|
|
1371
1449
|
if (sessionId && name) {
|
|
1450
|
+
// Persist so the rename survives re-enumeration: enrichedSnapshots reads
|
|
1451
|
+
// paiName from ~/.aibroker/session-names.json and it wins over the tab
|
|
1452
|
+
// title — without this the name reverts on the next sessions refresh.
|
|
1453
|
+
setPersistentSessionName(sessionId, name);
|
|
1372
1454
|
const sessions = hybridManager.listSessions();
|
|
1373
1455
|
const session = sessions.find(s => s.backendSessionId === sessionId);
|
|
1374
1456
|
if (session) {
|
|
@@ -1391,19 +1473,66 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1391
1473
|
const idx = sessions.findIndex(s => s.backendSessionId === sessionId);
|
|
1392
1474
|
if (idx >= 0) {
|
|
1393
1475
|
const target = sessions[idx];
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1476
|
+
const sid = target.backendSessionId;
|
|
1477
|
+
// Graceful Claude shutdown first (/exit preserves /resume), then hard-
|
|
1478
|
+
// close the iTerm tab so a re-enumeration can't resurrect it. Refresh
|
|
1479
|
+
// the list only AFTER the tab is gone — an immediate refresh re-adds the
|
|
1480
|
+
// still-open tab (the "it reappears" bug).
|
|
1481
|
+
if (sid)
|
|
1482
|
+
typeIntoSession(sid, "/exit");
|
|
1397
1483
|
hybridManager.removeByIndex(idx + 1);
|
|
1484
|
+
setTimeout(() => {
|
|
1485
|
+
try {
|
|
1486
|
+
if (sid)
|
|
1487
|
+
killSession(sid);
|
|
1488
|
+
}
|
|
1489
|
+
catch (e) {
|
|
1490
|
+
log(`[MQTT] killSession failed: ${e}`);
|
|
1491
|
+
}
|
|
1492
|
+
setTimeout(() => handleMqttCommand("sessions"), 600);
|
|
1493
|
+
}, 2000);
|
|
1494
|
+
}
|
|
1495
|
+
else {
|
|
1496
|
+
handleMqttCommand("sessions");
|
|
1398
1497
|
}
|
|
1399
|
-
handleMqttCommand("sessions");
|
|
1400
1498
|
}
|
|
1401
1499
|
break;
|
|
1402
1500
|
}
|
|
1403
1501
|
case "create": {
|
|
1502
|
+
// PAI project launch — opens Claude in the project's rootPath.
|
|
1503
|
+
const projectName = args.project;
|
|
1504
|
+
if (projectName) {
|
|
1505
|
+
const projectDisplay = (typeof args.name === "string" && args.name.trim()) ? args.name.trim() : projectName;
|
|
1506
|
+
(async () => {
|
|
1507
|
+
try {
|
|
1508
|
+
const { itermSessionId } = await launchPaiProject(projectName);
|
|
1509
|
+
hybridManager.registerVisualSession(projectDisplay, "", itermSessionId);
|
|
1510
|
+
const list = hybridManager.listSessions();
|
|
1511
|
+
const pidx = list.findIndex(s => s.backendSessionId === itermSessionId);
|
|
1512
|
+
if (pidx >= 0) {
|
|
1513
|
+
hybridManager.switchToIndex(pidx + 1);
|
|
1514
|
+
setActiveItermSessionId(itermSessionId);
|
|
1515
|
+
setLastRoutedSessionId(itermSessionId);
|
|
1516
|
+
}
|
|
1517
|
+
setPersistentSessionName(itermSessionId, projectDisplay);
|
|
1518
|
+
mqttPublishControl({ type: "session_switched", name: projectDisplay, sessionId: itermSessionId });
|
|
1519
|
+
handleMqttCommand("sessions");
|
|
1520
|
+
}
|
|
1521
|
+
catch (err) {
|
|
1522
|
+
log(`[MQTT] project launch failed: ${err}`);
|
|
1523
|
+
mqttPublishControl({ type: "error", message: `Failed to launch project: ${err instanceof Error ? err.message : String(err)}` });
|
|
1524
|
+
}
|
|
1525
|
+
})();
|
|
1526
|
+
break;
|
|
1527
|
+
}
|
|
1528
|
+
if (createThrottled()) {
|
|
1529
|
+
handleMqttCommand("sessions");
|
|
1530
|
+
break;
|
|
1531
|
+
}
|
|
1404
1532
|
const path = args.path;
|
|
1405
|
-
const
|
|
1406
|
-
const name = path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude";
|
|
1533
|
+
const requestedName = typeof args.name === "string" ? args.name.trim() : "";
|
|
1534
|
+
const name = requestedName || (path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude");
|
|
1535
|
+
const command = claudeLaunchCommand(path ?? "~", name);
|
|
1407
1536
|
const sessionId = createClaudeSession(command);
|
|
1408
1537
|
if (!sessionId) {
|
|
1409
1538
|
log("[MQTT] create: failed to create session");
|
|
@@ -1420,10 +1549,69 @@ export function handleMqttCommand(command, args = {}) {
|
|
|
1420
1549
|
setActiveItermSessionId(sessionId);
|
|
1421
1550
|
setLastRoutedSessionId(sessionId);
|
|
1422
1551
|
}
|
|
1552
|
+
setPersistentSessionName(sessionId, name);
|
|
1423
1553
|
mqttPublishControl({ type: "session_switched", name, sessionId });
|
|
1424
1554
|
handleMqttCommand("sessions");
|
|
1425
1555
|
break;
|
|
1426
1556
|
}
|
|
1557
|
+
case "rehome": {
|
|
1558
|
+
// "Switch topic": re-home an EXISTING tab to a new directory without
|
|
1559
|
+
// spawning a session. A live Claude owns the TTY, so we exit it gracefully
|
|
1560
|
+
// (/exit preserves /resume), then relaunch clc in the new dir in the SAME
|
|
1561
|
+
// iTerm tab — the session id is unchanged, so the app keeps following it.
|
|
1562
|
+
const rid = args.sessionId;
|
|
1563
|
+
const rpath = args.path;
|
|
1564
|
+
const rname = (typeof args.name === "string" && args.name.trim())
|
|
1565
|
+
? args.name.trim()
|
|
1566
|
+
: (rpath ? rpath.split("/").filter(Boolean).pop() ?? "Session" : "Session");
|
|
1567
|
+
if (!rid || !rpath) {
|
|
1568
|
+
handleMqttCommand("sessions");
|
|
1569
|
+
break;
|
|
1570
|
+
}
|
|
1571
|
+
typeIntoSession(rid, "/exit");
|
|
1572
|
+
// Wait for /exit to fully finalize (tab back at a shell prompt) before
|
|
1573
|
+
// relaunching, so the end-session work isn't cut short. Short initial delay
|
|
1574
|
+
// lets /exit register, then poll atPrompt.
|
|
1575
|
+
setTimeout(() => whenAtShellPrompt(rid, () => {
|
|
1576
|
+
typeIntoSession(rid, claudeLaunchCommand(rpath, rname));
|
|
1577
|
+
setItermSessionVar(rid, rname);
|
|
1578
|
+
setItermTabName(rid, rname);
|
|
1579
|
+
setItermBadge(rid, rname);
|
|
1580
|
+
const s = hybridManager.listSessions().find(x => x.backendSessionId === rid);
|
|
1581
|
+
if (s)
|
|
1582
|
+
s.name = rname;
|
|
1583
|
+
setPersistentSessionName(rid, rname);
|
|
1584
|
+
setActiveItermSessionId(rid);
|
|
1585
|
+
setLastRoutedSessionId(rid);
|
|
1586
|
+
mqttPublishControl({ type: "session_switched", name: rname, sessionId: rid });
|
|
1587
|
+
handleMqttCommand("sessions");
|
|
1588
|
+
}), 1200);
|
|
1589
|
+
break;
|
|
1590
|
+
}
|
|
1591
|
+
case "projects": {
|
|
1592
|
+
// Return ALL active PAI projects (not just the curated shortlist) so the
|
|
1593
|
+
// app's incremental search can find anything with history — see gateway
|
|
1594
|
+
// `listPaiProjects(true)`.
|
|
1595
|
+
(async () => {
|
|
1596
|
+
try {
|
|
1597
|
+
const projects = await listPaiProjects(true);
|
|
1598
|
+
const list = projects.map(p => ({
|
|
1599
|
+
name: p.displayName || p.name, // shown in the picker
|
|
1600
|
+
launch: p.name, // canonical key for create {project}
|
|
1601
|
+
slug: p.slug,
|
|
1602
|
+
path: p.rootPath,
|
|
1603
|
+
sessions: p.sessionCount,
|
|
1604
|
+
lastActive: p.lastActive,
|
|
1605
|
+
}));
|
|
1606
|
+
mqttPublishControl({ type: "projects", projects: list });
|
|
1607
|
+
}
|
|
1608
|
+
catch (err) {
|
|
1609
|
+
log(`[MQTT] projects list failed: ${err}`);
|
|
1610
|
+
mqttPublishControl({ type: "projects", projects: [] });
|
|
1611
|
+
}
|
|
1612
|
+
})();
|
|
1613
|
+
break;
|
|
1614
|
+
}
|
|
1427
1615
|
case "catch_up": {
|
|
1428
1616
|
let lastSeq = typeof args.lastSeq === "number" ? args.lastSeq : 0;
|
|
1429
1617
|
const currentSeq = mqGetLatestSeq();
|