@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
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TriggerBus = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const uuid_1 = require("uuid");
39
+ const HeadlessTransport_1 = require("../transport/HeadlessTransport");
40
+ // ── TriggerBus ────────────────────────────────────────────────────────────────
41
+ /**
42
+ * Orchestrates autonomous agent runs triggered by cron schedules or
43
+ * inbound HTTP webhooks.
44
+ *
45
+ * Integrates with AgentServer via the `triggers` option so webhook routes
46
+ * are registered on the same Fastify instance and cron jobs start alongside
47
+ * the server. Can also be used standalone (no AgentServer required).
48
+ *
49
+ * All runs are broadcast to the MonitorBus (if supplied) so the kanban board
50
+ * shows autonomous runs alongside interactive chat sessions.
51
+ *
52
+ * Usage:
53
+ * ```ts
54
+ * const triggers = new TriggerBus(enterprise.engineFactory)
55
+ * .addCron({
56
+ * name: 'daily-report',
57
+ * schedule: '0 9 * * 1-5',
58
+ * buildPrompt: () => 'Generate the daily ops summary.',
59
+ * onComplete: ({ output }) => console.log(output),
60
+ * })
61
+ * .addWebhook({
62
+ * name: 'github-issue',
63
+ * path: '/triggers/github',
64
+ * secret: process.env.GITHUB_WEBHOOK_SECRET,
65
+ * buildPrompt: (body) => `New GitHub issue: ${JSON.stringify(body)}`,
66
+ * });
67
+ *
68
+ * const server = new AgentServer({ port: 4001, engineFactory, triggers });
69
+ * await server.start();
70
+ * ```
71
+ */
72
+ class TriggerBus {
73
+ engineFactory;
74
+ monitorBus;
75
+ cronDefs = [];
76
+ webhookDefs = [];
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ cronTasks = []; // node-cron ScheduledTask — loaded lazily
79
+ started = false;
80
+ constructor(engineFactory, monitorBus) {
81
+ this.engineFactory = engineFactory;
82
+ this.monitorBus = monitorBus;
83
+ }
84
+ addCron(def) {
85
+ this.cronDefs.push(def);
86
+ return this;
87
+ }
88
+ addWebhook(def) {
89
+ this.webhookDefs.push(def);
90
+ return this;
91
+ }
92
+ // ── Fastify integration ───────────────────────────────────────────────────
93
+ /** Register webhook routes on a Fastify instance. Called by AgentServer. */
94
+ registerRoutes(app) {
95
+ for (const def of this.webhookDefs) {
96
+ const method = (def.method ?? 'POST').toLowerCase();
97
+ app[method](def.path, async (req, reply) => {
98
+ if (def.secret) {
99
+ const sig = (req.headers['x-hub-signature-256'] ?? '');
100
+ const rawBody = JSON.stringify(req.body);
101
+ if (!verifyHmac(rawBody, sig, def.secret)) {
102
+ return reply.code(401).send({ error: 'Invalid webhook signature' });
103
+ }
104
+ }
105
+ // Fire async — respond immediately so the caller doesn't time out
106
+ void this.fire(def, req.body).catch(err => def.onError?.(err instanceof Error ? err : new Error(String(err)), def.name));
107
+ return reply.code(202).send({ queued: true, trigger: def.name });
108
+ });
109
+ }
110
+ }
111
+ // ── Lifecycle ─────────────────────────────────────────────────────────────
112
+ start() {
113
+ if (this.started)
114
+ return;
115
+ this.started = true;
116
+ this.startCrons();
117
+ }
118
+ close() {
119
+ for (const task of this.cronTasks) {
120
+ try {
121
+ task.stop();
122
+ }
123
+ catch { /* already stopped */ }
124
+ }
125
+ this.cronTasks = [];
126
+ this.started = false;
127
+ }
128
+ // ── Internal ──────────────────────────────────────────────────────────────
129
+ startCrons() {
130
+ let nodeCron = null;
131
+ try {
132
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
133
+ nodeCron = require('node-cron');
134
+ }
135
+ catch {
136
+ if (this.cronDefs.length > 0) {
137
+ console.warn('[TriggerBus] node-cron not found — cron triggers disabled. Run: npm i node-cron');
138
+ }
139
+ return;
140
+ }
141
+ for (const def of this.cronDefs) {
142
+ if (!nodeCron.validate(def.schedule)) {
143
+ console.error(`[TriggerBus] Invalid cron schedule for "${def.name}": ${def.schedule}`);
144
+ continue;
145
+ }
146
+ const task = nodeCron.schedule(def.schedule, () => {
147
+ void this.fire(def).catch(err => def.onError?.(err instanceof Error ? err : new Error(String(err)), def.name));
148
+ });
149
+ this.cronTasks.push(task);
150
+ if (def.runOnStart) {
151
+ void this.fire(def).catch(err => def.onError?.(err instanceof Error ? err : new Error(String(err)), def.name));
152
+ }
153
+ }
154
+ }
155
+ async fire(def, payload) {
156
+ const sessionId = `trigger-${(0, uuid_1.v4)()}`;
157
+ const firedAt = new Date();
158
+ const startMs = Date.now();
159
+ const transport = new HeadlessTransport_1.HeadlessTransport();
160
+ // Fan out to MonitorBus so the kanban shows autonomous runs
161
+ if (this.monitorBus) {
162
+ const bus = this.monitorBus;
163
+ const origEmit = transport.emit.bind(transport);
164
+ transport.emit = (event) => {
165
+ origEmit(event);
166
+ bus.broadcast(sessionId, event);
167
+ };
168
+ bus.notifySessionOpen(sessionId);
169
+ }
170
+ try {
171
+ const engine = this.engineFactory(sessionId, transport);
172
+ const prompt = await def.buildPrompt(payload);
173
+ await engine.run(prompt);
174
+ const result = {
175
+ sessionId,
176
+ triggerName: def.name,
177
+ firedAt,
178
+ durationMs: Date.now() - startMs,
179
+ output: transport.getOutput(),
180
+ events: transport.getEvents(),
181
+ };
182
+ await def.onComplete?.(result);
183
+ }
184
+ finally {
185
+ this.monitorBus?.notifySessionClose(sessionId);
186
+ transport.close();
187
+ }
188
+ }
189
+ }
190
+ exports.TriggerBus = TriggerBus;
191
+ // ── HMAC helper ───────────────────────────────────────────────────────────────
192
+ function verifyHmac(body, signature, secret) {
193
+ if (!signature)
194
+ return false;
195
+ const expected = `sha256=${crypto
196
+ .createHmac('sha256', secret)
197
+ .update(body)
198
+ .digest('hex')}`;
199
+ try {
200
+ return crypto.timingSafeEqual(Buffer.from(signature, 'utf8'), Buffer.from(expected, 'utf8'));
201
+ }
202
+ catch {
203
+ return false;
204
+ }
205
+ }
206
+ //# sourceMappingURL=TriggerBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerBus.js","sourceRoot":"","sources":["../../src/trigger/TriggerBus.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backendkit-labs/agent-web",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
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",
@@ -21,10 +21,18 @@
21
21
  "dependencies": {
22
22
  "@fastify/websocket": "^11.0.0",
23
23
  "fastify": "^5.0.0",
24
+ "jsonwebtoken": "^9.0.0",
25
+ "prom-client": "^15.0.0",
24
26
  "uuid": "^10.0.0"
25
27
  },
28
+ "optionalDependencies": {
29
+ "@fastify/rate-limit": "^9.0.0",
30
+ "node-cron": "^3.0.0"
31
+ },
26
32
  "devDependencies": {
27
33
  "@backendkit-labs/agent-core": "*",
34
+ "@types/jsonwebtoken": "^9.0.0",
35
+ "@types/node-cron": "^3.0.0",
28
36
  "@types/node": "^20.0.0",
29
37
  "@types/uuid": "^10.0.0",
30
38
  "@types/ws": "^8.0.0",