@songsid/agend 2.1.2-beta.2 → 2.1.2-beta.3

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.
@@ -18,8 +18,16 @@ export declare class IpcServer extends EventEmitter {
18
18
  export declare class IpcClient extends EventEmitter {
19
19
  private sockPath;
20
20
  private socket;
21
+ /** A socket lifecycle must produce at most one disconnect notification. */
22
+ private disconnected;
21
23
  constructor(sockPath: string);
22
24
  connect(): Promise<void>;
25
+ /**
26
+ * Converge overflow/error/close into one notification, then make the client
27
+ * inert. EventEmitter invokes listeners synchronously, so FleetManager sees
28
+ * the disconnect before listeners are removed.
29
+ */
30
+ private handleDisconnect;
23
31
  get connected(): boolean;
24
32
  send(msg: unknown): void;
25
33
  close(): Promise<void>;
@@ -169,6 +169,8 @@ export class IpcServer extends EventEmitter {
169
169
  export class IpcClient extends EventEmitter {
170
170
  sockPath;
171
171
  socket = null;
172
+ /** A socket lifecycle must produce at most one disconnect notification. */
173
+ disconnected = false;
172
174
  constructor(sockPath) {
173
175
  super();
174
176
  this.sockPath = sockPath;
@@ -177,27 +179,51 @@ export class IpcClient extends EventEmitter {
177
179
  return new Promise((resolve, reject) => {
178
180
  const socket = createConnection(this.sockPath);
179
181
  this.socket = socket;
182
+ this.disconnected = false;
183
+ let connectSettled = false;
180
184
  const parse = makeLineParser((msg) => {
181
185
  this.emit("message", msg);
182
186
  }, () => {
183
187
  this.emit("overflow");
184
- socket.destroy();
185
- this.emit("disconnect", new Error("IPC buffer overflow"));
188
+ this.handleDisconnect(new Error("IPC buffer overflow"), socket);
186
189
  });
187
190
  socket.on("data", parse);
188
191
  socket.on("error", (err) => {
189
- this.emit("disconnect", err);
192
+ if (!connectSettled) {
193
+ connectSettled = true;
194
+ reject(err);
195
+ }
196
+ this.handleDisconnect(err, socket);
190
197
  });
191
198
  socket.on("close", () => {
192
- this.emit("disconnect", new Error("socket closed"));
199
+ if (!connectSettled) {
200
+ connectSettled = true;
201
+ reject(new Error("socket closed before connect"));
202
+ }
203
+ this.handleDisconnect(new Error("socket closed"), socket);
193
204
  });
194
- socket.once("error", reject);
195
205
  socket.once("connect", () => {
196
- socket.removeListener("error", reject);
206
+ connectSettled = true;
197
207
  resolve();
198
208
  });
199
209
  });
200
210
  }
211
+ /**
212
+ * Converge overflow/error/close into one notification, then make the client
213
+ * inert. EventEmitter invokes listeners synchronously, so FleetManager sees
214
+ * the disconnect before listeners are removed.
215
+ */
216
+ handleDisconnect(error, socket) {
217
+ if (this.disconnected || this.socket !== socket)
218
+ return;
219
+ this.disconnected = true;
220
+ this.emit("disconnect", error);
221
+ socket.removeAllListeners();
222
+ if (!socket.destroyed)
223
+ socket.destroy();
224
+ this.socket = null;
225
+ this.removeAllListeners();
226
+ }
201
227
  get connected() {
202
228
  return this.socket != null && !this.socket.destroyed;
203
229
  }
@@ -207,14 +233,15 @@ export class IpcClient extends EventEmitter {
207
233
  }
208
234
  }
209
235
  async close() {
210
- return new Promise((resolve) => {
211
- if (!this.socket || this.socket.destroyed) {
212
- resolve();
213
- return;
214
- }
215
- this.socket.once("close", resolve);
216
- this.socket.destroy();
217
- });
236
+ const socket = this.socket;
237
+ this.disconnected = true;
238
+ this.socket = null;
239
+ this.removeAllListeners();
240
+ if (!socket)
241
+ return;
242
+ socket.removeAllListeners();
243
+ if (!socket.destroyed)
244
+ socket.destroy();
218
245
  }
219
246
  }
220
247
  //# sourceMappingURL=ipc-bridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipc-bridge.js","sourceRoot":"","sources":["../../src/channel/ipc-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ipc-bridge.js","sourceRoot":"","sources":["../../src/channel/ipc-bridge.ts"],"names":[],"mappings":"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"}
@@ -107,6 +107,10 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
107
107
  private pendingModelSelects;
108
108
  private failoverActive;
109
109
  readonly ipcStoppingInstances: Set<string>;
110
+ /** Coalesce concurrent connection attempts for the same daemon socket. */
111
+ private ipcConnectInFlight;
112
+ /** At most one reconnect/backoff loop may exist per instance. */
113
+ private ipcReconnectInFlight;
110
114
  private adapterRestarting;
111
115
  private adapterState;
112
116
  private collabInstances;
@@ -253,8 +257,10 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
253
257
  private startAdditionalAdapter;
254
258
  /** Connect IPC to a single instance with all handlers */
255
259
  connectIpcToInstance(name: string): Promise<void>;
260
+ private connectIpcToInstanceInternal;
256
261
  /** Attempt IPC reconnection with exponential backoff */
257
262
  private ipcReconnect;
263
+ private runIpcReconnect;
258
264
  /** Restart a channel adapter after fatal error with infinite retry + 60s cap */
259
265
  private restartAdapter;
260
266
  /** Handle inbound message — transcribe voice if present, then route */
@@ -163,6 +163,10 @@ export class FleetManager {
163
163
  failoverActive = new Map(); // instance → current failover model
164
164
  // IPC reconnect: tracks instances being intentionally stopped (skip reconnect)
165
165
  ipcStoppingInstances = new Set();
166
+ /** Coalesce concurrent connection attempts for the same daemon socket. */
167
+ ipcConnectInFlight = new Map();
168
+ /** At most one reconnect/backoff loop may exist per instance. */
169
+ ipcReconnectInFlight = new Map();
166
170
  // Adapter restart: prevents re-entrant restart attempts
167
171
  adapterRestarting = new Set();
168
172
  // Adapter isolation: track state per adapter for retry + visibility
@@ -1931,19 +1935,38 @@ export class FleetManager {
1931
1935
  this.logger.info({ adapterId, type: channelConfig.type }, "Additional adapter started");
1932
1936
  }
1933
1937
  /** Connect IPC to a single instance with all handlers */
1934
- async connectIpcToInstance(name) {
1938
+ connectIpcToInstance(name) {
1939
+ const inFlight = this.ipcConnectInFlight.get(name);
1940
+ if (inFlight)
1941
+ return inFlight;
1942
+ const connection = this.connectIpcToInstanceInternal(name)
1943
+ .finally(() => {
1944
+ if (this.ipcConnectInFlight.get(name) === connection) {
1945
+ this.ipcConnectInFlight.delete(name);
1946
+ }
1947
+ });
1948
+ this.ipcConnectInFlight.set(name, connection);
1949
+ return connection;
1950
+ }
1951
+ async connectIpcToInstanceInternal(name) {
1935
1952
  // Close existing client to prevent socket leak on reconnect
1936
1953
  const existing = this.instanceIpcClients.get(name);
1937
1954
  if (existing) {
1938
- this.ipcStoppingInstances.add(name);
1955
+ // Remove application listeners before destroying the socket. Even if a
1956
+ // future regression creates two clients, the replaced one cannot keep
1957
+ // handling fleet_outbound messages as an orphan.
1958
+ existing.removeAllListeners();
1939
1959
  try {
1940
- existing.close();
1960
+ await existing.close();
1941
1961
  }
1942
1962
  catch (err) {
1943
1963
  this.logger.debug({ err, name }, "IPC client close failed (likely already closed)");
1944
1964
  }
1945
- this.instanceIpcClients.delete(name);
1946
- this.ipcStoppingInstances.delete(name);
1965
+ finally {
1966
+ if (this.instanceIpcClients.get(name) === existing) {
1967
+ this.instanceIpcClients.delete(name);
1968
+ }
1969
+ }
1947
1970
  }
1948
1971
  const sockPath = join(this.getInstanceDir(name), "channel.sock");
1949
1972
  if (!existsSync(sockPath))
@@ -2021,6 +2044,10 @@ export class FleetManager {
2021
2044
  }
2022
2045
  // Auto-reconnect on disconnect (unless intentionally stopping)
2023
2046
  ipc.on("disconnect", () => {
2047
+ // A delayed event from a replaced/stale client must never delete the
2048
+ // current connection or start another reconnect loop.
2049
+ if (this.instanceIpcClients.get(name) !== ipc)
2050
+ return;
2024
2051
  this.instanceIpcClients.delete(name);
2025
2052
  if (this.ipcStoppingInstances.has(name))
2026
2053
  return;
@@ -2032,7 +2059,20 @@ export class FleetManager {
2032
2059
  }
2033
2060
  }
2034
2061
  /** Attempt IPC reconnection with exponential backoff */
2035
- async ipcReconnect(name) {
2062
+ ipcReconnect(name) {
2063
+ const inFlight = this.ipcReconnectInFlight.get(name);
2064
+ if (inFlight)
2065
+ return inFlight;
2066
+ const reconnect = this.runIpcReconnect(name)
2067
+ .finally(() => {
2068
+ if (this.ipcReconnectInFlight.get(name) === reconnect) {
2069
+ this.ipcReconnectInFlight.delete(name);
2070
+ }
2071
+ });
2072
+ this.ipcReconnectInFlight.set(name, reconnect);
2073
+ return reconnect;
2074
+ }
2075
+ async runIpcReconnect(name) {
2036
2076
  for (let attempt = 1;; attempt++) {
2037
2077
  if (this.ipcStoppingInstances.has(name) || !this.daemons.has(name))
2038
2078
  return;