@kittl/sdk 0.0.9 → 1.0.0-alpha.2

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,34 @@ 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"
341
+ }),
342
+ agent: (dots, args, messageId) => ({
343
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
344
+ dots,
345
+ args,
346
+ messageId,
347
+ apiType: "agent"
272
348
  })
273
349
  };
274
350
  function createApiProxy(apiType) {
@@ -285,6 +361,64 @@ function createApiProxy(apiType) {
285
361
  });
286
362
  }
287
363
 
364
+ function createAIGeneratorBridgeApi() {
365
+ const callbacks = /* @__PURE__ */ new Map();
366
+ const proxy = createApiProxy("aiGenerator");
367
+ async function subscribe(request, callback) {
368
+ const subscriptionId = generateMessageId();
369
+ callbacks.set(subscriptionId, callback);
370
+ let response;
371
+ try {
372
+ response = await sendMessage({
373
+ command: "ai-generator-subscribe",
374
+ ...request,
375
+ subscriptionId,
376
+ messageId: generateMessageId()
377
+ });
378
+ } catch (error) {
379
+ callbacks.delete(subscriptionId);
380
+ throw error;
381
+ }
382
+ if (!response.isOk) {
383
+ callbacks.delete(subscriptionId);
384
+ throw new Error(response.error.message);
385
+ }
386
+ return () => {
387
+ callbacks.delete(subscriptionId);
388
+ postMessageToParent({
389
+ command: "ai-generator-unsubscribe",
390
+ subscriptionId
391
+ });
392
+ };
393
+ }
394
+ const methods = {
395
+ registerGenerator: (id, callback) => subscribe({ method: "registerGenerator", args: [id] }, (update) => {
396
+ if (update) callback(update);
397
+ }),
398
+ subscribeToGenerationUpdates: (ids, callback) => subscribe(
399
+ { method: "subscribeToGenerationUpdates", args: [ids] },
400
+ (update) => {
401
+ if (update) callback(update);
402
+ }
403
+ ),
404
+ subscribeToPendingGenerations: (callback) => subscribe(
405
+ { method: "subscribeToPendingGenerations", args: [] },
406
+ () => callback()
407
+ ),
408
+ /** Callers may reuse richer internal submission objects; never send their local abort callbacks. */
409
+ cancelGenerations: (submission) => proxy.cancelGenerations({
410
+ generationIds: submission.generationIds,
411
+ until: submission.until
412
+ })
413
+ };
414
+ return {
415
+ api: new Proxy(proxy, {
416
+ get: (target, property, receiver) => property in methods ? methods[property] : Reflect.get(target, property, receiver)
417
+ }),
418
+ dispatch: (message) => callbacks.get(message.subscriptionId)?.(message.update)
419
+ };
420
+ }
421
+
288
422
  var generationHandlers = /* @__PURE__ */ new Map();
289
423
  var generationSubscriptions = /* @__PURE__ */ new Map();
290
424
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -652,7 +786,7 @@ var SandboxedAuthClient = class {
652
786
  }
653
787
  };
654
788
 
655
- var createBatch = async () => {
789
+ var createBatchFor = async (apiType) => {
656
790
  const response = await sendMessage({
657
791
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
658
792
  messageId: generateMessageId()
@@ -661,14 +795,17 @@ var createBatch = async () => {
661
795
  throw response.error;
662
796
  }
663
797
  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
- });
798
+ const sendDesignCall = (dots, args) => {
799
+ const message = {
800
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
801
+ dots: apiType === "project" ? ["design", "api", ...dots] : dots,
802
+ args,
803
+ messageId: generateMessageId(),
804
+ apiType,
805
+ batchKey
806
+ };
807
+ return sendMessage(message);
808
+ };
672
809
  const commit = async () => {
673
810
  const res = await sendMessage({
674
811
  command: FROM_EXTENSION_COMMANDS.BATCH_COMMIT,
@@ -695,6 +832,8 @@ var createBatch = async () => {
695
832
  };
696
833
  return buildNode([]);
697
834
  };
835
+ var createBatch = () => createBatchFor("design");
836
+ var createProjectBatch = () => createBatchFor("project");
698
837
 
699
838
  var createContextBridgeApi = () => {
700
839
  const contextProxy = createApiProxy("context");
@@ -862,6 +1001,7 @@ var designStateApi = createDesignStateBridgeApi();
862
1001
  var appStateApi = createAppStateBridgeApi();
863
1002
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
864
1003
  var authClient = new SandboxedAuthClient();
1004
+ var aiGeneratorBridge = createAIGeneratorBridgeApi();
865
1005
  var handleIncomingMessage = (event) => {
866
1006
  const parent = window.parent;
867
1007
  if (!parent || parent === window) {
@@ -884,6 +1024,10 @@ var handleIncomingMessage = (event) => {
884
1024
  statelessApi.dispatch(data.type, data.payload);
885
1025
  return;
886
1026
  }
1027
+ if (isAIGeneratorUpdateMessage(data)) {
1028
+ aiGeneratorBridge.dispatch(data);
1029
+ return;
1030
+ }
887
1031
  if (isAIGenerationUpdatePushMessage(data)) {
888
1032
  dispatchAIGenerationUpdate(data.subscriptionId, data.update);
889
1033
  return;
@@ -908,7 +1052,29 @@ var handleIncomingMessage = (event) => {
908
1052
  );
909
1053
  }
910
1054
  };
1055
+ var projectProxy = createApiProxy("project");
1056
+ var projectApi = {
1057
+ design: {
1058
+ state: {
1059
+ getState: projectProxy.design.state.getState,
1060
+ subscribe: designStateApi.subscribe
1061
+ },
1062
+ api: projectProxy.design.api,
1063
+ createBatch: createProjectBatch
1064
+ },
1065
+ app: {
1066
+ state: {
1067
+ getState: projectProxy.app.state.getState,
1068
+ subscribe: appStateApi.subscribe
1069
+ },
1070
+ api: projectProxy.app.api
1071
+ }
1072
+ };
911
1073
  var bridgeHandlers = {
1074
+ agent: createApiProxy("agent"),
1075
+ aiGenerator: aiGeneratorBridge.api,
1076
+ brandKit: createApiProxy("brandKit"),
1077
+ mockup: createApiProxy("mockup"),
912
1078
  ai: createAIApiProxy(),
913
1079
  context: contextApi,
914
1080
  data: createApiProxy("data"),
@@ -917,12 +1083,17 @@ var bridgeHandlers = {
917
1083
  appStore: appStateApi,
918
1084
  export: createApiProxy("export"),
919
1085
  font: createApiProxy("font"),
1086
+ project: projectApi,
920
1087
  state: createApiProxy("state"),
921
1088
  upload: createApiProxy("upload"),
922
- fileBrowser: createFileBrowserApiProxy(),
1089
+ fileBrowser: { getFiles: createApiProxy("fileBrowser").getFiles },
1090
+ fileBrowserRegistration: createFileBrowserApiProxy(),
1091
+ openMicroEditor: createApiProxy("openMicroEditor"),
1092
+ openMainEditor: createApiProxy("openMainEditor"),
923
1093
  auth: authClient,
924
1094
  stateless: statelessApi,
925
- createBatch
1095
+ createBatch,
1096
+ createProjectBatch
926
1097
  };
927
1098
 
928
1099
  // src/api/utils.ts
@@ -933,6 +1104,9 @@ function unwrapResult(result) {
933
1104
  throw result.error;
934
1105
  }
935
1106
 
1107
+ // package.json
1108
+ var version = "1.0.0";
1109
+
936
1110
  // src/utils/syncHtmlDataThemeFromHostContext.ts
937
1111
  async function syncHtmlDataThemeFromHostContext(kittl2) {
938
1112
  if (typeof document === "undefined") {
@@ -973,12 +1147,17 @@ function createKittlSDK(apis) {
973
1147
  handleIncomingMessage(event);
974
1148
  }
975
1149
  );
976
- void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1150
+ const { context } = apis;
1151
+ const themeSynced = context?.get && context.subscribe ? syncHtmlDataThemeFromHostContext({
1152
+ context
1153
+ }) : Promise.resolve();
1154
+ void themeSynced.catch(() => void 0).then(() => {
977
1155
  kittl2.onLoadedCallback?.();
978
1156
  sendLoaded();
979
1157
  });
980
1158
  };
981
1159
  if (typeof document !== "undefined" && typeof window !== "undefined") {
1160
+ setSDKVersion(version);
982
1161
  window.kittl = kittl2;
983
1162
  if (document.readyState === "loading") {
984
1163
  document.addEventListener("DOMContentLoaded", initSdk);
@@ -992,8 +1171,13 @@ function createKittlSDK(apis) {
992
1171
  // src/sharedFileBrowser.ts
993
1172
  var kittl = createKittlSDK({
994
1173
  auth: bridgeHandlers.auth,
995
- context: bridgeHandlers.context,
996
- fileBrowser: bridgeHandlers.fileBrowser
1174
+ // context only carries tab registration here: the file browser is hidden, so
1175
+ // it has no theme to follow and nothing to drag
1176
+ context: {
1177
+ registerUploadBrowser: bridgeHandlers.fileBrowserRegistration.registerUploadBrowser
1178
+ },
1179
+ // Both locations share callback tracking so existing file-browser extensions work unchanged.
1180
+ fileBrowser: bridgeHandlers.fileBrowserRegistration
997
1181
  });
998
1182
  export {
999
1183
  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,34 @@
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"
344
+ }),
345
+ agent: (dots, args, messageId) => ({
346
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
347
+ dots,
348
+ args,
349
+ messageId,
350
+ apiType: "agent"
275
351
  })
276
352
  };
277
353
  function createApiProxy(apiType) {
@@ -288,6 +364,64 @@
288
364
  });
289
365
  }
290
366
 
367
+ function createAIGeneratorBridgeApi() {
368
+ const callbacks = /* @__PURE__ */ new Map();
369
+ const proxy = createApiProxy("aiGenerator");
370
+ async function subscribe(request, callback) {
371
+ const subscriptionId = generateMessageId();
372
+ callbacks.set(subscriptionId, callback);
373
+ let response;
374
+ try {
375
+ response = await sendMessage({
376
+ command: "ai-generator-subscribe",
377
+ ...request,
378
+ subscriptionId,
379
+ messageId: generateMessageId()
380
+ });
381
+ } catch (error) {
382
+ callbacks.delete(subscriptionId);
383
+ throw error;
384
+ }
385
+ if (!response.isOk) {
386
+ callbacks.delete(subscriptionId);
387
+ throw new Error(response.error.message);
388
+ }
389
+ return () => {
390
+ callbacks.delete(subscriptionId);
391
+ postMessageToParent({
392
+ command: "ai-generator-unsubscribe",
393
+ subscriptionId
394
+ });
395
+ };
396
+ }
397
+ const methods = {
398
+ registerGenerator: (id, callback) => subscribe({ method: "registerGenerator", args: [id] }, (update) => {
399
+ if (update) callback(update);
400
+ }),
401
+ subscribeToGenerationUpdates: (ids, callback) => subscribe(
402
+ { method: "subscribeToGenerationUpdates", args: [ids] },
403
+ (update) => {
404
+ if (update) callback(update);
405
+ }
406
+ ),
407
+ subscribeToPendingGenerations: (callback) => subscribe(
408
+ { method: "subscribeToPendingGenerations", args: [] },
409
+ () => callback()
410
+ ),
411
+ /** Callers may reuse richer internal submission objects; never send their local abort callbacks. */
412
+ cancelGenerations: (submission) => proxy.cancelGenerations({
413
+ generationIds: submission.generationIds,
414
+ until: submission.until
415
+ })
416
+ };
417
+ return {
418
+ api: new Proxy(proxy, {
419
+ get: (target, property, receiver) => property in methods ? methods[property] : Reflect.get(target, property, receiver)
420
+ }),
421
+ dispatch: (message) => callbacks.get(message.subscriptionId)?.(message.update)
422
+ };
423
+ }
424
+
291
425
  var generationHandlers = /* @__PURE__ */ new Map();
292
426
  var generationSubscriptions = /* @__PURE__ */ new Map();
293
427
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -655,7 +789,7 @@
655
789
  }
656
790
  };
657
791
 
658
- var createBatch = async () => {
792
+ var createBatchFor = async (apiType) => {
659
793
  const response = await sendMessage({
660
794
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
661
795
  messageId: generateMessageId()
@@ -664,14 +798,17 @@
664
798
  throw response.error;
665
799
  }
666
800
  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
- });
801
+ const sendDesignCall = (dots, args) => {
802
+ const message = {
803
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
804
+ dots: apiType === "project" ? ["design", "api", ...dots] : dots,
805
+ args,
806
+ messageId: generateMessageId(),
807
+ apiType,
808
+ batchKey
809
+ };
810
+ return sendMessage(message);
811
+ };
675
812
  const commit = async () => {
676
813
  const res = await sendMessage({
677
814
  command: FROM_EXTENSION_COMMANDS.BATCH_COMMIT,
@@ -698,6 +835,8 @@
698
835
  };
699
836
  return buildNode([]);
700
837
  };
838
+ var createBatch = () => createBatchFor("design");
839
+ var createProjectBatch = () => createBatchFor("project");
701
840
 
702
841
  var createContextBridgeApi = () => {
703
842
  const contextProxy = createApiProxy("context");
@@ -865,6 +1004,7 @@
865
1004
  var appStateApi = createAppStateBridgeApi();
866
1005
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
867
1006
  var authClient = new SandboxedAuthClient();
1007
+ var aiGeneratorBridge = createAIGeneratorBridgeApi();
868
1008
  var handleIncomingMessage = (event) => {
869
1009
  const parent = window.parent;
870
1010
  if (!parent || parent === window) {
@@ -887,6 +1027,10 @@
887
1027
  statelessApi.dispatch(data.type, data.payload);
888
1028
  return;
889
1029
  }
1030
+ if (isAIGeneratorUpdateMessage(data)) {
1031
+ aiGeneratorBridge.dispatch(data);
1032
+ return;
1033
+ }
890
1034
  if (isAIGenerationUpdatePushMessage(data)) {
891
1035
  dispatchAIGenerationUpdate(data.subscriptionId, data.update);
892
1036
  return;
@@ -911,7 +1055,29 @@
911
1055
  );
912
1056
  }
913
1057
  };
1058
+ var projectProxy = createApiProxy("project");
1059
+ var projectApi = {
1060
+ design: {
1061
+ state: {
1062
+ getState: projectProxy.design.state.getState,
1063
+ subscribe: designStateApi.subscribe
1064
+ },
1065
+ api: projectProxy.design.api,
1066
+ createBatch: createProjectBatch
1067
+ },
1068
+ app: {
1069
+ state: {
1070
+ getState: projectProxy.app.state.getState,
1071
+ subscribe: appStateApi.subscribe
1072
+ },
1073
+ api: projectProxy.app.api
1074
+ }
1075
+ };
914
1076
  var bridgeHandlers = {
1077
+ agent: createApiProxy("agent"),
1078
+ aiGenerator: aiGeneratorBridge.api,
1079
+ brandKit: createApiProxy("brandKit"),
1080
+ mockup: createApiProxy("mockup"),
915
1081
  ai: createAIApiProxy(),
916
1082
  context: contextApi,
917
1083
  data: createApiProxy("data"),
@@ -920,12 +1086,17 @@
920
1086
  appStore: appStateApi,
921
1087
  export: createApiProxy("export"),
922
1088
  font: createApiProxy("font"),
1089
+ project: projectApi,
923
1090
  state: createApiProxy("state"),
924
1091
  upload: createApiProxy("upload"),
925
- fileBrowser: createFileBrowserApiProxy(),
1092
+ fileBrowser: { getFiles: createApiProxy("fileBrowser").getFiles },
1093
+ fileBrowserRegistration: createFileBrowserApiProxy(),
1094
+ openMicroEditor: createApiProxy("openMicroEditor"),
1095
+ openMainEditor: createApiProxy("openMainEditor"),
926
1096
  auth: authClient,
927
1097
  stateless: statelessApi,
928
- createBatch
1098
+ createBatch,
1099
+ createProjectBatch
929
1100
  };
930
1101
 
931
1102
  // src/api/utils.ts
@@ -936,6 +1107,9 @@
936
1107
  throw result.error;
937
1108
  }
938
1109
 
1110
+ // package.json
1111
+ var version = "1.0.0";
1112
+
939
1113
  // src/utils/syncHtmlDataThemeFromHostContext.ts
940
1114
  async function syncHtmlDataThemeFromHostContext(kittl2) {
941
1115
  if (typeof document === "undefined") {
@@ -976,12 +1150,17 @@
976
1150
  handleIncomingMessage(event);
977
1151
  }
978
1152
  );
979
- void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1153
+ const { context } = apis;
1154
+ const themeSynced = context?.get && context.subscribe ? syncHtmlDataThemeFromHostContext({
1155
+ context
1156
+ }) : Promise.resolve();
1157
+ void themeSynced.catch(() => void 0).then(() => {
980
1158
  kittl2.onLoadedCallback?.();
981
1159
  sendLoaded();
982
1160
  });
983
1161
  };
984
1162
  if (typeof document !== "undefined" && typeof window !== "undefined") {
1163
+ setSDKVersion(version);
985
1164
  window.kittl = kittl2;
986
1165
  if (document.readyState === "loading") {
987
1166
  document.addEventListener("DOMContentLoaded", initSdk);
@@ -995,7 +1174,12 @@
995
1174
  // src/sharedFileBrowser.ts
996
1175
  var kittl = createKittlSDK({
997
1176
  auth: bridgeHandlers.auth,
998
- context: bridgeHandlers.context,
999
- fileBrowser: bridgeHandlers.fileBrowser
1177
+ // context only carries tab registration here: the file browser is hidden, so
1178
+ // it has no theme to follow and nothing to drag
1179
+ context: {
1180
+ registerUploadBrowser: bridgeHandlers.fileBrowserRegistration.registerUploadBrowser
1181
+ },
1182
+ // Both locations share callback tracking so existing file-browser extensions work unchanged.
1183
+ fileBrowser: bridgeHandlers.fileBrowserRegistration
1000
1184
  });
1001
1185
  })();