@meetopenbot/plugin-sdk 0.2.0 → 0.4.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.
- package/README.md +30 -40
- package/dist/agent-plugin.d.ts +55 -0
- package/dist/agent-plugin.d.ts.map +1 -0
- package/dist/agent-plugin.js +118 -0
- package/dist/agent-plugin.js.map +1 -0
- package/dist/cloud-mode.d.ts +14 -0
- package/dist/cloud-mode.d.ts.map +1 -0
- package/dist/cloud-mode.js +26 -0
- package/dist/cloud-mode.js.map +1 -0
- package/dist/credits-auth.d.ts +47 -0
- package/dist/credits-auth.d.ts.map +1 -0
- package/dist/credits-auth.js +139 -0
- package/dist/credits-auth.js.map +1 -0
- package/dist/helpers.d.ts +90 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +195 -0
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-agent.d.ts +36 -0
- package/dist/mcp-agent.d.ts.map +1 -0
- package/dist/mcp-agent.js +93 -0
- package/dist/mcp-agent.js.map +1 -0
- package/dist/mcp-args.d.ts +3 -0
- package/dist/mcp-args.d.ts.map +1 -0
- package/dist/mcp-args.js +41 -0
- package/dist/mcp-args.js.map +1 -0
- package/dist/model-registry.d.ts +54 -0
- package/dist/model-registry.d.ts.map +1 -0
- package/dist/model-registry.js +109 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/openai-model.d.ts +4 -0
- package/dist/openai-model.d.ts.map +1 -0
- package/dist/openai-model.js +13 -0
- package/dist/openai-model.js.map +1 -0
- package/dist/plugin.d.ts +6 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/text-reply.d.ts +30 -0
- package/dist/text-reply.d.ts.map +1 -0
- package/dist/text-reply.js +53 -0
- package/dist/text-reply.js.map +1 -0
- package/dist/thread-context.d.ts +15 -0
- package/dist/thread-context.d.ts.map +1 -0
- package/dist/thread-context.js +69 -0
- package/dist/thread-context.js.map +1 -0
- package/package.json +7 -2
package/dist/helpers.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { AgentInvokeEvent, AgentOutputEvent, EventMeta, ToolResultEvent, UIWidgetEvent, WebhookEvent, WebhookHttpResponseEvent } from "./events.js";
|
|
2
|
-
import type {
|
|
1
|
+
import type { AgentInvokeEvent, AgentOutputEvent, EventMeta, OpenBotState, ToolResultEvent, UIWidgetEvent, UIWidgetResponseEvent, WebhookEvent, WebhookHttpResponseEvent } from "./events.js";
|
|
2
|
+
import type { Storage } from "./storage.js";
|
|
3
|
+
import type { RenderUIWidgetData, UIWidgetBase, UIWidgetField } from "./ui.js";
|
|
3
4
|
/** Return true when this agent should handle an `agent:invoke` event. */
|
|
4
5
|
export declare function shouldHandleInvoke(event: AgentInvokeEvent, agentId: string): boolean;
|
|
5
6
|
/** Build an `agent:output` event. */
|
|
@@ -46,4 +47,91 @@ export declare function webhookHttpResponse(args: {
|
|
|
46
47
|
body?: unknown;
|
|
47
48
|
headers?: Record<string, string>;
|
|
48
49
|
}): WebhookHttpResponseEvent;
|
|
50
|
+
export declare const API_KEY_REQUEST_TYPE = "api_key_request";
|
|
51
|
+
export declare function apiKeyRequestWidget(args: {
|
|
52
|
+
agentId: string;
|
|
53
|
+
threadId?: string;
|
|
54
|
+
source: string;
|
|
55
|
+
envVar: string;
|
|
56
|
+
label: string;
|
|
57
|
+
placeholder?: string;
|
|
58
|
+
reason?: string;
|
|
59
|
+
provider?: string;
|
|
60
|
+
docsUrl?: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
extraFields?: UIWidgetField[];
|
|
63
|
+
}): ReturnType<typeof uiWidget>;
|
|
64
|
+
export type PersistApiKeyFailure = {
|
|
65
|
+
handled: true;
|
|
66
|
+
ok: false;
|
|
67
|
+
error: string;
|
|
68
|
+
};
|
|
69
|
+
export type PersistApiKeySuccess = {
|
|
70
|
+
handled: true;
|
|
71
|
+
ok: true;
|
|
72
|
+
envVar: string;
|
|
73
|
+
apiKey: string;
|
|
74
|
+
widgetId?: string;
|
|
75
|
+
provider?: string;
|
|
76
|
+
};
|
|
77
|
+
export type PersistApiKeyResult = {
|
|
78
|
+
handled: false;
|
|
79
|
+
} | PersistApiKeyFailure | PersistApiKeySuccess;
|
|
80
|
+
export declare function isPersistApiKeyFailure(result: PersistApiKeyResult): result is PersistApiKeyFailure;
|
|
81
|
+
export declare function isPersistApiKeySuccess(result: PersistApiKeyResult): result is PersistApiKeySuccess;
|
|
82
|
+
/** Persist a secret from an `api_key_request` widget response. */
|
|
83
|
+
export declare function persistApiKeyFromWidgetResponse(args: {
|
|
84
|
+
event: UIWidgetResponseEvent;
|
|
85
|
+
storage?: Storage;
|
|
86
|
+
source: string;
|
|
87
|
+
fallbackEnvVar: string;
|
|
88
|
+
env?: Record<string, string | undefined>;
|
|
89
|
+
extraEnvVars?: string[];
|
|
90
|
+
}): Promise<PersistApiKeyResult>;
|
|
91
|
+
export declare function apiKeySavedEvents(args: {
|
|
92
|
+
agentId: string;
|
|
93
|
+
threadId?: string;
|
|
94
|
+
envVar: string;
|
|
95
|
+
widgetId?: string;
|
|
96
|
+
retryMessage?: string;
|
|
97
|
+
}): Array<ReturnType<typeof uiWidget> | ReturnType<typeof agentOutput>>;
|
|
98
|
+
/** Trim a string value; empty strings become `undefined`. */
|
|
99
|
+
export declare function trimmedString(value: unknown): string | undefined;
|
|
100
|
+
/** Config `model` value, or `fallback` when unset. */
|
|
101
|
+
export declare function readConfigModel(config: Record<string, unknown>, fallback: string): string;
|
|
102
|
+
/** Strip a `provider/` prefix (`openai/gpt-4o-mini` → `gpt-4o-mini`). */
|
|
103
|
+
export declare function vendorModelId(model: string | undefined): string | undefined;
|
|
104
|
+
export type StorageVariableValue = string | {
|
|
105
|
+
value: string;
|
|
106
|
+
secret: boolean;
|
|
107
|
+
} | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* First non-empty value from `process.env`.
|
|
110
|
+
* The runtime merges workspace variables into the process env on boot and
|
|
111
|
+
* after every create/delete — plugins should not read `storage.getVariables()`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function lookupSecret(args: {
|
|
114
|
+
envKeys: string[];
|
|
115
|
+
}): string | undefined;
|
|
116
|
+
/** User-facing copy when a required workspace variable is missing. */
|
|
117
|
+
export declare function missingSecretMessage(envKey: string): string;
|
|
118
|
+
export type ThreadSession = {
|
|
119
|
+
read: (state: OpenBotState) => string | undefined;
|
|
120
|
+
write: (state: OpenBotState, storage: Storage | undefined, value: string) => Promise<void>;
|
|
121
|
+
};
|
|
122
|
+
/** Read/write a single string field on thread (or channel) persisted state. */
|
|
123
|
+
export declare function threadSession(field: string): ThreadSession;
|
|
124
|
+
/** Persist a small patch onto the current thread, or the channel if there is no thread. */
|
|
125
|
+
export declare function patchPersistedState(args: {
|
|
126
|
+
storage?: Storage;
|
|
127
|
+
state: OpenBotState;
|
|
128
|
+
patch: Record<string, unknown>;
|
|
129
|
+
}): Promise<void>;
|
|
130
|
+
/** Thread state if present, otherwise channel state. */
|
|
131
|
+
export declare function persistedStateRecord(state: OpenBotState): Record<string, unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* Bridge a callback-style agent loop onto an async generator.
|
|
134
|
+
* Used by specialist plugins that enqueue widgets from `generateText` hooks.
|
|
135
|
+
*/
|
|
136
|
+
export declare function yieldFromBackgroundQueue<T>(run: (enqueue: (item: T) => void) => Promise<void>): AsyncGenerator<T>;
|
|
49
137
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,aAAa,EACb,YAAY,EACZ,wBAAwB,EACzB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers.js
CHANGED
|
@@ -78,4 +78,199 @@ export function webhookHttpResponse(args) {
|
|
|
78
78
|
data: args,
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
+
export const API_KEY_REQUEST_TYPE = "api_key_request";
|
|
82
|
+
export function apiKeyRequestWidget(args) {
|
|
83
|
+
const docs = args.docsUrl ? ` You can get one from ${args.docsUrl}.` : "";
|
|
84
|
+
const description = args.description ??
|
|
85
|
+
`${args.label} could not authenticate${args.reason ? ` (${args.reason})` : ""}. ` +
|
|
86
|
+
`Provide a ${args.label} API key to continue.${docs} ` +
|
|
87
|
+
"The key is stored as a workspace variable on your machine and never leaves your local runtime.";
|
|
88
|
+
return uiWidget({
|
|
89
|
+
agentId: args.agentId,
|
|
90
|
+
threadId: args.threadId,
|
|
91
|
+
widget: {
|
|
92
|
+
kind: "form",
|
|
93
|
+
widgetId: `${args.source}_api_key_request_${Date.now()}`,
|
|
94
|
+
title: `${args.label} API Key Required`,
|
|
95
|
+
description,
|
|
96
|
+
fields: [
|
|
97
|
+
...(args.extraFields ?? []),
|
|
98
|
+
{
|
|
99
|
+
id: "apiKey",
|
|
100
|
+
label: "API Key",
|
|
101
|
+
type: "password",
|
|
102
|
+
placeholder: args.placeholder ?? "sk-...",
|
|
103
|
+
required: true,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
submitLabel: "Save API Key",
|
|
107
|
+
metadata: {
|
|
108
|
+
type: API_KEY_REQUEST_TYPE,
|
|
109
|
+
provider: args.provider ?? args.source,
|
|
110
|
+
envVar: args.envVar,
|
|
111
|
+
source: args.source,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function isPersistApiKeyFailure(result) {
|
|
117
|
+
return result.handled === true && result.ok === false;
|
|
118
|
+
}
|
|
119
|
+
export function isPersistApiKeySuccess(result) {
|
|
120
|
+
return result.handled === true && result.ok === true;
|
|
121
|
+
}
|
|
122
|
+
/** Persist a secret from an `api_key_request` widget response. */
|
|
123
|
+
export async function persistApiKeyFromWidgetResponse(args) {
|
|
124
|
+
const { metadata, values, widgetId } = args.event.data ?? {};
|
|
125
|
+
if (!metadata || metadata.type !== API_KEY_REQUEST_TYPE)
|
|
126
|
+
return { handled: false };
|
|
127
|
+
if (metadata.source !== args.source)
|
|
128
|
+
return { handled: false };
|
|
129
|
+
const apiKey = values?.apiKey;
|
|
130
|
+
if (typeof apiKey !== "string" || !apiKey.trim())
|
|
131
|
+
return { handled: false };
|
|
132
|
+
const envVar = typeof metadata.envVar === "string" && metadata.envVar.trim()
|
|
133
|
+
? metadata.envVar.trim()
|
|
134
|
+
: args.fallbackEnvVar;
|
|
135
|
+
const provider = typeof metadata.provider === "string" ? metadata.provider : undefined;
|
|
136
|
+
if (!args.storage) {
|
|
137
|
+
return { handled: true, ok: false, error: "no storage available; cannot persist API key." };
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const value = apiKey.trim();
|
|
141
|
+
await args.storage.createVariable({ key: envVar, value, secret: true });
|
|
142
|
+
const env = args.env ?? process.env;
|
|
143
|
+
env[envVar] = value;
|
|
144
|
+
for (const extra of args.extraEnvVars ?? []) {
|
|
145
|
+
env[extra] = value;
|
|
146
|
+
}
|
|
147
|
+
return { handled: true, ok: true, envVar, apiKey: value, widgetId, provider };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
151
|
+
return { handled: true, ok: false, error: message };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function apiKeySavedEvents(args) {
|
|
155
|
+
return [
|
|
156
|
+
uiWidget({
|
|
157
|
+
agentId: args.agentId,
|
|
158
|
+
threadId: args.threadId,
|
|
159
|
+
widget: {
|
|
160
|
+
widgetId: args.widgetId ?? `api_key_saved_${Date.now()}`,
|
|
161
|
+
kind: "message",
|
|
162
|
+
title: "API Key Saved",
|
|
163
|
+
body: `Saved ${args.envVar} as a workspace variable. You can now continue the conversation.`,
|
|
164
|
+
state: "submitted",
|
|
165
|
+
},
|
|
166
|
+
}),
|
|
167
|
+
agentOutput({
|
|
168
|
+
agentId: args.agentId,
|
|
169
|
+
threadId: args.threadId,
|
|
170
|
+
content: args.retryMessage ??
|
|
171
|
+
`Saved ${args.envVar} to workspace variables. Re-send your last message to retry.`,
|
|
172
|
+
}),
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
/** Trim a string value; empty strings become `undefined`. */
|
|
176
|
+
export function trimmedString(value) {
|
|
177
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
178
|
+
}
|
|
179
|
+
/** Config `model` value, or `fallback` when unset. */
|
|
180
|
+
export function readConfigModel(config, fallback) {
|
|
181
|
+
return trimmedString(config.model) ?? fallback;
|
|
182
|
+
}
|
|
183
|
+
/** Strip a `provider/` prefix (`openai/gpt-4o-mini` → `gpt-4o-mini`). */
|
|
184
|
+
export function vendorModelId(model) {
|
|
185
|
+
if (!model)
|
|
186
|
+
return undefined;
|
|
187
|
+
return model.includes("/") ? model.split("/").slice(1).join("/") : model;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* First non-empty value from `process.env`.
|
|
191
|
+
* The runtime merges workspace variables into the process env on boot and
|
|
192
|
+
* after every create/delete — plugins should not read `storage.getVariables()`.
|
|
193
|
+
*/
|
|
194
|
+
export function lookupSecret(args) {
|
|
195
|
+
for (const key of args.envKeys) {
|
|
196
|
+
const value = trimmedString(process.env[key]);
|
|
197
|
+
if (value)
|
|
198
|
+
return value;
|
|
199
|
+
}
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
/** User-facing copy when a required workspace variable is missing. */
|
|
203
|
+
export function missingSecretMessage(envKey) {
|
|
204
|
+
return `Setup is incomplete. Set \`${envKey}\` in workspace settings.`;
|
|
205
|
+
}
|
|
206
|
+
/** Read/write a single string field on thread (or channel) persisted state. */
|
|
207
|
+
export function threadSession(field) {
|
|
208
|
+
return {
|
|
209
|
+
read(state) {
|
|
210
|
+
return trimmedString(persistedStateRecord(state)[field]);
|
|
211
|
+
},
|
|
212
|
+
async write(state, storage, value) {
|
|
213
|
+
await patchPersistedState({ storage, state, patch: { [field]: value } });
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** Persist a small patch onto the current thread, or the channel if there is no thread. */
|
|
218
|
+
export async function patchPersistedState(args) {
|
|
219
|
+
if (!args.storage || !args.state.channelId)
|
|
220
|
+
return;
|
|
221
|
+
if (args.state.threadId) {
|
|
222
|
+
await args.storage.patchThreadState({
|
|
223
|
+
channelId: args.state.channelId,
|
|
224
|
+
threadId: args.state.threadId,
|
|
225
|
+
state: args.patch,
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
await args.storage.patchChannelState({
|
|
230
|
+
channelId: args.state.channelId,
|
|
231
|
+
state: args.patch,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/** Thread state if present, otherwise channel state. */
|
|
235
|
+
export function persistedStateRecord(state) {
|
|
236
|
+
const source = state.threadDetails?.state ?? state.channelDetails?.state;
|
|
237
|
+
return source && typeof source === "object" && !Array.isArray(source)
|
|
238
|
+
? source
|
|
239
|
+
: {};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Bridge a callback-style agent loop onto an async generator.
|
|
243
|
+
* Used by specialist plugins that enqueue widgets from `generateText` hooks.
|
|
244
|
+
*/
|
|
245
|
+
export async function* yieldFromBackgroundQueue(run) {
|
|
246
|
+
const queue = [];
|
|
247
|
+
let wake;
|
|
248
|
+
let done = false;
|
|
249
|
+
let error;
|
|
250
|
+
const task = run((item) => {
|
|
251
|
+
queue.push(item);
|
|
252
|
+
wake?.();
|
|
253
|
+
wake = undefined;
|
|
254
|
+
})
|
|
255
|
+
.catch((caught) => {
|
|
256
|
+
error = caught;
|
|
257
|
+
})
|
|
258
|
+
.finally(() => {
|
|
259
|
+
done = true;
|
|
260
|
+
wake?.();
|
|
261
|
+
wake = undefined;
|
|
262
|
+
});
|
|
263
|
+
while (!done || queue.length > 0) {
|
|
264
|
+
if (queue.length === 0) {
|
|
265
|
+
await new Promise((resolve) => {
|
|
266
|
+
wake = resolve;
|
|
267
|
+
});
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
yield queue.shift();
|
|
271
|
+
}
|
|
272
|
+
await task;
|
|
273
|
+
if (error)
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
81
276
|
//# sourceMappingURL=helpers.js.map
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,13 @@ export * from './ui.js';
|
|
|
6
6
|
export * from './storage.js';
|
|
7
7
|
export * from './helpers.js';
|
|
8
8
|
export * from './diff.js';
|
|
9
|
+
export * from './cloud-mode.js';
|
|
10
|
+
export * from './credits-auth.js';
|
|
11
|
+
export * from './model-registry.js';
|
|
12
|
+
export * from './agent-plugin.js';
|
|
13
|
+
export * from './text-reply.js';
|
|
14
|
+
export * from './mcp-agent.js';
|
|
15
|
+
export * from './mcp-args.js';
|
|
16
|
+
export * from './openai-model.js';
|
|
17
|
+
export * from './thread-context.js';
|
|
9
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,4 +6,13 @@ export * from './ui.js';
|
|
|
6
6
|
export * from './storage.js';
|
|
7
7
|
export * from './helpers.js';
|
|
8
8
|
export * from './diff.js';
|
|
9
|
+
export * from './cloud-mode.js';
|
|
10
|
+
export * from './credits-auth.js';
|
|
11
|
+
export * from './model-registry.js';
|
|
12
|
+
export * from './agent-plugin.js';
|
|
13
|
+
export * from './text-reply.js';
|
|
14
|
+
export * from './mcp-agent.js';
|
|
15
|
+
export * from './mcp-args.js';
|
|
16
|
+
export * from './openai-model.js';
|
|
17
|
+
export * from './thread-context.js';
|
|
9
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AgentPluginDefinition } from './agent-plugin.js';
|
|
2
|
+
import type { PluginModule } from './plugin.js';
|
|
3
|
+
export type McpHttpTransport = {
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: (apiKey: string) => Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
export type McpStdioTransport = {
|
|
8
|
+
command: string;
|
|
9
|
+
args?: string[];
|
|
10
|
+
env?: (apiKey: string) => Record<string, string>;
|
|
11
|
+
};
|
|
12
|
+
export type McpTransport = McpHttpTransport | McpStdioTransport;
|
|
13
|
+
export declare function runMcpTurn(args: {
|
|
14
|
+
mcp: McpTransport;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
model: string;
|
|
17
|
+
system: string;
|
|
18
|
+
prompt: string;
|
|
19
|
+
maxSteps?: number;
|
|
20
|
+
sanitizeEmptyArgs?: boolean;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
export type McpAgentDefinition = Omit<AgentPluginDefinition, 'run'> & {
|
|
23
|
+
secret: {
|
|
24
|
+
envKeys: string[];
|
|
25
|
+
};
|
|
26
|
+
mcp: McpTransport;
|
|
27
|
+
system: string;
|
|
28
|
+
maxSteps?: number;
|
|
29
|
+
history?: boolean;
|
|
30
|
+
sanitizeEmptyArgs?: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Specialist agent: secret + MCP + generateText. Model picker comes from `models`.
|
|
34
|
+
*/
|
|
35
|
+
export declare function defineMcpAgent(definition: McpAgentDefinition): Promise<PluginModule>;
|
|
36
|
+
//# sourceMappingURL=mcp-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-agent.d.ts","sourceRoot":"","sources":["../src/mcp-agent.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAMhE,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiClB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,GAAG;IACpE,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9B,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoD1F"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createMCPClient } from '@ai-sdk/mcp';
|
|
2
|
+
import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
|
|
3
|
+
import { generateText, stepCountIs } from 'ai';
|
|
4
|
+
import { creditsErrorMessage, hasLlmAuth, llmAuthNotConfiguredMessage, } from './credits-auth.js';
|
|
5
|
+
import { defineAgentPlugin, } from './agent-plugin.js';
|
|
6
|
+
import { lookupSecret, missingSecretMessage, readConfigModel } from './helpers.js';
|
|
7
|
+
import { wrapMcpTools } from './mcp-args.js';
|
|
8
|
+
import { resolveOpenAiModel } from './openai-model.js';
|
|
9
|
+
import { loadThreadContext } from './thread-context.js';
|
|
10
|
+
function isHttpTransport(transport) {
|
|
11
|
+
return 'url' in transport;
|
|
12
|
+
}
|
|
13
|
+
export async function runMcpTurn(args) {
|
|
14
|
+
const transport = isHttpTransport(args.mcp)
|
|
15
|
+
? {
|
|
16
|
+
type: 'http',
|
|
17
|
+
url: args.mcp.url,
|
|
18
|
+
headers: args.mcp.headers?.(args.apiKey),
|
|
19
|
+
}
|
|
20
|
+
: new Experimental_StdioMCPTransport({
|
|
21
|
+
command: args.mcp.command,
|
|
22
|
+
args: args.mcp.args ?? [],
|
|
23
|
+
env: {
|
|
24
|
+
PATH: process.env.PATH || '',
|
|
25
|
+
HOME: process.env.HOME || '',
|
|
26
|
+
...process.env,
|
|
27
|
+
...args.mcp.env?.(args.apiKey),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const client = await createMCPClient({ transport });
|
|
31
|
+
try {
|
|
32
|
+
let tools = await client.tools();
|
|
33
|
+
if (args.sanitizeEmptyArgs)
|
|
34
|
+
tools = wrapMcpTools(tools);
|
|
35
|
+
const result = await generateText({
|
|
36
|
+
model: resolveOpenAiModel(args.model),
|
|
37
|
+
system: args.system,
|
|
38
|
+
prompt: args.prompt,
|
|
39
|
+
tools,
|
|
40
|
+
stopWhen: stepCountIs(args.maxSteps ?? 10),
|
|
41
|
+
});
|
|
42
|
+
return result.text.trim() || 'Done.';
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await client.close().catch(() => undefined);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Specialist agent: secret + MCP + generateText. Model picker comes from `models`.
|
|
50
|
+
*/
|
|
51
|
+
export async function defineMcpAgent(definition) {
|
|
52
|
+
const { secret, mcp, system, maxSteps, history, sanitizeEmptyArgs, models, ...plugin } = definition;
|
|
53
|
+
const defaultModel = models?.default ?? 'openai/gpt-4o-mini';
|
|
54
|
+
return defineAgentPlugin({
|
|
55
|
+
...plugin,
|
|
56
|
+
models: models ?? { providers: ['openai'], default: defaultModel },
|
|
57
|
+
async run(args) {
|
|
58
|
+
const apiKey = lookupSecret(secret);
|
|
59
|
+
if (!apiKey)
|
|
60
|
+
return missingSecretMessage(secret.envKeys[0] ?? 'API_KEY');
|
|
61
|
+
if (!hasLlmAuth('openai'))
|
|
62
|
+
return llmAuthNotConfiguredMessage();
|
|
63
|
+
let prompt = args.prompt;
|
|
64
|
+
if (history && args.threadId) {
|
|
65
|
+
const threadContext = await loadThreadContext(args.context.storage, {
|
|
66
|
+
channelId: args.handlerCtx.state.channelId,
|
|
67
|
+
threadId: args.threadId,
|
|
68
|
+
agentId: args.context.agentId,
|
|
69
|
+
currentMessage: args.prompt,
|
|
70
|
+
});
|
|
71
|
+
if (threadContext)
|
|
72
|
+
prompt = `${threadContext}\n\nCurrent message:\n${args.prompt}`;
|
|
73
|
+
}
|
|
74
|
+
return runMcpTurn({
|
|
75
|
+
mcp,
|
|
76
|
+
apiKey,
|
|
77
|
+
model: readConfigModel(args.context.config, defaultModel),
|
|
78
|
+
system,
|
|
79
|
+
prompt,
|
|
80
|
+
maxSteps,
|
|
81
|
+
sanitizeEmptyArgs,
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
mapError: plugin.mapError ?? ((error) => ({
|
|
85
|
+
kind: 'reply',
|
|
86
|
+
content: creditsErrorMessage(error instanceof Error ? error.message : String(error), {
|
|
87
|
+
agentName: plugin.name,
|
|
88
|
+
}) ??
|
|
89
|
+
(error instanceof Error ? error.message : String(error)),
|
|
90
|
+
})),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=mcp-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-agent.js","sourceRoot":"","sources":["../src/mcp-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-args.d.ts","sourceRoot":"","sources":["../src/mcp-args.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAuB1D;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAiB1D"}
|
package/dist/mcp-args.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function sanitizeMcpToolArgs(args) {
|
|
2
|
+
if (args === null || args === undefined)
|
|
3
|
+
return args;
|
|
4
|
+
if (typeof args !== 'object' || Array.isArray(args))
|
|
5
|
+
return args;
|
|
6
|
+
const result = {};
|
|
7
|
+
for (const [key, value] of Object.entries(args)) {
|
|
8
|
+
if (value === '')
|
|
9
|
+
continue;
|
|
10
|
+
if (Array.isArray(value) && value.length === 0)
|
|
11
|
+
continue;
|
|
12
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
13
|
+
const nested = sanitizeMcpToolArgs(value);
|
|
14
|
+
if (nested &&
|
|
15
|
+
typeof nested === 'object' &&
|
|
16
|
+
!Array.isArray(nested) &&
|
|
17
|
+
Object.keys(nested).length > 0) {
|
|
18
|
+
result[key] = nested;
|
|
19
|
+
}
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
result[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
export function wrapMcpTools(tools) {
|
|
27
|
+
const wrapped = { ...tools };
|
|
28
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
29
|
+
if (!tool || typeof tool !== 'object' || !('execute' in tool))
|
|
30
|
+
continue;
|
|
31
|
+
const execute = tool.execute;
|
|
32
|
+
if (typeof execute !== 'function')
|
|
33
|
+
continue;
|
|
34
|
+
wrapped[name] = {
|
|
35
|
+
...tool,
|
|
36
|
+
execute: (input, options) => execute.call(tool, sanitizeMcpToolArgs(input), options),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return wrapped;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mcp-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-args.js","sourceRoot":"","sources":["../src/mcp-args.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;QAC3E,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,IACE,MAAM;gBACN,OAAO,MAAM,KAAK,QAAQ;gBAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAC9B,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACvB,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAmB,KAAQ;IACrD,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,EAA6B,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;YAAE,SAAS;QACxE,MAAM,OAAO,GAAI,IAA8B,CAAC,OAAO,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,UAAU;YAAE,SAAS;QAC5C,OAAO,CAAC,IAAI,CAAC,GAAG;YACd,GAAG,IAAI;YACP,OAAO,EAAE,CAAC,KAAc,EAAE,OAAiB,EAAE,EAAE,CAC5C,OAA0D,CAAC,IAAI,CAC9D,IAAI,EACJ,mBAAmB,CAAC,KAAK,CAAC,EAC1B,OAAO,CACR;SACJ,CAAC;IACJ,CAAC;IACD,OAAO,OAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ConfigSchemaProperty } from './plugin.js';
|
|
2
|
+
export type ModelRegistryProvider = {
|
|
3
|
+
label: string;
|
|
4
|
+
models: Array<{
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
description: string;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export type ModelRegistry = {
|
|
11
|
+
providers?: Record<string, ModelRegistryProvider>;
|
|
12
|
+
};
|
|
13
|
+
export type ModelConfigField = ConfigSchemaProperty & {
|
|
14
|
+
type: 'string';
|
|
15
|
+
options?: Array<{
|
|
16
|
+
label: string;
|
|
17
|
+
value: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
export type ModelConfigFieldOptions = {
|
|
22
|
+
/** Registry provider ids to include (e.g. `openai`, `anthropic`). */
|
|
23
|
+
providers: string[];
|
|
24
|
+
/** `prefixed` => `openai/gpt-4o`. `raw` => `gpt-4o`. */
|
|
25
|
+
valueFormat?: 'prefixed' | 'raw';
|
|
26
|
+
override?: boolean;
|
|
27
|
+
/** Used when the registry is empty, and as a preferred default when present. */
|
|
28
|
+
defaultValue?: string;
|
|
29
|
+
/** Prefer the first model whose id matches (e.g. `/sonnet/i`). */
|
|
30
|
+
defaultMatch?: RegExp;
|
|
31
|
+
description?: string;
|
|
32
|
+
fallbackDescription?: string;
|
|
33
|
+
extraOptions?: Array<{
|
|
34
|
+
label: string;
|
|
35
|
+
value: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
export declare const API_KEY_PROVIDER_IDS: readonly ["openai", "anthropic", "google", "deepseek"];
|
|
40
|
+
export declare const PROVIDER_API_KEY_LINKS: Record<string, string>;
|
|
41
|
+
export declare function fetchModelRegistry(): Promise<ModelRegistry | null>;
|
|
42
|
+
/** Test-only: drop the in-memory registry cache. */
|
|
43
|
+
export declare function resetModelRegistryCache(): void;
|
|
44
|
+
export declare function listApiKeyProviders(registry: ModelRegistry | null): Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
}>;
|
|
48
|
+
export declare function getProviderModelOptions(registry: ModelRegistry | null, provider: string): Array<{
|
|
49
|
+
label: string;
|
|
50
|
+
value: string;
|
|
51
|
+
}> | undefined;
|
|
52
|
+
/** Registry-backed `configSchema` model field (`enum` + labeled `options`). */
|
|
53
|
+
export declare function modelConfigField(options: ModelConfigFieldOptions): Promise<ModelConfigField>;
|
|
54
|
+
//# sourceMappingURL=model-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../src/model-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,qEAAqE;IACrE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E,CAAC;AAKF,eAAO,MAAM,oBAAoB,wDAAyD,CAAC;AAE3F,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKzD,CAAC;AAWF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmBxE;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAC7B,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAStC;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAIrD;AAMD,+EAA+E;AAC/E,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAuD3B"}
|