@topolo/sdk 0.4.0 → 0.4.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.
package/dist/index.cjs CHANGED
@@ -114,6 +114,7 @@ var TopoloHttpError = class extends TopoloSdkError {
114
114
  var SERVICES = {
115
115
  agent: "https://agent-api.topolo.app",
116
116
  auth: "https://auth.topolo.app",
117
+ backup: "https://backup.topolo.app",
117
118
  books: "https://books.topolo.app",
118
119
  bugfix: "https://bugfix.topolo.app",
119
120
  bytes: "https://bytes-api.topolo.app",
@@ -124,7 +125,6 @@ var SERVICES = {
124
125
  compose: "https://compose.topolo.app",
125
126
  consent: "https://consent.topolo.app",
126
127
  crm: "https://crm-api.topolo.app",
127
- customer_success: "https://success.topolo.app",
128
128
  developers: "https://developers.topolo.app",
129
129
  director: "https://director.topolo.app",
130
130
  feed: "https://feed-api.topolo.app",
@@ -138,9 +138,10 @@ var SERVICES = {
138
138
  localize: "https://localize.topolo.app",
139
139
  mail: "https://mail.topolo.app",
140
140
  mdm: "https://mdm-api.topolo.app",
141
- messaging: "https://messages.topolo.app",
141
+ messages: "https://messages.topolo.app",
142
142
  nexus: "https://nexus-api.topolo.app",
143
143
  notify: "https://notify.topolo.app",
144
+ observability_watch: "https://observability-watch.topolo.app",
144
145
  one: "https://one.topolo.app",
145
146
  p2p: "https://p2p.topolo.app",
146
147
  pay: "https://pay.topolo.app",
@@ -154,6 +155,7 @@ var SERVICES = {
154
155
  socialize: "https://socialize-api.topolo.app",
155
156
  spaces: "https://spaces.topolo.app",
156
157
  status: "https://status.topolo.app",
158
+ success: "https://success.topolo.app",
157
159
  support: "https://support.topolo.app",
158
160
  survey: "https://survey.topolo.app",
159
161
  voice: "https://voice.topolo.app",
@@ -172,13 +174,21 @@ var APPLICATIONS = {
172
174
  "deployTargets": [
173
175
  {
174
176
  "name": "topolo-admin",
175
- "kind": "pages",
176
- "apiUrl": null,
177
+ "kind": "worker",
178
+ "apiUrl": "https://admin.topolo.app",
177
179
  "domains": [
178
180
  "admin.topolo.app"
179
181
  ],
180
182
  "routes": [],
181
183
  "serviceId": null
184
+ },
185
+ {
186
+ "name": "topolo-admin-api",
187
+ "kind": "worker",
188
+ "apiUrl": null,
189
+ "domains": [],
190
+ "routes": [],
191
+ "serviceId": null
182
192
  }
183
193
  ]
184
194
  },
@@ -195,7 +205,7 @@ var APPLICATIONS = {
195
205
  {
196
206
  "name": "topolo-agent",
197
207
  "kind": "worker",
198
- "apiUrl": null,
208
+ "apiUrl": "https://agent.topolo.app",
199
209
  "domains": [
200
210
  "agent.topolo.app"
201
211
  ],
@@ -203,7 +213,7 @@ var APPLICATIONS = {
203
213
  "serviceId": null
204
214
  },
205
215
  {
206
- "name": "topolo-agent-worker",
216
+ "name": "topolo-agent-api",
207
217
  "kind": "worker",
208
218
  "apiUrl": "https://agent-api.topolo.app",
209
219
  "domains": [
@@ -243,16 +253,20 @@ var APPLICATIONS = {
243
253
  "appDir": "TopoloBackup",
244
254
  "name": "topolo-backup",
245
255
  "packageName": "topolo-backup",
246
- "productionUrl": null,
247
- "services": [],
256
+ "productionUrl": "https://backup.topolo.app",
257
+ "services": [
258
+ "backup"
259
+ ],
248
260
  "deployTargets": [
249
261
  {
250
262
  "name": "topolo-backup",
251
263
  "kind": "worker",
252
- "apiUrl": null,
253
- "domains": [],
264
+ "apiUrl": "https://backup.topolo.app",
265
+ "domains": [
266
+ "backup.topolo.app"
267
+ ],
254
268
  "routes": [],
255
- "serviceId": null
269
+ "serviceId": "backup"
256
270
  }
257
271
  ]
258
272
  },
@@ -273,10 +287,16 @@ var APPLICATIONS = {
273
287
  "domains": [
274
288
  "books.topolo.app"
275
289
  ],
276
- "routes": [
277
- "books.topolo.app"
278
- ],
290
+ "routes": [],
279
291
  "serviceId": "books"
292
+ },
293
+ {
294
+ "name": "topolo-books-api",
295
+ "kind": "worker",
296
+ "apiUrl": null,
297
+ "domains": [],
298
+ "routes": [],
299
+ "serviceId": null
280
300
  }
281
301
  ]
282
302
  },
@@ -297,9 +317,7 @@ var APPLICATIONS = {
297
317
  "domains": [
298
318
  "bugfix.topolo.app"
299
319
  ],
300
- "routes": [
301
- "bugfix.topolo.app"
302
- ],
320
+ "routes": [],
303
321
  "serviceId": "bugfix"
304
322
  }
305
323
  ]
@@ -316,8 +334,8 @@ var APPLICATIONS = {
316
334
  "deployTargets": [
317
335
  {
318
336
  "name": "topolo-bytes",
319
- "kind": "pages",
320
- "apiUrl": null,
337
+ "kind": "worker",
338
+ "apiUrl": "https://bytes.topolo.app",
321
339
  "domains": [
322
340
  "bytes.topolo.app"
323
341
  ],
@@ -353,10 +371,16 @@ var APPLICATIONS = {
353
371
  "domains": [
354
372
  "calendar.topolo.app"
355
373
  ],
356
- "routes": [
357
- "calendar.topolo.app"
358
- ],
374
+ "routes": [],
359
375
  "serviceId": "calendar"
376
+ },
377
+ {
378
+ "name": "topolo-calendar-api",
379
+ "kind": "worker",
380
+ "apiUrl": null,
381
+ "domains": [],
382
+ "routes": [],
383
+ "serviceId": null
360
384
  }
361
385
  ]
362
386
  },
@@ -399,22 +423,19 @@ var APPLICATIONS = {
399
423
  "domains": [
400
424
  "chat.topolo.app"
401
425
  ],
402
- "routes": [
403
- "chat.topolo.app"
404
- ],
426
+ "routes": [],
405
427
  "serviceId": "chat"
428
+ },
429
+ {
430
+ "name": "topolo-chat-api",
431
+ "kind": "worker",
432
+ "apiUrl": null,
433
+ "domains": [],
434
+ "routes": [],
435
+ "serviceId": null
406
436
  }
407
437
  ]
408
438
  },
409
- "cloudcontrol": {
410
- "id": "cloudcontrol",
411
- "appDir": "TopoloCloudControl",
412
- "name": "cloudcontrol",
413
- "packageName": "topolo-cloudcontrol",
414
- "productionUrl": null,
415
- "services": [],
416
- "deployTargets": []
417
- },
418
439
  "commerce": {
419
440
  "id": "commerce",
420
441
  "appDir": "TopoloCommerce",
@@ -437,8 +458,8 @@ var APPLICATIONS = {
437
458
  },
438
459
  {
439
460
  "name": "topolo-commerce-guest-web",
440
- "kind": "pages",
441
- "apiUrl": null,
461
+ "kind": "worker",
462
+ "apiUrl": "https://guest.topolo.app",
442
463
  "domains": [
443
464
  "guest.topolo.app"
444
465
  ],
@@ -447,8 +468,8 @@ var APPLICATIONS = {
447
468
  },
448
469
  {
449
470
  "name": "topolo-commerce-ops-web",
450
- "kind": "pages",
451
- "apiUrl": null,
471
+ "kind": "worker",
472
+ "apiUrl": "https://commerce.topolo.app",
452
473
  "domains": [
453
474
  "commerce.topolo.app"
454
475
  ],
@@ -457,8 +478,8 @@ var APPLICATIONS = {
457
478
  },
458
479
  {
459
480
  "name": "topolo-commerce-station-web",
460
- "kind": "pages",
461
- "apiUrl": null,
481
+ "kind": "worker",
482
+ "apiUrl": "https://station-commerce.topolo.app",
462
483
  "domains": [
463
484
  "station-commerce.topolo.app"
464
485
  ],
@@ -484,10 +505,16 @@ var APPLICATIONS = {
484
505
  "domains": [
485
506
  "compose.topolo.app"
486
507
  ],
487
- "routes": [
488
- "compose.topolo.app"
489
- ],
508
+ "routes": [],
490
509
  "serviceId": "compose"
510
+ },
511
+ {
512
+ "name": "topolo-compose-api",
513
+ "kind": "worker",
514
+ "apiUrl": null,
515
+ "domains": [],
516
+ "routes": [],
517
+ "serviceId": null
491
518
  }
492
519
  ]
493
520
  },
@@ -508,10 +535,16 @@ var APPLICATIONS = {
508
535
  "domains": [
509
536
  "consent.topolo.app"
510
537
  ],
511
- "routes": [
512
- "consent.topolo.app"
513
- ],
538
+ "routes": [],
514
539
  "serviceId": "consent"
540
+ },
541
+ {
542
+ "name": "topolo-consent-api",
543
+ "kind": "worker",
544
+ "apiUrl": null,
545
+ "domains": [],
546
+ "routes": [],
547
+ "serviceId": null
515
548
  }
516
549
  ]
517
550
  },
@@ -538,7 +571,7 @@ var APPLICATIONS = {
538
571
  {
539
572
  "name": "topolo-crm-app",
540
573
  "kind": "worker",
541
- "apiUrl": null,
574
+ "apiUrl": "https://crm.topolo.app",
542
575
  "domains": [
543
576
  "crm.topolo.app"
544
577
  ],
@@ -547,30 +580,6 @@ var APPLICATIONS = {
547
580
  }
548
581
  ]
549
582
  },
550
- "customer_success": {
551
- "id": "customer_success",
552
- "appDir": "TopoloSuccess",
553
- "name": "topolo-success",
554
- "packageName": "topolo-success",
555
- "productionUrl": "https://success.topolo.app",
556
- "services": [
557
- "customer_success"
558
- ],
559
- "deployTargets": [
560
- {
561
- "name": "topolo-success",
562
- "kind": "worker",
563
- "apiUrl": "https://success.topolo.app",
564
- "domains": [
565
- "success.topolo.app"
566
- ],
567
- "routes": [
568
- "success.topolo.app"
569
- ],
570
- "serviceId": "customer_success"
571
- }
572
- ]
573
- },
574
583
  "developers": {
575
584
  "id": "developers",
576
585
  "appDir": "TopoloDevelopers",
@@ -598,6 +607,14 @@ var APPLICATIONS = {
598
607
  ],
599
608
  "routes": [],
600
609
  "serviceId": "developers"
610
+ },
611
+ {
612
+ "name": "topolo-developers-api",
613
+ "kind": "worker",
614
+ "apiUrl": null,
615
+ "domains": [],
616
+ "routes": [],
617
+ "serviceId": null
601
618
  }
602
619
  ]
603
620
  },
@@ -618,10 +635,16 @@ var APPLICATIONS = {
618
635
  "domains": [
619
636
  "director.topolo.app"
620
637
  ],
621
- "routes": [
622
- "director.topolo.app"
623
- ],
638
+ "routes": [],
624
639
  "serviceId": "director"
640
+ },
641
+ {
642
+ "name": "topolo-director-api",
643
+ "kind": "worker",
644
+ "apiUrl": null,
645
+ "domains": [],
646
+ "routes": [],
647
+ "serviceId": null
625
648
  }
626
649
  ]
627
650
  },
@@ -635,13 +658,21 @@ var APPLICATIONS = {
635
658
  "deployTargets": [
636
659
  {
637
660
  "name": "topolo-docs",
638
- "kind": "pages",
639
- "apiUrl": null,
661
+ "kind": "worker",
662
+ "apiUrl": "https://docs.topolo.app",
640
663
  "domains": [
641
664
  "docs.topolo.app"
642
665
  ],
643
666
  "routes": [],
644
667
  "serviceId": null
668
+ },
669
+ {
670
+ "name": "topolo-docs-api",
671
+ "kind": "worker",
672
+ "apiUrl": null,
673
+ "domains": [],
674
+ "routes": [],
675
+ "serviceId": null
645
676
  }
646
677
  ]
647
678
  },
@@ -650,7 +681,7 @@ var APPLICATIONS = {
650
681
  "appDir": "TopoloFeed",
651
682
  "name": "TopoloFeed",
652
683
  "packageName": "topolo-feed",
653
- "productionUrl": "https://feed-api.topolo.app",
684
+ "productionUrl": "https://feed.topolo.app",
654
685
  "services": [
655
686
  "feed"
656
687
  ],
@@ -662,9 +693,7 @@ var APPLICATIONS = {
662
693
  "domains": [
663
694
  "feed-analytics-api.topolo.app"
664
695
  ],
665
- "routes": [
666
- "feed-analytics-api.topolo.app"
667
- ],
696
+ "routes": [],
668
697
  "serviceId": null
669
698
  },
670
699
  {
@@ -674,10 +703,18 @@ var APPLICATIONS = {
674
703
  "domains": [
675
704
  "feed-api.topolo.app"
676
705
  ],
677
- "routes": [
678
- "feed-api.topolo.app"
679
- ],
706
+ "routes": [],
680
707
  "serviceId": "feed"
708
+ },
709
+ {
710
+ "name": "topolo-feed-web",
711
+ "kind": "worker",
712
+ "apiUrl": "https://feed.topolo.app",
713
+ "domains": [
714
+ "feed.topolo.app"
715
+ ],
716
+ "routes": [],
717
+ "serviceId": null
681
718
  }
682
719
  ]
683
720
  },
@@ -698,17 +735,23 @@ var APPLICATIONS = {
698
735
  "domains": [
699
736
  "flow.topolo.app"
700
737
  ],
701
- "routes": [
702
- "flow.topolo.app"
703
- ],
738
+ "routes": [],
704
739
  "serviceId": "flow"
740
+ },
741
+ {
742
+ "name": "topolo-flow-api",
743
+ "kind": "worker",
744
+ "apiUrl": null,
745
+ "domains": [],
746
+ "routes": [],
747
+ "serviceId": null
705
748
  }
706
749
  ]
707
750
  },
708
751
  "forecast": {
709
752
  "id": "forecast",
710
753
  "appDir": "TopoloForecast",
711
- "name": "forecast-cloud",
754
+ "name": "topolo-forecast",
712
755
  "packageName": "topolo-forecast",
713
756
  "productionUrl": "https://forecast.topolo.app",
714
757
  "services": [
@@ -718,7 +761,7 @@ var APPLICATIONS = {
718
761
  {
719
762
  "name": "topolo-forecast",
720
763
  "kind": "worker",
721
- "apiUrl": null,
764
+ "apiUrl": "https://forecast.topolo.app",
722
765
  "domains": [
723
766
  "forecast.topolo.app"
724
767
  ],
@@ -754,10 +797,16 @@ var APPLICATIONS = {
754
797
  "domains": [
755
798
  "forms.topolo.app"
756
799
  ],
757
- "routes": [
758
- "forms.topolo.app"
759
- ],
800
+ "routes": [],
760
801
  "serviceId": "forms"
802
+ },
803
+ {
804
+ "name": "topolo-forms-api",
805
+ "kind": "worker",
806
+ "apiUrl": null,
807
+ "domains": [],
808
+ "routes": [],
809
+ "serviceId": null
761
810
  }
762
811
  ]
763
812
  },
@@ -778,10 +827,16 @@ var APPLICATIONS = {
778
827
  "domains": [
779
828
  "home.topolo.app"
780
829
  ],
781
- "routes": [
782
- "home.topolo.app"
783
- ],
830
+ "routes": [],
784
831
  "serviceId": "home"
832
+ },
833
+ {
834
+ "name": "topolo-home-api",
835
+ "kind": "worker",
836
+ "apiUrl": null,
837
+ "domains": [],
838
+ "routes": [],
839
+ "serviceId": null
785
840
  }
786
841
  ]
787
842
  },
@@ -802,10 +857,16 @@ var APPLICATIONS = {
802
857
  "domains": [
803
858
  "insights.topolo.app"
804
859
  ],
805
- "routes": [
806
- "insights.topolo.app"
807
- ],
860
+ "routes": [],
808
861
  "serviceId": "insights"
862
+ },
863
+ {
864
+ "name": "topolo-insights-api",
865
+ "kind": "worker",
866
+ "apiUrl": null,
867
+ "domains": [],
868
+ "routes": [],
869
+ "serviceId": null
809
870
  }
810
871
  ]
811
872
  },
@@ -826,10 +887,16 @@ var APPLICATIONS = {
826
887
  "domains": [
827
888
  "inventory.topolo.app"
828
889
  ],
829
- "routes": [
830
- "inventory.topolo.app"
831
- ],
890
+ "routes": [],
832
891
  "serviceId": "inventory"
892
+ },
893
+ {
894
+ "name": "topolo-inventory-api",
895
+ "kind": "worker",
896
+ "apiUrl": null,
897
+ "domains": [],
898
+ "routes": [],
899
+ "serviceId": null
833
900
  }
834
901
  ]
835
902
  },
@@ -846,7 +913,7 @@ var APPLICATIONS = {
846
913
  {
847
914
  "name": "topolo-learn",
848
915
  "kind": "worker",
849
- "apiUrl": null,
916
+ "apiUrl": "https://learn.topolo.app",
850
917
  "domains": [
851
918
  "learn.topolo.app"
852
919
  ],
@@ -906,10 +973,16 @@ var APPLICATIONS = {
906
973
  "domains": [
907
974
  "mail.topolo.app"
908
975
  ],
909
- "routes": [
910
- "mail.topolo.app"
911
- ],
976
+ "routes": [],
912
977
  "serviceId": "mail"
978
+ },
979
+ {
980
+ "name": "topolo-mail-api",
981
+ "kind": "worker",
982
+ "apiUrl": null,
983
+ "domains": [],
984
+ "routes": [],
985
+ "serviceId": null
913
986
  }
914
987
  ]
915
988
  },
@@ -930,47 +1003,51 @@ var APPLICATIONS = {
930
1003
  "domains": [
931
1004
  "mdm-api.topolo.app"
932
1005
  ],
933
- "routes": [
934
- "mdm-api.topolo.app"
935
- ],
1006
+ "routes": [],
936
1007
  "serviceId": "mdm"
937
1008
  },
938
1009
  {
939
1010
  "name": "topolo-mdm-console",
940
1011
  "kind": "worker",
941
- "apiUrl": null,
1012
+ "apiUrl": "https://mdm.topolo.app",
942
1013
  "domains": [
943
1014
  "mdm.topolo.app"
944
1015
  ],
945
- "routes": [
946
- "mdm.topolo.app"
947
- ],
1016
+ "routes": [],
948
1017
  "serviceId": null
949
1018
  }
950
1019
  ]
951
1020
  },
952
- "messaging": {
953
- "id": "messaging",
954
- "appDir": "TopoloMessaging",
955
- "name": "topolo-messaging",
956
- "packageName": "topolo-messaging",
1021
+ "messages": {
1022
+ "id": "messages",
1023
+ "appDir": "TopoloMessages",
1024
+ "name": "topolo-messages",
1025
+ "packageName": "topolo-messages",
957
1026
  "productionUrl": "https://messages.topolo.app",
958
1027
  "services": [
959
- "messaging"
1028
+ "messages"
960
1029
  ],
961
1030
  "deployTargets": [
962
1031
  {
963
- "name": "topolo-messaging",
1032
+ "name": "topolo-messages",
964
1033
  "kind": "worker",
965
1034
  "apiUrl": "https://messages.topolo.app",
966
1035
  "domains": [
967
1036
  "messages.topolo.app"
968
1037
  ],
969
1038
  "routes": [],
970
- "serviceId": "messaging"
1039
+ "serviceId": "messages"
1040
+ },
1041
+ {
1042
+ "name": "topolo-messages-api",
1043
+ "kind": "worker",
1044
+ "apiUrl": null,
1045
+ "domains": [],
1046
+ "routes": [],
1047
+ "serviceId": null
971
1048
  },
972
1049
  {
973
- "name": "topolo-messaging-dispatch",
1050
+ "name": "topolo-messages-dispatch",
974
1051
  "kind": "worker",
975
1052
  "apiUrl": null,
976
1053
  "domains": [],
@@ -1040,9 +1117,22 @@ var APPLICATIONS = {
1040
1117
  "appDir": "TopoloObservabilityWatch",
1041
1118
  "name": "topolo-observability-watch",
1042
1119
  "packageName": "topolo-observability-watch",
1043
- "productionUrl": null,
1044
- "services": [],
1045
- "deployTargets": []
1120
+ "productionUrl": "https://observability-watch.topolo.app",
1121
+ "services": [
1122
+ "observability_watch"
1123
+ ],
1124
+ "deployTargets": [
1125
+ {
1126
+ "name": "topolo-observability-watch",
1127
+ "kind": "worker",
1128
+ "apiUrl": "https://observability-watch.topolo.app",
1129
+ "domains": [
1130
+ "observability-watch.topolo.app"
1131
+ ],
1132
+ "routes": [],
1133
+ "serviceId": "observability_watch"
1134
+ }
1135
+ ]
1046
1136
  },
1047
1137
  "one": {
1048
1138
  "id": "one",
@@ -1056,40 +1146,37 @@ var APPLICATIONS = {
1056
1146
  "deployTargets": [
1057
1147
  {
1058
1148
  "name": "topolo-one",
1059
- "kind": "pages",
1060
- "apiUrl": null,
1061
- "domains": [
1062
- "one.topolo.app"
1063
- ],
1064
- "routes": [],
1065
- "serviceId": null
1066
- },
1067
- {
1068
- "name": "topolo-one-website",
1069
1149
  "kind": "worker",
1070
1150
  "apiUrl": null,
1071
- "domains": [
1072
- "topolo.io",
1073
- "www.topolo.io"
1074
- ],
1151
+ "domains": [],
1075
1152
  "routes": [],
1076
1153
  "serviceId": null
1077
1154
  },
1078
1155
  {
1079
- "name": "topolo-one-worker",
1156
+ "name": "topolo-one-api",
1080
1157
  "kind": "worker",
1081
1158
  "apiUrl": "https://one.topolo.app",
1082
1159
  "domains": [
1083
- "one.topolo.app",
1084
- "topolo.app",
1085
- "www.topolo.app"
1160
+ "one.topolo.app"
1086
1161
  ],
1087
1162
  "routes": [
1088
1163
  "one.topolo.app/*",
1089
- "topolo.app",
1090
1164
  "www.topolo.app/*"
1091
1165
  ],
1092
1166
  "serviceId": "one"
1167
+ },
1168
+ {
1169
+ "name": "topolo-one-website",
1170
+ "kind": "worker",
1171
+ "apiUrl": "https://topolo.io",
1172
+ "domains": [
1173
+ "topolo.io"
1174
+ ],
1175
+ "routes": [
1176
+ "topolo.io",
1177
+ "www.topolo.io"
1178
+ ],
1179
+ "serviceId": null
1093
1180
  }
1094
1181
  ]
1095
1182
  },
@@ -1110,10 +1197,16 @@ var APPLICATIONS = {
1110
1197
  "domains": [
1111
1198
  "p2p.topolo.app"
1112
1199
  ],
1113
- "routes": [
1114
- "p2p.topolo.app"
1115
- ],
1200
+ "routes": [],
1116
1201
  "serviceId": "p2p"
1202
+ },
1203
+ {
1204
+ "name": "topolo-p2p-api",
1205
+ "kind": "worker",
1206
+ "apiUrl": null,
1207
+ "domains": [],
1208
+ "routes": [],
1209
+ "serviceId": null
1117
1210
  }
1118
1211
  ]
1119
1212
  },
@@ -1136,6 +1229,14 @@ var APPLICATIONS = {
1136
1229
  ],
1137
1230
  "routes": [],
1138
1231
  "serviceId": "pay"
1232
+ },
1233
+ {
1234
+ "name": "topolo-pay-api",
1235
+ "kind": "worker",
1236
+ "apiUrl": null,
1237
+ "domains": [],
1238
+ "routes": [],
1239
+ "serviceId": null
1139
1240
  }
1140
1241
  ]
1141
1242
  },
@@ -1156,10 +1257,16 @@ var APPLICATIONS = {
1156
1257
  "domains": [
1157
1258
  "people.topolo.app"
1158
1259
  ],
1159
- "routes": [
1160
- "people.topolo.app"
1161
- ],
1260
+ "routes": [],
1162
1261
  "serviceId": "people"
1262
+ },
1263
+ {
1264
+ "name": "topolo-people-api",
1265
+ "kind": "worker",
1266
+ "apiUrl": null,
1267
+ "domains": [],
1268
+ "routes": [],
1269
+ "serviceId": null
1163
1270
  }
1164
1271
  ]
1165
1272
  },
@@ -1180,10 +1287,16 @@ var APPLICATIONS = {
1180
1287
  "domains": [
1181
1288
  "pulse.topolo.app"
1182
1289
  ],
1183
- "routes": [
1184
- "pulse.topolo.app"
1185
- ],
1290
+ "routes": [],
1186
1291
  "serviceId": "pulse"
1292
+ },
1293
+ {
1294
+ "name": "topolo-pulse-api",
1295
+ "kind": "worker",
1296
+ "apiUrl": null,
1297
+ "domains": [],
1298
+ "routes": [],
1299
+ "serviceId": null
1187
1300
  }
1188
1301
  ]
1189
1302
  },
@@ -1205,7 +1318,9 @@ var APPLICATIONS = {
1205
1318
  "domains": [
1206
1319
  "api.ol0.me"
1207
1320
  ],
1208
- "routes": [],
1321
+ "routes": [
1322
+ "api.ol0.me/*"
1323
+ ],
1209
1324
  "serviceId": "quro.api"
1210
1325
  },
1211
1326
  {
@@ -1223,7 +1338,7 @@ var APPLICATIONS = {
1223
1338
  {
1224
1339
  "name": "quro-ui",
1225
1340
  "kind": "worker",
1226
- "apiUrl": null,
1341
+ "apiUrl": "https://quro.topolo.app",
1227
1342
  "domains": [
1228
1343
  "quro.topolo.app"
1229
1344
  ],
@@ -1245,7 +1360,7 @@ var APPLICATIONS = {
1245
1360
  {
1246
1361
  "name": "topolo-roadmapper",
1247
1362
  "kind": "worker",
1248
- "apiUrl": null,
1363
+ "apiUrl": "https://roadmapper.topolo.app",
1249
1364
  "domains": [
1250
1365
  "roadmapper.topolo.app"
1251
1366
  ],
@@ -1281,10 +1396,16 @@ var APPLICATIONS = {
1281
1396
  "domains": [
1282
1397
  "sign.topolo.app"
1283
1398
  ],
1284
- "routes": [
1285
- "sign.topolo.app"
1286
- ],
1399
+ "routes": [],
1287
1400
  "serviceId": "sign"
1401
+ },
1402
+ {
1403
+ "name": "topolo-sign-api",
1404
+ "kind": "worker",
1405
+ "apiUrl": null,
1406
+ "domains": [],
1407
+ "routes": [],
1408
+ "serviceId": null
1288
1409
  }
1289
1410
  ]
1290
1411
  },
@@ -1301,7 +1422,7 @@ var APPLICATIONS = {
1301
1422
  {
1302
1423
  "name": "topolo-social-studio",
1303
1424
  "kind": "worker",
1304
- "apiUrl": null,
1425
+ "apiUrl": "https://studio.topolo.app",
1305
1426
  "domains": [
1306
1427
  "studio.topolo.app"
1307
1428
  ],
@@ -1340,8 +1461,8 @@ var APPLICATIONS = {
1340
1461
  "deployTargets": [
1341
1462
  {
1342
1463
  "name": "topolo-socialize",
1343
- "kind": "pages",
1344
- "apiUrl": null,
1464
+ "kind": "worker",
1465
+ "apiUrl": "https://socialize.topolo.app",
1345
1466
  "domains": [
1346
1467
  "socialize.topolo.app"
1347
1468
  ],
@@ -1385,10 +1506,16 @@ var APPLICATIONS = {
1385
1506
  "domains": [
1386
1507
  "spaces.topolo.app"
1387
1508
  ],
1388
- "routes": [
1389
- "spaces.topolo.app"
1390
- ],
1509
+ "routes": [],
1391
1510
  "serviceId": "spaces"
1511
+ },
1512
+ {
1513
+ "name": "topolo-spaces-api",
1514
+ "kind": "worker",
1515
+ "apiUrl": null,
1516
+ "domains": [],
1517
+ "routes": [],
1518
+ "serviceId": null
1392
1519
  }
1393
1520
  ]
1394
1521
  },
@@ -1409,10 +1536,40 @@ var APPLICATIONS = {
1409
1536
  "domains": [
1410
1537
  "status.topolo.app"
1411
1538
  ],
1539
+ "routes": [],
1540
+ "serviceId": "status"
1541
+ }
1542
+ ]
1543
+ },
1544
+ "success": {
1545
+ "id": "success",
1546
+ "appDir": "TopoloSuccess",
1547
+ "name": "topolo-success",
1548
+ "packageName": "topolo-success",
1549
+ "productionUrl": "https://success.topolo.app",
1550
+ "services": [
1551
+ "success"
1552
+ ],
1553
+ "deployTargets": [
1554
+ {
1555
+ "name": "topolo-success",
1556
+ "kind": "worker",
1557
+ "apiUrl": "https://success.topolo.app",
1558
+ "domains": [
1559
+ "success.topolo.app"
1560
+ ],
1412
1561
  "routes": [
1413
- "status.topolo.app"
1562
+ "success.topolo.app"
1414
1563
  ],
1415
- "serviceId": "status"
1564
+ "serviceId": "success"
1565
+ },
1566
+ {
1567
+ "name": "topolo-success-api",
1568
+ "kind": "worker",
1569
+ "apiUrl": null,
1570
+ "domains": [],
1571
+ "routes": [],
1572
+ "serviceId": null
1416
1573
  }
1417
1574
  ]
1418
1575
  },
@@ -1437,6 +1594,14 @@ var APPLICATIONS = {
1437
1594
  "support.topolo.app/*"
1438
1595
  ],
1439
1596
  "serviceId": "support"
1597
+ },
1598
+ {
1599
+ "name": "topolo-support-api",
1600
+ "kind": "worker",
1601
+ "apiUrl": null,
1602
+ "domains": [],
1603
+ "routes": [],
1604
+ "serviceId": null
1440
1605
  }
1441
1606
  ]
1442
1607
  },
@@ -1457,10 +1622,16 @@ var APPLICATIONS = {
1457
1622
  "domains": [
1458
1623
  "survey.topolo.app"
1459
1624
  ],
1460
- "routes": [
1461
- "survey.topolo.app"
1462
- ],
1625
+ "routes": [],
1463
1626
  "serviceId": "survey"
1627
+ },
1628
+ {
1629
+ "name": "topolo-survey-api",
1630
+ "kind": "worker",
1631
+ "apiUrl": null,
1632
+ "domains": [],
1633
+ "routes": [],
1634
+ "serviceId": null
1464
1635
  }
1465
1636
  ]
1466
1637
  },
@@ -1481,10 +1652,16 @@ var APPLICATIONS = {
1481
1652
  "domains": [
1482
1653
  "voice.topolo.app"
1483
1654
  ],
1484
- "routes": [
1485
- "voice.topolo.app"
1486
- ],
1655
+ "routes": [],
1487
1656
  "serviceId": "voice"
1657
+ },
1658
+ {
1659
+ "name": "topolo-voice-api",
1660
+ "kind": "worker",
1661
+ "apiUrl": null,
1662
+ "domains": [],
1663
+ "routes": [],
1664
+ "serviceId": null
1488
1665
  }
1489
1666
  ]
1490
1667
  },
@@ -1515,13 +1692,16 @@ var APPLICATIONS = {
1515
1692
  "domains": [
1516
1693
  "sites.topolo.app"
1517
1694
  ],
1518
- "routes": [],
1695
+ "routes": [
1696
+ "*.sites.topolo.app/*",
1697
+ "sites.topolo.app"
1698
+ ],
1519
1699
  "serviceId": null
1520
1700
  },
1521
1701
  {
1522
1702
  "name": "topolo-web-studio",
1523
1703
  "kind": "worker",
1524
- "apiUrl": null,
1704
+ "apiUrl": "https://web.topolo.app",
1525
1705
  "domains": [
1526
1706
  "web.topolo.app"
1527
1707
  ],
@@ -1611,11 +1791,13 @@ var APPLICATION_REQUIREMENTS = [
1611
1791
  evidence: [
1612
1792
  "Auth service catalog contains the service ID and slug",
1613
1793
  "Permissions, role bundles, and API-key scopes exist for the service",
1614
- "SDK, CLI, and MCP service discovery include the callable production API"
1794
+ "SDK, CLI, and MCP service discovery include the callable production API",
1795
+ "CloudControl production HTTP targets classify agent reachability with sdk_service_id or agent_callable:false"
1615
1796
  ],
1616
1797
  implementation: [
1617
- "Add production Worker api_url metadata before adding an SDK service ID",
1618
- "Expose stable service IDs through DEFAULT_SERVICE_URLS",
1798
+ "Add production Worker api_url metadata and sdk_service_id for every agent-callable API target",
1799
+ "Mark browser, documentation, and runtime-only Worker targets with agent_callable:false",
1800
+ "Expose stable service IDs through generated DEFAULT_SERVICE_URLS and live catalog discovery",
1619
1801
  "Keep typed SDK/CLI/MCP surfaces in sync when an API contract stabilizes"
1620
1802
  ]
1621
1803
  },
@@ -1719,8 +1901,10 @@ var APPLICATION_REQUIREMENTS = [
1719
1901
  function applicationRequirementScopes(application) {
1720
1902
  const scopes = /* @__PURE__ */ new Set(["all"]);
1721
1903
  const appId = application.id;
1722
- const hasBrowserSurface = Boolean(application.productionUrl) || application.deployTargets.some((target) => target.kind === "pages");
1723
- const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.apiUrl));
1904
+ const hasBrowserSurface = Boolean(application.productionUrl) || // String() keeps this guard valid after the Pages->Worker migration narrowed
1905
+ // the generated kind union to "worker" (no "pages" literal remains).
1906
+ application.deployTargets.some((target) => String(target.kind) === "pages");
1907
+ const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.serviceId));
1724
1908
  if (hasBrowserSurface) scopes.add("browser");
1725
1909
  if (hasApiSurface) scopes.add("api");
1726
1910
  if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
@@ -1837,7 +2021,7 @@ function evaluateRequirement(application, requirement) {
1837
2021
  evidence
1838
2022
  );
1839
2023
  case "cloudflare-deployment-contract": {
1840
- if (application.deployTargets.length === 0) {
2024
+ if (application.deployTargets.length < 1) {
1841
2025
  return finding(requirement, "missing", "No CloudControl deploy targets are registered.", evidence);
1842
2026
  }
1843
2027
  evidence.push(`deployTargets=${application.deployTargets.length}`);
@@ -1928,6 +2112,7 @@ function resolveServiceUrl(service, overrides) {
1928
2112
  var WRITE_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
1929
2113
  var POSITIVE_CACHE_TTL_MS = 5 * 60 * 1e3;
1930
2114
  var NEGATIVE_CACHE_TTL_MS = 60 * 1e3;
2115
+ var CATALOG_CACHE_TTL_MS = 60 * 1e3;
1931
2116
  var TopoloClient = class _TopoloClient {
1932
2117
  credential;
1933
2118
  agent;
@@ -1937,6 +2122,7 @@ var TopoloClient = class _TopoloClient {
1937
2122
  timeoutMs;
1938
2123
  fetchImpl;
1939
2124
  debug;
2125
+ serviceCatalogCache = null;
1940
2126
  /**
1941
2127
  * Process-wide cache for slug → service-id lookups. Keyed by
1942
2128
  * `${authBaseUrl}|${slug}` so multiple `TopoloClient` instances pointing at
@@ -1982,7 +2168,8 @@ var TopoloClient = class _TopoloClient {
1982
2168
  `Mutating ${method} requests require { confirm: true }. This guardrail prevents agents from issuing writes without an explicit human-in-the-loop acknowledgement.`
1983
2169
  );
1984
2170
  }
1985
- const baseUrl = resolveServiceUrl(opts.service, this.serviceUrls);
2171
+ const resolvedService = await this.resolveRequestService(opts.service);
2172
+ const baseUrl = resolvedService.baseUrl;
1986
2173
  const url = new URL(opts.path, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
1987
2174
  if (opts.query) {
1988
2175
  for (const [k, v] of Object.entries(opts.query)) {
@@ -1992,7 +2179,7 @@ var TopoloClient = class _TopoloClient {
1992
2179
  const headers = new Headers();
1993
2180
  headers.set("Accept", "application/json");
1994
2181
  if (opts.body !== void 0) headers.set("Content-Type", "application/json");
1995
- const platformServiceId = resolveConfiguredServiceId(opts.service, this.serviceIds);
2182
+ const platformServiceId = resolveConfiguredServiceId(resolvedService.serviceKey, this.serviceIds);
1996
2183
  if (platformServiceId) headers.set("X-Service-ID", platformServiceId);
1997
2184
  applyAuthHeaders(headers, this.credential);
1998
2185
  const requestId = generateRequestId();
@@ -2005,7 +2192,7 @@ var TopoloClient = class _TopoloClient {
2005
2192
  const signal = opts.signal ? mergeSignals(opts.signal, controller.signal) : controller.signal;
2006
2193
  const urlStr = url.toString();
2007
2194
  const startedAt = Date.now();
2008
- this.emit({ phase: "request", method, service: opts.service, path: opts.path, url: urlStr, requestId });
2195
+ this.emit({ phase: "request", method, service: resolvedService.serviceKey, path: opts.path, url: urlStr, requestId });
2009
2196
  let res;
2010
2197
  try {
2011
2198
  res = await this.fetchImpl(urlStr, {
@@ -2018,7 +2205,7 @@ var TopoloClient = class _TopoloClient {
2018
2205
  this.emit({
2019
2206
  phase: "error",
2020
2207
  method,
2021
- service: opts.service,
2208
+ service: resolvedService.serviceKey,
2022
2209
  path: opts.path,
2023
2210
  url: urlStr,
2024
2211
  requestId,
@@ -2037,7 +2224,7 @@ var TopoloClient = class _TopoloClient {
2037
2224
  this.emit({
2038
2225
  phase: "error",
2039
2226
  method,
2040
- service: opts.service,
2227
+ service: resolvedService.serviceKey,
2041
2228
  path: opts.path,
2042
2229
  url: urlStr,
2043
2230
  requestId,
@@ -2052,12 +2239,12 @@ var TopoloClient = class _TopoloClient {
2052
2239
  extractRequired(parsed)
2053
2240
  );
2054
2241
  }
2055
- throw new TopoloHttpError(opts.service, opts.path, res.status, parsed);
2242
+ throw new TopoloHttpError(resolvedService.serviceKey, opts.path, res.status, parsed);
2056
2243
  }
2057
2244
  this.emit({
2058
2245
  phase: "response",
2059
2246
  method,
2060
- service: opts.service,
2247
+ service: resolvedService.serviceKey,
2061
2248
  path: opts.path,
2062
2249
  url: urlStr,
2063
2250
  requestId,
@@ -2066,6 +2253,32 @@ var TopoloClient = class _TopoloClient {
2066
2253
  });
2067
2254
  return parsed;
2068
2255
  }
2256
+ async resolveRequestService(service) {
2257
+ const serviceKey = normalizeLookupKey(service);
2258
+ if (!serviceKey) {
2259
+ throw new TopoloSdkError("unknown_service", "service is required");
2260
+ }
2261
+ if (serviceKey === "auth") {
2262
+ const overrideUrl = resolveConfiguredServiceUrl(serviceKey, this.serviceUrls);
2263
+ if (overrideUrl) return { serviceKey, baseUrl: overrideUrl };
2264
+ return { serviceKey, baseUrl: DEFAULT_SERVICE_URLS.auth };
2265
+ }
2266
+ const live = await this.resolveLiveCallableService(serviceKey);
2267
+ if (live) {
2268
+ const overrideUrl = resolveConfiguredServiceUrl(serviceKey, this.serviceUrls);
2269
+ return overrideUrl ? { ...live, baseUrl: overrideUrl } : live;
2270
+ }
2271
+ throw new TopoloSdkError(
2272
+ "unknown_service",
2273
+ `Unknown Topolo service "${service}". Run service discovery first and pass a callable service id or slug.`
2274
+ );
2275
+ }
2276
+ async resolveLiveCallableService(serviceKey) {
2277
+ const catalog = await this.listServices();
2278
+ const match = catalog.find((entry) => catalogEntryMatches(entry, serviceKey));
2279
+ if (!match?.baseUrl || !isCallableCatalogEntry(match)) return null;
2280
+ return { serviceKey, baseUrl: match.baseUrl };
2281
+ }
2069
2282
  /**
2070
2283
  * Resolve a service-slug → opaque service-id via caller config or TopoloAuth.
2071
2284
  *
@@ -2126,43 +2339,55 @@ var TopoloClient = class _TopoloClient {
2126
2339
  /**
2127
2340
  * List the platform service catalog from the live registry
2128
2341
  * (`GET /api/services/catalog` on TopoloAuth). Credential-aware: the
2129
- * caller's credential is attached, so an authenticated caller in an
2130
- * entitled org also receives the `developer_only` services its role
2131
- * permits; an unauthenticated/agent caller receives `active` only.
2342
+ * caller's credential is attached, so the result only includes services the
2343
+ * credential's organization and effective permissions can use.
2132
2344
  *
2133
- * Resilient: on any network/HTTP failure this falls back to the
2134
- * build-time generated `APPLICATIONS` snapshot so offline/degraded
2135
- * callers still get a usable (if static) catalog. The live result is
2136
- * authoritative; the snapshot is a floor, not a cap.
2345
+ * Security boundary: this never falls back to the generated global snapshot.
2346
+ * The live Auth catalog is the authority because it is scoped to the caller's
2347
+ * organization and effective permissions.
2137
2348
  */
2138
2349
  async listServices() {
2139
- try {
2140
- const res = await this.request({ service: "auth", method: "GET", path: "/api/services/catalog" });
2141
- const raw = res.data?.services ?? res.services;
2142
- if (Array.isArray(raw) && raw.length > 0) {
2143
- const entries = [];
2144
- for (const item of raw) {
2145
- const s = item;
2146
- const serviceId = typeof s.service_id === "string" ? s.service_id : typeof s.id === "string" ? s.id : null;
2147
- if (!serviceId) continue;
2148
- entries.push({
2149
- serviceId,
2150
- slug: typeof s.app_slug === "string" ? s.app_slug : null,
2151
- name: typeof s.name === "string" ? s.name : null,
2152
- description: typeof s.description === "string" ? s.description : null,
2153
- baseUrl: typeof s.base_url === "string" ? s.base_url : null,
2154
- status: typeof s.status === "string" ? s.status : null,
2155
- surfaceKind: typeof s.surface_kind === "string" ? s.surface_kind : null,
2156
- launchable: s.launchable === true
2157
- });
2158
- }
2159
- if (entries.length > 0) return entries;
2160
- }
2161
- } catch {
2350
+ const now = Date.now();
2351
+ if (this.serviceCatalogCache && this.serviceCatalogCache.expiresAt > now) {
2352
+ return this.serviceCatalogCache.entries;
2353
+ }
2354
+ const res = await this.request({ service: "auth", method: "GET", path: "/api/services/catalog" });
2355
+ const raw = res.data?.services ?? res.services;
2356
+ if (!Array.isArray(raw)) {
2357
+ throw new TopoloSdkError(
2358
+ "service_catalog_unavailable",
2359
+ "TopoloAuth did not return a service catalog for the current credential."
2360
+ );
2361
+ }
2362
+ const entries = [];
2363
+ for (const item of raw) {
2364
+ const s = item;
2365
+ const serviceId = typeof s.service_id === "string" ? s.service_id : typeof s.id === "string" ? s.id : null;
2366
+ if (!serviceId) continue;
2367
+ const permissions = Array.isArray(s.granted_permissions) ? s.granted_permissions.filter((permission) => typeof permission === "string" && permission.trim().length > 0) : [];
2368
+ entries.push({
2369
+ serviceId,
2370
+ slug: typeof s.app_slug === "string" ? s.app_slug : null,
2371
+ name: typeof s.name === "string" ? s.name : null,
2372
+ description: typeof s.description === "string" ? s.description : null,
2373
+ baseUrl: typeof s.base_url === "string" ? s.base_url : null,
2374
+ status: typeof s.status === "string" ? s.status : null,
2375
+ surfaceKind: typeof s.surface_kind === "string" ? s.surface_kind : null,
2376
+ launchable: s.launchable === true,
2377
+ permissions
2378
+ });
2162
2379
  }
2163
- return this.generatedCatalogFallback();
2380
+ this.serviceCatalogCache = {
2381
+ entries,
2382
+ expiresAt: now + CATALOG_CACHE_TTL_MS
2383
+ };
2384
+ return entries;
2164
2385
  }
2165
- generatedCatalogFallback() {
2386
+ /**
2387
+ * Bundled generated registry for tooling that audits platform packaging, not
2388
+ * for deciding what the current credential may use.
2389
+ */
2390
+ listBundledServices() {
2166
2391
  const apps = Object.values(APPLICATIONS);
2167
2392
  return apps.map((app) => ({
2168
2393
  serviceId: app.id,
@@ -2170,9 +2395,10 @@ var TopoloClient = class _TopoloClient {
2170
2395
  name: app.name ?? app.id,
2171
2396
  description: null,
2172
2397
  baseUrl: app.productionUrl ?? null,
2173
- status: "active",
2398
+ status: "bundled",
2174
2399
  surfaceKind: "application",
2175
- launchable: Boolean(app.productionUrl)
2400
+ launchable: Boolean(app.productionUrl),
2401
+ permissions: []
2176
2402
  }));
2177
2403
  }
2178
2404
  /**
@@ -2221,8 +2447,18 @@ function resolveConfiguredServiceId(slug, serviceIds) {
2221
2447
  }
2222
2448
  return null;
2223
2449
  }
2450
+ function resolveConfiguredServiceUrl(slug, serviceUrls) {
2451
+ for (const serviceKey of serviceKeyCandidates(slug)) {
2452
+ const configured = serviceUrls?.[serviceKey];
2453
+ if (typeof configured === "string" && configured.trim()) return configured.trim();
2454
+ const envKey = `TOPOLO_SERVICE_URL_${serviceKey.replace(/\./g, "_").toUpperCase()}`;
2455
+ const envValue = typeof process !== "undefined" ? process.env?.[envKey] : void 0;
2456
+ if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
2457
+ }
2458
+ return null;
2459
+ }
2224
2460
  function serviceKeyCandidates(slug) {
2225
- const normalized = slug.trim().toLowerCase();
2461
+ const normalized = normalizeLookupKey(slug);
2226
2462
  const withoutTopolo = normalized.startsWith("topolo-") ? normalized.slice("topolo-".length) : normalized;
2227
2463
  return [.../* @__PURE__ */ new Set([
2228
2464
  normalized,
@@ -2231,6 +2467,31 @@ function serviceKeyCandidates(slug) {
2231
2467
  withoutTopolo.replace(/-/g, "_")
2232
2468
  ])];
2233
2469
  }
2470
+ function normalizeLookupKey(value) {
2471
+ return String(value || "").trim().toLowerCase().replace(/\s+/g, "-");
2472
+ }
2473
+ function catalogEntryMatches(entry, needle) {
2474
+ return catalogEntryLookupKeys(entry).includes(needle);
2475
+ }
2476
+ function catalogEntryLookupKeys(entry) {
2477
+ const values = [entry.serviceId, entry.slug, entry.name].filter((value) => typeof value === "string" && value.trim().length > 0);
2478
+ const keys = /* @__PURE__ */ new Set();
2479
+ for (const value of values) {
2480
+ const normalized = normalizeLookupKey(value);
2481
+ if (!normalized) continue;
2482
+ for (const candidate of serviceKeyCandidates(normalized)) {
2483
+ keys.add(candidate);
2484
+ }
2485
+ }
2486
+ return [...keys];
2487
+ }
2488
+ function isCallableCatalogEntry(entry) {
2489
+ const kind = normalizeLookupKey(entry.surfaceKind || "");
2490
+ if (kind === "api" || kind === "technical_service" || kind === "service") return true;
2491
+ return Boolean(
2492
+ entry.baseUrl && catalogEntryLookupKeys(entry).some((key) => Object.prototype.hasOwnProperty.call(DEFAULT_SERVICE_URLS, key))
2493
+ );
2494
+ }
2234
2495
  function describeError(body, fallback) {
2235
2496
  if (body && typeof body === "object") {
2236
2497
  const maybe = body;