@okrlinkhub/agent-bridge 0.2.0 → 2.0.1
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.
- package/README.md +132 -122
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +108 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/client/index.d.ts +54 -262
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +188 -539
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +4 -8
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +75 -257
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/agentBridgeUtils.d.ts +9 -0
- package/dist/component/agentBridgeUtils.d.ts.map +1 -0
- package/dist/component/agentBridgeUtils.js +36 -0
- package/dist/component/agentBridgeUtils.js.map +1 -0
- package/dist/component/agents.d.ts +30 -0
- package/dist/component/agents.d.ts.map +1 -0
- package/dist/component/agents.js +124 -0
- package/dist/component/agents.js.map +1 -0
- package/dist/component/gateway.d.ts +46 -51
- package/dist/component/gateway.d.ts.map +1 -1
- package/dist/component/gateway.js +176 -227
- package/dist/component/gateway.js.map +1 -1
- package/dist/component/permissions.d.ts +30 -84
- package/dist/component/permissions.d.ts.map +1 -1
- package/dist/component/permissions.js +80 -203
- package/dist/component/permissions.js.map +1 -1
- package/dist/component/schema.d.ts +58 -223
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +32 -126
- package/dist/component/schema.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +3 -2
- package/src/cli/init.ts +124 -0
- package/src/client/index.test.ts +147 -0
- package/src/client/index.ts +310 -790
- package/src/component/_generated/api.ts +4 -8
- package/src/component/_generated/component.ts +75 -310
- package/src/component/agentBridgeUtils.ts +56 -0
- package/src/component/agents.ts +138 -0
- package/src/component/gateway.ts +213 -279
- package/src/component/permissions.ts +89 -259
- package/src/component/schema.ts +34 -146
- package/src/react/index.ts +5 -6
- package/dist/component/channels.d.ts +0 -83
- package/dist/component/channels.d.ts.map +0 -1
- package/dist/component/channels.js +0 -288
- package/dist/component/channels.js.map +0 -1
- package/dist/component/circuitBreaker.d.ts +0 -73
- package/dist/component/circuitBreaker.d.ts.map +0 -1
- package/dist/component/circuitBreaker.js +0 -216
- package/dist/component/circuitBreaker.js.map +0 -1
- package/dist/component/provisioning.d.ts +0 -87
- package/dist/component/provisioning.d.ts.map +0 -1
- package/dist/component/provisioning.js +0 -343
- package/dist/component/provisioning.js.map +0 -1
- package/dist/component/registry.d.ts +0 -46
- package/dist/component/registry.d.ts.map +0 -1
- package/dist/component/registry.js +0 -121
- package/dist/component/registry.js.map +0 -1
- package/src/component/channels.ts +0 -374
- package/src/component/circuitBreaker.ts +0 -250
- package/src/component/provisioning.ts +0 -402
- package/src/component/registry.ts +0 -152
|
@@ -1,241 +1,118 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
|
-
import { mutation, query
|
|
3
|
-
|
|
4
|
-
const
|
|
2
|
+
import { mutation, query } from "./_generated/server.js";
|
|
3
|
+
import { patternMatchesAvailableFunctions } from "./agentBridgeUtils.js";
|
|
4
|
+
const permissionRuleValidator = v.object({
|
|
5
|
+
pattern: v.string(),
|
|
5
6
|
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
6
7
|
rateLimitConfig: v.optional(v.object({
|
|
7
8
|
requestsPerHour: v.number(),
|
|
8
|
-
tokenBudget: v.number(),
|
|
9
|
+
tokenBudget: v.optional(v.number()),
|
|
9
10
|
})),
|
|
10
|
-
matchedPattern: v.optional(v.string()),
|
|
11
11
|
});
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Calculate specificity score for a pattern.
|
|
15
|
-
* More specific patterns (longer fixed prefix before the first wildcard)
|
|
16
|
-
* get higher scores.
|
|
17
|
-
*/
|
|
18
|
-
function patternSpecificity(pattern) {
|
|
19
|
-
const wildcardIndex = pattern.indexOf("*");
|
|
20
|
-
if (wildcardIndex === -1)
|
|
21
|
-
return pattern.length;
|
|
22
|
-
return wildcardIndex;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Check if a function name matches a permission pattern.
|
|
26
|
-
* Supports "*" as a wildcard that matches any characters.
|
|
27
|
-
* Examples: "okr:*" matches "okr:getObjectives", "*" matches anything.
|
|
28
|
-
*/
|
|
29
|
-
function matchesPattern(functionName, pattern) {
|
|
30
|
-
if (pattern === "*")
|
|
31
|
-
return true;
|
|
32
|
-
// Escape regex special chars except *, then replace * with .*
|
|
33
|
-
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
34
|
-
const regexStr = "^" + escaped.replace(/\*/g, ".*") + "$";
|
|
35
|
-
const regex = new RegExp(regexStr);
|
|
36
|
-
return regex.test(functionName);
|
|
37
|
-
}
|
|
38
|
-
// --- Public functions ---
|
|
39
|
-
/**
|
|
40
|
-
* Set a permission for an agent on a specific app.
|
|
41
|
-
* If a permission with the same agentId + appName + functionPattern exists, it is updated.
|
|
42
|
-
*/
|
|
43
|
-
export const setPermission = mutation({
|
|
12
|
+
export const setAgentPermissions = mutation({
|
|
44
13
|
args: {
|
|
45
|
-
agentId: v.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
49
|
-
rateLimitConfig: v.optional(v.object({
|
|
50
|
-
requestsPerHour: v.number(),
|
|
51
|
-
tokenBudget: v.number(),
|
|
52
|
-
})),
|
|
53
|
-
createdBy: v.string(),
|
|
14
|
+
agentId: v.id("agents"),
|
|
15
|
+
rules: v.array(permissionRuleValidator),
|
|
16
|
+
availableFunctionKeys: v.array(v.string()),
|
|
54
17
|
},
|
|
55
|
-
returns: v.
|
|
18
|
+
returns: v.number(),
|
|
56
19
|
handler: async (ctx, args) => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const match = existing.find((p) => p.functionPattern === args.functionPattern);
|
|
63
|
-
if (match) {
|
|
64
|
-
await ctx.db.patch(match._id, {
|
|
65
|
-
permission: args.permission,
|
|
66
|
-
rateLimitConfig: args.rateLimitConfig,
|
|
67
|
-
createdBy: args.createdBy,
|
|
68
|
-
createdAt: Date.now(),
|
|
69
|
-
});
|
|
70
|
-
return match._id;
|
|
20
|
+
for (const rule of args.rules) {
|
|
21
|
+
const isValid = patternMatchesAvailableFunctions(rule.pattern, args.availableFunctionKeys);
|
|
22
|
+
if (!isValid) {
|
|
23
|
+
throw new Error(`Pattern "${rule.pattern}" does not match any configured function`);
|
|
24
|
+
}
|
|
71
25
|
}
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
functionPattern: args.functionPattern,
|
|
76
|
-
permission: args.permission,
|
|
77
|
-
rateLimitConfig: args.rateLimitConfig,
|
|
78
|
-
createdAt: Date.now(),
|
|
79
|
-
createdBy: args.createdBy,
|
|
80
|
-
});
|
|
81
|
-
return id;
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
/**
|
|
85
|
-
* Remove a specific permission.
|
|
86
|
-
*/
|
|
87
|
-
export const removePermission = mutation({
|
|
88
|
-
args: {
|
|
89
|
-
agentId: v.string(),
|
|
90
|
-
appName: v.string(),
|
|
91
|
-
functionPattern: v.string(),
|
|
92
|
-
},
|
|
93
|
-
returns: v.boolean(),
|
|
94
|
-
handler: async (ctx, args) => {
|
|
95
|
-
const perms = await ctx.db
|
|
96
|
-
.query("functionPermissions")
|
|
97
|
-
.withIndex("by_agent_and_app", (q) => q.eq("agentId", args.agentId).eq("appName", args.appName))
|
|
98
|
-
.collect();
|
|
99
|
-
const match = perms.find((p) => p.functionPattern === args.functionPattern);
|
|
100
|
-
if (!match)
|
|
101
|
-
return false;
|
|
102
|
-
await ctx.db.delete(match._id);
|
|
103
|
-
return true;
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
/**
|
|
107
|
-
* Check permission for a specific function call.
|
|
108
|
-
* Applies pattern matching with specificity ordering (most specific pattern wins).
|
|
109
|
-
* Default: deny if no matching pattern is found.
|
|
110
|
-
*/
|
|
111
|
-
export const checkPermission = query({
|
|
112
|
-
args: {
|
|
113
|
-
agentId: v.string(),
|
|
114
|
-
appName: v.string(),
|
|
115
|
-
functionName: v.string(),
|
|
116
|
-
},
|
|
117
|
-
returns: permissionResultValidator,
|
|
118
|
-
handler: async (ctx, args) => {
|
|
119
|
-
const permissions = await ctx.db
|
|
120
|
-
.query("functionPermissions")
|
|
121
|
-
.withIndex("by_agent_and_app", (q) => q.eq("agentId", args.agentId).eq("appName", args.appName))
|
|
26
|
+
const existingRules = await ctx.db
|
|
27
|
+
.query("agentPermissions")
|
|
28
|
+
.withIndex("by_agentId", (q) => q.eq("agentId", args.agentId))
|
|
122
29
|
.collect();
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
30
|
+
for (const existingRule of existingRules) {
|
|
31
|
+
await ctx.db.delete(existingRule._id);
|
|
32
|
+
}
|
|
33
|
+
for (const rule of args.rules) {
|
|
34
|
+
await ctx.db.insert("agentPermissions", {
|
|
35
|
+
agentId: args.agentId,
|
|
36
|
+
functionPattern: rule.pattern,
|
|
37
|
+
permission: rule.permission,
|
|
38
|
+
rateLimitConfig: rule.rateLimitConfig,
|
|
39
|
+
updatedAt: Date.now(),
|
|
40
|
+
});
|
|
131
41
|
}
|
|
132
|
-
|
|
133
|
-
const best = matches[0];
|
|
134
|
-
return {
|
|
135
|
-
permission: best.permission,
|
|
136
|
-
rateLimitConfig: best.rateLimitConfig,
|
|
137
|
-
matchedPattern: best.functionPattern,
|
|
138
|
-
};
|
|
42
|
+
return args.rules.length;
|
|
139
43
|
},
|
|
140
44
|
});
|
|
141
|
-
|
|
142
|
-
* List all permissions for an agent on a specific app.
|
|
143
|
-
*/
|
|
144
|
-
export const listPermissions = query({
|
|
45
|
+
export const listAgentPermissions = query({
|
|
145
46
|
args: {
|
|
146
|
-
agentId: v.
|
|
147
|
-
appName: v.string(),
|
|
47
|
+
agentId: v.id("agents"),
|
|
148
48
|
},
|
|
149
49
|
returns: v.array(v.object({
|
|
150
50
|
functionPattern: v.string(),
|
|
151
51
|
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
152
52
|
rateLimitConfig: v.optional(v.object({
|
|
153
53
|
requestsPerHour: v.number(),
|
|
154
|
-
tokenBudget: v.number(),
|
|
54
|
+
tokenBudget: v.optional(v.number()),
|
|
155
55
|
})),
|
|
156
|
-
|
|
157
|
-
createdBy: v.string(),
|
|
56
|
+
updatedAt: v.number(),
|
|
158
57
|
})),
|
|
159
58
|
handler: async (ctx, args) => {
|
|
160
|
-
const
|
|
161
|
-
.query("
|
|
162
|
-
.withIndex("
|
|
59
|
+
const rules = await ctx.db
|
|
60
|
+
.query("agentPermissions")
|
|
61
|
+
.withIndex("by_agentId", (q) => q.eq("agentId", args.agentId))
|
|
163
62
|
.collect();
|
|
164
|
-
return
|
|
165
|
-
functionPattern:
|
|
166
|
-
permission:
|
|
167
|
-
rateLimitConfig:
|
|
168
|
-
|
|
169
|
-
createdBy: p.createdBy,
|
|
63
|
+
return rules.map((rule) => ({
|
|
64
|
+
functionPattern: rule.functionPattern,
|
|
65
|
+
permission: rule.permission,
|
|
66
|
+
rateLimitConfig: rule.rateLimitConfig,
|
|
67
|
+
updatedAt: rule.updatedAt,
|
|
170
68
|
}));
|
|
171
69
|
},
|
|
172
70
|
});
|
|
173
|
-
|
|
174
|
-
* Remove all permissions for a specific agent on a specific app.
|
|
175
|
-
*/
|
|
176
|
-
export const clearPermissions = mutation({
|
|
71
|
+
export const setFunctionOverrides = mutation({
|
|
177
72
|
args: {
|
|
178
|
-
|
|
179
|
-
|
|
73
|
+
overrides: v.array(v.object({
|
|
74
|
+
key: v.string(),
|
|
75
|
+
enabled: v.boolean(),
|
|
76
|
+
globalRateLimit: v.optional(v.number()),
|
|
77
|
+
})),
|
|
78
|
+
availableFunctionKeys: v.array(v.string()),
|
|
180
79
|
},
|
|
181
80
|
returns: v.number(),
|
|
182
81
|
handler: async (ctx, args) => {
|
|
183
|
-
const
|
|
184
|
-
.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
82
|
+
for (const override of args.overrides) {
|
|
83
|
+
if (!args.availableFunctionKeys.includes(override.key)) {
|
|
84
|
+
throw new Error(`Function "${override.key}" is not exposed in config`);
|
|
85
|
+
}
|
|
86
|
+
const existing = await ctx.db
|
|
87
|
+
.query("agentFunctions")
|
|
88
|
+
.withIndex("by_key", (q) => q.eq("key", override.key))
|
|
89
|
+
.unique();
|
|
90
|
+
if (existing) {
|
|
91
|
+
await ctx.db.patch(existing._id, {
|
|
92
|
+
enabled: override.enabled,
|
|
93
|
+
globalRateLimit: override.globalRateLimit,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await ctx.db.insert("agentFunctions", {
|
|
98
|
+
key: override.key,
|
|
99
|
+
enabled: override.enabled,
|
|
100
|
+
globalRateLimit: override.globalRateLimit,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
189
103
|
}
|
|
190
|
-
return
|
|
104
|
+
return args.overrides.length;
|
|
191
105
|
},
|
|
192
106
|
});
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
returns: v.object({
|
|
203
|
-
functionName: v.string(),
|
|
204
|
-
permissions: v.array(v.object({
|
|
205
|
-
functionPattern: v.string(),
|
|
206
|
-
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
207
|
-
specificity: v.number(),
|
|
208
|
-
})),
|
|
209
|
-
matches: v.array(v.object({
|
|
210
|
-
functionPattern: v.string(),
|
|
211
|
-
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
212
|
-
specificity: v.number(),
|
|
213
|
-
})),
|
|
214
|
-
bestMatch: v.optional(v.object({
|
|
215
|
-
functionPattern: v.string(),
|
|
216
|
-
permission: v.union(v.literal("allow"), v.literal("deny"), v.literal("rate_limited")),
|
|
217
|
-
specificity: v.number(),
|
|
218
|
-
})),
|
|
219
|
-
}),
|
|
220
|
-
handler: async (ctx, args) => {
|
|
221
|
-
const permissions = await ctx.db
|
|
222
|
-
.query("functionPermissions")
|
|
223
|
-
.withIndex("by_agent_and_app", (q) => q.eq("agentId", args.agentId).eq("appName", args.appName))
|
|
224
|
-
.collect();
|
|
225
|
-
const withSpecificity = permissions.map((p) => ({
|
|
226
|
-
functionPattern: p.functionPattern,
|
|
227
|
-
permission: p.permission,
|
|
228
|
-
specificity: patternSpecificity(p.functionPattern),
|
|
229
|
-
}));
|
|
230
|
-
const matches = withSpecificity
|
|
231
|
-
.filter((p) => matchesPattern(args.functionName, p.functionPattern))
|
|
232
|
-
.sort((a, b) => b.specificity - a.specificity);
|
|
233
|
-
return {
|
|
234
|
-
functionName: args.functionName,
|
|
235
|
-
permissions: withSpecificity,
|
|
236
|
-
matches,
|
|
237
|
-
bestMatch: matches[0],
|
|
238
|
-
};
|
|
107
|
+
export const listFunctionOverrides = query({
|
|
108
|
+
args: {},
|
|
109
|
+
returns: v.array(v.object({
|
|
110
|
+
key: v.string(),
|
|
111
|
+
enabled: v.boolean(),
|
|
112
|
+
globalRateLimit: v.optional(v.number()),
|
|
113
|
+
})),
|
|
114
|
+
handler: async (ctx) => {
|
|
115
|
+
return await ctx.db.query("agentFunctions").collect();
|
|
239
116
|
},
|
|
240
117
|
});
|
|
241
118
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/component/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/component/permissions.ts"],"names":[],"mappings":"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"}
|