@meetopenbot/plugin-sdk 0.2.0 → 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.
- package/README.md +30 -40
- package/dist/agent-plugin.d.ts +54 -0
- package/dist/agent-plugin.d.ts.map +1 -0
- package/dist/agent-plugin.js +117 -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 +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -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/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
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../src/model-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-model.d.ts","sourceRoot":"","sources":["../src/openai-model.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGxC,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAO/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { creditsOpenAiClientOptions, llmAuthNotConfiguredMessage, } from './credits-auth.js';
|
|
2
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
3
|
+
import { vendorModelId } from './helpers.js';
|
|
4
|
+
/** OpenAI-compatible LanguageModel using BYOK or OpenBot Credits. */
|
|
5
|
+
export function resolveOpenAiModel(model) {
|
|
6
|
+
const modelId = vendorModelId(model) ?? model;
|
|
7
|
+
const transport = creditsOpenAiClientOptions();
|
|
8
|
+
if (!transport) {
|
|
9
|
+
throw new Error(llmAuthNotConfiguredMessage());
|
|
10
|
+
}
|
|
11
|
+
return createOpenAI(transport)(modelId);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=openai-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-model.js","sourceRoot":"","sources":["../src/openai-model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC9C,MAAM,SAAS,GAAG,0BAA0B,EAAE,CAAC;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -22,6 +22,12 @@ export type ConfigSchemaProperty = {
|
|
|
22
22
|
format?: 'password' | 'url' | 'email';
|
|
23
23
|
/** When true, the field may be overridden per `agent:invoke` from the composer. */
|
|
24
24
|
override?: boolean;
|
|
25
|
+
/** Labeled select options (preferred over bare `enum` when present). */
|
|
26
|
+
options?: Array<{
|
|
27
|
+
label: string;
|
|
28
|
+
value: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}>;
|
|
25
31
|
};
|
|
26
32
|
/** JSON-schema-like description of per-plugin config in AGENT.md. */
|
|
27
33
|
export type ConfigSchema = {
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjF,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,sBAAsB,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,sBAAsB,CAAC;KAC9B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;IACtC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjF,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,sBAAsB,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,sBAAsB,CAAC;KAC9B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;IACtC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,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,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,aAAa,CAAC;CACpD;AAED,uFAAuF;AACvF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE9C,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;AACvE,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC"}
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA2EA,MAAM,UAAU,YAAY,CAAkC,UAAa;IACzE,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Storage } from './storage.js';
|
|
2
|
+
export declare const MAX_THREAD_CONTEXT_LINES = 20;
|
|
3
|
+
export type ThreadContextLine = {
|
|
4
|
+
role: 'user' | 'assistant';
|
|
5
|
+
content: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function threadEventsToContextLines(events: unknown[], agentId: string): ThreadContextLine[];
|
|
8
|
+
export declare function formatThreadContext(lines: ThreadContextLine[]): string;
|
|
9
|
+
export declare function loadThreadContext(storage: Storage, args: {
|
|
10
|
+
channelId?: string;
|
|
11
|
+
threadId: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
currentMessage?: string;
|
|
14
|
+
}): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=thread-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-context.d.ts","sourceRoot":"","sources":["../src/thread-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAQF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE,MAAM,GACd,iBAAiB,EAAE,CAsCrB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAKtE;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const MAX_THREAD_CONTEXT_LINES = 20;
|
|
2
|
+
export function threadEventsToContextLines(events, agentId) {
|
|
3
|
+
const lines = [];
|
|
4
|
+
for (const raw of events) {
|
|
5
|
+
if (!raw || typeof raw !== 'object')
|
|
6
|
+
continue;
|
|
7
|
+
const event = raw;
|
|
8
|
+
if (event.meta?.parentToolCallId)
|
|
9
|
+
continue;
|
|
10
|
+
switch (event.type) {
|
|
11
|
+
case 'agent:invoke': {
|
|
12
|
+
const role = event.data?.role ?? 'user';
|
|
13
|
+
const content = typeof event.data?.content === 'string' ? event.data.content.trim() : '';
|
|
14
|
+
if (role === 'user' && content) {
|
|
15
|
+
lines.push({ role: 'user', content });
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case 'agent:output': {
|
|
20
|
+
if (event.meta?.agentId !== agentId)
|
|
21
|
+
break;
|
|
22
|
+
const content = typeof event.data?.content === 'string' ? event.data.content.trim() : '';
|
|
23
|
+
if (!content)
|
|
24
|
+
break;
|
|
25
|
+
const last = lines[lines.length - 1];
|
|
26
|
+
if (last?.role === 'assistant') {
|
|
27
|
+
last.content += content;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
lines.push({ role: 'assistant', content });
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (lines.length > MAX_THREAD_CONTEXT_LINES) {
|
|
37
|
+
return lines.slice(-MAX_THREAD_CONTEXT_LINES);
|
|
38
|
+
}
|
|
39
|
+
return lines;
|
|
40
|
+
}
|
|
41
|
+
export function formatThreadContext(lines) {
|
|
42
|
+
if (lines.length === 0)
|
|
43
|
+
return '';
|
|
44
|
+
const jsonl = lines.map((line) => JSON.stringify(line)).join('\n');
|
|
45
|
+
return `Previous conversation context (most recent last):\n${jsonl}`;
|
|
46
|
+
}
|
|
47
|
+
export async function loadThreadContext(storage, args) {
|
|
48
|
+
if (!args.channelId)
|
|
49
|
+
return '';
|
|
50
|
+
try {
|
|
51
|
+
const events = await storage.getEvents({
|
|
52
|
+
channelId: args.channelId,
|
|
53
|
+
threadId: args.threadId,
|
|
54
|
+
});
|
|
55
|
+
let lines = threadEventsToContextLines(events, args.agentId);
|
|
56
|
+
const currentMessage = args.currentMessage?.trim();
|
|
57
|
+
if (currentMessage) {
|
|
58
|
+
const last = lines[lines.length - 1];
|
|
59
|
+
if (last?.role === 'user' && last.content === currentMessage) {
|
|
60
|
+
lines = lines.slice(0, -1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return formatThreadContext(lines);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=thread-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-context.js","sourceRoot":"","sources":["../src/thread-context.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meetopenbot/plugin-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Types and helpers for building OpenBot plugins on the event bus.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
"melony": "^0.3.7",
|
|
23
23
|
"zod": "^4.3.5"
|
|
24
24
|
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@ai-sdk/mcp": "^2.0.14",
|
|
27
|
+
"@ai-sdk/openai": "^4.0.15",
|
|
28
|
+
"ai": "^7.0.29"
|
|
29
|
+
},
|
|
25
30
|
"devDependencies": {
|
|
26
31
|
"melony": "^0.3.7",
|
|
27
32
|
"typescript": "^5.0.0",
|
|
@@ -32,6 +37,6 @@
|
|
|
32
37
|
"build": "tsc",
|
|
33
38
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
34
39
|
"typecheck": "tsc --noEmit",
|
|
35
|
-
"test": "node --experimental-strip-types --test src
|
|
40
|
+
"test": "node --experimental-strip-types --test src/*.test.ts"
|
|
36
41
|
}
|
|
37
42
|
}
|