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.
Files changed (79) hide show
  1. package/dist/adapters/iterm/core.d.ts +18 -7
  2. package/dist/adapters/iterm/core.d.ts.map +1 -1
  3. package/dist/adapters/iterm/core.js +24 -13
  4. package/dist/adapters/iterm/core.js.map +1 -1
  5. package/dist/adapters/iterm/sessions.js +4 -4
  6. package/dist/adapters/iterm/sessions.js.map +1 -1
  7. package/dist/adapters/pailot/gateway.d.ts.map +1 -1
  8. package/dist/adapters/pailot/gateway.js +206 -18
  9. package/dist/adapters/pailot/gateway.js.map +1 -1
  10. package/dist/adapters/pailot/mqtt-broker.d.ts +5 -0
  11. package/dist/adapters/pailot/mqtt-broker.d.ts.map +1 -1
  12. package/dist/adapters/pailot/mqtt-broker.js +60 -6
  13. package/dist/adapters/pailot/mqtt-broker.js.map +1 -1
  14. package/dist/adapters/session/backend.js +1 -1
  15. package/dist/adapters/session/backend.js.map +1 -1
  16. package/dist/apns/client.d.ts +9 -0
  17. package/dist/apns/client.d.ts.map +1 -1
  18. package/dist/apns/client.js +25 -0
  19. package/dist/apns/client.js.map +1 -1
  20. package/dist/core/persistence.d.ts +7 -0
  21. package/dist/core/persistence.d.ts.map +1 -1
  22. package/dist/core/persistence.js +11 -0
  23. package/dist/core/persistence.js.map +1 -1
  24. package/dist/daemon/cli.d.ts +6 -0
  25. package/dist/daemon/cli.d.ts.map +1 -1
  26. package/dist/daemon/cli.js +13 -1
  27. package/dist/daemon/cli.js.map +1 -1
  28. package/dist/daemon/commands.d.ts.map +1 -1
  29. package/dist/daemon/commands.js +2 -1
  30. package/dist/daemon/commands.js.map +1 -1
  31. package/dist/daemon/core-handlers.d.ts.map +1 -1
  32. package/dist/daemon/core-handlers.js +79 -8
  33. package/dist/daemon/core-handlers.js.map +1 -1
  34. package/dist/daemon/index.d.ts.map +1 -1
  35. package/dist/daemon/index.js +16 -2
  36. package/dist/daemon/index.js.map +1 -1
  37. package/dist/daemon/ota.d.ts +8 -0
  38. package/dist/daemon/ota.d.ts.map +1 -0
  39. package/dist/daemon/ota.js +90 -0
  40. package/dist/daemon/ota.js.map +1 -0
  41. package/dist/daemon/pai-projects.d.ts +1 -1
  42. package/dist/daemon/pai-projects.d.ts.map +1 -1
  43. package/dist/daemon/pai-projects.js +34 -16
  44. package/dist/daemon/pai-projects.js.map +1 -1
  45. package/dist/daemon/session-content.d.ts.map +1 -1
  46. package/dist/daemon/session-content.js +2 -1
  47. package/dist/daemon/session-content.js.map +1 -1
  48. package/dist/ipc/client.d.ts.map +1 -1
  49. package/dist/ipc/client.js +4 -0
  50. package/dist/ipc/client.js.map +1 -1
  51. package/dist/ipc/server.d.ts.map +1 -1
  52. package/dist/ipc/server.js +9 -0
  53. package/dist/ipc/server.js.map +1 -1
  54. package/dist/mcp/index.d.ts +1 -1
  55. package/dist/mcp/index.js +62 -6
  56. package/dist/mcp/index.js.map +1 -1
  57. package/dist/transport/index.d.ts +18 -0
  58. package/dist/transport/index.d.ts.map +1 -0
  59. package/dist/transport/index.js +51 -0
  60. package/dist/transport/index.js.map +1 -0
  61. package/dist/transport/iterm.d.ts +21 -0
  62. package/dist/transport/iterm.d.ts.map +1 -0
  63. package/dist/transport/iterm.js +55 -0
  64. package/dist/transport/iterm.js.map +1 -0
  65. package/dist/transport/session-transport.d.ts +64 -0
  66. package/dist/transport/session-transport.d.ts.map +1 -0
  67. package/dist/transport/session-transport.js +17 -0
  68. package/dist/transport/session-transport.js.map +1 -0
  69. package/dist/transport/sync-facade.d.ts +52 -0
  70. package/dist/transport/sync-facade.d.ts.map +1 -0
  71. package/dist/transport/sync-facade.js +135 -0
  72. package/dist/transport/sync-facade.js.map +1 -0
  73. package/dist/transport/tmux.d.ts +53 -0
  74. package/dist/transport/tmux.d.ts.map +1 -0
  75. package/dist/transport/tmux.js +254 -0
  76. package/dist/transport/tmux.js.map +1 -0
  77. package/dist/types/ipc.d.ts +8 -0
  78. package/dist/types/ipc.d.ts.map +1 -1
  79. 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, profile, tty per session.
33
- * ~1.5s for 18 sessions (vs >30s timeout with the old combined script).
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 was dropped vs the original:
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
- * - `variable named "user.paiName"`: removed from AppleScript loop entirely.
38
- * paiName is now read from ~/.aibroker/session-names.json by the caller via
39
- * getAllPersistentSessionNames(). This makes paiName authoritative (no iTerm corruption),
40
- * faster (file read instead of AppleScript), and consistent with what rename writes.
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;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CA2CvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqBzC"}
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, profile, tty per session.
164
- * ~1.5s for 18 sessions (vs >30s timeout with the old combined script).
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 was dropped vs the original:
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
- * - `variable named "user.paiName"`: removed from AppleScript loop entirely.
169
- * paiName is now read from ~/.aibroker/session-names.json by the caller via
170
- * getAllPersistentSessionNames(). This makes paiName authoritative (no iTerm corruption),
171
- * faster (file read instead of AppleScript), and consistent with what rename writes.
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 overhead) and
179
- // `is at shell prompt` (~3.3s overhead) — both are derived or irrelevant.
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
- set output to output & sessionId & (ASCII character 9) & sessionName & (ASCII character 9) & sessionTty & linefeed
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 = ~2.1s for 18 sessions. 4s gives safe headroom.
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 < 3)
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[s.id])
103
- .map((s) => ({ id: s.id, name: persistentNames[s.id] ?? s.name }));
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[s.id] ?? null;
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":"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"}
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;AAmMH;;;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;AA2jBD,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,CA4QzG;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,CA+L3F"}
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, killSession, createClaudeSession } from "../iterm/sessions.js";
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, pasteTextIntoSession, snapshotAllSessions } from "../iterm/core.js";
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[snap.id] ?? null;
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
- // Kill the iTerm2 session if it's visual
457
- if (target.kind === "visual" && target.backendSessionId) {
458
- killSession(target.backendSessionId);
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] removed ${removed.kind} session "${removed.name}" (${removed.id})`);
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
- // Custom path — cd then claude
476
- const command = path ? `cd ${path.replace(/"/g, '\\"')} && claude` : "claude";
477
- const name = path ? path.split("/").filter(Boolean).pop() ?? "Claude" : "Claude";
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
- if (target.kind === "visual" && target.backendSessionId) {
1395
- killSession(target.backendSessionId);
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 command = path ? `cd ${path.replace(/"/g, '\\"')} && claude` : "claude";
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();