@backendkit-labs/agent-web 0.1.0 → 0.3.0

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 (37) hide show
  1. package/dist/auth/JwtAuth.d.ts +42 -0
  2. package/dist/auth/JwtAuth.d.ts.map +1 -0
  3. package/dist/auth/JwtAuth.js +69 -0
  4. package/dist/auth/JwtAuth.js.map +1 -0
  5. package/dist/index.d.ts +10 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +16 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/metrics/MetricsCollector.d.ts +46 -0
  10. package/dist/metrics/MetricsCollector.d.ts.map +1 -0
  11. package/dist/metrics/MetricsCollector.js +95 -0
  12. package/dist/metrics/MetricsCollector.js.map +1 -0
  13. package/dist/server/AgentServer.d.ts +46 -2
  14. package/dist/server/AgentServer.d.ts.map +1 -1
  15. package/dist/server/AgentServer.js +37 -4
  16. package/dist/server/AgentServer.js.map +1 -1
  17. package/dist/server/routes.d.ts +2 -1
  18. package/dist/server/routes.d.ts.map +1 -1
  19. package/dist/server/routes.js +20 -5
  20. package/dist/server/routes.js.map +1 -1
  21. package/dist/session/SessionManager.d.ts +12 -2
  22. package/dist/session/SessionManager.d.ts.map +1 -1
  23. package/dist/session/SessionManager.js +29 -6
  24. package/dist/session/SessionManager.js.map +1 -1
  25. package/dist/store/SessionMetaStore.d.ts +46 -0
  26. package/dist/store/SessionMetaStore.d.ts.map +1 -0
  27. package/dist/store/SessionMetaStore.js +72 -0
  28. package/dist/store/SessionMetaStore.js.map +1 -0
  29. package/dist/transport/HeadlessTransport.d.ts +21 -0
  30. package/dist/transport/HeadlessTransport.d.ts.map +1 -0
  31. package/dist/transport/HeadlessTransport.js +42 -0
  32. package/dist/transport/HeadlessTransport.js.map +1 -0
  33. package/dist/trigger/TriggerBus.d.ts +98 -0
  34. package/dist/trigger/TriggerBus.d.ts.map +1 -0
  35. package/dist/trigger/TriggerBus.js +206 -0
  36. package/dist/trigger/TriggerBus.js.map +1 -0
  37. package/package.json +9 -1
@@ -1,6 +1,8 @@
1
1
  import type { AgentEngine } from '@backendkit-labs/agent-core';
2
2
  import { WebSocketTransport } from '../transport/WebSocketTransport';
3
3
  import type { MonitorBus } from '../monitor/MonitorBus';
4
+ import type { MetricsCollector } from '../metrics/MetricsCollector';
5
+ import type { SessionMetaStore } from '../store/SessionMetaStore';
4
6
  import type { WebSocket } from 'ws';
5
7
  export interface Session {
6
8
  id: string;
@@ -8,6 +10,8 @@ export interface Session {
8
10
  transport: WebSocketTransport;
9
11
  createdAt: Date;
10
12
  lastActivityAt: Date;
13
+ /** Set when JWT auth is active. */
14
+ userId?: string;
11
15
  }
12
16
  export type EngineFactory = (sessionId: string, transport: WebSocketTransport) => AgentEngine;
13
17
  export interface SessionManagerOptions {
@@ -19,6 +23,10 @@ export interface SessionManagerOptions {
19
23
  maxSessions?: number;
20
24
  /** Optional monitor bus — broadcasts all session events to connected observers. */
21
25
  monitorBus?: MonitorBus;
26
+ /** Optional Prometheus metrics collector. */
27
+ metrics?: MetricsCollector;
28
+ /** Optional durable store for session metadata (Redis, etc.). */
29
+ store?: SessionMetaStore;
22
30
  }
23
31
  export declare class SessionManager {
24
32
  private sessions;
@@ -26,13 +34,15 @@ export declare class SessionManager {
26
34
  private readonly maxSessions;
27
35
  private readonly engineFactory;
28
36
  private readonly monitorBus;
37
+ private readonly metrics;
38
+ private readonly store;
29
39
  private sweepTimer;
30
40
  constructor(opts: SessionManagerOptions);
31
41
  /** Create a new session and wire a WebSocket to it. */
32
- create(socket: WebSocket): Session;
42
+ create(socket: WebSocket, userId?: string): Session;
33
43
  get(id: string): Session | undefined;
34
44
  destroy(id: string): void;
35
- list(): Pick<Session, 'id' | 'createdAt' | 'lastActivityAt'>[];
45
+ list(): Pick<Session, 'id' | 'createdAt' | 'lastActivityAt' | 'userId'>[];
36
46
  get size(): number;
37
47
  close(): void;
38
48
  private sweepIdle;
@@ -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,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;CACxB;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;CAC3B;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,UAAU,CAA+C;gBAErD,IAAI,EAAE,qBAAqB;IAWvC,uDAAuD;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO;IAoClC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAMpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASzB,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,gBAAgB,CAAC,EAAE;IAM9D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IAQb,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;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"}
@@ -9,18 +9,22 @@ class SessionManager {
9
9
  maxSessions;
10
10
  engineFactory;
11
11
  monitorBus;
12
+ metrics;
13
+ store;
12
14
  sweepTimer = null;
13
15
  constructor(opts) {
14
16
  this.engineFactory = opts.engineFactory;
15
17
  this.maxIdleMs = opts.maxIdleMs ?? 30 * 60 * 1000;
16
18
  this.maxSessions = opts.maxSessions ?? 100;
17
19
  this.monitorBus = opts.monitorBus;
20
+ this.metrics = opts.metrics;
21
+ this.store = opts.store;
18
22
  // sweep idle sessions every minute
19
23
  this.sweepTimer = setInterval(() => this.sweepIdle(), 60_000);
20
24
  this.sweepTimer.unref?.();
21
25
  }
22
26
  /** Create a new session and wire a WebSocket to it. */
23
- create(socket) {
27
+ create(socket, userId) {
24
28
  if (this.sessions.size >= this.maxSessions) {
25
29
  throw new Error(`Max concurrent sessions (${this.maxSessions}) reached`);
26
30
  }
@@ -36,22 +40,38 @@ class SessionManager {
36
40
  };
37
41
  }
38
42
  const engine = this.engineFactory(id, transport);
43
+ const now = new Date();
39
44
  const session = {
40
45
  id,
41
46
  engine,
42
47
  transport,
43
- createdAt: new Date(),
44
- lastActivityAt: new Date(),
48
+ createdAt: now,
49
+ lastActivityAt: now,
50
+ userId,
45
51
  };
46
52
  this.sessions.set(id, session);
47
53
  this.monitorBus?.notifySessionOpen(id);
54
+ this.metrics?.sessionOpened();
55
+ this.store?.set(id, {
56
+ id,
57
+ createdAt: now.toISOString(),
58
+ lastActivityAt: now.toISOString(),
59
+ userId,
60
+ }).catch(() => { });
48
61
  socket.on('close', () => this.destroy(id));
49
62
  return session;
50
63
  }
51
64
  get(id) {
52
65
  const session = this.sessions.get(id);
53
- if (session)
66
+ if (session) {
54
67
  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(() => { });
74
+ }
55
75
  return session;
56
76
  }
57
77
  destroy(id) {
@@ -68,10 +88,12 @@ class SessionManager {
68
88
  catch { /* may already be closed */ }
69
89
  this.sessions.delete(id);
70
90
  this.monitorBus?.notifySessionClose(id);
91
+ this.metrics?.sessionClosed();
92
+ this.store?.delete(id).catch(() => { });
71
93
  }
72
94
  list() {
73
- return [...this.sessions.values()].map(({ id, createdAt, lastActivityAt }) => ({
74
- id, createdAt, lastActivityAt,
95
+ return [...this.sessions.values()].map(({ id, createdAt, lastActivityAt, userId }) => ({
96
+ id, createdAt, lastActivityAt, userId,
75
97
  }));
76
98
  }
77
99
  get size() {
@@ -84,6 +106,7 @@ class SessionManager {
84
106
  }
85
107
  for (const id of [...this.sessions.keys()])
86
108
  this.destroy(id);
109
+ this.store?.close().catch(() => { });
87
110
  }
88
111
  sweepIdle() {
89
112
  const cutoff = Date.now() - this.maxIdleMs;
@@ -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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"}
@@ -0,0 +1,46 @@
1
+ export interface SessionMeta {
2
+ id: string;
3
+ createdAt: string;
4
+ lastActivityAt: string;
5
+ userId?: string;
6
+ /** Extra fields the application wants to track. */
7
+ [key: string]: unknown;
8
+ }
9
+ export interface SessionMetaStore {
10
+ set(id: string, meta: SessionMeta): Promise<void>;
11
+ get(id: string): Promise<SessionMeta | null>;
12
+ delete(id: string): Promise<void>;
13
+ list(): Promise<SessionMeta[]>;
14
+ close(): Promise<void>;
15
+ }
16
+ export declare class InMemorySessionMetaStore implements SessionMetaStore {
17
+ private data;
18
+ set(id: string, meta: SessionMeta): Promise<void>;
19
+ get(id: string): Promise<SessionMeta | null>;
20
+ delete(id: string): Promise<void>;
21
+ list(): Promise<SessionMeta[]>;
22
+ close(): Promise<void>;
23
+ }
24
+ export interface RedisLike {
25
+ get(key: string): Promise<string | null>;
26
+ set(key: string, value: string, expiryMode: string, time: number): Promise<unknown>;
27
+ del(key: string): Promise<unknown>;
28
+ keys(pattern: string): Promise<string[]>;
29
+ quit(): Promise<unknown>;
30
+ }
31
+ export declare class RedisSessionMetaStore implements SessionMetaStore {
32
+ private readonly redis;
33
+ private readonly prefix;
34
+ private readonly ttl;
35
+ constructor(redis: RedisLike, opts?: {
36
+ prefix?: string;
37
+ ttlSeconds?: number;
38
+ });
39
+ private key;
40
+ set(id: string, meta: SessionMeta): Promise<void>;
41
+ get(id: string): Promise<SessionMeta | null>;
42
+ delete(id: string): Promise<void>;
43
+ list(): Promise<SessionMeta[]>;
44
+ close(): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=SessionMetaStore.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // ── Session metadata store ─────────────────────────────────────────────────────
3
+ //
4
+ // The live AgentEngine + WebSocketTransport can't be serialized, so the in-memory
5
+ // Map in SessionManager remains the authoritative runtime store.
6
+ //
7
+ // SessionMetaStore persists lightweight metadata (id, userId, timestamps) to a
8
+ // durable backend. Use cases:
9
+ // - List active sessions across multiple server instances
10
+ // - Audit trail: who connected when, from which session id
11
+ // - Future: resume conversation history after reconnect
12
+ //
13
+ // Implementations:
14
+ // InMemorySessionMetaStore — default, zero deps, single-instance
15
+ // RedisSessionMetaStore — pass any Redis-like client (ioredis, node-redis)
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RedisSessionMetaStore = exports.InMemorySessionMetaStore = void 0;
18
+ // ── In-memory (default) ───────────────────────────────────────────────────────
19
+ class InMemorySessionMetaStore {
20
+ data = new Map();
21
+ async set(id, meta) {
22
+ this.data.set(id, meta);
23
+ }
24
+ async get(id) {
25
+ return this.data.get(id) ?? null;
26
+ }
27
+ async delete(id) {
28
+ this.data.delete(id);
29
+ }
30
+ async list() {
31
+ return [...this.data.values()];
32
+ }
33
+ async close() {
34
+ this.data.clear();
35
+ }
36
+ }
37
+ exports.InMemorySessionMetaStore = InMemorySessionMetaStore;
38
+ class RedisSessionMetaStore {
39
+ redis;
40
+ prefix;
41
+ ttl;
42
+ constructor(redis, opts = {}) {
43
+ this.redis = redis;
44
+ this.prefix = opts.prefix ?? 'bk:session:';
45
+ this.ttl = opts.ttlSeconds ?? 4 * 60 * 60; // 4 h default
46
+ }
47
+ key(id) {
48
+ return `${this.prefix}${id}`;
49
+ }
50
+ async set(id, meta) {
51
+ await this.redis.set(this.key(id), JSON.stringify(meta), 'EX', this.ttl);
52
+ }
53
+ async get(id) {
54
+ const raw = await this.redis.get(this.key(id));
55
+ return raw ? JSON.parse(raw) : null;
56
+ }
57
+ async delete(id) {
58
+ await this.redis.del(this.key(id));
59
+ }
60
+ 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
64
+ .filter((r) => r !== null)
65
+ .map(r => JSON.parse(r));
66
+ }
67
+ async close() {
68
+ await this.redis.quit();
69
+ }
70
+ }
71
+ exports.RedisSessionMetaStore = RedisSessionMetaStore;
72
+ //# sourceMappingURL=SessionMetaStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMetaStore.js","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AgentEvent, Transport, Unsubscribe } from '@backendkit-labs/agent-core';
2
+ /**
3
+ * A transport with no outbound socket.
4
+ *
5
+ * Used by TriggerBus for autonomous (cron/webhook) agent runs where there is
6
+ * no human on the other end. Events are buffered in memory so callers can
7
+ * inspect the full run after completion.
8
+ */
9
+ export declare class HeadlessTransport implements Transport {
10
+ private readonly _events;
11
+ private _closed;
12
+ emit(event: AgentEvent): void;
13
+ onInput(_handler: (input: string) => void): Unsubscribe;
14
+ close(): void;
15
+ /** All events emitted during the run, in order. */
16
+ getEvents(): AgentEvent[];
17
+ /** Concatenated text output (all 'token' events). */
18
+ getOutput(): string;
19
+ get isClosed(): boolean;
20
+ }
21
+ //# sourceMappingURL=HeadlessTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadlessTransport.d.ts","sourceRoot":"","sources":["../../src/transport/HeadlessTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEtF;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,OAAO,CAAS;IAExB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAK7B,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAKvD,KAAK,IAAI,IAAI;IAIb,mDAAmD;IACnD,SAAS,IAAI,UAAU,EAAE;IAIzB,qDAAqD;IACrD,SAAS,IAAI,MAAM;IAQnB,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACJ"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeadlessTransport = void 0;
4
+ /**
5
+ * A transport with no outbound socket.
6
+ *
7
+ * Used by TriggerBus for autonomous (cron/webhook) agent runs where there is
8
+ * no human on the other end. Events are buffered in memory so callers can
9
+ * inspect the full run after completion.
10
+ */
11
+ class HeadlessTransport {
12
+ _events = [];
13
+ _closed = false;
14
+ emit(event) {
15
+ if (this._closed)
16
+ return;
17
+ this._events.push(event);
18
+ }
19
+ onInput(_handler) {
20
+ // Headless transports never receive human input mid-run.
21
+ return () => { };
22
+ }
23
+ close() {
24
+ this._closed = true;
25
+ }
26
+ /** All events emitted during the run, in order. */
27
+ getEvents() {
28
+ return [...this._events];
29
+ }
30
+ /** Concatenated text output (all 'token' events). */
31
+ getOutput() {
32
+ return this._events
33
+ .filter((e) => e.type === 'token' && 'content' in e)
34
+ .map(e => e.content)
35
+ .join('');
36
+ }
37
+ get isClosed() {
38
+ return this._closed;
39
+ }
40
+ }
41
+ exports.HeadlessTransport = HeadlessTransport;
42
+ //# sourceMappingURL=HeadlessTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadlessTransport.js","sourceRoot":"","sources":["../../src/transport/HeadlessTransport.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAa,iBAAiB;IACT,OAAO,GAAiB,EAAE,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC,KAAiB;QAClB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,QAAiC;QACrC,yDAAyD;QACzD,OAAO,GAAG,EAAE,GAAe,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,mDAAmD;IACnD,SAAS;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,qDAAqD;IACrD,SAAS;QACL,OAAO,IAAI,CAAC,OAAO;aACd,MAAM,CAAC,CAAC,CAAC,EAAwD,EAAE,CAChE,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,IAAI,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACnB,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAnCD,8CAmCC"}
@@ -0,0 +1,98 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { AgentEngine, AgentEvent, Transport } from '@backendkit-labs/agent-core';
3
+ import type { MonitorBus } from '../monitor/MonitorBus';
4
+ /**
5
+ * Engine factory signature compatible with TriggerBus (and createEnterpriseSetup).
6
+ * Uses the base Transport interface so HeadlessTransport can be passed.
7
+ */
8
+ export type TriggerEngineFactory = (sessionId: string, transport: Transport) => AgentEngine;
9
+ export interface TriggerResult {
10
+ sessionId: string;
11
+ triggerName: string;
12
+ firedAt: Date;
13
+ durationMs: number;
14
+ output: string;
15
+ events: AgentEvent[];
16
+ }
17
+ export interface TriggerDefinition {
18
+ /** Human-readable name — shown in logs and MonitorBus. */
19
+ name: string;
20
+ /**
21
+ * Build the agent prompt from the trigger payload.
22
+ * For cron triggers payload is undefined; for webhooks it's the parsed body.
23
+ */
24
+ buildPrompt: (payload?: unknown) => string | Promise<string>;
25
+ /** Called after a successful run. */
26
+ onComplete?: (result: TriggerResult) => void | Promise<void>;
27
+ /** Called when the run throws. */
28
+ onError?: (err: Error, triggerName: string) => void | Promise<void>;
29
+ }
30
+ export interface CronTriggerDef extends TriggerDefinition {
31
+ /** Standard 5-field cron expression (e.g. '0 9 * * 1-5'). */
32
+ schedule: string;
33
+ /** If true, fire once immediately when TriggerBus.start() is called. */
34
+ runOnStart?: boolean;
35
+ }
36
+ export interface WebhookTriggerDef extends TriggerDefinition {
37
+ /**
38
+ * Fastify route path (e.g. '/triggers/github').
39
+ * Must start with '/'.
40
+ */
41
+ path: string;
42
+ /** HTTP method accepted. Default: 'POST'. */
43
+ method?: 'GET' | 'POST' | 'PUT';
44
+ /**
45
+ * Optional HMAC secret. When set, validates the incoming request against
46
+ * X-Hub-Signature-256 (GitHub-compatible) before firing the trigger.
47
+ */
48
+ secret?: string;
49
+ }
50
+ /**
51
+ * Orchestrates autonomous agent runs triggered by cron schedules or
52
+ * inbound HTTP webhooks.
53
+ *
54
+ * Integrates with AgentServer via the `triggers` option so webhook routes
55
+ * are registered on the same Fastify instance and cron jobs start alongside
56
+ * the server. Can also be used standalone (no AgentServer required).
57
+ *
58
+ * All runs are broadcast to the MonitorBus (if supplied) so the kanban board
59
+ * shows autonomous runs alongside interactive chat sessions.
60
+ *
61
+ * Usage:
62
+ * ```ts
63
+ * const triggers = new TriggerBus(enterprise.engineFactory)
64
+ * .addCron({
65
+ * name: 'daily-report',
66
+ * schedule: '0 9 * * 1-5',
67
+ * buildPrompt: () => 'Generate the daily ops summary.',
68
+ * onComplete: ({ output }) => console.log(output),
69
+ * })
70
+ * .addWebhook({
71
+ * name: 'github-issue',
72
+ * path: '/triggers/github',
73
+ * secret: process.env.GITHUB_WEBHOOK_SECRET,
74
+ * buildPrompt: (body) => `New GitHub issue: ${JSON.stringify(body)}`,
75
+ * });
76
+ *
77
+ * const server = new AgentServer({ port: 4001, engineFactory, triggers });
78
+ * await server.start();
79
+ * ```
80
+ */
81
+ export declare class TriggerBus {
82
+ private readonly engineFactory;
83
+ private readonly monitorBus?;
84
+ private readonly cronDefs;
85
+ private readonly webhookDefs;
86
+ private cronTasks;
87
+ private started;
88
+ constructor(engineFactory: TriggerEngineFactory, monitorBus?: MonitorBus | undefined);
89
+ addCron(def: CronTriggerDef): this;
90
+ addWebhook(def: WebhookTriggerDef): this;
91
+ /** Register webhook routes on a Fastify instance. Called by AgentServer. */
92
+ registerRoutes(app: FastifyInstance): void;
93
+ start(): void;
94
+ close(): void;
95
+ private startCrons;
96
+ private fire;
97
+ }
98
+ //# sourceMappingURL=TriggerBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerBus.d.ts","sourceRoot":"","sources":["../../src/trigger/TriggerBus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,KAAK,WAAW,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAI,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAM,IAAI,CAAC;IAClB,UAAU,EAAG,MAAM,CAAC;IACpB,MAAM,EAAO,MAAM,CAAC;IACpB,MAAM,EAAO,UAAU,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAC9B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACrD,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IACxD;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,UAAU;IAQf,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IARhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IAEvD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAGH,aAAa,EAAE,oBAAoB,EACnC,UAAU,CAAC,EAAE,UAAU,YAAA;IAG5C,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAKlC,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAOxC,4EAA4E;IAC5E,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAsB1C,KAAK,IAAI,IAAI;IAMb,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,UAAU;YAiCJ,IAAI;CAuCrB"}