@okrlinkhub/agent-factory 0.2.10 → 0.2.11
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/package.json +1 -1
- package/src/client/index.ts +2 -2
- package/src/component/lib.test.ts +10 -0
- package/src/component/pushing.ts +36 -3
- package/dist/client/_generated/_ignore.d.ts +0 -1
- package/dist/client/_generated/_ignore.d.ts.map +0 -1
- package/dist/client/_generated/_ignore.js +0 -3
- package/dist/client/_generated/_ignore.js.map +0 -1
- package/dist/client/bridge.d.ts +0 -65
- package/dist/client/bridge.d.ts.map +0 -1
- package/dist/client/bridge.js +0 -192
- package/dist/client/bridge.js.map +0 -1
- package/dist/client/index.d.ts +0 -516
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -795
- package/dist/client/index.js.map +0 -1
- package/dist/component/_generated/api.d.ts +0 -46
- package/dist/component/_generated/api.d.ts.map +0 -1
- package/dist/component/_generated/api.js +0 -31
- package/dist/component/_generated/api.js.map +0 -1
- package/dist/component/_generated/component.d.ts +0 -1396
- package/dist/component/_generated/component.d.ts.map +0 -1
- package/dist/component/_generated/component.js +0 -11
- package/dist/component/_generated/component.js.map +0 -1
- package/dist/component/_generated/dataModel.d.ts +0 -46
- package/dist/component/_generated/dataModel.d.ts.map +0 -1
- package/dist/component/_generated/dataModel.js +0 -11
- package/dist/component/_generated/dataModel.js.map +0 -1
- package/dist/component/_generated/server.d.ts +0 -121
- package/dist/component/_generated/server.d.ts.map +0 -1
- package/dist/component/_generated/server.js +0 -78
- package/dist/component/_generated/server.js.map +0 -1
- package/dist/component/config.d.ts +0 -254
- package/dist/component/config.d.ts.map +0 -1
- package/dist/component/config.js +0 -152
- package/dist/component/config.js.map +0 -1
- package/dist/component/convex.config.d.ts +0 -3
- package/dist/component/convex.config.d.ts.map +0 -1
- package/dist/component/convex.config.js +0 -3
- package/dist/component/convex.config.js.map +0 -1
- package/dist/component/identity.d.ts +0 -111
- package/dist/component/identity.d.ts.map +0 -1
- package/dist/component/identity.js +0 -455
- package/dist/component/identity.js.map +0 -1
- package/dist/component/lib.d.ts +0 -6
- package/dist/component/lib.d.ts.map +0 -1
- package/dist/component/lib.js +0 -6
- package/dist/component/lib.js.map +0 -1
- package/dist/component/providers/fly.d.ts +0 -51
- package/dist/component/providers/fly.d.ts.map +0 -1
- package/dist/component/providers/fly.js +0 -234
- package/dist/component/providers/fly.js.map +0 -1
- package/dist/component/pushing.d.ts +0 -256
- package/dist/component/pushing.d.ts.map +0 -1
- package/dist/component/pushing.js +0 -983
- package/dist/component/pushing.js.map +0 -1
- package/dist/component/queue.d.ts +0 -361
- package/dist/component/queue.d.ts.map +0 -1
- package/dist/component/queue.js +0 -1407
- package/dist/component/queue.js.map +0 -1
- package/dist/component/scheduler.d.ts +0 -116
- package/dist/component/scheduler.d.ts.map +0 -1
- package/dist/component/scheduler.js +0 -410
- package/dist/component/scheduler.js.map +0 -1
- package/dist/component/schema.d.ts +0 -648
- package/dist/component/schema.d.ts.map +0 -1
- package/dist/component/schema.js +0 -295
- package/dist/component/schema.js.map +0 -1
- package/dist/react/index.d.ts +0 -2
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js +0 -6
- package/dist/react/index.js.map +0 -1
package/package.json
CHANGED
package/src/client/index.ts
CHANGED
|
@@ -95,7 +95,7 @@ export function exposeApi(
|
|
|
95
95
|
args: {},
|
|
96
96
|
handler: async (ctx) => {
|
|
97
97
|
await options.auth(ctx, { type: "read" });
|
|
98
|
-
return await ctx.runQuery((component.queue as any).
|
|
98
|
+
return await ctx.runQuery((component.queue as any).getProviderRuntimeConfig, {});
|
|
99
99
|
},
|
|
100
100
|
}),
|
|
101
101
|
setProviderRuntimeConfig: mutationGeneric({
|
|
@@ -104,7 +104,7 @@ export function exposeApi(
|
|
|
104
104
|
},
|
|
105
105
|
handler: async (ctx, args) => {
|
|
106
106
|
await options.auth(ctx, { type: "write" });
|
|
107
|
-
await ctx.runMutation((component.queue as any).
|
|
107
|
+
await ctx.runMutation((component.queue as any).upsertProviderRuntimeConfig, args);
|
|
108
108
|
return null;
|
|
109
109
|
},
|
|
110
110
|
}),
|
|
@@ -501,6 +501,8 @@ describe("component lib", () => {
|
|
|
501
501
|
expect(queueStats.queuedReady).toBe(1);
|
|
502
502
|
const claim = await t.mutation(api.lib.claim, { workerId: "worker-push-fallback-1" });
|
|
503
503
|
expect(claim?.conversationId).toBe("user:user-push-1");
|
|
504
|
+
expect(claim?.payload.provider).toBe("system_push");
|
|
505
|
+
expect(claim?.payload.providerUserId).toBe("user-push-1");
|
|
504
506
|
|
|
505
507
|
const jobDispatches = await t.query((api.lib as any).listPushDispatchesByJob, {
|
|
506
508
|
jobId,
|
|
@@ -550,6 +552,10 @@ describe("component lib", () => {
|
|
|
550
552
|
|
|
551
553
|
const claim = await t.mutation(api.lib.claim, { workerId: "worker-push-telegram-manual-1" });
|
|
552
554
|
expect(claim?.conversationId).toBe("telegram:8246761447");
|
|
555
|
+
expect(claim?.payload.provider).toBe("telegram");
|
|
556
|
+
expect(claim?.payload.providerUserId).toBe("tg-user-manual-1");
|
|
557
|
+
expect(claim?.payload.metadata?.telegramChatId).toBe("8246761447");
|
|
558
|
+
expect(claim?.payload.metadata?.telegramUserId).toBe("tg-user-manual-1");
|
|
553
559
|
});
|
|
554
560
|
|
|
555
561
|
test("dispatchDuePushJobs should reuse telegram chat conversation id when available", async () => {
|
|
@@ -595,6 +601,10 @@ describe("component lib", () => {
|
|
|
595
601
|
|
|
596
602
|
const claim = await t.mutation(api.lib.claim, { workerId: "worker-push-telegram-scheduled-1" });
|
|
597
603
|
expect(claim?.conversationId).toBe("telegram:9988776655");
|
|
604
|
+
expect(claim?.payload.provider).toBe("telegram");
|
|
605
|
+
expect(claim?.payload.providerUserId).toBe("tg-user-scheduled-1");
|
|
606
|
+
expect(claim?.payload.metadata?.telegramChatId).toBe("9988776655");
|
|
607
|
+
expect(claim?.payload.metadata?.telegramUserId).toBe("tg-user-scheduled-1");
|
|
598
608
|
});
|
|
599
609
|
|
|
600
610
|
test("admin broadcast should enqueue to all active company agents", async () => {
|
package/src/component/pushing.ts
CHANGED
|
@@ -479,6 +479,9 @@ export const triggerPushJobNow = mutation({
|
|
|
479
479
|
}
|
|
480
480
|
const conversationTarget = await resolveConversationTargetForUser(ctx, job.consumerUserId);
|
|
481
481
|
const runKey = `manual:${job._id}:${nowMs}`;
|
|
482
|
+
const targetProviderUserId = conversationTarget.source === "telegram_chat"
|
|
483
|
+
? (conversationTarget.telegramUserId ?? conversationTarget.telegramChatId ?? job.consumerUserId)
|
|
484
|
+
: job.consumerUserId;
|
|
482
485
|
const messageId = await enqueuePushMessage(ctx, {
|
|
483
486
|
conversationId: conversationTarget.conversationId,
|
|
484
487
|
agentKey,
|
|
@@ -489,8 +492,16 @@ export const triggerPushJobNow = mutation({
|
|
|
489
492
|
runKey,
|
|
490
493
|
pushMode: "manual",
|
|
491
494
|
conversationTargetSource: conversationTarget.source,
|
|
495
|
+
...(conversationTarget.telegramChatId
|
|
496
|
+
? { telegramChatId: conversationTarget.telegramChatId }
|
|
497
|
+
: {}),
|
|
498
|
+
...(conversationTarget.telegramUserId
|
|
499
|
+
? { telegramUserId: conversationTarget.telegramUserId }
|
|
500
|
+
: {}),
|
|
492
501
|
},
|
|
493
502
|
scheduledFor: nowMs,
|
|
503
|
+
provider: conversationTarget.source === "telegram_chat" ? "telegram" : "system_push",
|
|
504
|
+
providerUserId: targetProviderUserId,
|
|
494
505
|
providerConfig: args.providerConfig,
|
|
495
506
|
});
|
|
496
507
|
await ctx.db.insert("messagePushDispatches", {
|
|
@@ -582,6 +593,9 @@ export const dispatchDuePushJobs = mutation({
|
|
|
582
593
|
}
|
|
583
594
|
const conversationTarget = await resolveConversationTargetForUser(ctx, job.consumerUserId);
|
|
584
595
|
try {
|
|
596
|
+
const targetProviderUserId = conversationTarget.source === "telegram_chat"
|
|
597
|
+
? (conversationTarget.telegramUserId ?? conversationTarget.telegramChatId ?? job.consumerUserId)
|
|
598
|
+
: job.consumerUserId;
|
|
585
599
|
const messageId = await enqueuePushMessage(ctx, {
|
|
586
600
|
conversationId: conversationTarget.conversationId,
|
|
587
601
|
agentKey,
|
|
@@ -592,8 +606,16 @@ export const dispatchDuePushJobs = mutation({
|
|
|
592
606
|
runKey,
|
|
593
607
|
pushMode: "scheduled",
|
|
594
608
|
conversationTargetSource: conversationTarget.source,
|
|
609
|
+
...(conversationTarget.telegramChatId
|
|
610
|
+
? { telegramChatId: conversationTarget.telegramChatId }
|
|
611
|
+
: {}),
|
|
612
|
+
...(conversationTarget.telegramUserId
|
|
613
|
+
? { telegramUserId: conversationTarget.telegramUserId }
|
|
614
|
+
: {}),
|
|
595
615
|
},
|
|
596
616
|
scheduledFor: nowMs,
|
|
617
|
+
provider: conversationTarget.source === "telegram_chat" ? "telegram" : "system_push",
|
|
618
|
+
providerUserId: targetProviderUserId,
|
|
597
619
|
providerConfig: args.providerConfig,
|
|
598
620
|
});
|
|
599
621
|
await ctx.db.insert("messagePushDispatches", {
|
|
@@ -692,6 +714,8 @@ export const sendBroadcastToAllActiveAgents = mutation({
|
|
|
692
714
|
companyId: args.companyId,
|
|
693
715
|
},
|
|
694
716
|
scheduledFor: nowMs,
|
|
717
|
+
provider: "system_push",
|
|
718
|
+
providerUserId: targetConsumerUserId,
|
|
695
719
|
providerConfig: args.providerConfig,
|
|
696
720
|
});
|
|
697
721
|
await ctx.db.insert("messagePushBroadcastDispatches", {
|
|
@@ -779,6 +803,8 @@ async function enqueuePushMessage(
|
|
|
779
803
|
text: string;
|
|
780
804
|
metadata: Record<string, string>;
|
|
781
805
|
scheduledFor: number;
|
|
806
|
+
provider: string;
|
|
807
|
+
providerUserId: string;
|
|
782
808
|
providerConfig?: ProviderConfig;
|
|
783
809
|
},
|
|
784
810
|
): Promise<Id<"messageQueue">> {
|
|
@@ -786,8 +812,8 @@ async function enqueuePushMessage(
|
|
|
786
812
|
conversationId: input.conversationId,
|
|
787
813
|
agentKey: input.agentKey,
|
|
788
814
|
payload: {
|
|
789
|
-
provider:
|
|
790
|
-
providerUserId: input.
|
|
815
|
+
provider: input.provider,
|
|
816
|
+
providerUserId: input.providerUserId,
|
|
791
817
|
messageText: input.text,
|
|
792
818
|
metadata: input.metadata,
|
|
793
819
|
},
|
|
@@ -819,7 +845,12 @@ async function resolveActiveAgentKeyForUser(ctx: MutationCtx, consumerUserId: st
|
|
|
819
845
|
async function resolveConversationTargetForUser(
|
|
820
846
|
ctx: MutationCtx,
|
|
821
847
|
consumerUserId: string,
|
|
822
|
-
): Promise<{
|
|
848
|
+
): Promise<{
|
|
849
|
+
conversationId: string;
|
|
850
|
+
source: "telegram_chat" | "legacy_user";
|
|
851
|
+
telegramChatId?: string;
|
|
852
|
+
telegramUserId?: string;
|
|
853
|
+
}> {
|
|
823
854
|
const binding = await ctx.db
|
|
824
855
|
.query("identityBindings")
|
|
825
856
|
.withIndex("by_consumerUserId_and_status", (q) =>
|
|
@@ -831,6 +862,8 @@ async function resolveConversationTargetForUser(
|
|
|
831
862
|
return {
|
|
832
863
|
conversationId: `telegram:${telegramChatId}`,
|
|
833
864
|
source: "telegram_chat",
|
|
865
|
+
telegramChatId,
|
|
866
|
+
telegramUserId: binding?.telegramUserId?.trim() || undefined,
|
|
834
867
|
};
|
|
835
868
|
}
|
|
836
869
|
return {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=_ignore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_ignore.d.ts","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_ignore.js","sourceRoot":"","sources":["../../../src/client/_generated/_ignore.ts"],"names":[],"mappings":";AAAA,kEAAkE"}
|
package/dist/client/bridge.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
export type HydratedBridgeRuntimeConfig = {
|
|
2
|
-
baseUrl: string | null;
|
|
3
|
-
appBaseUrlMapJson: string | null;
|
|
4
|
-
serviceId: string | null;
|
|
5
|
-
appKey: string | null;
|
|
6
|
-
serviceKey: string | null;
|
|
7
|
-
serviceKeySecretRef: string | null;
|
|
8
|
-
};
|
|
9
|
-
export type ResolvedBridgeRuntimeConfig = {
|
|
10
|
-
baseUrl: string;
|
|
11
|
-
serviceId: string;
|
|
12
|
-
appKey: string;
|
|
13
|
-
serviceKey: string;
|
|
14
|
-
};
|
|
15
|
-
export type BridgeExecutionResult = {
|
|
16
|
-
success: boolean;
|
|
17
|
-
status: number;
|
|
18
|
-
functionKey: string;
|
|
19
|
-
result?: unknown;
|
|
20
|
-
error?: string;
|
|
21
|
-
};
|
|
22
|
-
type ExecuteBridgeFunctionArgs = {
|
|
23
|
-
config: ResolvedBridgeRuntimeConfig;
|
|
24
|
-
functionKey: string;
|
|
25
|
-
args: Record<string, unknown>;
|
|
26
|
-
userToken?: string | null;
|
|
27
|
-
auditHeaders?: Record<string, string | undefined>;
|
|
28
|
-
fetchImpl?: typeof fetch;
|
|
29
|
-
retry?: {
|
|
30
|
-
maxAttempts?: number;
|
|
31
|
-
baseDelayMs?: number;
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
type MaybeExecuteBridgeToolCallArgs = {
|
|
35
|
-
toolName: string;
|
|
36
|
-
toolArgs: Record<string, unknown>;
|
|
37
|
-
hydratedConfig: HydratedBridgeRuntimeConfig | null;
|
|
38
|
-
userToken?: string | null;
|
|
39
|
-
fetchImpl?: typeof fetch;
|
|
40
|
-
retry?: {
|
|
41
|
-
maxAttempts?: number;
|
|
42
|
-
baseDelayMs?: number;
|
|
43
|
-
};
|
|
44
|
-
env?: Record<string, string | undefined>;
|
|
45
|
-
};
|
|
46
|
-
type MaybeExecuteBridgeToolCallResult = {
|
|
47
|
-
handled: false;
|
|
48
|
-
} | {
|
|
49
|
-
handled: true;
|
|
50
|
-
functionKey: string;
|
|
51
|
-
response: BridgeExecutionResult;
|
|
52
|
-
};
|
|
53
|
-
export declare function resolveBridgeRuntimeConfig(hydratedConfig: HydratedBridgeRuntimeConfig | null | undefined, env?: Record<string, string | undefined>): {
|
|
54
|
-
ok: true;
|
|
55
|
-
config: ResolvedBridgeRuntimeConfig;
|
|
56
|
-
} | {
|
|
57
|
-
ok: false;
|
|
58
|
-
error: string;
|
|
59
|
-
};
|
|
60
|
-
export declare function isBridgeToolName(toolName: string): boolean;
|
|
61
|
-
export declare function bridgeFunctionKeyFromToolName(toolName: string): string | null;
|
|
62
|
-
export declare function executeBridgeFunction(input: ExecuteBridgeFunctionArgs): Promise<BridgeExecutionResult>;
|
|
63
|
-
export declare function maybeExecuteBridgeToolCall(input: MaybeExecuteBridgeToolCallArgs): Promise<MaybeExecuteBridgeToolCallResult>;
|
|
64
|
-
export {};
|
|
65
|
-
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/client/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/client/bridge.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
const BRIDGE_ENV_KEYS = {
|
|
2
|
-
baseUrl: ["OPENCLAW_AGENT_BRIDGE_BASE_URL", "AGENT_BRIDGE_BASE_URL"],
|
|
3
|
-
serviceId: ["OPENCLAW_SERVICE_ID", "AGENT_BRIDGE_SERVICE_ID"],
|
|
4
|
-
serviceKey: ["OPENCLAW_SERVICE_KEY", "AGENT_BRIDGE_SERVICE_KEY"],
|
|
5
|
-
appKey: ["OPENCLAW_AGENT_APP", "OPENCLAW_APP_KEY", "AGENT_BRIDGE_APP_KEY"],
|
|
6
|
-
};
|
|
7
|
-
export function resolveBridgeRuntimeConfig(hydratedConfig, env = process.env) {
|
|
8
|
-
const appKey = pickValue(hydratedConfig?.appKey, readEnv(env, BRIDGE_ENV_KEYS.appKey));
|
|
9
|
-
const baseUrl = pickValue(hydratedConfig?.baseUrl, readEnv(env, BRIDGE_ENV_KEYS.baseUrl), resolveBaseUrlFromMap(hydratedConfig?.appBaseUrlMapJson, appKey));
|
|
10
|
-
const serviceId = pickValue(hydratedConfig?.serviceId, readEnv(env, BRIDGE_ENV_KEYS.serviceId));
|
|
11
|
-
const serviceKey = pickValue(hydratedConfig?.serviceKey, readEnv(env, BRIDGE_ENV_KEYS.serviceKey));
|
|
12
|
-
const missing = [];
|
|
13
|
-
if (!baseUrl)
|
|
14
|
-
missing.push("baseUrl");
|
|
15
|
-
if (!serviceId)
|
|
16
|
-
missing.push("serviceId");
|
|
17
|
-
if (!serviceKey)
|
|
18
|
-
missing.push("serviceKey");
|
|
19
|
-
if (!appKey)
|
|
20
|
-
missing.push("appKey");
|
|
21
|
-
if (missing.length > 0) {
|
|
22
|
-
return {
|
|
23
|
-
ok: false,
|
|
24
|
-
error: `Agent Bridge config incompleta: ${missing.join(", ")}`,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
const resolvedBaseUrl = baseUrl;
|
|
28
|
-
const resolvedServiceId = serviceId;
|
|
29
|
-
const resolvedServiceKey = serviceKey;
|
|
30
|
-
const resolvedAppKey = appKey;
|
|
31
|
-
return {
|
|
32
|
-
ok: true,
|
|
33
|
-
config: {
|
|
34
|
-
baseUrl: normalizeBaseUrl(resolvedBaseUrl),
|
|
35
|
-
serviceId: resolvedServiceId,
|
|
36
|
-
serviceKey: resolvedServiceKey,
|
|
37
|
-
appKey: resolvedAppKey,
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
export function isBridgeToolName(toolName) {
|
|
42
|
-
return /^bridge\.[A-Za-z0-9._-]+$/.test(toolName);
|
|
43
|
-
}
|
|
44
|
-
export function bridgeFunctionKeyFromToolName(toolName) {
|
|
45
|
-
if (!isBridgeToolName(toolName)) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
return toolName.slice("bridge.".length);
|
|
49
|
-
}
|
|
50
|
-
export async function executeBridgeFunction(input) {
|
|
51
|
-
const fetchImpl = input.fetchImpl ?? fetch;
|
|
52
|
-
const maxAttempts = Math.max(1, input.retry?.maxAttempts ?? 3);
|
|
53
|
-
const baseDelayMs = Math.max(50, input.retry?.baseDelayMs ?? 250);
|
|
54
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
55
|
-
const response = await fetchImpl(`${input.config.baseUrl}/agent/execute`, {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
"Content-Type": "application/json",
|
|
59
|
-
"X-Agent-Service-Id": input.config.serviceId,
|
|
60
|
-
"X-Agent-Service-Key": input.config.serviceKey,
|
|
61
|
-
"X-Agent-App": input.config.appKey,
|
|
62
|
-
...(input.userToken ? { Authorization: `Bearer ${input.userToken}` } : {}),
|
|
63
|
-
...sanitizeHeaderValues(input.auditHeaders),
|
|
64
|
-
},
|
|
65
|
-
body: JSON.stringify({
|
|
66
|
-
functionKey: input.functionKey,
|
|
67
|
-
args: input.args,
|
|
68
|
-
}),
|
|
69
|
-
});
|
|
70
|
-
const body = await safeParseJson(response);
|
|
71
|
-
const executionResult = {
|
|
72
|
-
success: response.ok && body?.success === true,
|
|
73
|
-
status: response.status,
|
|
74
|
-
functionKey: input.functionKey,
|
|
75
|
-
result: body?.result,
|
|
76
|
-
error: body?.error ?? (response.ok ? undefined : `HTTP ${response.status}`),
|
|
77
|
-
};
|
|
78
|
-
if (!shouldRetry(response.status) || attempt >= maxAttempts) {
|
|
79
|
-
return executionResult;
|
|
80
|
-
}
|
|
81
|
-
const backoff = baseDelayMs * 2 ** (attempt - 1);
|
|
82
|
-
await sleep(backoff);
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
success: false,
|
|
86
|
-
status: 500,
|
|
87
|
-
functionKey: input.functionKey,
|
|
88
|
-
error: "Bridge execution failed without response",
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
export async function maybeExecuteBridgeToolCall(input) {
|
|
92
|
-
const functionKey = bridgeFunctionKeyFromToolName(input.toolName);
|
|
93
|
-
if (!functionKey) {
|
|
94
|
-
return { handled: false };
|
|
95
|
-
}
|
|
96
|
-
const resolved = resolveBridgeRuntimeConfig(input.hydratedConfig, input.env);
|
|
97
|
-
if (!resolved.ok) {
|
|
98
|
-
return {
|
|
99
|
-
handled: true,
|
|
100
|
-
functionKey,
|
|
101
|
-
response: {
|
|
102
|
-
success: false,
|
|
103
|
-
status: 400,
|
|
104
|
-
functionKey,
|
|
105
|
-
error: resolved.error,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const response = await executeBridgeFunction({
|
|
110
|
-
config: resolved.config,
|
|
111
|
-
functionKey,
|
|
112
|
-
args: input.toolArgs,
|
|
113
|
-
userToken: input.userToken,
|
|
114
|
-
fetchImpl: input.fetchImpl,
|
|
115
|
-
retry: input.retry,
|
|
116
|
-
});
|
|
117
|
-
return {
|
|
118
|
-
handled: true,
|
|
119
|
-
functionKey,
|
|
120
|
-
response,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
function readEnv(env, keys) {
|
|
124
|
-
for (const key of keys) {
|
|
125
|
-
const value = env[key];
|
|
126
|
-
if (value && value.trim().length > 0) {
|
|
127
|
-
return value.trim();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
132
|
-
function pickValue(...values) {
|
|
133
|
-
for (const value of values) {
|
|
134
|
-
if (value && value.trim().length > 0) {
|
|
135
|
-
return value.trim();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
function resolveBaseUrlFromMap(appBaseUrlMapJson, appKey) {
|
|
141
|
-
if (!appBaseUrlMapJson || !appKey) {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
try {
|
|
145
|
-
const parsed = JSON.parse(appBaseUrlMapJson);
|
|
146
|
-
const value = parsed?.[appKey];
|
|
147
|
-
if (typeof value === "string" && value.trim().length > 0) {
|
|
148
|
-
return value.trim();
|
|
149
|
-
}
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
function normalizeBaseUrl(baseUrl) {
|
|
157
|
-
return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
158
|
-
}
|
|
159
|
-
function shouldRetry(status) {
|
|
160
|
-
return status === 429 || status >= 500;
|
|
161
|
-
}
|
|
162
|
-
function sleep(ms) {
|
|
163
|
-
return new Promise((resolve) => {
|
|
164
|
-
setTimeout(resolve, ms);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
async function safeParseJson(response) {
|
|
168
|
-
const contentType = response.headers.get("content-type");
|
|
169
|
-
if (!contentType?.toLowerCase().includes("application/json")) {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
try {
|
|
173
|
-
return (await response.json());
|
|
174
|
-
}
|
|
175
|
-
catch {
|
|
176
|
-
return null;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
function sanitizeHeaderValues(headers) {
|
|
180
|
-
if (!headers) {
|
|
181
|
-
return {};
|
|
182
|
-
}
|
|
183
|
-
const output = {};
|
|
184
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
185
|
-
if (!value || value.trim().length === 0) {
|
|
186
|
-
continue;
|
|
187
|
-
}
|
|
188
|
-
output[key] = value;
|
|
189
|
-
}
|
|
190
|
-
return output;
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=bridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/client/bridge.ts"],"names":[],"mappings":"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"}
|