@onereach/idw-apps 0.1.2-beta.6.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 (39) hide show
  1. package/README.md +411 -0
  2. package/dist/app/createIdwApp.d.ts +104 -0
  3. package/dist/app/createIdwApp.d.ts.map +1 -0
  4. package/dist/app/createIdwApp.js +151 -0
  5. package/dist/app/createIdwApp.js.map +1 -0
  6. package/dist/app/index.d.ts +15 -0
  7. package/dist/app/index.d.ts.map +1 -0
  8. package/dist/app/index.js +3 -0
  9. package/dist/app/index.js.map +1 -0
  10. package/dist/app/installIdwAppApi.d.ts +98 -0
  11. package/dist/app/installIdwAppApi.d.ts.map +1 -0
  12. package/dist/app/installIdwAppApi.js +314 -0
  13. package/dist/app/installIdwAppApi.js.map +1 -0
  14. package/dist/createIdwAppBridge.d.ts +13 -0
  15. package/dist/createIdwAppBridge.d.ts.map +1 -0
  16. package/dist/createIdwAppBridge.js +555 -0
  17. package/dist/createIdwAppBridge.js.map +1 -0
  18. package/dist/hostStateChannel.d.ts +51 -0
  19. package/dist/hostStateChannel.d.ts.map +1 -0
  20. package/dist/hostStateChannel.js +104 -0
  21. package/dist/hostStateChannel.js.map +1 -0
  22. package/dist/index.d.ts +9 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +6 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/protocol.d.ts +81 -0
  27. package/dist/protocol.d.ts.map +1 -0
  28. package/dist/protocol.js +67 -0
  29. package/dist/protocol.js.map +1 -0
  30. package/dist/stateStore.d.ts +23 -0
  31. package/dist/stateStore.d.ts.map +1 -0
  32. package/dist/stateStore.js +70 -0
  33. package/dist/stateStore.js.map +1 -0
  34. package/dist/types.d.ts +268 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +2 -0
  37. package/dist/types.js.map +1 -0
  38. package/package.json +44 -0
  39. package/skills/idw-app-development/SKILL.md +458 -0
@@ -0,0 +1,555 @@
1
+ import { AppBridge, PostMessageTransport, } from '@modelcontextprotocol/ext-apps/app-bridge';
2
+ import { createHostStateChannel } from './hostStateChannel';
3
+ import { StateStore } from './stateStore';
4
+ const DEFAULT_HOST_INFO = {
5
+ name: 'IDW Host',
6
+ version: '0.1.0',
7
+ };
8
+ const DEFAULT_OPEN_IDW_APP_TOOL = 'open_idw_app';
9
+ export const DEFAULT_IDW_AUTH_TOKEN_ACTION = 'getAuthToken';
10
+ const DEFAULT_CONTENT_MODALITIES = {
11
+ text: {},
12
+ structuredContent: {},
13
+ };
14
+ /**
15
+ * `postMessage` uses the structured clone algorithm. Payloads from JSONB reload,
16
+ * framework proxies, or odd prototype chains can fail to clone. Prefer native
17
+ * structured cloning, then fall back to a JSON round-trip for plain
18
+ * proxy-backed data such as Vue reactive objects. If neither normalization
19
+ * works, leave the value unchanged and let the upstream transport handle it.
20
+ */
21
+ function cloneForPostMessage(value) {
22
+ try {
23
+ return structuredClone(value);
24
+ }
25
+ catch {
26
+ try {
27
+ return JSON.parse(JSON.stringify(value));
28
+ }
29
+ catch {
30
+ return value;
31
+ }
32
+ }
33
+ }
34
+ /** Flatten model-context content blocks into a single text string. */
35
+ function extractTextFromModelContext(params) {
36
+ const blocks = params.content;
37
+ if (!Array.isArray(blocks)) {
38
+ return '';
39
+ }
40
+ const parts = [];
41
+ for (const block of blocks) {
42
+ if (block?.type === 'text' && typeof block.text === 'string' && block.text.trim()) {
43
+ parts.push(block.text.trim());
44
+ }
45
+ }
46
+ return parts.join('\n');
47
+ }
48
+ /** True when an MCP model-context update contains useful text or structured data. */
49
+ function hasModelContextPayload(params, text) {
50
+ if (text) {
51
+ return true;
52
+ }
53
+ const payload = params;
54
+ return payload.structuredContent !== undefined
55
+ || (Array.isArray(payload.content) && payload.content.length > 0);
56
+ }
57
+ function hasOpaqueSandboxOrigin(iframe) {
58
+ const sandbox = iframe.getAttribute?.('sandbox');
59
+ if (sandbox == null) {
60
+ return false;
61
+ }
62
+ return !/\ballow-same-origin\b/.test(sandbox);
63
+ }
64
+ function defaultResolveTargetOrigin(iframe) {
65
+ // Sandboxed iframes without `allow-same-origin` have an opaque `null` origin.
66
+ // Targeting the URL origin would drop host -> app state replies.
67
+ if (hasOpaqueSandboxOrigin(iframe)) {
68
+ return '*';
69
+ }
70
+ const src = iframe.src;
71
+ if (!src) {
72
+ return '*';
73
+ }
74
+ try {
75
+ const origin = new URL(src).origin;
76
+ return origin && origin !== 'null' ? origin : '*';
77
+ }
78
+ catch {
79
+ return '*';
80
+ }
81
+ }
82
+ function defaultOnLog({ level, logger, data }) {
83
+ const fn = ['error', 'critical', 'alert', 'emergency'].includes(level)
84
+ ? console.error
85
+ : level === 'warning'
86
+ ? console.warn
87
+ : console.debug;
88
+ fn(`[MCP App${logger ? `:${logger}` : ''}]`, data);
89
+ }
90
+ /**
91
+ * Create an IDW host-side adapter around the MCP Apps `AppBridge`.
92
+ *
93
+ * This is a thin wrapper, not a replacement: standard MCP Apps behavior is
94
+ * preserved and routed through caller-provided callbacks so this package never
95
+ * imports app stores or backend clients directly. On top of that it adds an
96
+ * IDW/OpenAI-compatible widget-state channel (see {@link createHostStateChannel}
97
+ * and the `@onereach/idw-apps/app` entry point).
98
+ */
99
+ export function createIdwAppBridge(options) {
100
+ const { iframe, idwId, chatId, hostKey, surface, appInstanceId = hostKey, auth, allowedActions, hostContext, hostCapabilities, contentModalities = DEFAULT_CONTENT_MODALITIES, initialState, hostInfo = DEFAULT_HOST_INFO, onStateChange, onIdwAction, onCallTool, onListResources, onListResourceTemplates, onListPrompts, onReadResource, onMessage, onDownloadFile, onRequestDisplayMode, onRequestTeardown, onOpenIdwApp, onUpdateModelContext, onOpenLink, onLog = defaultOnLog, onSizeChange, openIdwAppToolName = DEFAULT_OPEN_IDW_APP_TOOL, resolveTargetOrigin = defaultResolveTargetOrigin, hostWindow = globalThis.window, } = options;
101
+ // Bind the side-channel origin once. A later iframe navigation must not
102
+ // silently redirect IDW state/action/auth messages to another origin.
103
+ const idwTargetOrigin = resolveTargetOrigin(iframe);
104
+ const store = new StateStore(initialState);
105
+ let bridge = null;
106
+ let isReady = false;
107
+ let artifactId = options.artifactId;
108
+ let toolCallId = options.toolCallId;
109
+ let pendingInput = null;
110
+ let pendingResult = null;
111
+ let currentHostContext = hostContext;
112
+ function toolError(text) {
113
+ return {
114
+ content: [{
115
+ type: 'text',
116
+ text,
117
+ }],
118
+ isError: true,
119
+ };
120
+ }
121
+ function toolJson(data) {
122
+ return {
123
+ content: [{
124
+ type: 'text',
125
+ text: JSON.stringify(data),
126
+ }],
127
+ structuredContent: data,
128
+ };
129
+ }
130
+ function authContextBlock() {
131
+ if (!auth) {
132
+ return undefined;
133
+ }
134
+ const context = {
135
+ apiBaseUrl: auth.apiBaseUrl,
136
+ };
137
+ if (auth.exposeInHostContext) {
138
+ context.orToken = auth.orToken;
139
+ }
140
+ return context.orToken || context.apiBaseUrl
141
+ ? context
142
+ : undefined;
143
+ }
144
+ function idwContextBlock() {
145
+ return {
146
+ idwId,
147
+ surface,
148
+ appInstanceId,
149
+ auth: authContextBlock(),
150
+ allowedActions,
151
+ };
152
+ }
153
+ function mergedHostContext() {
154
+ return {
155
+ ...currentHostContext,
156
+ idw: idwContextBlock(),
157
+ };
158
+ }
159
+ function hostCapabilityBlock() {
160
+ const base = {
161
+ logging: {},
162
+ openLinks: {},
163
+ };
164
+ if (onUpdateModelContext) {
165
+ base.updateModelContext = contentModalities;
166
+ }
167
+ if (onCallTool || onOpenIdwApp) {
168
+ base.serverTools = {
169
+ listChanged: true,
170
+ };
171
+ }
172
+ if (onReadResource || onListResources || onListResourceTemplates) {
173
+ base.serverResources = {
174
+ listChanged: true,
175
+ };
176
+ }
177
+ if (onMessage) {
178
+ base.message = contentModalities;
179
+ }
180
+ if (onDownloadFile) {
181
+ base.downloadFile = {};
182
+ }
183
+ const merged = {
184
+ ...base,
185
+ ...hostCapabilities,
186
+ };
187
+ if (base.serverTools || hostCapabilities?.serverTools) {
188
+ merged.serverTools = {
189
+ ...base.serverTools,
190
+ ...hostCapabilities?.serverTools,
191
+ };
192
+ }
193
+ if (base.serverResources || hostCapabilities?.serverResources) {
194
+ merged.serverResources = {
195
+ ...base.serverResources,
196
+ ...hostCapabilities?.serverResources,
197
+ };
198
+ }
199
+ if (onUpdateModelContext) {
200
+ merged.updateModelContext = {
201
+ ...base.updateModelContext,
202
+ ...hostCapabilities?.updateModelContext,
203
+ };
204
+ }
205
+ else {
206
+ delete merged.updateModelContext;
207
+ }
208
+ if (base.message || hostCapabilities?.message) {
209
+ merged.message = {
210
+ ...base.message,
211
+ ...hostCapabilities?.message,
212
+ };
213
+ }
214
+ if (base.sandbox || hostCapabilities?.sandbox) {
215
+ merged.sandbox = {
216
+ ...base.sandbox,
217
+ ...hostCapabilities?.sandbox,
218
+ };
219
+ }
220
+ return merged;
221
+ }
222
+ const stateChannel = createHostStateChannel({
223
+ hostWindow,
224
+ iframe,
225
+ getState: () => store.get(),
226
+ // App-initiated widget-state update: update local state immediately, persist async.
227
+ applyAppState: (state) => {
228
+ store.set(state);
229
+ void Promise.resolve(onStateChange?.(store.get())).catch(() => {
230
+ // Persistence failures must not break the iframe's UI state.
231
+ });
232
+ },
233
+ handleAction: async (params) => {
234
+ const authTokenActionName = auth?.tokenActionName ?? DEFAULT_IDW_AUTH_TOKEN_ACTION;
235
+ if (allowedActions && !allowedActions.includes(params.name)) {
236
+ return toolError(`IDW action is not allowed: ${params.name}`);
237
+ }
238
+ if (params.name === authTokenActionName) {
239
+ if (!auth?.allowTokenRequest) {
240
+ return toolError('Auth token access is not configured for this app');
241
+ }
242
+ let token;
243
+ if (auth.getOrToken) {
244
+ try {
245
+ token = await auth.getOrToken(runtimeContext());
246
+ }
247
+ catch {
248
+ return toolError('Auth token provider failed for this app');
249
+ }
250
+ if (typeof token !== 'string' || !token.trim()) {
251
+ return toolError('Auth token provider did not return a valid token');
252
+ }
253
+ }
254
+ else {
255
+ token = auth.orToken;
256
+ if (typeof token !== 'string' || !token.trim()) {
257
+ return toolError('Auth token access is not configured for this app');
258
+ }
259
+ }
260
+ return toolJson({
261
+ token,
262
+ tokenType: 'or-token',
263
+ apiBaseUrl: auth.apiBaseUrl,
264
+ });
265
+ }
266
+ if (!onIdwAction) {
267
+ return toolError('No IDW action handler is configured for this app');
268
+ }
269
+ return onIdwAction(params, runtimeContext());
270
+ },
271
+ expectedOrigin: idwTargetOrigin,
272
+ // HTMLIFrameElement satisfies IframeLike; adapt the caller's typed resolver.
273
+ resolveTargetOrigin: () => idwTargetOrigin,
274
+ });
275
+ function runtimeContext() {
276
+ return {
277
+ idwId,
278
+ chatId,
279
+ hostKey,
280
+ surface,
281
+ appInstanceId,
282
+ artifactId,
283
+ toolCallId,
284
+ };
285
+ }
286
+ function isStaleToolCall(candidate) {
287
+ return Boolean(candidate && toolCallId && candidate !== toolCallId);
288
+ }
289
+ function wireHandlers(nextBridge) {
290
+ nextBridge.oncalltool = async (toolParams) => {
291
+ if (toolParams.name === openIdwAppToolName && onOpenIdwApp) {
292
+ return onOpenIdwApp(toolParams, runtimeContext());
293
+ }
294
+ if (!onCallTool) {
295
+ return {
296
+ content: [{
297
+ type: 'text',
298
+ text: 'No tool handler is configured for this MCP app',
299
+ }],
300
+ isError: true,
301
+ };
302
+ }
303
+ return onCallTool(toolParams, runtimeContext());
304
+ };
305
+ nextBridge.onlistresources = async (resourceParams) => {
306
+ if (!onListResources) {
307
+ return {
308
+ resources: [],
309
+ };
310
+ }
311
+ return onListResources(resourceParams, runtimeContext());
312
+ };
313
+ nextBridge.onlistresourcetemplates = async (resourceParams) => {
314
+ if (!onListResourceTemplates) {
315
+ return {
316
+ resourceTemplates: [],
317
+ };
318
+ }
319
+ return onListResourceTemplates(resourceParams, runtimeContext());
320
+ };
321
+ nextBridge.onlistprompts = async (promptParams) => {
322
+ if (!onListPrompts) {
323
+ return {
324
+ prompts: [],
325
+ };
326
+ }
327
+ return onListPrompts(promptParams, runtimeContext());
328
+ };
329
+ nextBridge.onreadresource = async (resourceParams) => {
330
+ if (!onReadResource) {
331
+ throw new Error('No resource handler is configured for this MCP app');
332
+ }
333
+ return onReadResource(resourceParams, runtimeContext());
334
+ };
335
+ nextBridge.onmessage = async (messageParams) => {
336
+ if (!onMessage) {
337
+ return {
338
+ isError: true,
339
+ };
340
+ }
341
+ return onMessage(messageParams, runtimeContext());
342
+ };
343
+ nextBridge.onopenlink = async ({ url }) => {
344
+ if (onOpenLink) {
345
+ await onOpenLink(url);
346
+ }
347
+ else if (/^https?:\/\//i.test(url)) {
348
+ globalThis.window?.open(url, '_blank', 'noopener,noreferrer');
349
+ }
350
+ return {};
351
+ };
352
+ nextBridge.ondownloadfile = async (downloadParams) => {
353
+ if (!onDownloadFile) {
354
+ return {
355
+ isError: true,
356
+ };
357
+ }
358
+ return onDownloadFile(downloadParams, runtimeContext());
359
+ };
360
+ if (onUpdateModelContext) {
361
+ nextBridge.onupdatemodelcontext = async (contextParams) => {
362
+ const text = extractTextFromModelContext(contextParams);
363
+ // Preserve the full standard MCP payload. In particular, a valid
364
+ // structured-only update has no text to flatten but is still useful to
365
+ // the IDW host and model on a later turn.
366
+ if (hasModelContextPayload(contextParams, text)) {
367
+ await onUpdateModelContext(text, contextParams, runtimeContext());
368
+ }
369
+ return {};
370
+ };
371
+ }
372
+ if (onRequestDisplayMode) {
373
+ nextBridge.onrequestdisplaymode = async (displayModeParams) => {
374
+ return onRequestDisplayMode(displayModeParams, runtimeContext());
375
+ };
376
+ }
377
+ nextBridge.onrequestteardown = (teardownParams) => {
378
+ void Promise.resolve(onRequestTeardown?.(teardownParams, runtimeContext())).catch(() => {
379
+ // App-initiated teardown is fire-and-forget in the upstream protocol.
380
+ });
381
+ };
382
+ nextBridge.onsizechange = (params) => {
383
+ if (onSizeChange) {
384
+ onSizeChange(params);
385
+ return;
386
+ }
387
+ if (params.height != null) {
388
+ iframe.style.height = `${params.height}px`;
389
+ }
390
+ };
391
+ nextBridge.onloggingmessage = onLog;
392
+ nextBridge.oninitialized = async () => {
393
+ isReady = true;
394
+ if (pendingInput !== null) {
395
+ await nextBridge.sendToolInput({ arguments: cloneForPostMessage(pendingInput) });
396
+ pendingInput = null;
397
+ }
398
+ if (pendingResult !== null) {
399
+ await nextBridge.sendToolResult(cloneForPostMessage(pendingResult));
400
+ pendingResult = null;
401
+ }
402
+ };
403
+ }
404
+ async function disconnect() {
405
+ const activeBridge = bridge;
406
+ stateChannel.stop();
407
+ if (!activeBridge) {
408
+ return;
409
+ }
410
+ bridge = null;
411
+ isReady = false;
412
+ pendingInput = null;
413
+ pendingResult = null;
414
+ try {
415
+ await activeBridge.teardownResource({});
416
+ }
417
+ catch {
418
+ // The iframe may already be gone during teardown.
419
+ }
420
+ try {
421
+ await activeBridge.close();
422
+ }
423
+ catch {
424
+ // Ignore close races while replacing or unmounting the app host.
425
+ }
426
+ }
427
+ async function connect() {
428
+ await disconnect();
429
+ const contentWindow = iframe.contentWindow;
430
+ if (!contentWindow) {
431
+ throw new Error('createIdwAppBridge: iframe has no contentWindow');
432
+ }
433
+ const nextBridge = new AppBridge(null, hostInfo, hostCapabilityBlock(), {
434
+ hostContext: mergedHostContext(),
435
+ });
436
+ wireHandlers(nextBridge);
437
+ bridge = nextBridge;
438
+ // Start the IDW state channel before connecting so early app requests are caught.
439
+ stateChannel.start();
440
+ await nextBridge.connect(new PostMessageTransport(contentWindow, contentWindow));
441
+ }
442
+ async function sendToolInput(args, forToolCallId) {
443
+ if (isStaleToolCall(forToolCallId)) {
444
+ return;
445
+ }
446
+ const safe = cloneForPostMessage(args);
447
+ if (!bridge || !isReady) {
448
+ pendingInput = safe;
449
+ return;
450
+ }
451
+ await bridge.sendToolInput({ arguments: safe });
452
+ }
453
+ async function sendToolResult(result, forToolCallId) {
454
+ if (isStaleToolCall(forToolCallId)) {
455
+ return;
456
+ }
457
+ const safe = cloneForPostMessage(result);
458
+ if (!bridge || !isReady) {
459
+ pendingResult = safe;
460
+ return;
461
+ }
462
+ await bridge.sendToolResult(safe);
463
+ }
464
+ function activeBridgeForAppTools() {
465
+ if (!bridge || !isReady) {
466
+ throw new Error('createIdwAppBridge: app tools are unavailable before initialization');
467
+ }
468
+ return bridge;
469
+ }
470
+ async function listAppTools(params, options) {
471
+ return activeBridgeForAppTools().listTools(params, options);
472
+ }
473
+ async function callAppTool(params, options) {
474
+ return activeBridgeForAppTools().callTool(params, options);
475
+ }
476
+ function getAppCapabilities() {
477
+ return bridge?.getAppCapabilities();
478
+ }
479
+ async function sendToolCancelled(reason = 'Cancelled') {
480
+ await bridge?.sendToolCancelled({ reason });
481
+ }
482
+ async function sendToolListChanged(params) {
483
+ await bridge?.sendToolListChanged(params);
484
+ }
485
+ async function sendResourceListChanged(params) {
486
+ await bridge?.sendResourceListChanged(params);
487
+ }
488
+ async function sendPromptListChanged(params) {
489
+ await bridge?.sendPromptListChanged(params);
490
+ }
491
+ function setHostContext(context) {
492
+ currentHostContext = context;
493
+ bridge?.setHostContext(mergedHostContext());
494
+ }
495
+ async function updateRuntimeContext(update) {
496
+ if ('artifactId' in update) {
497
+ artifactId = update.artifactId;
498
+ }
499
+ if ('toolCallId' in update) {
500
+ if (!isReady && update.toolCallId !== toolCallId) {
501
+ // Never replay input and result belonging to different tool calls when
502
+ // runtime updates arrive before app initialization finishes.
503
+ pendingInput = null;
504
+ pendingResult = null;
505
+ }
506
+ toolCallId = update.toolCallId;
507
+ }
508
+ if (update.toolInput) {
509
+ await sendToolInput(update.toolInput, toolCallId);
510
+ }
511
+ if (update.toolResult != null) {
512
+ await sendToolResult(update.toolResult, toolCallId);
513
+ }
514
+ }
515
+ function getWidgetState() {
516
+ return store.get();
517
+ }
518
+ function setWidgetState(state) {
519
+ store.set(state);
520
+ const next = store.get();
521
+ stateChannel.pushState(next);
522
+ void Promise.resolve(onStateChange?.(next)).catch(() => {
523
+ // Persistence failures must not break the iframe's UI state.
524
+ });
525
+ }
526
+ function getState() {
527
+ return getWidgetState();
528
+ }
529
+ function setState(state) {
530
+ setWidgetState(state);
531
+ }
532
+ return {
533
+ get isReady() {
534
+ return isReady;
535
+ },
536
+ connect,
537
+ disconnect,
538
+ updateRuntimeContext,
539
+ sendToolInput,
540
+ sendToolResult,
541
+ listAppTools,
542
+ callAppTool,
543
+ getAppCapabilities,
544
+ sendToolCancelled,
545
+ sendToolListChanged,
546
+ sendResourceListChanged,
547
+ sendPromptListChanged,
548
+ setHostContext,
549
+ getWidgetState,
550
+ setWidgetState,
551
+ getState,
552
+ setState,
553
+ };
554
+ }
555
+ //# sourceMappingURL=createIdwAppBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIdwAppBridge.js","sourceRoot":"","sources":["../src/createIdwAppBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,oBAAoB,GACrB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAuB1C,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACR,CAAC;AACX,MAAM,yBAAyB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,6BAA6B,GAAG,cAAc,CAAC;AAC5D,MAAM,0BAA0B,GAAG;IACjC,IAAI,EAAE,EAAE;IACR,iBAAiB,EAAE,EAAE;CACb,CAAC;AAEX;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAI,KAAQ;IACtC,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,SAAS,2BAA2B,CAAC,MAAgC;IACnE,MAAM,MAAM,GAAI,MAAgC,CAAC,OAAO,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAiD,EAAE,CAAC;QACtE,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,qFAAqF;AACrF,SAAS,sBAAsB,CAAC,MAAgC,EAAE,IAAY;IAC5E,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,MAGf,CAAC;IACF,OAAO,OAAO,CAAC,iBAAiB,KAAK,SAAS;WACzC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,sBAAsB,CAAC,MAE/B;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,0BAA0B,CAAC,MAGnC;IACC,8EAA8E;IAC9E,iEAAiE;IACjE,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnC,OAAO,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAiB;IAC1D,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpE,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,CAAC,CAAC,KAAK,KAAK,SAAS;YACnB,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpB,EAAE,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,MAAM,EACJ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,aAAa,GAAG,OAAO,EACvB,IAAI,EACJ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAAG,0BAA0B,EAC9C,YAAY,EACZ,QAAQ,GAAG,iBAAiB,EAC5B,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,KAAK,GAAG,YAAY,EACpB,YAAY,EACZ,kBAAkB,GAAG,yBAAyB,EAC9C,mBAAmB,GAAG,0BAA0B,EAChD,UAAU,GAAG,UAAU,CAAC,MAAM,GAC/B,GAAG,OAAO,CAAC;IAEZ,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACpC,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEpC,IAAI,YAAY,GAAmC,IAAI,CAAC;IACxD,IAAI,aAAa,GAA4B,IAAI,CAAC;IAClD,IAAI,kBAAkB,GAAG,WAAW,CAAC;IAErC,SAAS,SAAS,CAAC,IAAY;QAC7B,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI;iBACL,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,SAAS,QAAQ,CAAC,IAA6B;QAC7C,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;iBAC3B,CAAC;YACF,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;IAED,SAAS,gBAAgB;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAsB;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QAEF,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU;YAC1C,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,SAAS,eAAe;QACtB,OAAO;YACL,KAAK;YACL,OAAO;YACP,aAAa;YACb,IAAI,EAAE,gBAAgB,EAAE;YACxB,cAAc;SACf,CAAC;IACJ,CAAC;IAED,SAAS,iBAAiB;QACxB,OAAO;YACL,GAAG,kBAAkB;YACrB,GAAG,EAAE,eAAe,EAAE;SACvB,CAAC;IACJ,CAAC;IAED,SAAS,mBAAmB;QAC1B,MAAM,IAAI,GAAqB;YAC7B,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,IAAI,oBAAoB,EAAE,CAAC;YACzB,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;QAC9C,CAAC;QAED,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG;gBACjB,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,IAAI,cAAc,IAAI,eAAe,IAAI,uBAAuB,EAAE,CAAC;YACjE,IAAI,CAAC,eAAe,GAAG;gBACrB,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;QACnC,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,MAAM,GAAqB;YAC/B,GAAG,IAAI;YACP,GAAG,gBAAgB;SACpB,CAAC;QAEF,IAAI,IAAI,CAAC,WAAW,IAAI,gBAAgB,EAAE,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,WAAW,GAAG;gBACnB,GAAG,IAAI,CAAC,WAAW;gBACnB,GAAG,gBAAgB,EAAE,WAAW;aACjC,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,IAAI,gBAAgB,EAAE,eAAe,EAAE,CAAC;YAC9D,MAAM,CAAC,eAAe,GAAG;gBACvB,GAAG,IAAI,CAAC,eAAe;gBACvB,GAAG,gBAAgB,EAAE,eAAe;aACrC,CAAC;QACJ,CAAC;QAED,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,CAAC,kBAAkB,GAAG;gBAC1B,GAAG,IAAI,CAAC,kBAAkB;gBAC1B,GAAG,gBAAgB,EAAE,kBAAkB;aACxC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,kBAAkB,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,gBAAgB,EAAE,OAAO,EAAE,CAAC;YAC9C,MAAM,CAAC,OAAO,GAAG;gBACf,GAAG,IAAI,CAAC,OAAO;gBACf,GAAG,gBAAgB,EAAE,OAAO;aAC7B,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,gBAAgB,EAAE,OAAO,EAAE,CAAC;YAC9C,MAAM,CAAC,OAAO,GAAG;gBACf,GAAG,IAAI,CAAC,OAAO;gBACf,GAAG,gBAAgB,EAAE,OAAO;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,sBAAsB,CAAC;QAC1C,UAAU;QACV,MAAM;QACN,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC3B,oFAAoF;QACpF,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjB,KAAK,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC5D,6DAA6D;YAC/D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC7B,MAAM,mBAAmB,GAAG,IAAI,EAAE,eAAe,IAAI,6BAA6B,CAAC;YACnF,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,OAAO,SAAS,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;oBAC7B,OAAO,SAAS,CAAC,kDAAkD,CAAC,CAAC;gBACvE,CAAC;gBAED,IAAI,KAAyB,CAAC;gBAC9B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC;wBACH,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;oBAClD,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,SAAS,CAAC,yCAAyC,CAAC,CAAC;oBAC9D,CAAC;oBAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC/C,OAAO,SAAS,CAAC,kDAAkD,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;oBACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC/C,OAAO,SAAS,CAAC,kDAAkD,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;gBAED,OAAO,QAAQ,CAAC;oBACd,KAAK;oBACL,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,SAAS,CAAC,kDAAkD,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,cAAc,EAAE,eAAe;QAC/B,6EAA6E;QAC7E,mBAAmB,EAAE,GAAG,EAAE,CAAC,eAAe;KAC3C,CAAC,CAAC;IAEH,SAAS,cAAc;QACrB,OAAO;YACL,KAAK;YACL,MAAM;YACN,OAAO;YACP,OAAO;YACP,aAAa;YACb,UAAU;YACV,UAAU;SACX,CAAC;IACJ,CAAC;IAED,SAAS,eAAe,CAAC,SAAkB;QACzC,OAAO,OAAO,CAAC,SAAS,IAAI,UAAU,IAAI,SAAS,KAAK,UAAU,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,YAAY,CAAC,UAAqB;QACzC,UAAU,CAAC,UAAU,GAAG,KAAK,EAAE,UAAU,EAAE,EAAE;YAC3C,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,IAAI,YAAY,EAAE,CAAC;gBAC3D,OAAO,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gDAAgD;yBACvD,CAAC;oBACF,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,UAAU,CAAC,eAAe,GAAG,KAAK,EAAE,cAAc,EAAE,EAAE;YACpD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAO;oBACL,SAAS,EAAE,EAAE;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,eAAe,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,UAAU,CAAC,uBAAuB,GAAG,KAAK,EAAE,cAAc,EAAE,EAAE;YAC5D,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC7B,OAAO;oBACL,iBAAiB,EAAE,EAAE;iBACtB,CAAC;YACJ,CAAC;YACD,OAAO,uBAAuB,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC;QAEF,UAAU,CAAC,aAAa,GAAG,KAAK,EAAE,YAAY,EAAE,EAAE;YAChD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,UAAU,CAAC,cAAc,GAAG,KAAK,EAAE,cAAc,EAAE,EAAE;YACnD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC;QAEF,UAAU,CAAC,SAAS,GAAG,KAAK,EAAE,aAAa,EAAE,EAAE;YAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC;QAEF,UAAU,CAAC,UAAU,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YACxC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,UAAU,CAAC,cAAc,GAAG,KAAK,EAAE,cAAc,EAAE,EAAE;YACnD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO;oBACL,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC;QAEF,IAAI,oBAAoB,EAAE,CAAC;YACzB,UAAU,CAAC,oBAAoB,GAAG,KAAK,EAAE,aAAa,EAAE,EAAE;gBACxD,MAAM,IAAI,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC;gBACxD,iEAAiE;gBACjE,uEAAuE;gBACvE,0CAA0C;gBAC1C,IAAI,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;oBAChD,MAAM,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,oBAAoB,EAAE,CAAC;YACzB,UAAU,CAAC,oBAAoB,GAAG,KAAK,EAAE,iBAAiB,EAAE,EAAE;gBAC5D,OAAO,oBAAoB,CAAC,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,iBAAiB,GAAG,CAAC,cAAc,EAAE,EAAE;YAChD,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACrF,sEAAsE;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,UAAU,CAAC,YAAY,GAAG,CAAC,MAAwB,EAAE,EAAE;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,MAAM,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAEpC,UAAU,CAAC,aAAa,GAAG,KAAK,IAAI,EAAE;YACpC,OAAO,GAAG,IAAI,CAAC;YAEf,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACjF,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,MAAM,UAAU,CAAC,cAAc,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;gBACpE,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QAEH,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,UAAU;QACvB,MAAM,YAAY,GAAG,MAAM,CAAC;QAC5B,YAAY,CAAC,IAAI,EAAE,CAAC;QAEpB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,GAAG,KAAK,CAAC;QAChB,YAAY,GAAG,IAAI,CAAC;QACpB,aAAa,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,IAAI,CAAC;YACH,MAAO,YAAsD,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,KAAK,UAAU,OAAO;QACpB,MAAM,UAAU,EAAE,CAAC;QAEnB,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE;YACtE,WAAW,EAAE,iBAAiB,EAAW;SAC1C,CAAC,CAAC;QAEH,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,GAAG,UAAU,CAAC;QAEpB,kFAAkF;QAClF,YAAY,CAAC,KAAK,EAAE,CAAC;QAErB,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,IAA6B,EAAE,aAAsB;QAChF,IAAI,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,MAAwB,EAAE,aAAsB;QAC5E,IAAI,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,uBAAuB;QAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,UAAU,YAAY,CACzB,MAA0B,EAC1B,OAA4B;QAE5B,OAAO,uBAAuB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,UAAU,WAAW,CACxB,MAAyB,EACzB,OAA4B;QAE5B,OAAO,uBAAuB,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS,kBAAkB;QACzB,OAAO,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,MAAM,GAAG,WAAW;QACnD,MAAM,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,UAAU,mBAAmB,CAAC,MAAwD;QACzF,MAAM,MAAM,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,UAAU,uBAAuB,CAAC,MAA4D;QACjG,MAAM,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,UAAU,qBAAqB,CAAC,MAA0D;QAC7F,MAAM,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS,cAAc,CAAC,OAAoB;QAC1C,kBAAkB,GAAG,OAAO,CAAC;QAC7B,MAAM,EAAE,cAAc,CAAC,iBAAiB,EAAW,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,UAAU,oBAAoB,CAAC,MAAwB;QAC1D,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACjC,CAAC;QACD,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACjD,uEAAuE;gBACvE,6DAA6D;gBAC7D,YAAY,GAAG,IAAI,CAAC;gBACpB,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACjC,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,SAAS,cAAc;QACrB,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,SAAS,cAAc,CAAC,KAAc;QACpC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACzB,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACrD,6DAA6D;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,QAAQ;QACf,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,SAAS,QAAQ,CAAC,KAAc;QAC9B,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO;QACP,UAAU;QACV,oBAAoB;QACpB,aAAa;QACb,cAAc;QACd,YAAY;QACZ,WAAW;QACX,kBAAkB;QAClB,iBAAiB;QACjB,mBAAmB;QACnB,uBAAuB;QACvB,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,cAAc;QACd,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { IdwActionParams, IdwActionResult } from './types';
2
+ /** Minimal window surface needed to post messages into the app iframe. */
3
+ export interface WindowPostLike {
4
+ postMessage(message: unknown, targetOrigin: string): void;
5
+ }
6
+ /** Minimal iframe surface used by the channel (satisfied by `HTMLIFrameElement`). */
7
+ export interface IframeLike {
8
+ contentWindow: WindowPostLike | null;
9
+ src?: string;
10
+ }
11
+ /** Minimal message event surface (satisfied by DOM `MessageEvent`). */
12
+ export interface MessageEventLike {
13
+ data: unknown;
14
+ source: unknown;
15
+ origin?: string;
16
+ stopImmediatePropagation?: () => void;
17
+ }
18
+ /** Minimal host window surface (satisfied by DOM `window`). */
19
+ export interface HostWindowLike {
20
+ addEventListener(type: 'message', listener: (event: MessageEventLike) => void, options?: boolean): void;
21
+ removeEventListener(type: 'message', listener: (event: MessageEventLike) => void, options?: boolean): void;
22
+ }
23
+ export interface HostStateChannelOptions {
24
+ hostWindow: HostWindowLike;
25
+ iframe: IframeLike;
26
+ /** Return the latest state known to the host. */
27
+ getState: () => unknown;
28
+ /** Apply state that originated in the app (updates the store and persists). */
29
+ applyAppState: (state: unknown) => void;
30
+ /** Handle an app-initiated IDW action. */
31
+ handleAction?: (params: IdwActionParams) => IdwActionResult | Promise<IdwActionResult>;
32
+ /** Origin bound when the bridge is created. `'*'` permits opaque-origin iframe messages. */
33
+ expectedOrigin?: string;
34
+ /** Resolve the `postMessage` target origin for the iframe. */
35
+ resolveTargetOrigin: (iframe: IframeLike) => string;
36
+ }
37
+ /**
38
+ * Host half of the IDW state channel.
39
+ *
40
+ * IDW extension (not part of the standard MCP Apps bridge): listens for
41
+ * `idw:app:*` messages coming from the target iframe and answers get/set-state
42
+ * requests. Every inbound message is validated against `iframe.contentWindow`
43
+ * so a sibling frame cannot spoof state traffic.
44
+ */
45
+ export declare function createHostStateChannel(options: HostStateChannelOptions): {
46
+ start(): void;
47
+ stop(): void;
48
+ /** Push a host-initiated state update after the app has opted into the IDW channel. */
49
+ pushState(state: unknown): void;
50
+ };
51
+ //# sourceMappingURL=hostStateChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostStateChannel.d.ts","sourceRoot":"","sources":["../src/hostStateChannel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;CACvC;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxG,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5G;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,+EAA+E;IAC/E,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,0CAA0C;IAC1C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvF,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,mBAAmB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC;CACrD;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB;aA0F1D,IAAI;YAIL,IAAI;IAIZ,uFAAuF;qBACtE,OAAO,GAAG,IAAI;EAUlC"}