@okrlinkhub/agent-bridge 0.1.0 → 0.2.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 (35) hide show
  1. package/dist/client/index.d.ts +89 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +279 -4
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/component/_generated/api.d.ts +4 -0
  6. package/dist/component/_generated/api.d.ts.map +1 -1
  7. package/dist/component/_generated/api.js.map +1 -1
  8. package/dist/component/_generated/component.d.ts +103 -0
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/channels.d.ts +83 -0
  11. package/dist/component/channels.d.ts.map +1 -0
  12. package/dist/component/channels.js +288 -0
  13. package/dist/component/channels.js.map +1 -0
  14. package/dist/component/circuitBreaker.d.ts +73 -0
  15. package/dist/component/circuitBreaker.d.ts.map +1 -0
  16. package/dist/component/circuitBreaker.js +216 -0
  17. package/dist/component/circuitBreaker.js.map +1 -0
  18. package/dist/component/gateway.d.ts +19 -3
  19. package/dist/component/gateway.d.ts.map +1 -1
  20. package/dist/component/gateway.js +82 -2
  21. package/dist/component/gateway.js.map +1 -1
  22. package/dist/component/permissions.d.ts +2 -2
  23. package/dist/component/registry.d.ts +3 -3
  24. package/dist/component/schema.d.ts +73 -3
  25. package/dist/component/schema.d.ts.map +1 -1
  26. package/dist/component/schema.js +46 -0
  27. package/dist/component/schema.js.map +1 -1
  28. package/package.json +5 -2
  29. package/src/client/index.ts +411 -4
  30. package/src/component/_generated/api.ts +4 -0
  31. package/src/component/_generated/component.ts +142 -1
  32. package/src/component/channels.ts +374 -0
  33. package/src/component/circuitBreaker.ts +250 -0
  34. package/src/component/gateway.ts +98 -2
  35. package/src/component/schema.ts +49 -0
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@okrlinkhub/agent-bridge",
3
3
  "description": "A agent bridge component for Convex.",
4
- "repository": "github:okrlinkhub/agent-bridge",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/okrlinkhub/agent-bridge.git"
7
+ },
5
8
  "homepage": "https://github.com/okrlinkhub/agent-bridge#readme",
6
9
  "bugs": {
7
10
  "url": "https://github.com/okrlinkhub/agent-bridge/issues"
8
11
  },
9
- "version": "0.1.0",
12
+ "version": "0.2.0",
10
13
  "license": "Apache-2.0",
11
14
  "keywords": [
12
15
  "convex",
@@ -252,6 +252,140 @@ export class AgentBridge {
252
252
  limit: opts?.limit,
253
253
  });
254
254
  }
255
+
256
+ // --- Circuit Breaker ---
257
+
258
+ /**
259
+ * Get the current circuit breaker status for an agent on this app.
260
+ * Returns the counter for the current hour window, or null if none exists.
261
+ */
262
+ async getCircuitBreakerStatus(ctx: QueryCtx, agentId: string) {
263
+ return await ctx.runQuery(this.component.circuitBreaker.getStatus, {
264
+ agentId,
265
+ appName: this.appName,
266
+ });
267
+ }
268
+
269
+ /**
270
+ * Admin: manually reset a blocked circuit breaker for an agent.
271
+ */
272
+ async resetCircuitBreaker(
273
+ ctx: MutationCtx,
274
+ agentId: string,
275
+ ): Promise<boolean> {
276
+ return await ctx.runMutation(this.component.circuitBreaker.resetCounter, {
277
+ agentId,
278
+ appName: this.appName,
279
+ });
280
+ }
281
+
282
+ /**
283
+ * Admin: list all currently blocked circuit breakers across all agents.
284
+ */
285
+ async listBlockedAgents(ctx: QueryCtx) {
286
+ return await ctx.runQuery(this.component.circuitBreaker.listBlocked, {});
287
+ }
288
+
289
+ // --- A2A Channels ---
290
+
291
+ /**
292
+ * Admin: create a channel for this app.
293
+ * Idempotent -- returns existing channel ID if it already exists.
294
+ */
295
+ async createChannel(
296
+ ctx: MutationCtx,
297
+ channelName: string,
298
+ description?: string,
299
+ ): Promise<string> {
300
+ return await ctx.runMutation(this.component.channels.createChannel, {
301
+ appName: this.appName,
302
+ channelName,
303
+ description,
304
+ });
305
+ }
306
+
307
+ /**
308
+ * List active channels for this app.
309
+ */
310
+ async listChannels(ctx: QueryCtx) {
311
+ return await ctx.runQuery(this.component.channels.listChannels, {
312
+ appName: this.appName,
313
+ });
314
+ }
315
+
316
+ /**
317
+ * Admin: deactivate a channel (soft delete).
318
+ */
319
+ async deactivateChannel(
320
+ ctx: MutationCtx,
321
+ channelName: string,
322
+ ): Promise<boolean> {
323
+ return await ctx.runMutation(this.component.channels.deactivateChannel, {
324
+ appName: this.appName,
325
+ channelName,
326
+ });
327
+ }
328
+
329
+ /**
330
+ * Post a message to a channel on behalf of an authenticated agent.
331
+ */
332
+ async postMessage(
333
+ ctx: MutationCtx,
334
+ opts: {
335
+ instanceToken: string;
336
+ channelName: string;
337
+ payload: string;
338
+ priority?: number;
339
+ ttlMinutes?: number;
340
+ },
341
+ ) {
342
+ return await ctx.runMutation(this.component.channels.postMessage, {
343
+ instanceToken: opts.instanceToken,
344
+ appName: this.appName,
345
+ channelName: opts.channelName,
346
+ payload: opts.payload,
347
+ priority: opts.priority,
348
+ ttlMinutes: opts.ttlMinutes,
349
+ });
350
+ }
351
+
352
+ /**
353
+ * Read messages from a channel on behalf of an authenticated agent.
354
+ */
355
+ async readMessages(
356
+ ctx: QueryCtx,
357
+ opts: {
358
+ instanceToken: string;
359
+ channelName: string;
360
+ limit?: number;
361
+ after?: number;
362
+ },
363
+ ) {
364
+ return await ctx.runQuery(this.component.channels.readMessages, {
365
+ instanceToken: opts.instanceToken,
366
+ appName: this.appName,
367
+ channelName: opts.channelName,
368
+ limit: opts.limit,
369
+ after: opts.after,
370
+ });
371
+ }
372
+
373
+ /**
374
+ * Get unread message count for an agent on a channel.
375
+ */
376
+ async getUnreadCount(
377
+ ctx: QueryCtx,
378
+ opts: {
379
+ instanceToken: string;
380
+ channelName: string;
381
+ },
382
+ ) {
383
+ return await ctx.runQuery(this.component.channels.getUnreadCount, {
384
+ instanceToken: opts.instanceToken,
385
+ appName: this.appName,
386
+ channelName: opts.channelName,
387
+ });
388
+ }
255
389
  }
256
390
 
257
391
  // --- HTTP Route Registration ---
@@ -291,6 +425,7 @@ export function registerRoutes(
291
425
  instanceToken?: string;
292
426
  functionName?: string;
293
427
  args?: Record<string, unknown>;
428
+ estimatedCost?: number;
294
429
  };
295
430
  try {
296
431
  body = await request.json();
@@ -298,7 +433,7 @@ export function registerRoutes(
298
433
  return jsonResponse({ error: "Invalid JSON body" }, 400);
299
434
  }
300
435
 
301
- const { instanceToken, functionName, args } = body;
436
+ const { instanceToken, functionName, args, estimatedCost } = body;
302
437
 
303
438
  if (!instanceToken || !functionName) {
304
439
  return jsonResponse(
@@ -308,13 +443,14 @@ export function registerRoutes(
308
443
  }
309
444
 
310
445
  // Step 1: Authorize the request (mutation -- validates token, checks permissions,
311
- // updates counters, returns function handle)
446
+ // circuit breaker, updates counters, returns function handle)
312
447
  const authResult = await ctx.runMutation(
313
448
  component.gateway.authorizeRequest,
314
449
  {
315
450
  instanceToken,
316
451
  functionName,
317
452
  appName: config.appName,
453
+ estimatedCost,
318
454
  },
319
455
  );
320
456
 
@@ -324,14 +460,28 @@ export function registerRoutes(
324
460
  ? ` (matchedPattern="${authResult.matchedPattern}", permission="${authResult.matchedPermission}")`
325
461
  : "";
326
462
  // Log the denied access
463
+ const permission =
464
+ authResult.statusCode === 429 ? "rate_limited" : "deny";
327
465
  await ctx.runMutation(component.gateway.logAccess, {
328
466
  agentId: authResult.agentId ?? "unknown",
329
467
  appName: config.appName,
330
468
  functionCalled: functionName,
331
- permission: "deny",
469
+ permission,
332
470
  errorMessage: authResult.error + detailSuffix,
333
471
  });
334
472
 
473
+ // For rate-limited responses, include Retry-After header
474
+ if (
475
+ authResult.statusCode === 429 &&
476
+ authResult.retryAfterSeconds !== undefined
477
+ ) {
478
+ return jsonResponseWithHeaders(
479
+ { error: authResult.error },
480
+ authResult.statusCode,
481
+ { "Retry-After": String(authResult.retryAfterSeconds) },
482
+ );
483
+ }
484
+
335
485
  return jsonResponse(
336
486
  { error: authResult.error },
337
487
  authResult.statusCode,
@@ -469,9 +619,255 @@ export function registerRoutes(
469
619
  }
470
620
  }),
471
621
  });
622
+
623
+ // --- POST /agent-bridge/channels ---
624
+ // Create a new channel (admin operation)
625
+ http.route({
626
+ path: `${prefix}/channels`,
627
+ method: "POST",
628
+ handler: httpActionGeneric(async (ctx, request) => {
629
+ let body: {
630
+ channelName?: string;
631
+ description?: string;
632
+ };
633
+ try {
634
+ body = await request.json();
635
+ } catch {
636
+ return jsonResponse({ error: "Invalid JSON body" }, 400);
637
+ }
638
+
639
+ const { channelName, description } = body;
640
+
641
+ if (!channelName) {
642
+ return jsonResponse(
643
+ { error: "Missing required field: channelName" },
644
+ 400,
645
+ );
646
+ }
647
+
648
+ try {
649
+ const channelId = await ctx.runMutation(
650
+ component.channels.createChannel,
651
+ {
652
+ appName: config.appName,
653
+ channelName,
654
+ description,
655
+ },
656
+ );
657
+
658
+ return jsonResponse({ channelId, channelName }, 200);
659
+ } catch (error: unknown) {
660
+ const errorMessage =
661
+ error instanceof Error ? error.message : "Failed to create channel";
662
+ return jsonResponse({ error: errorMessage }, 500);
663
+ }
664
+ }),
665
+ });
666
+
667
+ // --- GET /agent-bridge/channels ---
668
+ // List active channels for this app
669
+ http.route({
670
+ path: `${prefix}/channels`,
671
+ method: "GET",
672
+ handler: httpActionGeneric(async (ctx) => {
673
+ try {
674
+ const channels = await ctx.runQuery(
675
+ component.channels.listChannels,
676
+ { appName: config.appName },
677
+ );
678
+
679
+ return jsonResponse({ channels }, 200);
680
+ } catch (error: unknown) {
681
+ const errorMessage =
682
+ error instanceof Error ? error.message : "Failed to list channels";
683
+ return jsonResponse({ error: errorMessage }, 500);
684
+ }
685
+ }),
686
+ });
687
+
688
+ // --- POST /agent-bridge/channels/post ---
689
+ // Post a message to a channel (requires instanceToken)
690
+ http.route({
691
+ path: `${prefix}/channels/post`,
692
+ method: "POST",
693
+ handler: httpActionGeneric(async (ctx, request) => {
694
+ let body: {
695
+ instanceToken?: string;
696
+ channelName?: string;
697
+ payload?: string;
698
+ priority?: number;
699
+ ttlMinutes?: number;
700
+ };
701
+ try {
702
+ body = await request.json();
703
+ } catch {
704
+ return jsonResponse({ error: "Invalid JSON body" }, 400);
705
+ }
706
+
707
+ const { instanceToken, channelName, payload, priority, ttlMinutes } =
708
+ body;
709
+
710
+ if (!instanceToken || !channelName || !payload) {
711
+ return jsonResponse(
712
+ {
713
+ error:
714
+ "Missing required fields: instanceToken, channelName, payload",
715
+ },
716
+ 400,
717
+ );
718
+ }
719
+
720
+ try {
721
+ const result = await ctx.runMutation(
722
+ component.channels.postMessage,
723
+ {
724
+ instanceToken,
725
+ appName: config.appName,
726
+ channelName,
727
+ payload,
728
+ priority,
729
+ ttlMinutes,
730
+ },
731
+ );
732
+
733
+ return jsonResponse(result, 200);
734
+ } catch (error: unknown) {
735
+ const errorMessage =
736
+ error instanceof Error ? error.message : "Failed to post message";
737
+ // Map authentication errors to appropriate status codes
738
+ if (
739
+ errorMessage.includes("Invalid instance token") ||
740
+ errorMessage.includes("expired")
741
+ ) {
742
+ return jsonResponse({ error: errorMessage }, 401);
743
+ }
744
+ if (
745
+ errorMessage.includes("revoked") ||
746
+ errorMessage.includes("does not match")
747
+ ) {
748
+ return jsonResponse({ error: errorMessage }, 403);
749
+ }
750
+ return jsonResponse({ error: errorMessage }, 500);
751
+ }
752
+ }),
753
+ });
754
+
755
+ // --- POST /agent-bridge/channels/read ---
756
+ // Read messages from a channel (POST because it has body with filters)
757
+ http.route({
758
+ path: `${prefix}/channels/read`,
759
+ method: "POST",
760
+ handler: httpActionGeneric(async (ctx, request) => {
761
+ let body: {
762
+ instanceToken?: string;
763
+ channelName?: string;
764
+ limit?: number;
765
+ after?: number;
766
+ };
767
+ try {
768
+ body = await request.json();
769
+ } catch {
770
+ return jsonResponse({ error: "Invalid JSON body" }, 400);
771
+ }
772
+
773
+ const { instanceToken, channelName, limit, after } = body;
774
+
775
+ if (!instanceToken || !channelName) {
776
+ return jsonResponse(
777
+ {
778
+ error: "Missing required fields: instanceToken, channelName",
779
+ },
780
+ 400,
781
+ );
782
+ }
783
+
784
+ try {
785
+ const messages = await ctx.runQuery(
786
+ component.channels.readMessages,
787
+ {
788
+ instanceToken,
789
+ appName: config.appName,
790
+ channelName,
791
+ limit,
792
+ after,
793
+ },
794
+ );
795
+
796
+ return jsonResponse({ messages }, 200);
797
+ } catch (error: unknown) {
798
+ const errorMessage =
799
+ error instanceof Error ? error.message : "Failed to read messages";
800
+ if (
801
+ errorMessage.includes("Invalid instance token") ||
802
+ errorMessage.includes("expired")
803
+ ) {
804
+ return jsonResponse({ error: errorMessage }, 401);
805
+ }
806
+ if (
807
+ errorMessage.includes("revoked") ||
808
+ errorMessage.includes("does not match")
809
+ ) {
810
+ return jsonResponse({ error: errorMessage }, 403);
811
+ }
812
+ return jsonResponse({ error: errorMessage }, 500);
813
+ }
814
+ }),
815
+ });
816
+
817
+ // --- POST /agent-bridge/channels/mark-read ---
818
+ // Mark a message as read by an agent
819
+ http.route({
820
+ path: `${prefix}/channels/mark-read`,
821
+ method: "POST",
822
+ handler: httpActionGeneric(async (ctx, request) => {
823
+ let body: {
824
+ instanceToken?: string;
825
+ messageId?: string;
826
+ };
827
+ try {
828
+ body = await request.json();
829
+ } catch {
830
+ return jsonResponse({ error: "Invalid JSON body" }, 400);
831
+ }
832
+
833
+ const { instanceToken, messageId } = body;
834
+
835
+ if (!instanceToken || !messageId) {
836
+ return jsonResponse(
837
+ {
838
+ error: "Missing required fields: instanceToken, messageId",
839
+ },
840
+ 400,
841
+ );
842
+ }
843
+
844
+ try {
845
+ const success = await ctx.runMutation(
846
+ component.channels.markAsRead,
847
+ {
848
+ instanceToken,
849
+ appName: config.appName,
850
+ messageId,
851
+ },
852
+ );
853
+
854
+ return jsonResponse({ success }, 200);
855
+ } catch (error: unknown) {
856
+ const errorMessage =
857
+ error instanceof Error ? error.message : "Failed to mark as read";
858
+ if (
859
+ errorMessage.includes("Invalid instance token") ||
860
+ errorMessage.includes("expired")
861
+ ) {
862
+ return jsonResponse({ error: errorMessage }, 401);
863
+ }
864
+ return jsonResponse({ error: errorMessage }, 500);
865
+ }
866
+ }),
867
+ });
472
868
  }
473
869
 
474
- // --- Helper ---
870
+ // --- Helpers ---
475
871
 
476
872
  function jsonResponse(data: unknown, status: number): Response {
477
873
  return new Response(JSON.stringify(data), {
@@ -479,3 +875,14 @@ function jsonResponse(data: unknown, status: number): Response {
479
875
  headers: { "Content-Type": "application/json" },
480
876
  });
481
877
  }
878
+
879
+ function jsonResponseWithHeaders(
880
+ data: unknown,
881
+ status: number,
882
+ extraHeaders: Record<string, string>,
883
+ ): Response {
884
+ return new Response(JSON.stringify(data), {
885
+ status,
886
+ headers: { "Content-Type": "application/json", ...extraHeaders },
887
+ });
888
+ }
@@ -8,6 +8,8 @@
8
8
  * @module
9
9
  */
10
10
 
11
+ import type * as channels from "../channels.js";
12
+ import type * as circuitBreaker from "../circuitBreaker.js";
11
13
  import type * as gateway from "../gateway.js";
12
14
  import type * as permissions from "../permissions.js";
13
15
  import type * as provisioning from "../provisioning.js";
@@ -21,6 +23,8 @@ import type {
21
23
  import { anyApi, componentsGeneric } from "convex/server";
22
24
 
23
25
  const fullApi: ApiFromModules<{
26
+ channels: typeof channels;
27
+ circuitBreaker: typeof circuitBreaker;
24
28
  gateway: typeof gateway;
25
29
  permissions: typeof permissions;
26
30
  provisioning: typeof provisioning;
@@ -23,11 +23,151 @@ import type { FunctionReference } from "convex/server";
23
23
  */
24
24
  export type ComponentApi<Name extends string | undefined = string | undefined> =
25
25
  {
26
+ channels: {
27
+ createChannel: FunctionReference<
28
+ "mutation",
29
+ "internal",
30
+ { appName: string; channelName: string; description?: string },
31
+ string,
32
+ Name
33
+ >;
34
+ deactivateChannel: FunctionReference<
35
+ "mutation",
36
+ "internal",
37
+ { appName: string; channelName: string },
38
+ boolean,
39
+ Name
40
+ >;
41
+ getUnreadCount: FunctionReference<
42
+ "query",
43
+ "internal",
44
+ { appName: string; channelName: string; instanceToken: string },
45
+ number,
46
+ Name
47
+ >;
48
+ listChannels: FunctionReference<
49
+ "query",
50
+ "internal",
51
+ { appName: string },
52
+ Array<{
53
+ channelName: string;
54
+ createdAt: number;
55
+ description?: string;
56
+ isActive: boolean;
57
+ }>,
58
+ Name
59
+ >;
60
+ markAsRead: FunctionReference<
61
+ "mutation",
62
+ "internal",
63
+ { appName: string; instanceToken: string; messageId: string },
64
+ boolean,
65
+ Name
66
+ >;
67
+ postMessage: FunctionReference<
68
+ "mutation",
69
+ "internal",
70
+ {
71
+ appName: string;
72
+ channelName: string;
73
+ instanceToken: string;
74
+ payload: string;
75
+ priority?: number;
76
+ ttlMinutes?: number;
77
+ },
78
+ { messageId: string; success: boolean },
79
+ Name
80
+ >;
81
+ readMessages: FunctionReference<
82
+ "query",
83
+ "internal",
84
+ {
85
+ after?: number;
86
+ appName: string;
87
+ channelName: string;
88
+ instanceToken: string;
89
+ limit?: number;
90
+ },
91
+ Array<{
92
+ expiresAt: number;
93
+ fromAgentId: string;
94
+ messageId: string;
95
+ metadata: { priority: number; ttl: number };
96
+ payload: string;
97
+ readBy: Array<string>;
98
+ sentAt: number;
99
+ }>,
100
+ Name
101
+ >;
102
+ };
103
+ circuitBreaker: {
104
+ checkAndIncrement: FunctionReference<
105
+ "mutation",
106
+ "internal",
107
+ {
108
+ agentId: string;
109
+ appName: string;
110
+ estimatedCost: number;
111
+ limits: { requestsPerHour: number; tokenBudget: number };
112
+ },
113
+ {
114
+ allowed: boolean;
115
+ currentCount: number;
116
+ currentTokens: number;
117
+ reason?: string;
118
+ },
119
+ Name
120
+ >;
121
+ getStatus: FunctionReference<
122
+ "query",
123
+ "internal",
124
+ { agentId: string; appName: string },
125
+ {
126
+ agentId: string;
127
+ appName: string;
128
+ blockedAt?: number;
129
+ blockedReason?: string;
130
+ isBlocked: boolean;
131
+ requestCount: number;
132
+ tokenEstimate: number;
133
+ windowHour: string;
134
+ } | null,
135
+ Name
136
+ >;
137
+ listBlocked: FunctionReference<
138
+ "query",
139
+ "internal",
140
+ {},
141
+ Array<{
142
+ agentId: string;
143
+ appName: string;
144
+ blockedAt?: number;
145
+ blockedReason?: string;
146
+ isBlocked: boolean;
147
+ requestCount: number;
148
+ tokenEstimate: number;
149
+ windowHour: string;
150
+ }>,
151
+ Name
152
+ >;
153
+ resetCounter: FunctionReference<
154
+ "mutation",
155
+ "internal",
156
+ { agentId: string; appName: string },
157
+ boolean,
158
+ Name
159
+ >;
160
+ };
26
161
  gateway: {
27
162
  authorizeRequest: FunctionReference<
28
163
  "mutation",
29
164
  "internal",
30
- { appName: string; functionName: string; instanceToken: string },
165
+ {
166
+ appName: string;
167
+ estimatedCost?: number;
168
+ functionName: string;
169
+ instanceToken: string;
170
+ },
31
171
  | {
32
172
  agentId: string;
33
173
  appName: string;
@@ -41,6 +181,7 @@ export type ComponentApi<Name extends string | undefined = string | undefined> =
41
181
  error: string;
42
182
  matchedPattern?: string;
43
183
  matchedPermission?: "allow" | "deny" | "rate_limited";
184
+ retryAfterSeconds?: number;
44
185
  statusCode: number;
45
186
  },
46
187
  Name