@okdoc-ai/plugin-sdk 1.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 (61) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +131 -0
  3. package/dist/angular.d.ts +36 -0
  4. package/dist/angular.d.ts.map +1 -0
  5. package/dist/angular.js +38 -0
  6. package/dist/angular.js.map +1 -0
  7. package/dist/converters/gemini.d.ts +26 -0
  8. package/dist/converters/gemini.d.ts.map +1 -0
  9. package/dist/converters/gemini.js +66 -0
  10. package/dist/converters/gemini.js.map +1 -0
  11. package/dist/converters/index.d.ts +3 -0
  12. package/dist/converters/index.d.ts.map +1 -0
  13. package/dist/converters/index.js +6 -0
  14. package/dist/converters/index.js.map +1 -0
  15. package/dist/converters/openai.d.ts +25 -0
  16. package/dist/converters/openai.d.ts.map +1 -0
  17. package/dist/converters/openai.js +36 -0
  18. package/dist/converters/openai.js.map +1 -0
  19. package/dist/decorators.d.ts +50 -0
  20. package/dist/decorators.d.ts.map +1 -0
  21. package/dist/decorators.js +78 -0
  22. package/dist/decorators.js.map +1 -0
  23. package/dist/handler.d.ts +5 -0
  24. package/dist/handler.d.ts.map +1 -0
  25. package/dist/handler.js +8 -0
  26. package/dist/handler.js.map +1 -0
  27. package/dist/iframe-sdk-types.d.ts +104 -0
  28. package/dist/iframe-sdk-types.d.ts.map +1 -0
  29. package/dist/iframe-sdk-types.js +15 -0
  30. package/dist/iframe-sdk-types.js.map +1 -0
  31. package/dist/iframe-sdk.d.ts +2 -0
  32. package/dist/iframe-sdk.d.ts.map +1 -0
  33. package/dist/iframe-sdk.js +202 -0
  34. package/dist/iframe-sdk.js.map +1 -0
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +17 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/metadata.d.ts +22 -0
  40. package/dist/metadata.d.ts.map +1 -0
  41. package/dist/metadata.js +53 -0
  42. package/dist/metadata.js.map +1 -0
  43. package/dist/okdoc-iframe-sdk-global.d.ts +116 -0
  44. package/dist/okdoc-iframe-sdk.js +1 -0
  45. package/dist/register-remote.d.ts +50 -0
  46. package/dist/register-remote.d.ts.map +1 -0
  47. package/dist/register-remote.js +84 -0
  48. package/dist/register-remote.js.map +1 -0
  49. package/dist/symbols.d.ts +5 -0
  50. package/dist/symbols.d.ts.map +1 -0
  51. package/dist/symbols.js +8 -0
  52. package/dist/symbols.js.map +1 -0
  53. package/dist/types.d.ts +298 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +17 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/version.d.ts +2 -0
  58. package/dist/version.d.ts.map +1 -0
  59. package/dist/version.js +4 -0
  60. package/dist/version.js.map +1 -0
  61. package/package.json +76 -0
@@ -0,0 +1,78 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk — Decorators
3
+ // ============================================================================
4
+ import { OKDOC_PLUGIN_KEY, MCP_TOOLS_KEY } from './symbols.js';
5
+ // ── @OkDocPlugin ────────────────────────────────────────────────────────────
6
+ /**
7
+ * Class decorator that marks an Angular component as an OkDoc plugin.
8
+ *
9
+ * Stores manifest metadata on the class constructor so the host framework
10
+ * can discover plugin identity, namespace, and icon without instantiation.
11
+ *
12
+ * ```typescript
13
+ * @OkDocPlugin({
14
+ * id: 'audio-player',
15
+ * name: 'Audio Player',
16
+ * description: 'Plays audio files via URL',
17
+ * version: '1.0.0',
18
+ * icon: 'musical-notes-outline',
19
+ * namespace: 'audio_player',
20
+ * })
21
+ * @Component({ selector: 'okdoc-audio-player', standalone: true, ... })
22
+ * export class AudioPlayerComponent { ... }
23
+ * ```
24
+ */
25
+ export function OkDocPlugin(metadata) {
26
+ return function (target) {
27
+ Object.defineProperty(target, OKDOC_PLUGIN_KEY, {
28
+ value: metadata,
29
+ writable: false,
30
+ enumerable: false,
31
+ configurable: false,
32
+ });
33
+ };
34
+ }
35
+ /**
36
+ * Method decorator that marks a method as an MCP-callable tool.
37
+ *
38
+ * Stores metadata on the class prototype under MCP_TOOLS_KEY so the host
39
+ * framework can discover tool declarations without instantiation.
40
+ *
41
+ * The method becomes the tool handler when the component is live.
42
+ * It receives parsed arguments and must return `Promise<McpToolResult>`.
43
+ *
44
+ * ```typescript
45
+ * @McpTool({ description: 'Start audio playback' })
46
+ * async play(): Promise<McpToolResult> {
47
+ * this.audioRef.nativeElement.play();
48
+ * return { content: [{ type: 'text', text: 'Playing' }] };
49
+ * }
50
+ * ```
51
+ */
52
+ export function McpTool(options) {
53
+ return function (_target, propertyKey, _descriptor) {
54
+ const proto = _target;
55
+ const existing = proto[MCP_TOOLS_KEY] ? [...proto[MCP_TOOLS_KEY]] : [];
56
+ const metadata = {
57
+ methodName: String(propertyKey),
58
+ description: options.description,
59
+ };
60
+ if (options.name != null) {
61
+ metadata.name = options.name;
62
+ }
63
+ if (options.inputSchema != null) {
64
+ metadata.inputSchema = options.inputSchema;
65
+ }
66
+ if (options.annotations != null) {
67
+ metadata.annotations = options.annotations;
68
+ }
69
+ existing.push(metadata);
70
+ Object.defineProperty(proto, MCP_TOOLS_KEY, {
71
+ value: existing,
72
+ writable: true,
73
+ enumerable: false,
74
+ configurable: true,
75
+ });
76
+ };
77
+ }
78
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAG/E,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,QAA6B;IACrD,OAAO,UAAU,MAAgB;QAC7B,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE;YAC5C,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACtB,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAeD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CAAC,OAAuB;IAC3C,OAAO,UAAU,OAAe,EAAE,WAA4B,EAAE,WAA+B;QAC3F,MAAM,KAAK,GAAG,OAA4C,CAAC;QAC3D,MAAM,QAAQ,GAAsB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,MAAM,QAAQ,GAAoB;YAC9B,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC;YAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;SACnC,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC9B,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC9B,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAC/C,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE;YACxC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;SACrB,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { toGeminiFunctionDeclarations } from './converters/gemini.js';
2
+ export type { GeminiFunctionDeclaration, GeminiSchema, GeminiSchemaType } from './converters/gemini.js';
3
+ export { toOpenAiFunctions } from './converters/openai.js';
4
+ export type { OpenAiFunctionTool, OpenAiFunctionDefinition, OpenAiJsonSchema } from './converters/openai.js';
5
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAExG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk/handler — Host-side AI format converters
3
+ //
4
+ // Import from '@okdoc-ai/plugin-sdk/handler'.
5
+ // ============================================================================
6
+ export { toGeminiFunctionDeclarations } from './converters/gemini.js';
7
+ export { toOpenAiFunctions } from './converters/openai.js';
8
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gEAAgE;AAChE,EAAE;AACF,8CAA8C;AAC9C,+EAA+E;AAE/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,104 @@
1
+ export interface JsonSchemaProperty {
2
+ type?: string | string[];
3
+ description?: string;
4
+ enum?: unknown[];
5
+ const?: unknown;
6
+ default?: unknown;
7
+ minLength?: number;
8
+ maxLength?: number;
9
+ pattern?: string;
10
+ format?: string;
11
+ minimum?: number;
12
+ maximum?: number;
13
+ items?: JsonSchemaProperty | JsonSchemaProperty[];
14
+ minItems?: number;
15
+ maxItems?: number;
16
+ properties?: Record<string, JsonSchemaProperty>;
17
+ required?: string[];
18
+ additionalProperties?: boolean | JsonSchemaProperty;
19
+ oneOf?: JsonSchemaProperty[];
20
+ anyOf?: JsonSchemaProperty[];
21
+ allOf?: JsonSchemaProperty[];
22
+ not?: JsonSchemaProperty;
23
+ [key: string]: unknown;
24
+ }
25
+ export interface ToolInputSchema {
26
+ type: 'object';
27
+ properties?: Record<string, JsonSchemaProperty>;
28
+ required?: string[];
29
+ }
30
+ export interface Annotations {
31
+ audience?: ('user' | 'assistant')[];
32
+ priority?: number;
33
+ lastModified?: string;
34
+ }
35
+ export interface ToolAnnotations {
36
+ title?: string;
37
+ readOnlyHint?: boolean;
38
+ destructiveHint?: boolean;
39
+ idempotentHint?: boolean;
40
+ openWorldHint?: boolean;
41
+ }
42
+ export interface ContentBlock {
43
+ type: 'text' | 'image' | 'audio' | 'resource' | 'resource_link';
44
+ text?: string;
45
+ data?: string;
46
+ mimeType?: string;
47
+ uri?: string;
48
+ name?: string;
49
+ description?: string;
50
+ resource?: {
51
+ uri: string;
52
+ mimeType?: string;
53
+ text?: string;
54
+ blob?: string;
55
+ };
56
+ annotations?: Annotations;
57
+ }
58
+ export interface ToolResult {
59
+ content: ContentBlock[];
60
+ structuredContent?: Record<string, unknown>;
61
+ isError?: boolean;
62
+ }
63
+ export interface ToolConfig {
64
+ description: string;
65
+ inputSchema?: ToolInputSchema;
66
+ annotations?: ToolAnnotations;
67
+ handler: (args: Record<string, unknown>) => Promise<ToolResult>;
68
+ }
69
+ export interface InitOptions {
70
+ /** Unique plugin identifier */
71
+ id: string;
72
+ /** Display name shown in the Plugin Store */
73
+ name: string;
74
+ /** Short description */
75
+ description?: string;
76
+ /** Semver version of the plugin */
77
+ version: string;
78
+ /** Ionicon name for the store card */
79
+ icon?: string;
80
+ /** MCP namespace prefix for all tools */
81
+ namespace: string;
82
+ /** Display mode: foreground (visible UI) or background (hidden) */
83
+ mode?: 'foreground' | 'background';
84
+ /** Allowed origins for the host handshake. If omitted, any origin is accepted. */
85
+ allowedOrigins?: string[];
86
+ }
87
+ export interface IframeSDK {
88
+ /** Initialize the plugin with its manifest. Must be called before registerTool(). */
89
+ init(options: InitOptions): void;
90
+ /** Register a tool that the host app (AI) can call. */
91
+ registerTool(name: string, config: ToolConfig): void;
92
+ /**
93
+ * Send a notification message to the AI.
94
+ * Only works after the host has connected via handshake.
95
+ */
96
+ notify(message: string): void;
97
+ /** Clean up the SDK: remove event listeners, close port, clear state. */
98
+ destroy(): void;
99
+ /** Current iframe protocol version */
100
+ readonly version: number;
101
+ /** MCP protocol version this SDK targets */
102
+ readonly mcpProtocolVersion: string;
103
+ }
104
+ //# sourceMappingURL=iframe-sdk-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-sdk-types.d.ts","sourceRoot":"","sources":["../src/iframe-sdk-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk — Iframe SDK Type Definitions (single source of truth)
3
+ //
4
+ // These interfaces define the public API available to iframe plugin developers
5
+ // via the global `OkDoc` object.
6
+ //
7
+ // ★ The build script auto-generates `dist/okdoc-iframe-sdk-global.d.ts` from
8
+ // the tsc-emitted declarations of this file. It strips `export`, adds the
9
+ // `OkDoc` prefix to all type names, and appends `declare var OkDoc: ...`.
10
+ //
11
+ // ★ To update the global d.ts: edit THIS file, then run `npm run build:all`.
12
+ // Never edit the generated d.ts manually.
13
+ // ============================================================================
14
+ export {};
15
+ //# sourceMappingURL=iframe-sdk-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-sdk-types.js","sourceRoot":"","sources":["../src/iframe-sdk-types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,iCAAiC;AACjC,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,4CAA4C;AAC5C,+EAA+E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=iframe-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-sdk.d.ts","sourceRoot":"","sources":["../src/iframe-sdk.ts"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk — Iframe SDK (standalone, no dependencies)
3
+ //
4
+ // This file is compiled into a self-contained IIFE (okdoc-iframe-sdk.js)
5
+ // that site owners include on their pages via <script> tag.
6
+ //
7
+ // Usage:
8
+ // <script src="okdoc-iframe-sdk.js"></script>
9
+ // <script>
10
+ // OkDoc.init({ id: 'my-plugin', name: 'My Plugin', namespace: 'my', version: '1.0.0' });
11
+ // OkDoc.registerTool('doSomething', {
12
+ // description: 'Does something useful',
13
+ // inputSchema: { type: 'object', properties: { input: { type: 'string' } } },
14
+ // handler: async (args) => ({ content: [{ type: 'text', text: 'Done!' }] })
15
+ // });
16
+ // </script>
17
+ // ============================================================================
18
+ /** Iframe protocol version this SDK implements */
19
+ const SDK_VERSION = 2;
20
+ /** MCP protocol version this SDK targets */
21
+ const MCP_PROTOCOL_VERSION = '2025-03-26';
22
+ // ── Internal state ──────────────────────────────────────────────────────────
23
+ let manifest = null;
24
+ let allowedOrigins = null;
25
+ const tools = new Map();
26
+ let port = null;
27
+ let sendTimer = null;
28
+ function buildToolDeclarations() {
29
+ const declarations = [];
30
+ tools.forEach((config, name) => {
31
+ const decl = { name, description: config.description };
32
+ if (config.inputSchema) {
33
+ decl.inputSchema = config.inputSchema;
34
+ }
35
+ if (config.annotations) {
36
+ decl.annotations = config.annotations;
37
+ }
38
+ declarations.push(decl);
39
+ });
40
+ return declarations;
41
+ }
42
+ function sendManifest(p) {
43
+ if (!manifest)
44
+ return;
45
+ p.postMessage({
46
+ type: 'okdoc:manifest',
47
+ sdkVersion: SDK_VERSION,
48
+ manifest: {
49
+ ...manifest,
50
+ description: manifest.description ?? '',
51
+ tools: buildToolDeclarations(),
52
+ sdkVersion: __OKDOC_SDK_VERSION__,
53
+ mcpProtocolVersion: MCP_PROTOCOL_VERSION,
54
+ },
55
+ });
56
+ }
57
+ /**
58
+ * Schedule a manifest send after a short debounce (150ms).
59
+ * This ensures that rapid init() + registerTool() calls in the same
60
+ * tick produce a single manifest message with all tools included.
61
+ */
62
+ function scheduleSendManifest() {
63
+ if (!port || !manifest)
64
+ return;
65
+ if (sendTimer !== null) {
66
+ clearTimeout(sendTimer);
67
+ }
68
+ sendTimer = setTimeout(() => {
69
+ sendTimer = null;
70
+ if (port && manifest) {
71
+ sendManifest(port);
72
+ }
73
+ }, 150);
74
+ }
75
+ async function handleToolCall(p, id, toolName, args) {
76
+ const tool = tools.get(toolName);
77
+ if (!tool) {
78
+ p.postMessage({
79
+ type: 'okdoc:result',
80
+ id,
81
+ result: {
82
+ content: [{ type: 'text', text: `Tool "${toolName}" not found in this plugin.` }],
83
+ isError: true,
84
+ },
85
+ });
86
+ return;
87
+ }
88
+ try {
89
+ const result = await tool.handler(args);
90
+ p.postMessage({ type: 'okdoc:result', id, result });
91
+ }
92
+ catch (err) {
93
+ const message = err instanceof Error ? err.message : String(err);
94
+ p.postMessage({
95
+ type: 'okdoc:result',
96
+ id,
97
+ result: {
98
+ content: [{ type: 'text', text: `Tool "${toolName}" error: ${message}` }],
99
+ isError: true,
100
+ },
101
+ });
102
+ }
103
+ }
104
+ function onPortMessage(event) {
105
+ const data = event.data;
106
+ if (!data || typeof data.type !== 'string')
107
+ return;
108
+ if (data.type === 'okdoc:call') {
109
+ handleToolCall(port, data.id, data.tool, data.args ?? {});
110
+ }
111
+ }
112
+ function onHandshake(event) {
113
+ const data = event.data;
114
+ if (!data || data.type !== 'okdoc:handshake')
115
+ return;
116
+ if (!event.ports || event.ports.length === 0)
117
+ return;
118
+ // Origin validation
119
+ if (allowedOrigins) {
120
+ if (!allowedOrigins.includes(event.origin)) {
121
+ console.warn(`[OkDoc SDK] Rejected handshake from untrusted origin: ${event.origin}`);
122
+ return;
123
+ }
124
+ }
125
+ else {
126
+ console.warn('[OkDoc SDK] No allowedOrigins configured — accepting handshake from any origin. ' +
127
+ 'Set allowedOrigins in OkDoc.init() for production use.');
128
+ }
129
+ // Accept the port from the host
130
+ port = event.ports[0];
131
+ port.onmessage = onPortMessage;
132
+ // Respond with manifest
133
+ sendManifest(port);
134
+ }
135
+ // Listen for the handshake message from the host
136
+ window.addEventListener('message', onHandshake);
137
+ // ============================================================================
138
+ // Public API — exposed as window.OkDoc
139
+ // ============================================================================
140
+ const OkDoc = {
141
+ /**
142
+ * Initialize the plugin with its manifest.
143
+ * Must be called before registerTool().
144
+ */
145
+ init(options) {
146
+ const { allowedOrigins: origins, ...m } = options;
147
+ manifest = m;
148
+ allowedOrigins = origins ?? null;
149
+ // If the handshake already arrived before init(), schedule manifest send
150
+ scheduleSendManifest();
151
+ },
152
+ /**
153
+ * Register a tool that the host app (AI) can call.
154
+ */
155
+ registerTool(name, config) {
156
+ tools.set(name, config);
157
+ // Schedule manifest re-send so host sees updated tools (debounced)
158
+ scheduleSendManifest();
159
+ },
160
+ /**
161
+ * Send a notification message to the AI.
162
+ * Only works after the host has connected via handshake.
163
+ */
164
+ notify(message) {
165
+ if (port) {
166
+ console.log('[OkDoc SDK] Sending notification to host:', message);
167
+ port.postMessage({ type: 'okdoc:notify', message });
168
+ }
169
+ else {
170
+ console.warn('[OkDoc SDK] notify() called but no port connected — handshake not completed yet.');
171
+ }
172
+ },
173
+ /**
174
+ * Clean up the SDK: remove event listeners, close port, clear state.
175
+ */
176
+ destroy() {
177
+ window.removeEventListener('message', onHandshake);
178
+ if (sendTimer !== null) {
179
+ clearTimeout(sendTimer);
180
+ sendTimer = null;
181
+ }
182
+ if (port) {
183
+ port.close();
184
+ port = null;
185
+ }
186
+ manifest = null;
187
+ allowedOrigins = null;
188
+ tools.clear();
189
+ },
190
+ /** Current iframe protocol version */
191
+ version: SDK_VERSION,
192
+ /** MCP protocol version this SDK targets */
193
+ mcpProtocolVersion: MCP_PROTOCOL_VERSION,
194
+ };
195
+ // Expose globally (frozen, non-writable)
196
+ Object.defineProperty(window, 'OkDoc', {
197
+ value: Object.freeze(OkDoc),
198
+ writable: false,
199
+ configurable: false,
200
+ });
201
+ export {};
202
+ //# sourceMappingURL=iframe-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iframe-sdk.js","sourceRoot":"","sources":["../src/iframe-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { OKDOC_MCP_PROTOCOL_VERSION, OKDOC_SDK_VERSION, OKDOC_IFRAME_PROTOCOL_VERSION, } from './types.js';
2
+ export type { JsonSchemaProperty, McpToolInputSchema, McpAnnotations, McpTextContent, McpImageContent, McpAudioContent, McpEmbeddedResource, McpResourceLink, McpContentBlock, McpToolAnnotations, McpToolResult, McpStaticToolDeclaration, McpToolMetadata, OkDocPluginMetadata, OkDocPluginManifest, RemotePluginManifest, RemotePluginBundle, OkDocPluginGlobal, IframePluginManifest, OkDocIframeHandshake, OkDocIframeManifestMessage, OkDocIframeCallMessage, OkDocIframeResultMessage, OkDocIframeNotifyMessage, OkDocIframePortMessage, McpToolProvider, McpToolDefinition, McpComponentConfig, } from './types.js';
3
+ export { OKDOC_PLUGIN_KEY, MCP_TOOLS_KEY } from './symbols.js';
4
+ export { OkDocPlugin, McpTool } from './decorators.js';
5
+ export type { McpToolOptions } from './decorators.js';
6
+ export { readPluginMetadata, readToolMetadata, readStaticToolDeclarations, enrichPluginMetadata } from './metadata.js';
7
+ export { registerRemotePlugin } from './register-remote.js';
8
+ export type { RemotePluginBundleInput } from './register-remote.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,6BAA6B,GAChC,MAAM,YAAY,CAAC;AAGpB,YAAY,EACR,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EAEjB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EAEtB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGvH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk — Public API
3
+ //
4
+ // This is the main entry point. Angular-specific exports are in ./angular.
5
+ // Host-side handler & converters are in ./handler.
6
+ // ============================================================================
7
+ // Version constants
8
+ export { OKDOC_MCP_PROTOCOL_VERSION, OKDOC_SDK_VERSION, OKDOC_IFRAME_PROTOCOL_VERSION, } from './types.js';
9
+ // Symbols
10
+ export { OKDOC_PLUGIN_KEY, MCP_TOOLS_KEY } from './symbols.js';
11
+ // Decorators
12
+ export { OkDocPlugin, McpTool } from './decorators.js';
13
+ // Metadata readers
14
+ export { readPluginMetadata, readToolMetadata, readStaticToolDeclarations, enrichPluginMetadata } from './metadata.js';
15
+ // Remote plugin registration
16
+ export { registerRemotePlugin } from './register-remote.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,mDAAmD;AACnD,+EAA+E;AAE/E,oBAAoB;AACpB,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,6BAA6B,GAChC,MAAM,YAAY,CAAC;AAoCpB,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGvD,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEvH,6BAA6B;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { OkDocPluginMetadata, McpToolMetadata, McpStaticToolDeclaration } from './types.js';
2
+ /**
3
+ * Read @OkDocPlugin metadata from a component class.
4
+ * Returns `null` if the class is not decorated.
5
+ */
6
+ export declare function readPluginMetadata(componentClass: Function): OkDocPluginMetadata | null;
7
+ /**
8
+ * Read @McpTool metadata from a component class prototype.
9
+ * Returns an empty array if no methods are decorated.
10
+ */
11
+ export declare function readToolMetadata(componentClass: Function): McpToolMetadata[];
12
+ /**
13
+ * Read @McpTool metadata and convert to static tool declarations
14
+ * (name + description + parameters, no handler).
15
+ */
16
+ export declare function readStaticToolDeclarations(componentClass: Function): McpStaticToolDeclaration[];
17
+ /**
18
+ * Auto-populate `sdkVersion` and `mcpProtocolVersion` on plugin metadata
19
+ * if not already set. Call during plugin registration.
20
+ */
21
+ export declare function enrichPluginMetadata(metadata: OkDocPluginMetadata): OkDocPluginMetadata;
22
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAiD,MAAM,YAAY,CAAC;AAG3I;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,QAAQ,GAAG,mBAAmB,GAAG,IAAI,CAEvF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,QAAQ,GAAG,eAAe,EAAE,CAE5E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,QAAQ,GAAG,wBAAwB,EAAE,CAc/F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,CAMvF"}
@@ -0,0 +1,53 @@
1
+ // ============================================================================
2
+ // @okdoc-ai/plugin-sdk — Metadata Readers
3
+ //
4
+ // Read decorator metadata from a class WITHOUT instantiating it.
5
+ // Used by the host framework to discover plugin identity and tools statically.
6
+ // ============================================================================
7
+ import { OKDOC_SDK_VERSION, OKDOC_MCP_PROTOCOL_VERSION } from './types.js';
8
+ import { OKDOC_PLUGIN_KEY, MCP_TOOLS_KEY } from './symbols.js';
9
+ /**
10
+ * Read @OkDocPlugin metadata from a component class.
11
+ * Returns `null` if the class is not decorated.
12
+ */
13
+ export function readPluginMetadata(componentClass) {
14
+ return componentClass[OKDOC_PLUGIN_KEY] ?? null;
15
+ }
16
+ /**
17
+ * Read @McpTool metadata from a component class prototype.
18
+ * Returns an empty array if no methods are decorated.
19
+ */
20
+ export function readToolMetadata(componentClass) {
21
+ return componentClass.prototype[MCP_TOOLS_KEY] ?? [];
22
+ }
23
+ /**
24
+ * Read @McpTool metadata and convert to static tool declarations
25
+ * (name + description + parameters, no handler).
26
+ */
27
+ export function readStaticToolDeclarations(componentClass) {
28
+ return readToolMetadata(componentClass).map(meta => {
29
+ const decl = {
30
+ name: meta.name ?? meta.methodName,
31
+ description: meta.description,
32
+ };
33
+ if (meta.inputSchema != null) {
34
+ decl.inputSchema = meta.inputSchema;
35
+ }
36
+ if (meta.annotations != null) {
37
+ decl.annotations = meta.annotations;
38
+ }
39
+ return decl;
40
+ });
41
+ }
42
+ /**
43
+ * Auto-populate `sdkVersion` and `mcpProtocolVersion` on plugin metadata
44
+ * if not already set. Call during plugin registration.
45
+ */
46
+ export function enrichPluginMetadata(metadata) {
47
+ return {
48
+ ...metadata,
49
+ sdkVersion: metadata.sdkVersion ?? OKDOC_SDK_VERSION,
50
+ mcpProtocolVersion: metadata.mcpProtocolVersion ?? OKDOC_MCP_PROTOCOL_VERSION,
51
+ };
52
+ }
53
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0CAA0C;AAC1C,EAAE;AACF,iEAAiE;AACjE,+EAA+E;AAC/E,+EAA+E;AAE/E,OAAO,EAAkE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC3I,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAAwB;IACvD,OAAQ,cAAsB,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAwB;IACrD,OAAQ,cAAc,CAAC,SAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAwB;IAC/D,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/C,MAAM,IAAI,GAA6B;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU;YAClC,WAAW,EAAE,IAAI,CAAC,WAAW;SAChC,CAAC;QACF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA6B;IAC9D,OAAO;QACH,GAAG,QAAQ;QACX,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,iBAAiB;QACpD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,0BAA0B;KAChF,CAAC;AACN,CAAC"}