@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.
@@ -11,6 +11,10 @@ function unwrapResult(result) {
11
11
  }
12
12
 
13
13
  var FROM_EXTENSION_COMMANDS = {
14
+ /** Capability-owned AI callback registration. */
15
+ AI_GENERATOR_SUBSCRIBE: "ai-generator-subscribe",
16
+ /** Capability-owned AI callback teardown. */
17
+ AI_GENERATOR_UNSUBSCRIBE: "ai-generator-unsubscribe",
14
18
  /** SDK API call */
15
19
  SDK_CALL: "sdk-call",
16
20
  /** AI handler registration */
@@ -59,6 +63,8 @@ var FROM_EXTENSION_COMMANDS = {
59
63
  LOADED: "loaded"
60
64
  };
61
65
  var TO_EXTENSION_COMMANDS = {
66
+ /** Callback payload for generator or pending-set subscriptions. */
67
+ AI_GENERATOR_UPDATE: "ai-generator-update",
62
68
  /** SDK API response */
63
69
  SDK_RESPONSE: "sdk-response",
64
70
  /** File browser fetch content request */
@@ -75,6 +81,10 @@ var TO_EXTENSION_COMMANDS = {
75
81
  APP_STATE_UPDATE: "app-state-update"
76
82
  };
77
83
 
84
+ function isAIGeneratorUpdateMessage(data) {
85
+ return !!data && typeof data === "object" && "command" in data && data.command === "ai-generator-update" && "subscriptionId" in data && typeof data.subscriptionId === "string";
86
+ }
87
+
78
88
  var isSDKResponseMessage = (data) => {
79
89
  return typeof data === "object" && data !== null && "command" in data && data.command === TO_EXTENSION_COMMANDS.SDK_RESPONSE && "messageId" in data && typeof data.messageId === "string";
80
90
  };
@@ -144,7 +154,10 @@ var APPROVED_EXTENSION_COMMUNICATION_DOMAINS = [
144
154
  "https://app.stagingdesigner.com",
145
155
  "https://*.stagingdesigner.com",
146
156
  "http://localhost:3000",
147
- "https://app.kittl.com"
157
+ "https://app.kittl.com",
158
+ // website, for sandboxed standalone dashboard pages
159
+ "http://localhost:3003",
160
+ "https://www.kittl.com"
148
161
  ];
149
162
  var toOrigin = (value) => {
150
163
  if (!value) {
@@ -199,8 +212,15 @@ var getParentDomain = () => {
199
212
  };
200
213
 
201
214
  var pendingRequests = /* @__PURE__ */ new Map();
215
+ var sdkVersion;
216
+ function setSDKVersion(version2) {
217
+ sdkVersion = version2;
218
+ }
202
219
  var postMessageToParent = (message) => {
203
- window.parent.postMessage(message, getParentDomain());
220
+ window.parent.postMessage(
221
+ sdkVersion === void 0 ? message : { ...message, sdkVersion },
222
+ getParentDomain()
223
+ );
204
224
  };
205
225
  var sendMessage = (message) => {
206
226
  postMessageToParent(message);
@@ -223,6 +243,27 @@ var sendLoaded = () => {
223
243
  };
224
244
 
225
245
  var createSDKCallMessage = {
246
+ aiGenerator: (dots, args, messageId) => ({
247
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
248
+ dots,
249
+ args,
250
+ messageId,
251
+ apiType: "aiGenerator"
252
+ }),
253
+ mockup: (dots, args, messageId) => ({
254
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
255
+ dots,
256
+ args,
257
+ messageId,
258
+ apiType: "mockup"
259
+ }),
260
+ fileBrowser: (dots, args, messageId) => ({
261
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
262
+ dots,
263
+ args,
264
+ messageId,
265
+ apiType: "fileBrowser"
266
+ }),
226
267
  ai: (dots, args, messageId) => ({
227
268
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
228
269
  dots,
@@ -258,6 +299,13 @@ var createSDKCallMessage = {
258
299
  messageId,
259
300
  apiType: "font"
260
301
  }),
302
+ project: (dots, args, messageId) => ({
303
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
304
+ dots,
305
+ args,
306
+ messageId,
307
+ apiType: "project"
308
+ }),
261
309
  state: (dots, args, messageId) => ({
262
310
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
263
311
  dots,
@@ -278,6 +326,34 @@ var createSDKCallMessage = {
278
326
  args,
279
327
  messageId,
280
328
  apiType: "data"
329
+ }),
330
+ brandKit: (dots, args, messageId) => ({
331
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
332
+ dots,
333
+ args,
334
+ messageId,
335
+ apiType: "brandKit"
336
+ }),
337
+ openMicroEditor: (dots, args, messageId) => ({
338
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
339
+ dots,
340
+ args,
341
+ messageId,
342
+ apiType: "openMicroEditor"
343
+ }),
344
+ openMainEditor: (dots, args, messageId) => ({
345
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
346
+ dots,
347
+ args,
348
+ messageId,
349
+ apiType: "openMainEditor"
350
+ }),
351
+ agent: (dots, args, messageId) => ({
352
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
353
+ dots,
354
+ args,
355
+ messageId,
356
+ apiType: "agent"
281
357
  })
282
358
  };
283
359
  function createApiProxy(apiType) {
@@ -294,6 +370,64 @@ function createApiProxy(apiType) {
294
370
  });
295
371
  }
296
372
 
373
+ function createAIGeneratorBridgeApi() {
374
+ const callbacks = /* @__PURE__ */ new Map();
375
+ const proxy = createApiProxy("aiGenerator");
376
+ async function subscribe(request, callback) {
377
+ const subscriptionId = generateMessageId();
378
+ callbacks.set(subscriptionId, callback);
379
+ let response;
380
+ try {
381
+ response = await sendMessage({
382
+ command: "ai-generator-subscribe",
383
+ ...request,
384
+ subscriptionId,
385
+ messageId: generateMessageId()
386
+ });
387
+ } catch (error) {
388
+ callbacks.delete(subscriptionId);
389
+ throw error;
390
+ }
391
+ if (!response.isOk) {
392
+ callbacks.delete(subscriptionId);
393
+ throw new Error(response.error.message);
394
+ }
395
+ return () => {
396
+ callbacks.delete(subscriptionId);
397
+ postMessageToParent({
398
+ command: "ai-generator-unsubscribe",
399
+ subscriptionId
400
+ });
401
+ };
402
+ }
403
+ const methods = {
404
+ registerGenerator: (id, callback) => subscribe({ method: "registerGenerator", args: [id] }, (update) => {
405
+ if (update) callback(update);
406
+ }),
407
+ subscribeToGenerationUpdates: (ids, callback) => subscribe(
408
+ { method: "subscribeToGenerationUpdates", args: [ids] },
409
+ (update) => {
410
+ if (update) callback(update);
411
+ }
412
+ ),
413
+ subscribeToPendingGenerations: (callback) => subscribe(
414
+ { method: "subscribeToPendingGenerations", args: [] },
415
+ () => callback()
416
+ ),
417
+ /** Callers may reuse richer internal submission objects; never send their local abort callbacks. */
418
+ cancelGenerations: (submission) => proxy.cancelGenerations({
419
+ generationIds: submission.generationIds,
420
+ until: submission.until
421
+ })
422
+ };
423
+ return {
424
+ api: new Proxy(proxy, {
425
+ get: (target, property, receiver) => property in methods ? methods[property] : Reflect.get(target, property, receiver)
426
+ }),
427
+ dispatch: (message) => callbacks.get(message.subscriptionId)?.(message.update)
428
+ };
429
+ }
430
+
297
431
  var generationHandlers = /* @__PURE__ */ new Map();
298
432
  var generationSubscriptions = /* @__PURE__ */ new Map();
299
433
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -661,7 +795,7 @@ var SandboxedAuthClient = class {
661
795
  }
662
796
  };
663
797
 
664
- var createBatch = async () => {
798
+ var createBatchFor = async (apiType) => {
665
799
  const response = await sendMessage({
666
800
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
667
801
  messageId: generateMessageId()
@@ -670,14 +804,17 @@ var createBatch = async () => {
670
804
  throw response.error;
671
805
  }
672
806
  const { batchKey } = response.result;
673
- const sendDesignCall = (dots, args) => sendMessage({
674
- command: FROM_EXTENSION_COMMANDS.SDK_CALL,
675
- dots,
676
- args,
677
- messageId: generateMessageId(),
678
- apiType: "design",
679
- batchKey
680
- });
807
+ const sendDesignCall = (dots, args) => {
808
+ const message = {
809
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
810
+ dots: apiType === "project" ? ["design", "api", ...dots] : dots,
811
+ args,
812
+ messageId: generateMessageId(),
813
+ apiType,
814
+ batchKey
815
+ };
816
+ return sendMessage(message);
817
+ };
681
818
  const commit = async () => {
682
819
  const res = await sendMessage({
683
820
  command: FROM_EXTENSION_COMMANDS.BATCH_COMMIT,
@@ -704,6 +841,8 @@ var createBatch = async () => {
704
841
  };
705
842
  return buildNode([]);
706
843
  };
844
+ var createBatch = () => createBatchFor("design");
845
+ var createProjectBatch = () => createBatchFor("project");
707
846
 
708
847
  var createContextBridgeApi = () => {
709
848
  const contextProxy = createApiProxy("context");
@@ -871,6 +1010,7 @@ var designStateApi = createDesignStateBridgeApi();
871
1010
  var appStateApi = createAppStateBridgeApi();
872
1011
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
873
1012
  var authClient = new SandboxedAuthClient();
1013
+ var aiGeneratorBridge = createAIGeneratorBridgeApi();
874
1014
  var handleIncomingMessage = (event) => {
875
1015
  const parent = window.parent;
876
1016
  if (!parent || parent === window) {
@@ -893,6 +1033,10 @@ var handleIncomingMessage = (event) => {
893
1033
  statelessApi.dispatch(data.type, data.payload);
894
1034
  return;
895
1035
  }
1036
+ if (isAIGeneratorUpdateMessage(data)) {
1037
+ aiGeneratorBridge.dispatch(data);
1038
+ return;
1039
+ }
896
1040
  if (isAIGenerationUpdatePushMessage(data)) {
897
1041
  dispatchAIGenerationUpdate(data.subscriptionId, data.update);
898
1042
  return;
@@ -917,7 +1061,29 @@ var handleIncomingMessage = (event) => {
917
1061
  );
918
1062
  }
919
1063
  };
1064
+ var projectProxy = createApiProxy("project");
1065
+ var projectApi = {
1066
+ design: {
1067
+ state: {
1068
+ getState: projectProxy.design.state.getState,
1069
+ subscribe: designStateApi.subscribe
1070
+ },
1071
+ api: projectProxy.design.api,
1072
+ createBatch: createProjectBatch
1073
+ },
1074
+ app: {
1075
+ state: {
1076
+ getState: projectProxy.app.state.getState,
1077
+ subscribe: appStateApi.subscribe
1078
+ },
1079
+ api: projectProxy.app.api
1080
+ }
1081
+ };
920
1082
  var bridgeHandlers = {
1083
+ agent: createApiProxy("agent"),
1084
+ aiGenerator: aiGeneratorBridge.api,
1085
+ brandKit: createApiProxy("brandKit"),
1086
+ mockup: createApiProxy("mockup"),
921
1087
  ai: createAIApiProxy(),
922
1088
  context: contextApi,
923
1089
  data: createApiProxy("data"),
@@ -926,12 +1092,17 @@ var bridgeHandlers = {
926
1092
  appStore: appStateApi,
927
1093
  export: createApiProxy("export"),
928
1094
  font: createApiProxy("font"),
1095
+ project: projectApi,
929
1096
  state: createApiProxy("state"),
930
1097
  upload: createApiProxy("upload"),
931
- fileBrowser: createFileBrowserApiProxy(),
1098
+ fileBrowser: { getFiles: createApiProxy("fileBrowser").getFiles },
1099
+ fileBrowserRegistration: createFileBrowserApiProxy(),
1100
+ openMicroEditor: createApiProxy("openMicroEditor"),
1101
+ openMainEditor: createApiProxy("openMainEditor"),
932
1102
  auth: authClient,
933
1103
  stateless: statelessApi,
934
- createBatch
1104
+ createBatch,
1105
+ createProjectBatch
935
1106
  };
936
1107
 
937
1108
  // src/api/dragAndDrop/DragAndDropApi.ts
@@ -966,7 +1137,7 @@ var DragAndDropApi = class {
966
1137
  async dropImage(input) {
967
1138
  let objectId = null;
968
1139
  try {
969
- const offset = unwrapResult(await this.context.get()).dragAndDrop.offset;
1140
+ const offset = unwrapResult(await this.context.get()).iframeOffset;
970
1141
  const params = this.buildDropImageParams(input, offset);
971
1142
  objectId = await this.addDroppedImage(params);
972
1143
  if (input.persistImage) {
@@ -1197,29 +1368,31 @@ var DragAndDropApi = class {
1197
1368
 
1198
1369
  // src/createEditorSDKAPIs.ts
1199
1370
  function createEditorSDKAPIs() {
1371
+ const { project } = bridgeHandlers;
1372
+ const dragAndDrop = new DragAndDropApi({
1373
+ state: project.app.api,
1374
+ context: bridgeHandlers.context,
1375
+ design: project.design.api,
1376
+ upload: bridgeHandlers.upload
1377
+ });
1200
1378
  return {
1201
- ai: bridgeHandlers.ai,
1202
- data: bridgeHandlers.data,
1203
- design: bridgeHandlers.design,
1379
+ aiGenerator: bridgeHandlers.aiGenerator,
1380
+ mockup: bridgeHandlers.mockup,
1381
+ project,
1204
1382
  export: bridgeHandlers.export,
1205
- designStore: bridgeHandlers.designStore,
1206
- appStore: bridgeHandlers.appStore,
1207
- context: bridgeHandlers.context,
1208
- dragAndDrop: new DragAndDropApi({
1209
- state: bridgeHandlers.state,
1210
- context: bridgeHandlers.context,
1211
- design: bridgeHandlers.design,
1212
- upload: bridgeHandlers.upload
1213
- }),
1214
- state: bridgeHandlers.state,
1383
+ helpers: { dragAndDrop },
1384
+ dragAndDrop,
1215
1385
  auth: bridgeHandlers.auth,
1216
1386
  upload: bridgeHandlers.upload,
1217
1387
  stateless: bridgeHandlers.stateless,
1218
1388
  font: bridgeHandlers.font,
1219
- createBatch: bridgeHandlers.createBatch
1389
+ fileBrowser: bridgeHandlers.fileBrowser
1220
1390
  };
1221
1391
  }
1222
1392
 
1393
+ // package.json
1394
+ var version = "1.0.0";
1395
+
1223
1396
  // src/utils/syncHtmlDataThemeFromHostContext.ts
1224
1397
  async function syncHtmlDataThemeFromHostContext(kittl2) {
1225
1398
  if (typeof document === "undefined") {
@@ -1260,12 +1433,17 @@ function createKittlSDK(apis) {
1260
1433
  handleIncomingMessage(event);
1261
1434
  }
1262
1435
  );
1263
- void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1436
+ const { context } = apis;
1437
+ const themeSynced = context?.get && context.subscribe ? syncHtmlDataThemeFromHostContext({
1438
+ context
1439
+ }) : Promise.resolve();
1440
+ void themeSynced.catch(() => void 0).then(() => {
1264
1441
  kittl2.onLoadedCallback?.();
1265
1442
  sendLoaded();
1266
1443
  });
1267
1444
  };
1268
1445
  if (typeof document !== "undefined" && typeof window !== "undefined") {
1446
+ setSDKVersion(version);
1269
1447
  window.kittl = kittl2;
1270
1448
  if (document.readyState === "loading") {
1271
1449
  document.addEventListener("DOMContentLoaded", initSdk);
@@ -1277,7 +1455,11 @@ function createKittlSDK(apis) {
1277
1455
  }
1278
1456
 
1279
1457
  // src/editorScriptRunner.ts
1280
- var kittl = createKittlSDK(createEditorSDKAPIs());
1458
+ var kittl = createKittlSDK({
1459
+ ...createEditorSDKAPIs(),
1460
+ // nothing is contextually relevant to a hidden script runner yet
1461
+ context: {}
1462
+ });
1281
1463
  export {
1282
1464
  kittl,
1283
1465
  unwrapResult