@meetopenbot/plugin-sdk 0.1.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +31 -38
  2. package/dist/agent-plugin.d.ts +54 -0
  3. package/dist/agent-plugin.d.ts.map +1 -0
  4. package/dist/agent-plugin.js +117 -0
  5. package/dist/agent-plugin.js.map +1 -0
  6. package/dist/cloud-mode.d.ts +14 -0
  7. package/dist/cloud-mode.d.ts.map +1 -0
  8. package/dist/cloud-mode.js +26 -0
  9. package/dist/cloud-mode.js.map +1 -0
  10. package/dist/credits-auth.d.ts +47 -0
  11. package/dist/credits-auth.d.ts.map +1 -0
  12. package/dist/credits-auth.js +139 -0
  13. package/dist/credits-auth.js.map +1 -0
  14. package/dist/diff.d.ts +44 -0
  15. package/dist/diff.d.ts.map +1 -0
  16. package/dist/diff.js +287 -0
  17. package/dist/diff.js.map +1 -0
  18. package/dist/events.d.ts +1 -1
  19. package/dist/events.d.ts.map +1 -1
  20. package/dist/helpers.d.ts +98 -2
  21. package/dist/helpers.d.ts.map +1 -1
  22. package/dist/helpers.js +207 -0
  23. package/dist/helpers.js.map +1 -1
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +9 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/mcp-agent.d.ts +36 -0
  29. package/dist/mcp-agent.d.ts.map +1 -0
  30. package/dist/mcp-agent.js +93 -0
  31. package/dist/mcp-agent.js.map +1 -0
  32. package/dist/mcp-args.d.ts +3 -0
  33. package/dist/mcp-args.d.ts.map +1 -0
  34. package/dist/mcp-args.js +41 -0
  35. package/dist/mcp-args.js.map +1 -0
  36. package/dist/model-registry.d.ts +54 -0
  37. package/dist/model-registry.d.ts.map +1 -0
  38. package/dist/model-registry.js +109 -0
  39. package/dist/model-registry.js.map +1 -0
  40. package/dist/openai-model.d.ts +4 -0
  41. package/dist/openai-model.d.ts.map +1 -0
  42. package/dist/openai-model.js +13 -0
  43. package/dist/openai-model.js.map +1 -0
  44. package/dist/plugin.d.ts +6 -0
  45. package/dist/plugin.d.ts.map +1 -1
  46. package/dist/plugin.js.map +1 -1
  47. package/dist/thread-context.d.ts +15 -0
  48. package/dist/thread-context.d.ts.map +1 -0
  49. package/dist/thread-context.js +69 -0
  50. package/dist/thread-context.js.map +1 -0
  51. package/dist/ui.d.ts +25 -2
  52. package/dist/ui.d.ts.map +1 -1
  53. package/package.json +15 -7
package/dist/helpers.js CHANGED
@@ -23,6 +23,18 @@ export function toolResult(toolName, request, data) {
23
23
  meta: request.meta,
24
24
  };
25
25
  }
26
+ /** Collapsed tool-trace message, stacked with others that share `groupId`. */
27
+ export function toolTraceWidget(args) {
28
+ return {
29
+ kind: "message",
30
+ display: "collapsed",
31
+ widgetId: args.widgetId,
32
+ groupId: args.groupId,
33
+ title: args.title,
34
+ ...(args.body ? { body: args.body } : {}),
35
+ ...(args.state ? { state: args.state } : {}),
36
+ };
37
+ }
26
38
  /** Build a `client:ui:widget` event. */
27
39
  export function uiWidget(args) {
28
40
  return {
@@ -66,4 +78,199 @@ export function webhookHttpResponse(args) {
66
78
  data: args,
67
79
  };
68
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
+ }
69
276
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAWA,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAChC,KAAuB,EACvB,OAAe;IAEf,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,WAAW,CAAC,IAK3B;IACC,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;QAC/B,IAAI,EAAE;YACJ,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,OAA6B,EAC7B,IAAW;IAEX,OAAO;QACL,IAAI,EAAE,UAAU,QAAQ,SAAS;QACjC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,QAAQ,CAAC,IAKxB;IACC,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,IAAI,CAAC,MAAM;QACjB,IAAI,EAAE;YACJ,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD;KACF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CACtB,MAA4B,EAC5B,KAAQ;IAER,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO;QACL,GAAG,KAAK;QACR,IAAI,EAAE;YACJ,GAAG,MAAM,CAAC,IAAI;YACd,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SACtB;KACF,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,IAAY;IAEZ,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,4 +5,13 @@ export * from './events.js';
5
5
  export * from './ui.js';
6
6
  export * from './storage.js';
7
7
  export * from './helpers.js';
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 './mcp-agent.js';
14
+ export * from './mcp-args.js';
15
+ export * from './openai-model.js';
16
+ export * from './thread-context.js';
8
17
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
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,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -5,4 +5,13 @@ export * from './events.js';
5
5
  export * from './ui.js';
6
6
  export * from './storage.js';
7
7
  export * from './helpers.js';
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 './mcp-agent.js';
14
+ export * from './mcp-args.js';
15
+ export * from './openai-model.js';
16
+ export * from './thread-context.js';
8
17
  //# 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"}
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,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,3 @@
1
+ export declare function sanitizeMcpToolArgs(args: unknown): unknown;
2
+ export declare function wrapMcpTools<T extends object>(tools: T): T;
3
+ //# sourceMappingURL=mcp-args.d.ts.map
@@ -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"}
@@ -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"}
@@ -0,0 +1,109 @@
1
+ const DEFAULT_REGISTRY_URL = 'https://raw.githubusercontent.com/meetopenbot/openbot-registry/main/registry.json';
2
+ export const API_KEY_PROVIDER_IDS = ['openai', 'anthropic', 'google', 'deepseek'];
3
+ export const PROVIDER_API_KEY_LINKS = {
4
+ openai: 'https://platform.openai.com/api-keys',
5
+ anthropic: 'https://console.anthropic.com/settings/keys',
6
+ google: 'https://aistudio.google.com/app/apikey',
7
+ deepseek: 'https://platform.deepseek.com/api_keys',
8
+ };
9
+ const FALLBACK_PROVIDERS = [
10
+ { id: 'openai', label: 'OpenAI' },
11
+ { id: 'anthropic', label: 'Anthropic' },
12
+ { id: 'google', label: 'Google' },
13
+ { id: 'deepseek', label: 'DeepSeek' },
14
+ ];
15
+ let cachedRegistry;
16
+ export async function fetchModelRegistry() {
17
+ if (cachedRegistry !== undefined)
18
+ return cachedRegistry;
19
+ const url = process.env.OPENBOT_MODEL_REGISTRY_URL?.trim() || DEFAULT_REGISTRY_URL;
20
+ try {
21
+ const response = await fetch(url, {
22
+ headers: { Accept: 'application/json' },
23
+ signal: AbortSignal.timeout(15_000),
24
+ });
25
+ if (!response.ok) {
26
+ cachedRegistry = null;
27
+ return null;
28
+ }
29
+ cachedRegistry = (await response.json());
30
+ return cachedRegistry;
31
+ }
32
+ catch {
33
+ cachedRegistry = null;
34
+ return null;
35
+ }
36
+ }
37
+ /** Test-only: drop the in-memory registry cache. */
38
+ export function resetModelRegistryCache() {
39
+ cachedRegistry = undefined;
40
+ }
41
+ export function listApiKeyProviders(registry) {
42
+ if (!registry?.providers)
43
+ return FALLBACK_PROVIDERS;
44
+ const providers = API_KEY_PROVIDER_IDS.flatMap((id) => {
45
+ const provider = registry.providers?.[id];
46
+ return provider ? [{ id, label: provider.label }] : [];
47
+ });
48
+ return providers.length > 0 ? providers : FALLBACK_PROVIDERS;
49
+ }
50
+ export function getProviderModelOptions(registry, provider) {
51
+ const models = registry?.providers?.[provider]?.models;
52
+ if (!models?.length)
53
+ return undefined;
54
+ return models.map((model) => ({ label: model.label, value: model.id }));
55
+ }
56
+ function modelValue(providerId, modelId, format) {
57
+ return format === 'raw' ? modelId : `${providerId}/${modelId}`;
58
+ }
59
+ /** Registry-backed `configSchema` model field (`enum` + labeled `options`). */
60
+ export async function modelConfigField(options) {
61
+ const valueFormat = options.valueFormat ?? 'prefixed';
62
+ const fallback = {
63
+ type: 'string',
64
+ description: options.fallbackDescription ??
65
+ options.description ??
66
+ 'Model id from the OpenBot registry.',
67
+ ...(options.defaultValue ? { default: options.defaultValue } : {}),
68
+ ...(options.override ? { override: true } : {}),
69
+ };
70
+ const registry = await fetchModelRegistry();
71
+ const fieldOptions = [
72
+ ...(options.extraOptions ?? []),
73
+ ];
74
+ for (const providerId of options.providers) {
75
+ const provider = registry?.providers?.[providerId];
76
+ if (!provider)
77
+ continue;
78
+ for (const model of provider.models ?? []) {
79
+ fieldOptions.push({
80
+ value: modelValue(providerId, model.id, valueFormat),
81
+ label: options.providers.length > 1
82
+ ? `${provider.label} — ${model.label}`
83
+ : model.label,
84
+ description: model.description,
85
+ });
86
+ }
87
+ }
88
+ const extraCount = options.extraOptions?.length ?? 0;
89
+ if (fieldOptions.length <= extraCount)
90
+ return fallback;
91
+ const modelOptions = fieldOptions.slice(extraCount);
92
+ const matched = (options.defaultMatch
93
+ ? modelOptions.find((option) => options.defaultMatch?.test(option.value))
94
+ : undefined) ??
95
+ (options.defaultValue
96
+ ? modelOptions.find((option) => option.value === options.defaultValue)
97
+ : undefined) ??
98
+ modelOptions[0];
99
+ const defaultValue = options.extraOptions?.[0]?.value ?? matched?.value ?? options.defaultValue;
100
+ return {
101
+ type: 'string',
102
+ description: options.description ?? 'Model from the OpenBot registry.',
103
+ ...(defaultValue ? { default: defaultValue } : {}),
104
+ ...(options.override ? { override: true } : {}),
105
+ enum: fieldOptions.map((option) => option.value),
106
+ options: fieldOptions,
107
+ };
108
+ }
109
+ //# sourceMappingURL=model-registry.js.map