@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.
Files changed (49) hide show
  1. package/README.md +30 -40
  2. package/dist/agent-plugin.d.ts +55 -0
  3. package/dist/agent-plugin.d.ts.map +1 -0
  4. package/dist/agent-plugin.js +118 -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/helpers.d.ts +90 -2
  15. package/dist/helpers.d.ts.map +1 -1
  16. package/dist/helpers.js +195 -0
  17. package/dist/helpers.js.map +1 -1
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +9 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/mcp-agent.d.ts +36 -0
  23. package/dist/mcp-agent.d.ts.map +1 -0
  24. package/dist/mcp-agent.js +93 -0
  25. package/dist/mcp-agent.js.map +1 -0
  26. package/dist/mcp-args.d.ts +3 -0
  27. package/dist/mcp-args.d.ts.map +1 -0
  28. package/dist/mcp-args.js +41 -0
  29. package/dist/mcp-args.js.map +1 -0
  30. package/dist/model-registry.d.ts +54 -0
  31. package/dist/model-registry.d.ts.map +1 -0
  32. package/dist/model-registry.js +109 -0
  33. package/dist/model-registry.js.map +1 -0
  34. package/dist/openai-model.d.ts +4 -0
  35. package/dist/openai-model.d.ts.map +1 -0
  36. package/dist/openai-model.js +13 -0
  37. package/dist/openai-model.js.map +1 -0
  38. package/dist/plugin.d.ts +6 -0
  39. package/dist/plugin.d.ts.map +1 -1
  40. package/dist/plugin.js.map +1 -1
  41. package/dist/text-reply.d.ts +30 -0
  42. package/dist/text-reply.d.ts.map +1 -0
  43. package/dist/text-reply.js +53 -0
  44. package/dist/text-reply.js.map +1 -0
  45. package/dist/thread-context.d.ts +15 -0
  46. package/dist/thread-context.d.ts.map +1 -0
  47. package/dist/thread-context.js +69 -0
  48. package/dist/thread-context.js.map +1 -0
  49. 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,4 @@
1
+ import type { LanguageModel } from 'ai';
2
+ /** OpenAI-compatible LanguageModel using BYOK or OpenBot Credits. */
3
+ export declare function resolveOpenAiModel(model: string): LanguageModel;
4
+ //# sourceMappingURL=openai-model.d.ts.map
@@ -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 = {
@@ -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;CACpB,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAyEA,MAAM,UAAU,YAAY,CAAkC,UAAa;IACzE,OAAO,UAAU,CAAC;AACpB,CAAC"}
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,30 @@
1
+ import type { AgentTurnYield } from './agent-plugin.js';
2
+ /** How a stream event maps onto a text reply. */
3
+ export type TextReplyHint = {
4
+ type: 'delta';
5
+ text: string;
6
+ } | {
7
+ type: 'text';
8
+ text: string;
9
+ } | {
10
+ type: 'flush';
11
+ } | {
12
+ type: 'skip';
13
+ };
14
+ /** `{ kind: 'reply' }` yield for `defineAgentPlugin`. */
15
+ export declare function textReply(content: string): AgentTurnYield;
16
+ /**
17
+ * Collect text deltas and emit one `{ kind: 'reply' }` per completed reply.
18
+ *
19
+ * - `delta`: append to the current reply
20
+ * - `text`: complete snapshot — drop in-progress deltas and yield immediately
21
+ * - `flush`: yield collected deltas (reply boundary)
22
+ * - `skip`: ignore
23
+ */
24
+ export declare function createTextReplyBuffer(): {
25
+ apply: (hint: TextReplyHint) => Generator<AgentTurnYield>;
26
+ end: () => Generator<AgentTurnYield>;
27
+ };
28
+ /** Classify each stream event and yield completed text as it lands. */
29
+ export declare function emitTextReplies<T>(events: AsyncIterable<T>, classify: (event: T) => TextReplyHint): AsyncGenerator<AgentTurnYield>;
30
+ //# sourceMappingURL=text-reply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-reply.d.ts","sourceRoot":"","sources":["../src/text-reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,iDAAiD;AACjD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB;kBAGb,aAAa,KAAG,SAAS,CAAC,cAAc,CAAC;eAuB9C,SAAS,CAAC,cAAc,CAAC;EAK3C;AAED,uEAAuE;AACvE,wBAAuB,eAAe,CAAC,CAAC,EACtC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,aAAa,GACpC,cAAc,CAAC,cAAc,CAAC,CAMhC"}
@@ -0,0 +1,53 @@
1
+ /** `{ kind: 'reply' }` yield for `defineAgentPlugin`. */
2
+ export function textReply(content) {
3
+ return { kind: 'reply', content };
4
+ }
5
+ /**
6
+ * Collect text deltas and emit one `{ kind: 'reply' }` per completed reply.
7
+ *
8
+ * - `delta`: append to the current reply
9
+ * - `text`: complete snapshot — drop in-progress deltas and yield immediately
10
+ * - `flush`: yield collected deltas (reply boundary)
11
+ * - `skip`: ignore
12
+ */
13
+ export function createTextReplyBuffer() {
14
+ let buffer = '';
15
+ function* apply(hint) {
16
+ switch (hint.type) {
17
+ case 'delta': {
18
+ if (hint.text)
19
+ buffer += hint.text;
20
+ return;
21
+ }
22
+ case 'text': {
23
+ buffer = '';
24
+ const content = hint.text.trim();
25
+ if (content)
26
+ yield textReply(content);
27
+ return;
28
+ }
29
+ case 'flush': {
30
+ const content = buffer.trim();
31
+ buffer = '';
32
+ if (content)
33
+ yield textReply(content);
34
+ return;
35
+ }
36
+ case 'skip':
37
+ return;
38
+ }
39
+ }
40
+ function* end() {
41
+ yield* apply({ type: 'flush' });
42
+ }
43
+ return { apply, end };
44
+ }
45
+ /** Classify each stream event and yield completed text as it lands. */
46
+ export async function* emitTextReplies(events, classify) {
47
+ const replies = createTextReplyBuffer();
48
+ for await (const event of events) {
49
+ yield* replies.apply(classify(event));
50
+ }
51
+ yield* replies.end();
52
+ }
53
+ //# sourceMappingURL=text-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-reply.js","sourceRoot":"","sources":["../src/text-reply.ts"],"names":[],"mappings":"AASA,yDAAyD;AACzD,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAmB;QACjC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,GAAG,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,OAAO;oBAAE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,GAAG,EAAE,CAAC;gBACZ,IAAI,OAAO;oBAAE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,KAAK,MAAM;gBACT,OAAO;QACX,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,CAAC,GAAG;QACX,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,MAAwB,EACxB,QAAqC;IAErC,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,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.2.0",
3
+ "version": "0.4.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/diff.test.ts"
40
+ "test": "node --experimental-strip-types --test src/*.test.ts"
36
41
  }
37
42
  }