@kittl/sdk 0.0.9 → 1.0.0-alpha.1

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.
@@ -2,6 +2,10 @@
2
2
  /*! Kittl SDK - https://kittl.com - see license for terms */
3
3
 
4
4
  var FROM_EXTENSION_COMMANDS = {
5
+ /** Capability-owned AI callback registration. */
6
+ AI_GENERATOR_SUBSCRIBE: "ai-generator-subscribe",
7
+ /** Capability-owned AI callback teardown. */
8
+ AI_GENERATOR_UNSUBSCRIBE: "ai-generator-unsubscribe",
5
9
  /** SDK API call */
6
10
  SDK_CALL: "sdk-call",
7
11
  /** AI handler registration */
@@ -50,6 +54,8 @@ var FROM_EXTENSION_COMMANDS = {
50
54
  LOADED: "loaded"
51
55
  };
52
56
  var TO_EXTENSION_COMMANDS = {
57
+ /** Callback payload for generator or pending-set subscriptions. */
58
+ AI_GENERATOR_UPDATE: "ai-generator-update",
53
59
  /** SDK API response */
54
60
  SDK_RESPONSE: "sdk-response",
55
61
  /** File browser fetch content request */
@@ -66,6 +72,10 @@ var TO_EXTENSION_COMMANDS = {
66
72
  APP_STATE_UPDATE: "app-state-update"
67
73
  };
68
74
 
75
+ function isAIGeneratorUpdateMessage(data) {
76
+ return !!data && typeof data === "object" && "command" in data && data.command === "ai-generator-update" && "subscriptionId" in data && typeof data.subscriptionId === "string";
77
+ }
78
+
69
79
  var isSDKResponseMessage = (data) => {
70
80
  return typeof data === "object" && data !== null && "command" in data && data.command === TO_EXTENSION_COMMANDS.SDK_RESPONSE && "messageId" in data && typeof data.messageId === "string";
71
81
  };
@@ -135,7 +145,10 @@ var APPROVED_EXTENSION_COMMUNICATION_DOMAINS = [
135
145
  "https://app.stagingdesigner.com",
136
146
  "https://*.stagingdesigner.com",
137
147
  "http://localhost:3000",
138
- "https://app.kittl.com"
148
+ "https://app.kittl.com",
149
+ // website, for sandboxed standalone dashboard pages
150
+ "http://localhost:3003",
151
+ "https://www.kittl.com"
139
152
  ];
140
153
  var toOrigin = (value) => {
141
154
  if (!value) {
@@ -190,8 +203,15 @@ var getParentDomain = () => {
190
203
  };
191
204
 
192
205
  var pendingRequests = /* @__PURE__ */ new Map();
206
+ var sdkVersion;
207
+ function setSDKVersion(version2) {
208
+ sdkVersion = version2;
209
+ }
193
210
  var postMessageToParent = (message) => {
194
- window.parent.postMessage(message, getParentDomain());
211
+ window.parent.postMessage(
212
+ sdkVersion === void 0 ? message : { ...message, sdkVersion },
213
+ getParentDomain()
214
+ );
195
215
  };
196
216
  var sendMessage = (message) => {
197
217
  postMessageToParent(message);
@@ -214,6 +234,27 @@ var sendLoaded = () => {
214
234
  };
215
235
 
216
236
  var createSDKCallMessage = {
237
+ aiGenerator: (dots, args, messageId) => ({
238
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
239
+ dots,
240
+ args,
241
+ messageId,
242
+ apiType: "aiGenerator"
243
+ }),
244
+ mockup: (dots, args, messageId) => ({
245
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
246
+ dots,
247
+ args,
248
+ messageId,
249
+ apiType: "mockup"
250
+ }),
251
+ fileBrowser: (dots, args, messageId) => ({
252
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
253
+ dots,
254
+ args,
255
+ messageId,
256
+ apiType: "fileBrowser"
257
+ }),
217
258
  ai: (dots, args, messageId) => ({
218
259
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
219
260
  dots,
@@ -249,6 +290,13 @@ var createSDKCallMessage = {
249
290
  messageId,
250
291
  apiType: "font"
251
292
  }),
293
+ project: (dots, args, messageId) => ({
294
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
295
+ dots,
296
+ args,
297
+ messageId,
298
+ apiType: "project"
299
+ }),
252
300
  state: (dots, args, messageId) => ({
253
301
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
254
302
  dots,
@@ -269,6 +317,27 @@ var createSDKCallMessage = {
269
317
  args,
270
318
  messageId,
271
319
  apiType: "data"
320
+ }),
321
+ brandKit: (dots, args, messageId) => ({
322
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
323
+ dots,
324
+ args,
325
+ messageId,
326
+ apiType: "brandKit"
327
+ }),
328
+ openMicroEditor: (dots, args, messageId) => ({
329
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
330
+ dots,
331
+ args,
332
+ messageId,
333
+ apiType: "openMicroEditor"
334
+ }),
335
+ openMainEditor: (dots, args, messageId) => ({
336
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
337
+ dots,
338
+ args,
339
+ messageId,
340
+ apiType: "openMainEditor"
272
341
  })
273
342
  };
274
343
  function createApiProxy(apiType) {
@@ -285,6 +354,64 @@ function createApiProxy(apiType) {
285
354
  });
286
355
  }
287
356
 
357
+ function createAIGeneratorBridgeApi() {
358
+ const callbacks = /* @__PURE__ */ new Map();
359
+ const proxy = createApiProxy("aiGenerator");
360
+ async function subscribe(request, callback) {
361
+ const subscriptionId = generateMessageId();
362
+ callbacks.set(subscriptionId, callback);
363
+ let response;
364
+ try {
365
+ response = await sendMessage({
366
+ command: "ai-generator-subscribe",
367
+ ...request,
368
+ subscriptionId,
369
+ messageId: generateMessageId()
370
+ });
371
+ } catch (error) {
372
+ callbacks.delete(subscriptionId);
373
+ throw error;
374
+ }
375
+ if (!response.isOk) {
376
+ callbacks.delete(subscriptionId);
377
+ throw new Error(response.error.message);
378
+ }
379
+ return () => {
380
+ callbacks.delete(subscriptionId);
381
+ postMessageToParent({
382
+ command: "ai-generator-unsubscribe",
383
+ subscriptionId
384
+ });
385
+ };
386
+ }
387
+ const methods = {
388
+ registerGenerator: (id, callback) => subscribe({ method: "registerGenerator", args: [id] }, (update) => {
389
+ if (update) callback(update);
390
+ }),
391
+ subscribeToGenerationUpdates: (ids, callback) => subscribe(
392
+ { method: "subscribeToGenerationUpdates", args: [ids] },
393
+ (update) => {
394
+ if (update) callback(update);
395
+ }
396
+ ),
397
+ subscribeToPendingGenerations: (callback) => subscribe(
398
+ { method: "subscribeToPendingGenerations", args: [] },
399
+ () => callback()
400
+ ),
401
+ /** Callers may reuse richer internal submission objects; never send their local abort callbacks. */
402
+ cancelGenerations: (submission) => proxy.cancelGenerations({
403
+ generationIds: submission.generationIds,
404
+ until: submission.until
405
+ })
406
+ };
407
+ return {
408
+ api: new Proxy(proxy, {
409
+ get: (target, property, receiver) => property in methods ? methods[property] : Reflect.get(target, property, receiver)
410
+ }),
411
+ dispatch: (message) => callbacks.get(message.subscriptionId)?.(message.update)
412
+ };
413
+ }
414
+
288
415
  var generationHandlers = /* @__PURE__ */ new Map();
289
416
  var generationSubscriptions = /* @__PURE__ */ new Map();
290
417
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -652,7 +779,7 @@ var SandboxedAuthClient = class {
652
779
  }
653
780
  };
654
781
 
655
- var createBatch = async () => {
782
+ var createBatchFor = async (apiType) => {
656
783
  const response = await sendMessage({
657
784
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
658
785
  messageId: generateMessageId()
@@ -661,14 +788,17 @@ var createBatch = async () => {
661
788
  throw response.error;
662
789
  }
663
790
  const { batchKey } = response.result;
664
- const sendDesignCall = (dots, args) => sendMessage({
665
- command: FROM_EXTENSION_COMMANDS.SDK_CALL,
666
- dots,
667
- args,
668
- messageId: generateMessageId(),
669
- apiType: "design",
670
- batchKey
671
- });
791
+ const sendDesignCall = (dots, args) => {
792
+ const message = {
793
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
794
+ dots: apiType === "project" ? ["design", "api", ...dots] : dots,
795
+ args,
796
+ messageId: generateMessageId(),
797
+ apiType,
798
+ batchKey
799
+ };
800
+ return sendMessage(message);
801
+ };
672
802
  const commit = async () => {
673
803
  const res = await sendMessage({
674
804
  command: FROM_EXTENSION_COMMANDS.BATCH_COMMIT,
@@ -695,6 +825,8 @@ var createBatch = async () => {
695
825
  };
696
826
  return buildNode([]);
697
827
  };
828
+ var createBatch = () => createBatchFor("design");
829
+ var createProjectBatch = () => createBatchFor("project");
698
830
 
699
831
  var createContextBridgeApi = () => {
700
832
  const contextProxy = createApiProxy("context");
@@ -862,6 +994,7 @@ var designStateApi = createDesignStateBridgeApi();
862
994
  var appStateApi = createAppStateBridgeApi();
863
995
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
864
996
  var authClient = new SandboxedAuthClient();
997
+ var aiGeneratorBridge = createAIGeneratorBridgeApi();
865
998
  var handleIncomingMessage = (event) => {
866
999
  const parent = window.parent;
867
1000
  if (!parent || parent === window) {
@@ -884,6 +1017,10 @@ var handleIncomingMessage = (event) => {
884
1017
  statelessApi.dispatch(data.type, data.payload);
885
1018
  return;
886
1019
  }
1020
+ if (isAIGeneratorUpdateMessage(data)) {
1021
+ aiGeneratorBridge.dispatch(data);
1022
+ return;
1023
+ }
887
1024
  if (isAIGenerationUpdatePushMessage(data)) {
888
1025
  dispatchAIGenerationUpdate(data.subscriptionId, data.update);
889
1026
  return;
@@ -908,7 +1045,28 @@ var handleIncomingMessage = (event) => {
908
1045
  );
909
1046
  }
910
1047
  };
1048
+ var projectProxy = createApiProxy("project");
1049
+ var projectApi = {
1050
+ design: {
1051
+ state: {
1052
+ getState: projectProxy.design.state.getState,
1053
+ subscribe: designStateApi.subscribe
1054
+ },
1055
+ api: projectProxy.design.api,
1056
+ createBatch: createProjectBatch
1057
+ },
1058
+ app: {
1059
+ state: {
1060
+ getState: projectProxy.app.state.getState,
1061
+ subscribe: appStateApi.subscribe
1062
+ },
1063
+ api: projectProxy.app.api
1064
+ }
1065
+ };
911
1066
  var bridgeHandlers = {
1067
+ aiGenerator: aiGeneratorBridge.api,
1068
+ brandKit: createApiProxy("brandKit"),
1069
+ mockup: createApiProxy("mockup"),
912
1070
  ai: createAIApiProxy(),
913
1071
  context: contextApi,
914
1072
  data: createApiProxy("data"),
@@ -917,12 +1075,17 @@ var bridgeHandlers = {
917
1075
  appStore: appStateApi,
918
1076
  export: createApiProxy("export"),
919
1077
  font: createApiProxy("font"),
1078
+ project: projectApi,
920
1079
  state: createApiProxy("state"),
921
1080
  upload: createApiProxy("upload"),
922
- fileBrowser: createFileBrowserApiProxy(),
1081
+ fileBrowser: { getFiles: createApiProxy("fileBrowser").getFiles },
1082
+ fileBrowserRegistration: createFileBrowserApiProxy(),
1083
+ openMicroEditor: createApiProxy("openMicroEditor"),
1084
+ openMainEditor: createApiProxy("openMainEditor"),
923
1085
  auth: authClient,
924
1086
  stateless: statelessApi,
925
- createBatch
1087
+ createBatch,
1088
+ createProjectBatch
926
1089
  };
927
1090
 
928
1091
  // src/api/utils.ts
@@ -933,6 +1096,9 @@ function unwrapResult(result) {
933
1096
  throw result.error;
934
1097
  }
935
1098
 
1099
+ // package.json
1100
+ var version = "1.0.0";
1101
+
936
1102
  // src/utils/syncHtmlDataThemeFromHostContext.ts
937
1103
  async function syncHtmlDataThemeFromHostContext(kittl2) {
938
1104
  if (typeof document === "undefined") {
@@ -973,12 +1139,17 @@ function createKittlSDK(apis) {
973
1139
  handleIncomingMessage(event);
974
1140
  }
975
1141
  );
976
- void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1142
+ const { context } = apis;
1143
+ const themeSynced = context?.get && context.subscribe ? syncHtmlDataThemeFromHostContext({
1144
+ context
1145
+ }) : Promise.resolve();
1146
+ void themeSynced.catch(() => void 0).then(() => {
977
1147
  kittl2.onLoadedCallback?.();
978
1148
  sendLoaded();
979
1149
  });
980
1150
  };
981
1151
  if (typeof document !== "undefined" && typeof window !== "undefined") {
1152
+ setSDKVersion(version);
982
1153
  window.kittl = kittl2;
983
1154
  if (document.readyState === "loading") {
984
1155
  document.addEventListener("DOMContentLoaded", initSdk);
@@ -992,8 +1163,13 @@ function createKittlSDK(apis) {
992
1163
  // src/sharedFileBrowser.ts
993
1164
  var kittl = createKittlSDK({
994
1165
  auth: bridgeHandlers.auth,
995
- context: bridgeHandlers.context,
996
- fileBrowser: bridgeHandlers.fileBrowser
1166
+ // context only carries tab registration here: the file browser is hidden, so
1167
+ // it has no theme to follow and nothing to drag
1168
+ context: {
1169
+ registerUploadBrowser: bridgeHandlers.fileBrowserRegistration.registerUploadBrowser
1170
+ },
1171
+ // Both locations share callback tracking so existing file-browser extensions work unchanged.
1172
+ fileBrowser: bridgeHandlers.fileBrowserRegistration
997
1173
  });
998
1174
  export {
999
1175
  kittl,
@@ -5,6 +5,10 @@
5
5
  (() => {
6
6
 
7
7
  var FROM_EXTENSION_COMMANDS = {
8
+ /** Capability-owned AI callback registration. */
9
+ AI_GENERATOR_SUBSCRIBE: "ai-generator-subscribe",
10
+ /** Capability-owned AI callback teardown. */
11
+ AI_GENERATOR_UNSUBSCRIBE: "ai-generator-unsubscribe",
8
12
  /** SDK API call */
9
13
  SDK_CALL: "sdk-call",
10
14
  /** AI handler registration */
@@ -53,6 +57,8 @@
53
57
  LOADED: "loaded"
54
58
  };
55
59
  var TO_EXTENSION_COMMANDS = {
60
+ /** Callback payload for generator or pending-set subscriptions. */
61
+ AI_GENERATOR_UPDATE: "ai-generator-update",
56
62
  /** SDK API response */
57
63
  SDK_RESPONSE: "sdk-response",
58
64
  /** File browser fetch content request */
@@ -69,6 +75,10 @@
69
75
  APP_STATE_UPDATE: "app-state-update"
70
76
  };
71
77
 
78
+ function isAIGeneratorUpdateMessage(data) {
79
+ return !!data && typeof data === "object" && "command" in data && data.command === "ai-generator-update" && "subscriptionId" in data && typeof data.subscriptionId === "string";
80
+ }
81
+
72
82
  var isSDKResponseMessage = (data) => {
73
83
  return typeof data === "object" && data !== null && "command" in data && data.command === TO_EXTENSION_COMMANDS.SDK_RESPONSE && "messageId" in data && typeof data.messageId === "string";
74
84
  };
@@ -138,7 +148,10 @@
138
148
  "https://app.stagingdesigner.com",
139
149
  "https://*.stagingdesigner.com",
140
150
  "http://localhost:3000",
141
- "https://app.kittl.com"
151
+ "https://app.kittl.com",
152
+ // website, for sandboxed standalone dashboard pages
153
+ "http://localhost:3003",
154
+ "https://www.kittl.com"
142
155
  ];
143
156
  var toOrigin = (value) => {
144
157
  if (!value) {
@@ -193,8 +206,15 @@
193
206
  };
194
207
 
195
208
  var pendingRequests = /* @__PURE__ */ new Map();
209
+ var sdkVersion;
210
+ function setSDKVersion(version2) {
211
+ sdkVersion = version2;
212
+ }
196
213
  var postMessageToParent = (message) => {
197
- window.parent.postMessage(message, getParentDomain());
214
+ window.parent.postMessage(
215
+ sdkVersion === void 0 ? message : { ...message, sdkVersion },
216
+ getParentDomain()
217
+ );
198
218
  };
199
219
  var sendMessage = (message) => {
200
220
  postMessageToParent(message);
@@ -217,6 +237,27 @@
217
237
  };
218
238
 
219
239
  var createSDKCallMessage = {
240
+ aiGenerator: (dots, args, messageId) => ({
241
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
242
+ dots,
243
+ args,
244
+ messageId,
245
+ apiType: "aiGenerator"
246
+ }),
247
+ mockup: (dots, args, messageId) => ({
248
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
249
+ dots,
250
+ args,
251
+ messageId,
252
+ apiType: "mockup"
253
+ }),
254
+ fileBrowser: (dots, args, messageId) => ({
255
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
256
+ dots,
257
+ args,
258
+ messageId,
259
+ apiType: "fileBrowser"
260
+ }),
220
261
  ai: (dots, args, messageId) => ({
221
262
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
222
263
  dots,
@@ -252,6 +293,13 @@
252
293
  messageId,
253
294
  apiType: "font"
254
295
  }),
296
+ project: (dots, args, messageId) => ({
297
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
298
+ dots,
299
+ args,
300
+ messageId,
301
+ apiType: "project"
302
+ }),
255
303
  state: (dots, args, messageId) => ({
256
304
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
257
305
  dots,
@@ -272,6 +320,27 @@
272
320
  args,
273
321
  messageId,
274
322
  apiType: "data"
323
+ }),
324
+ brandKit: (dots, args, messageId) => ({
325
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
326
+ dots,
327
+ args,
328
+ messageId,
329
+ apiType: "brandKit"
330
+ }),
331
+ openMicroEditor: (dots, args, messageId) => ({
332
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
333
+ dots,
334
+ args,
335
+ messageId,
336
+ apiType: "openMicroEditor"
337
+ }),
338
+ openMainEditor: (dots, args, messageId) => ({
339
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
340
+ dots,
341
+ args,
342
+ messageId,
343
+ apiType: "openMainEditor"
275
344
  })
276
345
  };
277
346
  function createApiProxy(apiType) {
@@ -288,6 +357,64 @@
288
357
  });
289
358
  }
290
359
 
360
+ function createAIGeneratorBridgeApi() {
361
+ const callbacks = /* @__PURE__ */ new Map();
362
+ const proxy = createApiProxy("aiGenerator");
363
+ async function subscribe(request, callback) {
364
+ const subscriptionId = generateMessageId();
365
+ callbacks.set(subscriptionId, callback);
366
+ let response;
367
+ try {
368
+ response = await sendMessage({
369
+ command: "ai-generator-subscribe",
370
+ ...request,
371
+ subscriptionId,
372
+ messageId: generateMessageId()
373
+ });
374
+ } catch (error) {
375
+ callbacks.delete(subscriptionId);
376
+ throw error;
377
+ }
378
+ if (!response.isOk) {
379
+ callbacks.delete(subscriptionId);
380
+ throw new Error(response.error.message);
381
+ }
382
+ return () => {
383
+ callbacks.delete(subscriptionId);
384
+ postMessageToParent({
385
+ command: "ai-generator-unsubscribe",
386
+ subscriptionId
387
+ });
388
+ };
389
+ }
390
+ const methods = {
391
+ registerGenerator: (id, callback) => subscribe({ method: "registerGenerator", args: [id] }, (update) => {
392
+ if (update) callback(update);
393
+ }),
394
+ subscribeToGenerationUpdates: (ids, callback) => subscribe(
395
+ { method: "subscribeToGenerationUpdates", args: [ids] },
396
+ (update) => {
397
+ if (update) callback(update);
398
+ }
399
+ ),
400
+ subscribeToPendingGenerations: (callback) => subscribe(
401
+ { method: "subscribeToPendingGenerations", args: [] },
402
+ () => callback()
403
+ ),
404
+ /** Callers may reuse richer internal submission objects; never send their local abort callbacks. */
405
+ cancelGenerations: (submission) => proxy.cancelGenerations({
406
+ generationIds: submission.generationIds,
407
+ until: submission.until
408
+ })
409
+ };
410
+ return {
411
+ api: new Proxy(proxy, {
412
+ get: (target, property, receiver) => property in methods ? methods[property] : Reflect.get(target, property, receiver)
413
+ }),
414
+ dispatch: (message) => callbacks.get(message.subscriptionId)?.(message.update)
415
+ };
416
+ }
417
+
291
418
  var generationHandlers = /* @__PURE__ */ new Map();
292
419
  var generationSubscriptions = /* @__PURE__ */ new Map();
293
420
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -655,7 +782,7 @@
655
782
  }
656
783
  };
657
784
 
658
- var createBatch = async () => {
785
+ var createBatchFor = async (apiType) => {
659
786
  const response = await sendMessage({
660
787
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
661
788
  messageId: generateMessageId()
@@ -664,14 +791,17 @@
664
791
  throw response.error;
665
792
  }
666
793
  const { batchKey } = response.result;
667
- const sendDesignCall = (dots, args) => sendMessage({
668
- command: FROM_EXTENSION_COMMANDS.SDK_CALL,
669
- dots,
670
- args,
671
- messageId: generateMessageId(),
672
- apiType: "design",
673
- batchKey
674
- });
794
+ const sendDesignCall = (dots, args) => {
795
+ const message = {
796
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
797
+ dots: apiType === "project" ? ["design", "api", ...dots] : dots,
798
+ args,
799
+ messageId: generateMessageId(),
800
+ apiType,
801
+ batchKey
802
+ };
803
+ return sendMessage(message);
804
+ };
675
805
  const commit = async () => {
676
806
  const res = await sendMessage({
677
807
  command: FROM_EXTENSION_COMMANDS.BATCH_COMMIT,
@@ -698,6 +828,8 @@
698
828
  };
699
829
  return buildNode([]);
700
830
  };
831
+ var createBatch = () => createBatchFor("design");
832
+ var createProjectBatch = () => createBatchFor("project");
701
833
 
702
834
  var createContextBridgeApi = () => {
703
835
  const contextProxy = createApiProxy("context");
@@ -865,6 +997,7 @@
865
997
  var appStateApi = createAppStateBridgeApi();
866
998
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
867
999
  var authClient = new SandboxedAuthClient();
1000
+ var aiGeneratorBridge = createAIGeneratorBridgeApi();
868
1001
  var handleIncomingMessage = (event) => {
869
1002
  const parent = window.parent;
870
1003
  if (!parent || parent === window) {
@@ -887,6 +1020,10 @@
887
1020
  statelessApi.dispatch(data.type, data.payload);
888
1021
  return;
889
1022
  }
1023
+ if (isAIGeneratorUpdateMessage(data)) {
1024
+ aiGeneratorBridge.dispatch(data);
1025
+ return;
1026
+ }
890
1027
  if (isAIGenerationUpdatePushMessage(data)) {
891
1028
  dispatchAIGenerationUpdate(data.subscriptionId, data.update);
892
1029
  return;
@@ -911,7 +1048,28 @@
911
1048
  );
912
1049
  }
913
1050
  };
1051
+ var projectProxy = createApiProxy("project");
1052
+ var projectApi = {
1053
+ design: {
1054
+ state: {
1055
+ getState: projectProxy.design.state.getState,
1056
+ subscribe: designStateApi.subscribe
1057
+ },
1058
+ api: projectProxy.design.api,
1059
+ createBatch: createProjectBatch
1060
+ },
1061
+ app: {
1062
+ state: {
1063
+ getState: projectProxy.app.state.getState,
1064
+ subscribe: appStateApi.subscribe
1065
+ },
1066
+ api: projectProxy.app.api
1067
+ }
1068
+ };
914
1069
  var bridgeHandlers = {
1070
+ aiGenerator: aiGeneratorBridge.api,
1071
+ brandKit: createApiProxy("brandKit"),
1072
+ mockup: createApiProxy("mockup"),
915
1073
  ai: createAIApiProxy(),
916
1074
  context: contextApi,
917
1075
  data: createApiProxy("data"),
@@ -920,12 +1078,17 @@
920
1078
  appStore: appStateApi,
921
1079
  export: createApiProxy("export"),
922
1080
  font: createApiProxy("font"),
1081
+ project: projectApi,
923
1082
  state: createApiProxy("state"),
924
1083
  upload: createApiProxy("upload"),
925
- fileBrowser: createFileBrowserApiProxy(),
1084
+ fileBrowser: { getFiles: createApiProxy("fileBrowser").getFiles },
1085
+ fileBrowserRegistration: createFileBrowserApiProxy(),
1086
+ openMicroEditor: createApiProxy("openMicroEditor"),
1087
+ openMainEditor: createApiProxy("openMainEditor"),
926
1088
  auth: authClient,
927
1089
  stateless: statelessApi,
928
- createBatch
1090
+ createBatch,
1091
+ createProjectBatch
929
1092
  };
930
1093
 
931
1094
  // src/api/utils.ts
@@ -936,6 +1099,9 @@
936
1099
  throw result.error;
937
1100
  }
938
1101
 
1102
+ // package.json
1103
+ var version = "1.0.0";
1104
+
939
1105
  // src/utils/syncHtmlDataThemeFromHostContext.ts
940
1106
  async function syncHtmlDataThemeFromHostContext(kittl2) {
941
1107
  if (typeof document === "undefined") {
@@ -976,12 +1142,17 @@
976
1142
  handleIncomingMessage(event);
977
1143
  }
978
1144
  );
979
- void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1145
+ const { context } = apis;
1146
+ const themeSynced = context?.get && context.subscribe ? syncHtmlDataThemeFromHostContext({
1147
+ context
1148
+ }) : Promise.resolve();
1149
+ void themeSynced.catch(() => void 0).then(() => {
980
1150
  kittl2.onLoadedCallback?.();
981
1151
  sendLoaded();
982
1152
  });
983
1153
  };
984
1154
  if (typeof document !== "undefined" && typeof window !== "undefined") {
1155
+ setSDKVersion(version);
985
1156
  window.kittl = kittl2;
986
1157
  if (document.readyState === "loading") {
987
1158
  document.addEventListener("DOMContentLoaded", initSdk);
@@ -995,7 +1166,12 @@
995
1166
  // src/sharedFileBrowser.ts
996
1167
  var kittl = createKittlSDK({
997
1168
  auth: bridgeHandlers.auth,
998
- context: bridgeHandlers.context,
999
- fileBrowser: bridgeHandlers.fileBrowser
1169
+ // context only carries tab registration here: the file browser is hidden, so
1170
+ // it has no theme to follow and nothing to drag
1171
+ context: {
1172
+ registerUploadBrowser: bridgeHandlers.fileBrowserRegistration.registerUploadBrowser
1173
+ },
1174
+ // Both locations share callback tracking so existing file-browser extensions work unchanged.
1175
+ fileBrowser: bridgeHandlers.fileBrowserRegistration
1000
1176
  });
1001
1177
  })();