@backendkit-labs/agent-web 0.6.1 → 0.6.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.
@@ -17,6 +17,8 @@ export type MonitorFrame = {
17
17
  content: string;
18
18
  };
19
19
  export declare class MonitorBus {
20
+ /** Frames not delivered to an observer because it was not reading. */
21
+ droppedFrames: number;
20
22
  /** Observer -> the only user whose sessions it may see (undefined: every session). */
21
23
  private monitors;
22
24
  /** Open session -> its owner (undefined when the session has none, e.g. no auth configured). */
@@ -1 +1 @@
1
- {"version":3,"file":"MonitorBus.d.ts","sourceRoot":"","sources":["../../src/monitor/MonitorBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,MAAM,YAAY,GAClB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpD,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,GACpC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,qBAAa,UAAU;IACnB,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAA4C;IAC5D,gGAAgG;IAChG,OAAO,CAAC,cAAc,CAAyC;IAE/D;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAavD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK3C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAIrD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3D,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,IAAI;IAMZ,IAAI,IAAI,IAAI,MAAM,CAEjB;CACJ"}
1
+ {"version":3,"file":"MonitorBus.d.ts","sourceRoot":"","sources":["../../src/monitor/MonitorBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,MAAM,YAAY,GAClB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpD,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,GACpC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAKhE,qBAAa,UAAU;IACnB,sEAAsE;IACtE,aAAa,SAAK;IAClB,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAA4C;IAC5D,gGAAgG;IAChG,OAAO,CAAC,cAAc,CAAyC;IAE/D;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAavD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK3C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAIrD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3D,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,IAAI;IAMZ,IAAI,IAAI,IAAI,MAAM,CAEjB;CACJ"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MonitorBus = void 0;
4
+ /** Observers are best-effort: past this many unsent bytes their frames are skipped (1 MiB). */
5
+ const MAX_OBSERVER_BUFFERED_BYTES = 1024 * 1024;
4
6
  class MonitorBus {
7
+ /** Frames not delivered to an observer because it was not reading. */
8
+ droppedFrames = 0;
5
9
  /** Observer -> the only user whose sessions it may see (undefined: every session). */
6
10
  monitors = new Map();
7
11
  /** Open session -> its owner (undefined when the session has none, e.g. no auth configured). */
@@ -41,6 +45,11 @@ class MonitorBus {
41
45
  if (onlyUserId !== undefined && !canSee(onlyUserId, sessionId === undefined ? undefined : this.activeSessions.get(sessionId)))
42
46
  continue;
43
47
  if (ws.readyState === 1 /* OPEN */) {
48
+ // A stalled observer must not accumulate every frame of every session in memory.
49
+ if ((ws.bufferedAmount ?? 0) > MAX_OBSERVER_BUFFERED_BYTES) {
50
+ this.droppedFrames++;
51
+ continue;
52
+ }
44
53
  try {
45
54
  ws.send(data);
46
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MonitorBus.js","sourceRoot":"","sources":["../../src/monitor/MonitorBus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MonitorBus.js","sourceRoot":"","sources":["../../src/monitor/MonitorBus.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,12 @@ export interface SessionManagerOptions {
27
27
  metrics?: MetricsCollector;
28
28
  /** Optional durable store for session metadata (Redis, etc.). */
29
29
  store?: SessionMetaStore;
30
+ /**
31
+ * Minimum time between writes of one session's `lastActivityAt` to the store. `get()` runs on every
32
+ * message, and a write per message turned each of them into a store round trip. In-memory activity is
33
+ * always exact; the stored value lags by at most this much. Default 30000; 0 writes on every `get()`.
34
+ */
35
+ activityPersistIntervalMs?: number;
30
36
  }
31
37
  export declare class SessionManager {
32
38
  private sessions;
@@ -36,6 +42,8 @@ export declare class SessionManager {
36
42
  private readonly monitorBus;
37
43
  private readonly metrics;
38
44
  private readonly store;
45
+ private readonly activityPersistIntervalMs;
46
+ private readonly lastPersisted;
39
47
  private sweepTimer;
40
48
  constructor(opts: SessionManagerOptions);
41
49
  /** Create a new session and wire a WebSocket to it. */
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,KAAK,WAAW,CAAC;AAE9F,MAAM,WAAW,qBAAqB;IAClC,uFAAuF;IACvF,aAAa,EAAE,aAAa,CAAC;IAC7B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,UAAU,CAA+C;gBAErD,IAAI,EAAE,qBAAqB;IAavC,uDAAuD;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IA6CnD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAcpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAWzB,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,gBAAgB,GAAG,QAAQ,CAAC,EAAE;IAMzE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,SAAS;CAQpB"}
1
+ {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,KAAK,WAAW,CAAC;AAE9F,MAAM,WAAW,qBAAqB;IAClC,uFAAuF;IACvF,aAAa,EAAE,aAAa,CAAC;IAC7B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,UAAU,CAA+C;gBAErD,IAAI,EAAE,qBAAqB;IAcvC,uDAAuD;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IA8CnD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAkBpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAYzB,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,gBAAgB,GAAG,QAAQ,CAAC,EAAE;IAMzE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,SAAS;CAQpB"}
@@ -11,6 +11,8 @@ class SessionManager {
11
11
  monitorBus;
12
12
  metrics;
13
13
  store;
14
+ activityPersistIntervalMs;
15
+ lastPersisted = new Map();
14
16
  sweepTimer = null;
15
17
  constructor(opts) {
16
18
  this.engineFactory = opts.engineFactory;
@@ -19,6 +21,7 @@ class SessionManager {
19
21
  this.monitorBus = opts.monitorBus;
20
22
  this.metrics = opts.metrics;
21
23
  this.store = opts.store;
24
+ this.activityPersistIntervalMs = opts.activityPersistIntervalMs ?? 30_000;
22
25
  // sweep idle sessions every minute
23
26
  this.sweepTimer = setInterval(() => this.sweepIdle(), 60_000);
24
27
  this.sweepTimer.unref?.();
@@ -52,6 +55,7 @@ class SessionManager {
52
55
  this.sessions.set(id, session);
53
56
  this.monitorBus?.notifySessionOpen(id, userId);
54
57
  this.metrics?.sessionOpened();
58
+ this.lastPersisted.set(id, now.getTime());
55
59
  this.store?.set(id, {
56
60
  id,
57
61
  createdAt: now.toISOString(),
@@ -65,12 +69,16 @@ class SessionManager {
65
69
  const session = this.sessions.get(id);
66
70
  if (session) {
67
71
  session.lastActivityAt = new Date();
68
- this.store?.set(id, {
69
- id,
70
- createdAt: session.createdAt.toISOString(),
71
- lastActivityAt: session.lastActivityAt.toISOString(),
72
- userId: session.userId,
73
- }).catch(() => { });
72
+ const now = session.lastActivityAt.getTime();
73
+ if (this.store && now - (this.lastPersisted.get(id) ?? 0) >= this.activityPersistIntervalMs) {
74
+ this.lastPersisted.set(id, now);
75
+ this.store.set(id, {
76
+ id,
77
+ createdAt: session.createdAt.toISOString(),
78
+ lastActivityAt: session.lastActivityAt.toISOString(),
79
+ userId: session.userId,
80
+ }).catch(() => { });
81
+ }
74
82
  }
75
83
  return session;
76
84
  }
@@ -87,6 +95,7 @@ class SessionManager {
87
95
  }
88
96
  catch { /* may already be closed */ }
89
97
  this.sessions.delete(id);
98
+ this.lastPersisted.delete(id);
90
99
  this.monitorBus?.notifySessionClose(id);
91
100
  this.metrics?.sessionClosed();
92
101
  this.store?.delete(id).catch(() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,8 @@ export interface RedisLike {
26
26
  set(key: string, value: string, expiryMode: string, time: number): Promise<unknown>;
27
27
  del(key: string): Promise<unknown>;
28
28
  keys(pattern: string): Promise<string[]>;
29
+ scan?(cursor: string, matchToken: 'MATCH', pattern: string, countToken: 'COUNT', count: number): Promise<[string, string[]]>;
30
+ mget?(keys: string[]): Promise<Array<string | null>>;
29
31
  quit(): Promise<unknown>;
30
32
  }
31
33
  export declare class RedisSessionMetaStore implements SessionMetaStore {
@@ -41,6 +43,8 @@ export declare class RedisSessionMetaStore implements SessionMetaStore {
41
43
  get(id: string): Promise<SessionMeta | null>;
42
44
  delete(id: string): Promise<void>;
43
45
  list(): Promise<SessionMeta[]>;
46
+ /** SCAN walks the keyspace in small steps; KEYS does it in one blocking call. */
47
+ private listKeys;
44
48
  close(): Promise<void>;
45
49
  }
46
50
  //# sourceMappingURL=SessionMetaStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionMetaStore.d.ts","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAID,qBAAa,wBAAyB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,IAAI,CAAkC;IAExC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAMD,MAAM,WAAW,SAAS;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAKtD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJ1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAGR,KAAK,EAAE,SAAS,EACjC,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAMvD,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQ9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"SessionMetaStore.d.ts","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,8 @@ class InMemorySessionMetaStore {
35
35
  }
36
36
  }
37
37
  exports.InMemorySessionMetaStore = InMemorySessionMetaStore;
38
+ const SCAN_COUNT = 200;
39
+ const MGET_CHUNK = 500;
38
40
  class RedisSessionMetaStore {
39
41
  redis;
40
42
  prefix;
@@ -58,12 +60,33 @@ class RedisSessionMetaStore {
58
60
  await this.redis.del(this.key(id));
59
61
  }
60
62
  async list() {
61
- const keys = await this.redis.keys(`${this.prefix}*`);
62
- const results = await Promise.all(keys.map(k => this.redis.get(k)));
63
- return results
63
+ const keys = await this.listKeys();
64
+ const values = [];
65
+ for (let i = 0; i < keys.length; i += MGET_CHUNK) {
66
+ const chunk = keys.slice(i, i + MGET_CHUNK);
67
+ values.push(...(this.redis.mget
68
+ ? await this.redis.mget(chunk)
69
+ : await Promise.all(chunk.map(k => this.redis.get(k)))));
70
+ }
71
+ return values
64
72
  .filter((r) => r !== null)
65
73
  .map(r => JSON.parse(r));
66
74
  }
75
+ /** SCAN walks the keyspace in small steps; KEYS does it in one blocking call. */
76
+ async listKeys() {
77
+ const pattern = `${this.prefix}*`;
78
+ if (!this.redis.scan)
79
+ return this.redis.keys(pattern);
80
+ const seen = new Set(); // SCAN may return a key more than once
81
+ let cursor = '0';
82
+ do {
83
+ const [next, batch] = await this.redis.scan(cursor, 'MATCH', pattern, 'COUNT', SCAN_COUNT);
84
+ for (const k of batch)
85
+ seen.add(k);
86
+ cursor = next;
87
+ } while (cursor !== '0');
88
+ return [...seen];
89
+ }
67
90
  async close() {
68
91
  await this.redis.quit();
69
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SessionMetaStore.js","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionMetaStore.js","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,18 @@ export type WsMessage = {
8
8
  type: 'approval';
9
9
  decision: 'approve' | 'approve_all' | 'reject';
10
10
  };
11
+ /** Bytes a client may leave unread in the socket's send buffer before it is cut off. */
12
+ export declare const DEFAULT_MAX_BUFFERED_BYTES: number;
13
+ export interface WebSocketTransportOptions {
14
+ /** Close the connection when this many bytes are queued unsent (a client that cannot keep up). Default 8 MiB. */
15
+ maxBufferedBytes?: number;
16
+ }
11
17
  export declare class WebSocketTransport implements Transport {
12
18
  private readonly socket;
13
19
  private inputHandlers;
14
20
  private closed;
15
- constructor(socket: WebSocket);
21
+ private readonly maxBufferedBytes;
22
+ constructor(socket: WebSocket, opts?: WebSocketTransportOptions);
16
23
  emit(event: AgentEvent): void;
17
24
  onInput(handler: (input: string) => void): Unsubscribe;
18
25
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE3E,qBAAa,kBAAmB,YAAW,SAAS;IAIpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,MAAM,CAAS;gBAEM,MAAM,EAAE,SAAS;IAkB9C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAS7B,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAOtD,KAAK,IAAI,IAAI;IAUb,IAAI,MAAM,IAAI,OAAO,CAEpB;CACJ"}
1
+ {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE3E,wFAAwF;AACxF,eAAO,MAAM,0BAA0B,QAAkB,CAAC;AAE1D,MAAM,WAAW,yBAAyB;IACtC,iHAAiH;IACjH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,kBAAmB,YAAW,SAAS;IAKpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAEb,MAAM,EAAE,SAAS,EAAE,IAAI,GAAE,yBAA8B;IAmBpF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAiB7B,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAOtD,KAAK,IAAI,IAAI;IAUb,IAAI,MAAM,IAAI,OAAO,CAEpB;CACJ"}
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebSocketTransport = void 0;
3
+ exports.WebSocketTransport = exports.DEFAULT_MAX_BUFFERED_BYTES = void 0;
4
+ /** Bytes a client may leave unread in the socket's send buffer before it is cut off. */
5
+ exports.DEFAULT_MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
4
6
  class WebSocketTransport {
5
7
  socket;
6
8
  inputHandlers = [];
7
9
  closed = false;
8
- constructor(socket) {
10
+ maxBufferedBytes;
11
+ constructor(socket, opts = {}) {
9
12
  this.socket = socket;
13
+ this.maxBufferedBytes = opts.maxBufferedBytes ?? exports.DEFAULT_MAX_BUFFERED_BYTES;
10
14
  socket.on('message', (raw) => {
11
15
  try {
12
16
  const msg = JSON.parse(raw.toString());
@@ -27,6 +31,17 @@ class WebSocketTransport {
27
31
  emit(event) {
28
32
  if (this.closed)
29
33
  return;
34
+ // ws queues what the peer has not read; a stalled client would grow that buffer without limit.
35
+ // Dropping events would hand it a corrupt conversation, so the connection is closed instead.
36
+ if ((this.socket.bufferedAmount ?? 0) > this.maxBufferedBytes) {
37
+ this.closed = true;
38
+ this.inputHandlers = [];
39
+ try {
40
+ this.socket.close(1013, 'slow consumer');
41
+ }
42
+ catch { /* already closed */ }
43
+ return;
44
+ }
30
45
  try {
31
46
  this.socket.send(JSON.stringify(event));
32
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketTransport.js","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":";;;AAQA,MAAa,kBAAkB;IAIE;IAHrB,aAAa,GAAmC,EAAE,CAAC;IACnD,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;QAC1C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAoB,EAAE,EAAE;YAC1C,IAAI,CAAC;gBACD,MAAM,GAAG,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa;wBAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvD,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,0BAA0B;YAC9B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,KAAiB;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,oDAAoD;QACxD,CAAC;IACL,CAAC;IAED,OAAO,CAAC,OAAgC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;QACvE,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACL,iBAAiB;QACrB,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACN,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,OAAO;IAChE,CAAC;CACJ;AAnDD,gDAmDC"}
1
+ {"version":3,"file":"WebSocketTransport.js","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":";;;AAQA,wFAAwF;AAC3E,QAAA,0BAA0B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAO1D,MAAa,kBAAkB;IAKE;IAJrB,aAAa,GAAmC,EAAE,CAAC;IACnD,MAAM,GAAG,KAAK,CAAC;IACN,gBAAgB,CAAS;IAE1C,YAA6B,MAAiB,EAAE,OAAkC,EAAE;QAAvD,WAAM,GAAN,MAAM,CAAW;QAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,kCAA0B,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAoB,EAAE,EAAE;YAC1C,IAAI,CAAC;gBACD,MAAM,GAAG,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACvB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa;wBAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvD,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,0BAA0B;YAC9B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,KAAiB;QAClB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,+FAA+F;QAC/F,6FAA6F;QAC7F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAChF,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACL,oDAAoD;QACxD,CAAC;IACL,CAAC;IAED,OAAO,CAAC,OAAgC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;QACvE,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACL,iBAAiB;QACrB,CAAC;IACL,CAAC;IAED,IAAI,MAAM;QACN,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,OAAO;IAChE,CAAC;CACJ;AA7DD,gDA6DC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backendkit-labs/agent-web",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "HTTP/WebSocket server layer for agent-core — browser-ready streaming agent sessions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "prepublishOnly": "npm run build"
18
18
  },
19
19
  "peerDependencies": {
20
- "@backendkit-labs/agent-core": ">=0.24.0 <0.37.0"
20
+ "@backendkit-labs/agent-core": ">=0.24.0 <0.38.0"
21
21
  },
22
22
  "dependencies": {
23
23
  "@fastify/websocket": "^11.0.0",
@@ -31,7 +31,7 @@
31
31
  "node-cron": "^4.2.1"
32
32
  },
33
33
  "devDependencies": {
34
- "@backendkit-labs/agent-core": "^0.36.0",
34
+ "@backendkit-labs/agent-core": "^0.37.0",
35
35
  "@types/jest": "^29.5.14",
36
36
  "@types/jsonwebtoken": "^9.0.0",
37
37
  "@types/node": "^20.0.0",