@topolo/mcp 0.2.5 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // src/index.ts
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
 
6
- // ../packages/topolo-sdk/dist/index.js
6
+ // ../topolo-sdk/dist/index.js
7
7
  function applyAuthHeaders(headers, credential) {
8
8
  if (credential.kind === "api_key") {
9
9
  headers.set("X-Api-Key", credential.apiKey);
@@ -59,48 +59,69 @@ var TopoloHttpError = class extends TopoloSdkError {
59
59
  }
60
60
  };
61
61
  var SERVICES = {
62
- agent: "https://topolo-agent-worker.topolo.workers.dev",
62
+ agent: "https://agent-api.topolo.app",
63
63
  auth: "https://auth.topolo.app",
64
+ books: "https://books.topolo.app",
64
65
  bugfix: "https://bugfix.topolo.app",
65
- bytes: "https://r2-media-manager-worker.topolo.workers.dev",
66
+ bytes: "https://bytes-api.topolo.app",
66
67
  calendar: "https://calendar.topolo.app",
68
+ capacity: "https://capacity.topolo.app",
67
69
  chat: "https://chat.topolo.app",
68
- commerce: "https://topolo-commerce-api.topolo.workers.dev",
70
+ commerce: "https://commerce-api.topolo.app",
71
+ compose: "https://compose.topolo.app",
72
+ consent: "https://consent.topolo.app",
69
73
  crm: "https://crm-api.topolo.app",
70
- feed: "https://topolo-feed-api.topolo.app",
71
- forecast: "https://forecast-worker-production.topolo.workers.dev",
72
- learn: "https://topololearn-api.topolo.workers.dev",
74
+ customer_success: "https://success.topolo.app",
75
+ developers: "https://developers.topolo.app",
76
+ director: "https://director.topolo.app",
77
+ feed: "https://feed-api.topolo.app",
78
+ flow: "https://flow.topolo.app",
79
+ forecast: "https://forecast-api.topolo.app",
80
+ forms: "https://forms.topolo.app",
81
+ home: "https://home.topolo.app",
82
+ insights: "https://insights.topolo.app",
83
+ inventory: "https://inventory.topolo.app",
84
+ learn: "https://learn-api.topolo.app",
85
+ localize: "https://localize.topolo.app",
73
86
  mail: "https://mail.topolo.app",
74
- mdm: "https://topolo-mdm-api.topolo.app",
87
+ mdm: "https://mdm-api.topolo.app",
75
88
  messaging: "https://messages.topolo.app",
76
- nexus: "https://topolo-nexus-gateway.topolo.workers.dev",
89
+ nexus: "https://nexus-api.topolo.app",
90
+ notify: "https://notify.topolo.app",
77
91
  one: "https://one.topolo.app",
78
- pay: "https://topolo-pay.topolo.workers.dev",
92
+ p2p: "https://p2p.topolo.app",
93
+ pay: "https://pay.topolo.app",
94
+ people: "https://people.topolo.app",
95
+ pulse: "https://pulse.topolo.app",
79
96
  "quro.api": "https://api.ol0.me",
80
97
  "quro.redirect": "https://ol0.me",
81
98
  roadmapper: "https://roadmapper-api.topolo.app",
82
- social_studio: "https://topolo-social-studio-api.topolo.workers.dev",
83
- socialize: "https://socialize-prod-api.topolo.workers.dev",
99
+ sign: "https://sign.topolo.app",
100
+ social_studio: "https://studio-api.topolo.app",
101
+ socialize: "https://socialize-api.topolo.app",
102
+ spaces: "https://spaces.topolo.app",
103
+ status: "https://status.topolo.app",
84
104
  support: "https://support.topolo.app",
105
+ survey: "https://survey.topolo.app",
106
+ voice: "https://voice.topolo.app",
85
107
  web: "https://web-api.topolo.app"
86
108
  };
87
- var PLATFORM_SERVICE_IDS = {
88
- crm: "srv_iCwM4jGXcwlj"
89
- };
90
109
  var APPLICATIONS = {
91
110
  "admin": {
92
111
  "id": "admin",
93
112
  "appDir": "TopoloAdmin",
94
- "name": "topoloadmin",
113
+ "name": "topolo-admin",
95
114
  "packageName": "topolo-admin",
96
115
  "productionUrl": "https://admin.topolo.app",
97
116
  "services": [],
98
117
  "deployTargets": [
99
118
  {
100
- "name": "topoloadmin",
119
+ "name": "topolo-admin",
101
120
  "kind": "pages",
102
121
  "apiUrl": null,
103
- "domains": [],
122
+ "domains": [
123
+ "admin.topolo.app"
124
+ ],
104
125
  "routes": [],
105
126
  "serviceId": null
106
127
  }
@@ -118,17 +139,21 @@ var APPLICATIONS = {
118
139
  "deployTargets": [
119
140
  {
120
141
  "name": "topolo-agent",
121
- "kind": "pages",
142
+ "kind": "worker",
122
143
  "apiUrl": null,
123
- "domains": [],
144
+ "domains": [
145
+ "agent.topolo.app"
146
+ ],
124
147
  "routes": [],
125
148
  "serviceId": null
126
149
  },
127
150
  {
128
151
  "name": "topolo-agent-worker",
129
152
  "kind": "worker",
130
- "apiUrl": "https://topolo-agent-worker.topolo.workers.dev",
131
- "domains": [],
153
+ "apiUrl": "https://agent-api.topolo.app",
154
+ "domains": [
155
+ "agent-api.topolo.app"
156
+ ],
132
157
  "routes": [],
133
158
  "serviceId": "agent"
134
159
  }
@@ -158,6 +183,48 @@ var APPLICATIONS = {
158
183
  }
159
184
  ]
160
185
  },
186
+ "backup": {
187
+ "id": "backup",
188
+ "appDir": "TopoloBackup",
189
+ "name": "topolo-backup",
190
+ "packageName": "topolo-backup",
191
+ "productionUrl": null,
192
+ "services": [],
193
+ "deployTargets": [
194
+ {
195
+ "name": "topolo-backup",
196
+ "kind": "worker",
197
+ "apiUrl": null,
198
+ "domains": [],
199
+ "routes": [],
200
+ "serviceId": null
201
+ }
202
+ ]
203
+ },
204
+ "books": {
205
+ "id": "books",
206
+ "appDir": "TopoloBooks",
207
+ "name": "topolo-books",
208
+ "packageName": "topolo-books",
209
+ "productionUrl": "https://books.topolo.app",
210
+ "services": [
211
+ "books"
212
+ ],
213
+ "deployTargets": [
214
+ {
215
+ "name": "topolo-books",
216
+ "kind": "worker",
217
+ "apiUrl": "https://books.topolo.app",
218
+ "domains": [
219
+ "books.topolo.app"
220
+ ],
221
+ "routes": [
222
+ "books.topolo.app"
223
+ ],
224
+ "serviceId": "books"
225
+ }
226
+ ]
227
+ },
161
228
  "bugfix": {
162
229
  "id": "bugfix",
163
230
  "appDir": "TopoloBugFix",
@@ -193,18 +260,22 @@ var APPLICATIONS = {
193
260
  ],
194
261
  "deployTargets": [
195
262
  {
196
- "name": "bytes",
263
+ "name": "topolo-bytes",
197
264
  "kind": "pages",
198
265
  "apiUrl": null,
199
- "domains": [],
266
+ "domains": [
267
+ "bytes.topolo.app"
268
+ ],
200
269
  "routes": [],
201
270
  "serviceId": null
202
271
  },
203
272
  {
204
- "name": "r2-media-manager-worker",
273
+ "name": "topolo-bytes-api",
205
274
  "kind": "worker",
206
- "apiUrl": "https://r2-media-manager-worker.topolo.workers.dev",
207
- "domains": [],
275
+ "apiUrl": "https://bytes-api.topolo.app",
276
+ "domains": [
277
+ "bytes-api.topolo.app"
278
+ ],
208
279
  "routes": [],
209
280
  "serviceId": "bytes"
210
281
  }
@@ -234,6 +305,28 @@ var APPLICATIONS = {
234
305
  }
235
306
  ]
236
307
  },
308
+ "capacity": {
309
+ "id": "capacity",
310
+ "appDir": "TopoloCapacity",
311
+ "name": "topolo-capacity",
312
+ "packageName": "topolo-capacity",
313
+ "productionUrl": "https://capacity.topolo.app",
314
+ "services": [
315
+ "capacity"
316
+ ],
317
+ "deployTargets": [
318
+ {
319
+ "name": "topolo-capacity",
320
+ "kind": "worker",
321
+ "apiUrl": "https://capacity.topolo.app",
322
+ "domains": [
323
+ "capacity.topolo.app"
324
+ ],
325
+ "routes": [],
326
+ "serviceId": "capacity"
327
+ }
328
+ ]
329
+ },
237
330
  "chat": {
238
331
  "id": "chat",
239
332
  "appDir": "TopoloChat",
@@ -258,19 +351,10 @@ var APPLICATIONS = {
258
351
  }
259
352
  ]
260
353
  },
261
- "cli": {
262
- "id": "cli",
263
- "appDir": "TopoloCli",
264
- "name": "@topolo/cli",
265
- "packageName": "@topolo/cli",
266
- "productionUrl": null,
267
- "services": [],
268
- "deployTargets": []
269
- },
270
354
  "cloudcontrol": {
271
355
  "id": "cloudcontrol",
272
356
  "appDir": "TopoloCloudControl",
273
- "name": "topolo-cloudcontrol",
357
+ "name": "cloudcontrol",
274
358
  "packageName": "topolo-cloudcontrol",
275
359
  "productionUrl": null,
276
360
  "services": [],
@@ -289,9 +373,9 @@ var APPLICATIONS = {
289
373
  {
290
374
  "name": "topolo-commerce-api",
291
375
  "kind": "worker",
292
- "apiUrl": "https://topolo-commerce-api.topolo.workers.dev",
376
+ "apiUrl": "https://commerce-api.topolo.app",
293
377
  "domains": [
294
- "topolo-commerce-api.topolo.workers.dev"
378
+ "commerce-api.topolo.app"
295
379
  ],
296
380
  "routes": [],
297
381
  "serviceId": "commerce"
@@ -301,8 +385,7 @@ var APPLICATIONS = {
301
385
  "kind": "pages",
302
386
  "apiUrl": null,
303
387
  "domains": [
304
- "guest.topolo.app",
305
- "topolo-commerce-guest-web.pages.dev"
388
+ "guest.topolo.app"
306
389
  ],
307
390
  "routes": [],
308
391
  "serviceId": null
@@ -312,8 +395,7 @@ var APPLICATIONS = {
312
395
  "kind": "pages",
313
396
  "apiUrl": null,
314
397
  "domains": [
315
- "commerce.topolo.app",
316
- "topolo-commerce-ops-web.pages.dev"
398
+ "commerce.topolo.app"
317
399
  ],
318
400
  "routes": [],
319
401
  "serviceId": null
@@ -323,14 +405,61 @@ var APPLICATIONS = {
323
405
  "kind": "pages",
324
406
  "apiUrl": null,
325
407
  "domains": [
326
- "station-commerce.topolo.app",
327
- "topolo-commerce-station-web.pages.dev"
408
+ "station-commerce.topolo.app"
328
409
  ],
329
410
  "routes": [],
330
411
  "serviceId": null
331
412
  }
332
413
  ]
333
414
  },
415
+ "compose": {
416
+ "id": "compose",
417
+ "appDir": "TopoloCompose",
418
+ "name": "topolo-compose",
419
+ "packageName": "@topolo/compose",
420
+ "productionUrl": "https://compose.topolo.app",
421
+ "services": [
422
+ "compose"
423
+ ],
424
+ "deployTargets": [
425
+ {
426
+ "name": "topolo-compose",
427
+ "kind": "worker",
428
+ "apiUrl": "https://compose.topolo.app",
429
+ "domains": [
430
+ "compose.topolo.app"
431
+ ],
432
+ "routes": [
433
+ "compose.topolo.app"
434
+ ],
435
+ "serviceId": "compose"
436
+ }
437
+ ]
438
+ },
439
+ "consent": {
440
+ "id": "consent",
441
+ "appDir": "TopoloConsent",
442
+ "name": "topolo-consent",
443
+ "packageName": "topolo-consent",
444
+ "productionUrl": "https://consent.topolo.app",
445
+ "services": [
446
+ "consent"
447
+ ],
448
+ "deployTargets": [
449
+ {
450
+ "name": "topolo-consent",
451
+ "kind": "worker",
452
+ "apiUrl": "https://consent.topolo.app",
453
+ "domains": [
454
+ "consent.topolo.app"
455
+ ],
456
+ "routes": [
457
+ "consent.topolo.app"
458
+ ],
459
+ "serviceId": "consent"
460
+ }
461
+ ]
462
+ },
334
463
  "crm": {
335
464
  "id": "crm",
336
465
  "appDir": "TopoloCRM",
@@ -342,20 +471,48 @@ var APPLICATIONS = {
342
471
  ],
343
472
  "deployTargets": [
344
473
  {
345
- "name": "topolo-crm-frontend",
346
- "kind": "pages",
347
- "apiUrl": null,
348
- "domains": [],
474
+ "name": "topolo-crm-api",
475
+ "kind": "worker",
476
+ "apiUrl": "https://crm-api.topolo.app",
477
+ "domains": [
478
+ "crm-api.topolo.app"
479
+ ],
349
480
  "routes": [],
350
- "serviceId": null
481
+ "serviceId": "crm"
351
482
  },
352
483
  {
353
- "name": "topolo-crm-worker",
484
+ "name": "topolo-crm-app",
354
485
  "kind": "worker",
355
- "apiUrl": "https://crm-api.topolo.app",
356
- "domains": [],
486
+ "apiUrl": null,
487
+ "domains": [
488
+ "crm.topolo.app"
489
+ ],
357
490
  "routes": [],
358
- "serviceId": "crm"
491
+ "serviceId": null
492
+ }
493
+ ]
494
+ },
495
+ "customer_success": {
496
+ "id": "customer_success",
497
+ "appDir": "TopoloSuccess",
498
+ "name": "topolo-success",
499
+ "packageName": "topolo-success",
500
+ "productionUrl": "https://success.topolo.app",
501
+ "services": [
502
+ "customer_success"
503
+ ],
504
+ "deployTargets": [
505
+ {
506
+ "name": "topolo-success",
507
+ "kind": "worker",
508
+ "apiUrl": "https://success.topolo.app",
509
+ "domains": [
510
+ "success.topolo.app"
511
+ ],
512
+ "routes": [
513
+ "success.topolo.app"
514
+ ],
515
+ "serviceId": "customer_success"
359
516
  }
360
517
  ]
361
518
  },
@@ -365,17 +522,51 @@ var APPLICATIONS = {
365
522
  "name": "topolo-developers",
366
523
  "packageName": "topolo-developers",
367
524
  "productionUrl": "https://developers.topolo.app",
368
- "services": [],
525
+ "services": [
526
+ "developers"
527
+ ],
369
528
  "deployTargets": [
370
529
  {
371
- "name": "topolo-developers",
372
- "kind": "pages",
530
+ "name": "topolo-catalog-cron",
531
+ "kind": "worker",
373
532
  "apiUrl": null,
533
+ "domains": [],
534
+ "routes": [],
535
+ "serviceId": null
536
+ },
537
+ {
538
+ "name": "topolo-developers",
539
+ "kind": "worker",
540
+ "apiUrl": "https://developers.topolo.app",
374
541
  "domains": [
375
542
  "developers.topolo.app"
376
543
  ],
377
544
  "routes": [],
378
- "serviceId": null
545
+ "serviceId": "developers"
546
+ }
547
+ ]
548
+ },
549
+ "director": {
550
+ "id": "director",
551
+ "appDir": "TopoloDirector",
552
+ "name": "topolo-director",
553
+ "packageName": "topolo-director",
554
+ "productionUrl": "https://director.topolo.app",
555
+ "services": [
556
+ "director"
557
+ ],
558
+ "deployTargets": [
559
+ {
560
+ "name": "topolo-director",
561
+ "kind": "worker",
562
+ "apiUrl": "https://director.topolo.app",
563
+ "domains": [
564
+ "director.topolo.app"
565
+ ],
566
+ "routes": [
567
+ "director.topolo.app"
568
+ ],
569
+ "serviceId": "director"
379
570
  }
380
571
  ]
381
572
  },
@@ -403,8 +594,8 @@ var APPLICATIONS = {
403
594
  "id": "feed",
404
595
  "appDir": "TopoloFeed",
405
596
  "name": "TopoloFeed",
406
- "packageName": null,
407
- "productionUrl": "https://topolo-feed-api.topolo.app",
597
+ "packageName": "topolo-feed",
598
+ "productionUrl": "https://feed-api.topolo.app",
408
599
  "services": [
409
600
  "feed"
410
601
  ],
@@ -412,29 +603,53 @@ var APPLICATIONS = {
412
603
  {
413
604
  "name": "topolo-feed-analytics-api",
414
605
  "kind": "worker",
415
- "apiUrl": "https://topolo-feed-analytics-api.topolo.app",
606
+ "apiUrl": "https://feed-analytics-api.topolo.app",
416
607
  "domains": [
417
- "topolo-feed-analytics-api.topolo.app"
608
+ "feed-analytics-api.topolo.app"
418
609
  ],
419
610
  "routes": [
420
- "topolo-feed-analytics-api.topolo.app"
611
+ "feed-analytics-api.topolo.app"
421
612
  ],
422
613
  "serviceId": null
423
614
  },
424
615
  {
425
616
  "name": "topolo-feed-api",
426
617
  "kind": "worker",
427
- "apiUrl": "https://topolo-feed-api.topolo.app",
618
+ "apiUrl": "https://feed-api.topolo.app",
428
619
  "domains": [
429
- "topolo-feed-api.topolo.app"
620
+ "feed-api.topolo.app"
430
621
  ],
431
622
  "routes": [
432
- "topolo-feed-api.topolo.app"
623
+ "feed-api.topolo.app"
433
624
  ],
434
625
  "serviceId": "feed"
435
626
  }
436
627
  ]
437
628
  },
629
+ "flow": {
630
+ "id": "flow",
631
+ "appDir": "TopoloFlow",
632
+ "name": "topolo-flow",
633
+ "packageName": "topolo-flow",
634
+ "productionUrl": "https://flow.topolo.app",
635
+ "services": [
636
+ "flow"
637
+ ],
638
+ "deployTargets": [
639
+ {
640
+ "name": "topolo-flow",
641
+ "kind": "worker",
642
+ "apiUrl": "https://flow.topolo.app",
643
+ "domains": [
644
+ "flow.topolo.app"
645
+ ],
646
+ "routes": [
647
+ "flow.topolo.app"
648
+ ],
649
+ "serviceId": "flow"
650
+ }
651
+ ]
652
+ },
438
653
  "forecast": {
439
654
  "id": "forecast",
440
655
  "appDir": "TopoloForecast",
@@ -446,23 +661,123 @@ var APPLICATIONS = {
446
661
  ],
447
662
  "deployTargets": [
448
663
  {
449
- "name": "forecast",
450
- "kind": "pages",
664
+ "name": "topolo-forecast",
665
+ "kind": "worker",
451
666
  "apiUrl": null,
452
- "domains": [],
667
+ "domains": [
668
+ "forecast.topolo.app"
669
+ ],
453
670
  "routes": [],
454
671
  "serviceId": null
455
672
  },
456
673
  {
457
- "name": "forecast-worker-production",
674
+ "name": "topolo-forecast-api",
458
675
  "kind": "worker",
459
- "apiUrl": "https://forecast-worker-production.topolo.workers.dev",
460
- "domains": [],
676
+ "apiUrl": "https://forecast-api.topolo.app",
677
+ "domains": [
678
+ "forecast-api.topolo.app"
679
+ ],
461
680
  "routes": [],
462
681
  "serviceId": "forecast"
463
682
  }
464
683
  ]
465
684
  },
685
+ "forms": {
686
+ "id": "forms",
687
+ "appDir": "TopoloForms",
688
+ "name": "topolo-forms",
689
+ "packageName": "topolo-forms",
690
+ "productionUrl": "https://forms.topolo.app",
691
+ "services": [
692
+ "forms"
693
+ ],
694
+ "deployTargets": [
695
+ {
696
+ "name": "topolo-forms",
697
+ "kind": "worker",
698
+ "apiUrl": "https://forms.topolo.app",
699
+ "domains": [
700
+ "forms.topolo.app"
701
+ ],
702
+ "routes": [
703
+ "forms.topolo.app"
704
+ ],
705
+ "serviceId": "forms"
706
+ }
707
+ ]
708
+ },
709
+ "home": {
710
+ "id": "home",
711
+ "appDir": "TopoloHome",
712
+ "name": "topolo-home",
713
+ "packageName": "topolo-home",
714
+ "productionUrl": "https://home.topolo.app",
715
+ "services": [
716
+ "home"
717
+ ],
718
+ "deployTargets": [
719
+ {
720
+ "name": "topolo-home",
721
+ "kind": "worker",
722
+ "apiUrl": "https://home.topolo.app",
723
+ "domains": [
724
+ "home.topolo.app"
725
+ ],
726
+ "routes": [
727
+ "home.topolo.app"
728
+ ],
729
+ "serviceId": "home"
730
+ }
731
+ ]
732
+ },
733
+ "insights": {
734
+ "id": "insights",
735
+ "appDir": "TopoloInsights",
736
+ "name": "topolo-insights",
737
+ "packageName": "topolo-insights",
738
+ "productionUrl": "https://insights.topolo.app",
739
+ "services": [
740
+ "insights"
741
+ ],
742
+ "deployTargets": [
743
+ {
744
+ "name": "topolo-insights",
745
+ "kind": "worker",
746
+ "apiUrl": "https://insights.topolo.app",
747
+ "domains": [
748
+ "insights.topolo.app"
749
+ ],
750
+ "routes": [
751
+ "insights.topolo.app"
752
+ ],
753
+ "serviceId": "insights"
754
+ }
755
+ ]
756
+ },
757
+ "inventory": {
758
+ "id": "inventory",
759
+ "appDir": "TopoloInventory",
760
+ "name": "topolo-inventory",
761
+ "packageName": "topolo-inventory",
762
+ "productionUrl": "https://inventory.topolo.app",
763
+ "services": [
764
+ "inventory"
765
+ ],
766
+ "deployTargets": [
767
+ {
768
+ "name": "topolo-inventory",
769
+ "kind": "worker",
770
+ "apiUrl": "https://inventory.topolo.app",
771
+ "domains": [
772
+ "inventory.topolo.app"
773
+ ],
774
+ "routes": [
775
+ "inventory.topolo.app"
776
+ ],
777
+ "serviceId": "inventory"
778
+ }
779
+ ]
780
+ },
466
781
  "learn": {
467
782
  "id": "learn",
468
783
  "appDir": "TopoloLearn",
@@ -474,8 +789,8 @@ var APPLICATIONS = {
474
789
  ],
475
790
  "deployTargets": [
476
791
  {
477
- "name": "topololearn",
478
- "kind": "pages",
792
+ "name": "topolo-learn",
793
+ "kind": "worker",
479
794
  "apiUrl": null,
480
795
  "domains": [
481
796
  "learn.topolo.app"
@@ -484,17 +799,41 @@ var APPLICATIONS = {
484
799
  "serviceId": null
485
800
  },
486
801
  {
487
- "name": "topololearn-api",
802
+ "name": "topolo-learn-api",
488
803
  "kind": "worker",
489
- "apiUrl": "https://topololearn-api.topolo.workers.dev",
804
+ "apiUrl": "https://learn-api.topolo.app",
490
805
  "domains": [
491
- "topololearn-api.topolo.workers.dev"
806
+ "learn-api.topolo.app"
492
807
  ],
493
808
  "routes": [],
494
809
  "serviceId": "learn"
495
810
  }
496
811
  ]
497
812
  },
813
+ "localize": {
814
+ "id": "localize",
815
+ "appDir": "TopoloLocalize",
816
+ "name": "topolo-localize",
817
+ "packageName": "topolo-localize",
818
+ "productionUrl": "https://localize.topolo.app",
819
+ "services": [
820
+ "localize"
821
+ ],
822
+ "deployTargets": [
823
+ {
824
+ "name": "topolo-localize",
825
+ "kind": "worker",
826
+ "apiUrl": "https://localize.topolo.app",
827
+ "domains": [
828
+ "localize.topolo.app"
829
+ ],
830
+ "routes": [
831
+ "localize.topolo.app"
832
+ ],
833
+ "serviceId": "localize"
834
+ }
835
+ ]
836
+ },
498
837
  "mail": {
499
838
  "id": "mail",
500
839
  "appDir": "TopoloMail",
@@ -507,7 +846,7 @@ var APPLICATIONS = {
507
846
  "deployTargets": [
508
847
  {
509
848
  "name": "topolo-mail",
510
- "kind": "workers",
849
+ "kind": "worker",
511
850
  "apiUrl": "https://mail.topolo.app",
512
851
  "domains": [
513
852
  "mail.topolo.app"
@@ -519,20 +858,11 @@ var APPLICATIONS = {
519
858
  }
520
859
  ]
521
860
  },
522
- "mcp": {
523
- "id": "mcp",
524
- "appDir": "TopoloMCP",
525
- "name": "@topolo/mcp",
526
- "packageName": "@topolo/mcp",
527
- "productionUrl": null,
528
- "services": [],
529
- "deployTargets": []
530
- },
531
861
  "mdm": {
532
862
  "id": "mdm",
533
863
  "appDir": "TopoloMDM",
534
864
  "name": "TopoloMDM",
535
- "packageName": null,
865
+ "packageName": "topolo-mdm",
536
866
  "productionUrl": "https://mdm.topolo.app",
537
867
  "services": [
538
868
  "mdm"
@@ -541,22 +871,21 @@ var APPLICATIONS = {
541
871
  {
542
872
  "name": "topolo-mdm-api",
543
873
  "kind": "worker",
544
- "apiUrl": "https://topolo-mdm-api.topolo.app",
874
+ "apiUrl": "https://mdm-api.topolo.app",
545
875
  "domains": [
546
- "topolo-mdm-api.topolo.app"
876
+ "mdm-api.topolo.app"
547
877
  ],
548
878
  "routes": [
549
- "topolo-mdm-api.topolo.app"
879
+ "mdm-api.topolo.app"
550
880
  ],
551
881
  "serviceId": "mdm"
552
882
  },
553
883
  {
554
884
  "name": "topolo-mdm-console",
555
- "kind": "pages",
885
+ "kind": "worker",
556
886
  "apiUrl": null,
557
887
  "domains": [
558
- "mdm.topolo.app",
559
- "topolo-mdm-console.pages.dev"
888
+ "mdm.topolo.app"
560
889
  ],
561
890
  "routes": [
562
891
  "mdm.topolo.app"
@@ -577,7 +906,7 @@ var APPLICATIONS = {
577
906
  "deployTargets": [
578
907
  {
579
908
  "name": "topolo-messaging",
580
- "kind": "workers",
909
+ "kind": "worker",
581
910
  "apiUrl": "https://messages.topolo.app",
582
911
  "domains": [
583
912
  "messages.topolo.app"
@@ -587,7 +916,7 @@ var APPLICATIONS = {
587
916
  },
588
917
  {
589
918
  "name": "topolo-messaging-dispatch",
590
- "kind": "workers",
919
+ "kind": "worker",
591
920
  "apiUrl": null,
592
921
  "domains": [],
593
922
  "routes": [],
@@ -607,11 +936,10 @@ var APPLICATIONS = {
607
936
  "deployTargets": [
608
937
  {
609
938
  "name": "topolo-nexus-dashboard",
610
- "kind": "pages",
939
+ "kind": "worker",
611
940
  "apiUrl": null,
612
941
  "domains": [
613
- "nexus.topolo.app",
614
- "topolo-nexus-dashboard.pages.dev"
942
+ "nexus.topolo.app"
615
943
  ],
616
944
  "routes": [],
617
945
  "serviceId": null
@@ -619,19 +947,52 @@ var APPLICATIONS = {
619
947
  {
620
948
  "name": "topolo-nexus-gateway",
621
949
  "kind": "worker",
622
- "apiUrl": "https://topolo-nexus-gateway.topolo.workers.dev",
950
+ "apiUrl": "https://nexus-api.topolo.app",
623
951
  "domains": [
624
- "topolo-nexus-gateway.topolo.workers.dev"
952
+ "nexus-api.topolo.app"
625
953
  ],
626
954
  "routes": [],
627
955
  "serviceId": "nexus"
628
956
  }
629
957
  ]
630
958
  },
959
+ "notify": {
960
+ "id": "notify",
961
+ "appDir": "TopoloNotify",
962
+ "name": "topolo-notify",
963
+ "packageName": "@topolo/notify",
964
+ "productionUrl": "https://notify.topolo.app",
965
+ "services": [
966
+ "notify"
967
+ ],
968
+ "deployTargets": [
969
+ {
970
+ "name": "topolo-notify",
971
+ "kind": "worker",
972
+ "apiUrl": "https://notify.topolo.app",
973
+ "domains": [
974
+ "notify.topolo.app"
975
+ ],
976
+ "routes": [
977
+ "notify.topolo.app"
978
+ ],
979
+ "serviceId": "notify"
980
+ }
981
+ ]
982
+ },
983
+ "observability_watch": {
984
+ "id": "observability_watch",
985
+ "appDir": "TopoloObservabilityWatch",
986
+ "name": "topolo-observability-watch",
987
+ "packageName": "topolo-observability-watch",
988
+ "productionUrl": null,
989
+ "services": [],
990
+ "deployTargets": []
991
+ },
631
992
  "one": {
632
993
  "id": "one",
633
994
  "appDir": "TopoloOne",
634
- "name": "topolo-oneclick-sso",
995
+ "name": "TopoloOne",
635
996
  "packageName": "topolo-oneclick-sso",
636
997
  "productionUrl": "https://one.topolo.app",
637
998
  "services": [
@@ -639,47 +1000,68 @@ var APPLICATIONS = {
639
1000
  ],
640
1001
  "deployTargets": [
641
1002
  {
642
- "name": "ai-chat-rag",
643
- "kind": "worker",
644
- "apiUrl": null,
645
- "domains": [
646
- "ai-chat-rag.topolo.workers.dev"
647
- ],
648
- "routes": [],
649
- "serviceId": null
650
- },
651
- {
652
- "name": "topoloone",
1003
+ "name": "topolo-one",
653
1004
  "kind": "pages",
654
1005
  "apiUrl": null,
655
1006
  "domains": [
656
- "oneclick-dashboard.pages.dev"
1007
+ "one.topolo.app"
657
1008
  ],
658
1009
  "routes": [],
659
1010
  "serviceId": null
660
1011
  },
661
1012
  {
662
- "name": "topoloone-website",
1013
+ "name": "topolo-one-website",
663
1014
  "kind": "worker",
664
1015
  "apiUrl": null,
665
1016
  "domains": [
666
- "one.topolo.io"
1017
+ "topolo.io",
1018
+ "www.topolo.io"
667
1019
  ],
668
1020
  "routes": [],
669
1021
  "serviceId": null
670
1022
  },
671
1023
  {
672
- "name": "topoloone-worker",
1024
+ "name": "topolo-one-worker",
673
1025
  "kind": "worker",
674
1026
  "apiUrl": "https://one.topolo.app",
675
- "domains": [],
1027
+ "domains": [
1028
+ "one.topolo.app",
1029
+ "topolo.app",
1030
+ "www.topolo.app"
1031
+ ],
676
1032
  "routes": [
677
- "one.topolo.app/*"
1033
+ "one.topolo.app/*",
1034
+ "topolo.app",
1035
+ "www.topolo.app/*"
678
1036
  ],
679
1037
  "serviceId": "one"
680
1038
  }
681
1039
  ]
682
1040
  },
1041
+ "p2p": {
1042
+ "id": "p2p",
1043
+ "appDir": "TopoloP2P",
1044
+ "name": "topolo-p2p",
1045
+ "packageName": "topolo-p2p",
1046
+ "productionUrl": "https://p2p.topolo.app",
1047
+ "services": [
1048
+ "p2p"
1049
+ ],
1050
+ "deployTargets": [
1051
+ {
1052
+ "name": "topolo-p2p",
1053
+ "kind": "worker",
1054
+ "apiUrl": "https://p2p.topolo.app",
1055
+ "domains": [
1056
+ "p2p.topolo.app"
1057
+ ],
1058
+ "routes": [
1059
+ "p2p.topolo.app"
1060
+ ],
1061
+ "serviceId": "p2p"
1062
+ }
1063
+ ]
1064
+ },
683
1065
  "pay": {
684
1066
  "id": "pay",
685
1067
  "appDir": "TopoloPay",
@@ -693,18 +1075,68 @@ var APPLICATIONS = {
693
1075
  {
694
1076
  "name": "topolo-pay",
695
1077
  "kind": "worker",
696
- "apiUrl": "https://topolo-pay.topolo.workers.dev",
697
- "domains": [],
1078
+ "apiUrl": "https://pay.topolo.app",
1079
+ "domains": [
1080
+ "pay.topolo.app"
1081
+ ],
698
1082
  "routes": [],
699
1083
  "serviceId": "pay"
700
1084
  }
701
1085
  ]
702
1086
  },
1087
+ "people": {
1088
+ "id": "people",
1089
+ "appDir": "TopoloPeople",
1090
+ "name": "topolo-people",
1091
+ "packageName": "topolo-people",
1092
+ "productionUrl": "https://people.topolo.app",
1093
+ "services": [
1094
+ "people"
1095
+ ],
1096
+ "deployTargets": [
1097
+ {
1098
+ "name": "topolo-people",
1099
+ "kind": "worker",
1100
+ "apiUrl": "https://people.topolo.app",
1101
+ "domains": [
1102
+ "people.topolo.app"
1103
+ ],
1104
+ "routes": [
1105
+ "people.topolo.app"
1106
+ ],
1107
+ "serviceId": "people"
1108
+ }
1109
+ ]
1110
+ },
1111
+ "pulse": {
1112
+ "id": "pulse",
1113
+ "appDir": "TopoloPulse",
1114
+ "name": "topolo-pulse",
1115
+ "packageName": "topolo-pulse",
1116
+ "productionUrl": "https://pulse.topolo.app",
1117
+ "services": [
1118
+ "pulse"
1119
+ ],
1120
+ "deployTargets": [
1121
+ {
1122
+ "name": "topolo-pulse",
1123
+ "kind": "worker",
1124
+ "apiUrl": "https://pulse.topolo.app",
1125
+ "domains": [
1126
+ "pulse.topolo.app"
1127
+ ],
1128
+ "routes": [
1129
+ "pulse.topolo.app"
1130
+ ],
1131
+ "serviceId": "pulse"
1132
+ }
1133
+ ]
1134
+ },
703
1135
  "quro": {
704
1136
  "id": "quro",
705
1137
  "appDir": "TopoloQuro",
706
1138
  "name": "TopoloQuro",
707
- "packageName": null,
1139
+ "packageName": "topolo-quro",
708
1140
  "productionUrl": "https://quro.topolo.app",
709
1141
  "services": [
710
1142
  "quro.api",
@@ -715,7 +1147,9 @@ var APPLICATIONS = {
715
1147
  "name": "quro-api",
716
1148
  "kind": "worker",
717
1149
  "apiUrl": "https://api.ol0.me",
718
- "domains": [],
1150
+ "domains": [
1151
+ "api.ol0.me"
1152
+ ],
719
1153
  "routes": [],
720
1154
  "serviceId": "quro.api"
721
1155
  },
@@ -723,7 +1157,9 @@ var APPLICATIONS = {
723
1157
  "name": "quro-redirect-system",
724
1158
  "kind": "worker",
725
1159
  "apiUrl": "https://ol0.me",
726
- "domains": [],
1160
+ "domains": [
1161
+ "ol0.me"
1162
+ ],
727
1163
  "routes": [
728
1164
  "ol0.me/*"
729
1165
  ],
@@ -731,9 +1167,11 @@ var APPLICATIONS = {
731
1167
  },
732
1168
  {
733
1169
  "name": "quro-ui",
734
- "kind": "pages",
1170
+ "kind": "worker",
735
1171
  "apiUrl": null,
736
- "domains": [],
1172
+ "domains": [
1173
+ "quro.topolo.app"
1174
+ ],
737
1175
  "routes": [],
738
1176
  "serviceId": null
739
1177
  }
@@ -750,8 +1188,8 @@ var APPLICATIONS = {
750
1188
  ],
751
1189
  "deployTargets": [
752
1190
  {
753
- "name": "roadmapper",
754
- "kind": "pages",
1191
+ "name": "topolo-roadmapper",
1192
+ "kind": "worker",
755
1193
  "apiUrl": null,
756
1194
  "domains": [
757
1195
  "roadmapper.topolo.app"
@@ -760,7 +1198,7 @@ var APPLICATIONS = {
760
1198
  "serviceId": null
761
1199
  },
762
1200
  {
763
- "name": "topolo-production-roadmapper",
1201
+ "name": "topolo-roadmapper-api",
764
1202
  "kind": "worker",
765
1203
  "apiUrl": "https://roadmapper-api.topolo.app",
766
1204
  "domains": [
@@ -771,6 +1209,30 @@ var APPLICATIONS = {
771
1209
  }
772
1210
  ]
773
1211
  },
1212
+ "sign": {
1213
+ "id": "sign",
1214
+ "appDir": "TopoloSign",
1215
+ "name": "topolo-sign",
1216
+ "packageName": "topolo-sign",
1217
+ "productionUrl": "https://sign.topolo.app",
1218
+ "services": [
1219
+ "sign"
1220
+ ],
1221
+ "deployTargets": [
1222
+ {
1223
+ "name": "topolo-sign",
1224
+ "kind": "worker",
1225
+ "apiUrl": "https://sign.topolo.app",
1226
+ "domains": [
1227
+ "sign.topolo.app"
1228
+ ],
1229
+ "routes": [
1230
+ "sign.topolo.app"
1231
+ ],
1232
+ "serviceId": "sign"
1233
+ }
1234
+ ]
1235
+ },
774
1236
  "social_studio": {
775
1237
  "id": "social_studio",
776
1238
  "appDir": "TopoloSocialStudio",
@@ -783,17 +1245,21 @@ var APPLICATIONS = {
783
1245
  "deployTargets": [
784
1246
  {
785
1247
  "name": "topolo-social-studio",
786
- "kind": "pages",
1248
+ "kind": "worker",
787
1249
  "apiUrl": null,
788
- "domains": [],
1250
+ "domains": [
1251
+ "studio.topolo.app"
1252
+ ],
789
1253
  "routes": [],
790
1254
  "serviceId": null
791
1255
  },
792
1256
  {
793
1257
  "name": "topolo-social-studio-api",
794
1258
  "kind": "worker",
795
- "apiUrl": "https://topolo-social-studio-api.topolo.workers.dev",
796
- "domains": [],
1259
+ "apiUrl": "https://studio-api.topolo.app",
1260
+ "domains": [
1261
+ "studio-api.topolo.app"
1262
+ ],
797
1263
  "routes": [],
798
1264
  "serviceId": "social_studio"
799
1265
  },
@@ -818,23 +1284,27 @@ var APPLICATIONS = {
818
1284
  ],
819
1285
  "deployTargets": [
820
1286
  {
821
- "name": "socialize",
1287
+ "name": "topolo-socialize",
822
1288
  "kind": "pages",
823
1289
  "apiUrl": null,
824
- "domains": [],
1290
+ "domains": [
1291
+ "socialize.topolo.app"
1292
+ ],
825
1293
  "routes": [],
826
1294
  "serviceId": null
827
1295
  },
828
1296
  {
829
- "name": "socialize-prod-api",
1297
+ "name": "topolo-socialize-api",
830
1298
  "kind": "worker",
831
- "apiUrl": "https://socialize-prod-api.topolo.workers.dev",
832
- "domains": [],
1299
+ "apiUrl": "https://socialize-api.topolo.app",
1300
+ "domains": [
1301
+ "socialize-api.topolo.app"
1302
+ ],
833
1303
  "routes": [],
834
1304
  "serviceId": "socialize"
835
1305
  },
836
1306
  {
837
- "name": "socialize-prod-scheduler",
1307
+ "name": "topolo-socialize-scheduler",
838
1308
  "kind": "worker",
839
1309
  "apiUrl": null,
840
1310
  "domains": [],
@@ -843,6 +1313,54 @@ var APPLICATIONS = {
843
1313
  }
844
1314
  ]
845
1315
  },
1316
+ "spaces": {
1317
+ "id": "spaces",
1318
+ "appDir": "TopoloSpaces",
1319
+ "name": "topolo-spaces",
1320
+ "packageName": "@topolo/spaces",
1321
+ "productionUrl": "https://spaces.topolo.app",
1322
+ "services": [
1323
+ "spaces"
1324
+ ],
1325
+ "deployTargets": [
1326
+ {
1327
+ "name": "topolo-spaces",
1328
+ "kind": "worker",
1329
+ "apiUrl": "https://spaces.topolo.app",
1330
+ "domains": [
1331
+ "spaces.topolo.app"
1332
+ ],
1333
+ "routes": [
1334
+ "spaces.topolo.app"
1335
+ ],
1336
+ "serviceId": "spaces"
1337
+ }
1338
+ ]
1339
+ },
1340
+ "status": {
1341
+ "id": "status",
1342
+ "appDir": "TopoloStatus",
1343
+ "name": "topolo-status",
1344
+ "packageName": "topolo-status",
1345
+ "productionUrl": "https://status.topolo.app",
1346
+ "services": [
1347
+ "status"
1348
+ ],
1349
+ "deployTargets": [
1350
+ {
1351
+ "name": "topolo-status",
1352
+ "kind": "worker",
1353
+ "apiUrl": "https://status.topolo.app",
1354
+ "domains": [
1355
+ "status.topolo.app"
1356
+ ],
1357
+ "routes": [
1358
+ "status.topolo.app"
1359
+ ],
1360
+ "serviceId": "status"
1361
+ }
1362
+ ]
1363
+ },
846
1364
  "support": {
847
1365
  "id": "support",
848
1366
  "appDir": "TopoloSupport",
@@ -855,7 +1373,7 @@ var APPLICATIONS = {
855
1373
  "deployTargets": [
856
1374
  {
857
1375
  "name": "topolo-support",
858
- "kind": "workers",
1376
+ "kind": "worker",
859
1377
  "apiUrl": "https://support.topolo.app",
860
1378
  "domains": [
861
1379
  "support.topolo.app"
@@ -867,6 +1385,54 @@ var APPLICATIONS = {
867
1385
  }
868
1386
  ]
869
1387
  },
1388
+ "survey": {
1389
+ "id": "survey",
1390
+ "appDir": "TopoloSurvey",
1391
+ "name": "topolo-survey",
1392
+ "packageName": "topolo-survey",
1393
+ "productionUrl": "https://survey.topolo.app",
1394
+ "services": [
1395
+ "survey"
1396
+ ],
1397
+ "deployTargets": [
1398
+ {
1399
+ "name": "topolo-survey",
1400
+ "kind": "worker",
1401
+ "apiUrl": "https://survey.topolo.app",
1402
+ "domains": [
1403
+ "survey.topolo.app"
1404
+ ],
1405
+ "routes": [
1406
+ "survey.topolo.app"
1407
+ ],
1408
+ "serviceId": "survey"
1409
+ }
1410
+ ]
1411
+ },
1412
+ "voice": {
1413
+ "id": "voice",
1414
+ "appDir": "TopoloVoice",
1415
+ "name": "topolo-voice",
1416
+ "packageName": "topolo-voice",
1417
+ "productionUrl": "https://voice.topolo.app",
1418
+ "services": [
1419
+ "voice"
1420
+ ],
1421
+ "deployTargets": [
1422
+ {
1423
+ "name": "topolo-voice",
1424
+ "kind": "worker",
1425
+ "apiUrl": "https://voice.topolo.app",
1426
+ "domains": [
1427
+ "voice.topolo.app"
1428
+ ],
1429
+ "routes": [
1430
+ "voice.topolo.app"
1431
+ ],
1432
+ "serviceId": "voice"
1433
+ }
1434
+ ]
1435
+ },
870
1436
  "web": {
871
1437
  "id": "web",
872
1438
  "appDir": "TopoloWeb",
@@ -878,7 +1444,7 @@ var APPLICATIONS = {
878
1444
  ],
879
1445
  "deployTargets": [
880
1446
  {
881
- "name": "topoloweb-api",
1447
+ "name": "topolo-web-api",
882
1448
  "kind": "worker",
883
1449
  "apiUrl": "https://web-api.topolo.app",
884
1450
  "domains": [
@@ -888,7 +1454,7 @@ var APPLICATIONS = {
888
1454
  "serviceId": "web"
889
1455
  },
890
1456
  {
891
- "name": "topoloweb-runtime",
1457
+ "name": "topolo-web-runtime",
892
1458
  "kind": "worker",
893
1459
  "apiUrl": "https://sites.topolo.app",
894
1460
  "domains": [
@@ -898,8 +1464,8 @@ var APPLICATIONS = {
898
1464
  "serviceId": null
899
1465
  },
900
1466
  {
901
- "name": "topoloweb-studio",
902
- "kind": "pages",
1467
+ "name": "topolo-web-studio",
1468
+ "kind": "worker",
903
1469
  "apiUrl": null,
904
1470
  "domains": [
905
1471
  "web.topolo.app"
@@ -910,7 +1476,7 @@ var APPLICATIONS = {
910
1476
  ]
911
1477
  }
912
1478
  };
913
- var APPLICATION_REQUIREMENTS_VERSION = "2026-04-22.1";
1479
+ var APPLICATION_REQUIREMENTS_VERSION = "2026-05-01.1";
914
1480
  var APPLICATION_REQUIREMENTS = [
915
1481
  {
916
1482
  id: "platform-metadata",
@@ -950,12 +1516,12 @@ var APPLICATION_REQUIREMENTS = [
950
1516
  summary: "Applications must derive identity, organization, scopes, and service entitlement from TopoloAuth rather than inventing parallel auth state.",
951
1517
  appliesTo: ["browser", "api", "tooling", "agent_surface"],
952
1518
  evidence: [
953
- "@topolo/auth-client or @topolo/auth-middleware is used where applicable",
1519
+ "@topolo/auth-client or @topolo-io/worker-runtime is used where applicable",
954
1520
  "No public command, tool, or SDK method accepts orgId",
955
1521
  "Service slug and Auth service registration are documented for protected services"
956
1522
  ],
957
1523
  implementation: [
958
- "Use shared auth packages instead of copying token parsing or browser storage flows",
1524
+ "Use shared auth/runtime packages instead of copying token parsing, gateway, or browser storage flows",
959
1525
  "Derive organization from the credential on every request",
960
1526
  "Route OAuth, refresh, logout, and SSO paths according to the shared Auth contract"
961
1527
  ]
@@ -968,14 +1534,16 @@ var APPLICATION_REQUIREMENTS = [
968
1534
  evidence: [
969
1535
  "@topolo/ui-kit is used for the platform shell where the app has authenticated UI",
970
1536
  "The shared launcher/app switcher is reachable from authenticated app chrome",
971
- "Account menu and sign-out behavior use TopoloAppShell or TopoloAccountMenu"
1537
+ "Account menu and sign-out behavior use TopoloAppShell or TopoloAccountMenu",
1538
+ "Authenticated app body content stays inside the viewport on mobile and desktop widths"
972
1539
  ],
973
1540
  implementation: [
974
1541
  "Use TopoloAppShell for authenticated app layouts",
975
1542
  "Use TopoloAccountMenu when a partial-shell surface still needs account chrome",
976
1543
  "Pass app-specific account actions as additive menu items instead of forking dropdowns",
977
1544
  "Use shared design tokens and platform UI primitives before creating local equivalents",
978
- "Keep mobile and desktop shell behavior aligned with the platform UI kit"
1545
+ "Keep mobile and desktop shell behavior aligned with the platform UI kit",
1546
+ "Constrain app-owned workspace wrappers with min-width: 0, width: auto, and viewport-aware max-width so shell padding cannot create page-level horizontal overflow"
979
1547
  ]
980
1548
  },
981
1549
  {
@@ -1042,6 +1610,22 @@ var APPLICATION_REQUIREMENTS = [
1042
1610
  "Keep command output JSON-stable for agents and human-readable with --no-json"
1043
1611
  ]
1044
1612
  },
1613
+ {
1614
+ id: "native-dashboard-widget",
1615
+ title: "Expose a native dashboard widget contract",
1616
+ summary: "Launchable first-party applications must populate TopoloOne live workspace through an app-owned /api/widget endpoint using the SDK widget response contract.",
1617
+ appliesTo: ["api"],
1618
+ evidence: [
1619
+ "The app-owned API exposes GET /api/widget",
1620
+ "The endpoint returns TopoloWidgetApiResponse from @topolo/sdk",
1621
+ "The endpoint derives organization/user context from the app auth boundary"
1622
+ ],
1623
+ implementation: [
1624
+ "Import createTopoloWidgetResponse from @topolo/sdk in the app backend",
1625
+ "Return native app metrics or action widgets instead of generic launch-card fallbacks",
1626
+ "Add a route-level test that validates the response with validateTopoloWidgetResponse"
1627
+ ]
1628
+ },
1045
1629
  {
1046
1630
  id: "observability-and-audit",
1047
1631
  title: "Emit platform audit and debugging signals",
@@ -1077,15 +1661,15 @@ var APPLICATION_REQUIREMENTS = [
1077
1661
  ];
1078
1662
  function applicationRequirementScopes(application) {
1079
1663
  const scopes = /* @__PURE__ */ new Set(["all"]);
1080
- const deployTargets = application.deployTargets;
1081
- const hasBrowserSurface = Boolean(application.productionUrl) || deployTargets.some((target) => target.kind === "pages");
1082
- const hasApiSurface = application.services.length > 0 || deployTargets.some((target) => Boolean(target.apiUrl));
1664
+ const appId = application.id;
1665
+ const hasBrowserSurface = Boolean(application.productionUrl) || application.deployTargets.some((target) => target.kind === "pages");
1666
+ const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.apiUrl));
1083
1667
  if (hasBrowserSurface) scopes.add("browser");
1084
1668
  if (hasApiSurface) scopes.add("api");
1085
- if (application.id === "cli" || application.id === "mcp" || application.id === "cloudcontrol") {
1669
+ if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
1086
1670
  scopes.add("tooling");
1087
1671
  }
1088
- if (application.id === "cli" || application.id === "mcp" || hasApiSurface) {
1672
+ if (appId === "cli" || appId === "mcp" || hasApiSurface) {
1089
1673
  scopes.add("agent_surface");
1090
1674
  }
1091
1675
  return Array.from(scopes);
@@ -1204,16 +1788,24 @@ function evaluateRequirement(application, requirement) {
1204
1788
  return finding(requirement, "met", "CloudControl deploy target metadata is present.", evidence);
1205
1789
  }
1206
1790
  case "agent-and-operator-surfaces": {
1791
+ const appId = application.id;
1207
1792
  if (application.services.length > 0) {
1208
1793
  evidence.push(`services=${application.services.join(",")}`);
1209
1794
  return finding(requirement, "partial", "SDK service discovery exists; typed SDK/CLI/MCP workflow coverage should be checked as APIs stabilize.", evidence);
1210
1795
  }
1211
- if (application.id === "cli" || application.id === "mcp" || application.id === "cloudcontrol") {
1212
- evidence.push(`tooling=${application.id}`);
1796
+ if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
1797
+ evidence.push(`tooling=${appId}`);
1213
1798
  return finding(requirement, "met", "This application is itself an agent/operator surface.", evidence);
1214
1799
  }
1215
1800
  return finding(requirement, "missing", "No SDK service or tooling surface is registered.", evidence);
1216
1801
  }
1802
+ case "native-dashboard-widget":
1803
+ return finding(
1804
+ requirement,
1805
+ "needs_review",
1806
+ "Catalog metadata cannot verify app-owned /api/widget implementation details.",
1807
+ evidence
1808
+ );
1217
1809
  case "observability-and-audit":
1218
1810
  return finding(
1219
1811
  requirement,
@@ -1265,30 +1857,46 @@ function statusRank(status) {
1265
1857
  }
1266
1858
  var DEFAULT_SERVICE_URLS = SERVICES;
1267
1859
  function resolveServiceUrl(service, overrides) {
1268
- var _a;
1269
- const override = overrides == null ? void 0 : overrides[service];
1860
+ const override = overrides?.[service];
1270
1861
  if (override) return override;
1271
1862
  const envKey = `TOPOLO_SERVICE_URL_${service.replace(/\./g, "_").toUpperCase()}`;
1272
- const envValue = typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a[envKey] : void 0;
1863
+ const envValue = typeof process !== "undefined" ? process.env?.[envKey] : void 0;
1273
1864
  if (envValue) return envValue;
1274
1865
  return DEFAULT_SERVICE_URLS[service];
1275
1866
  }
1276
1867
  var WRITE_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
1277
- var TopoloClient = class {
1868
+ var POSITIVE_CACHE_TTL_MS = 5 * 60 * 1e3;
1869
+ var NEGATIVE_CACHE_TTL_MS = 60 * 1e3;
1870
+ var TopoloClient = class _TopoloClient {
1278
1871
  credential;
1279
1872
  agent;
1280
1873
  serviceUrls;
1874
+ serviceIds;
1281
1875
  requireConfirmForWrites;
1282
1876
  timeoutMs;
1283
1877
  fetchImpl;
1284
1878
  debug;
1879
+ /**
1880
+ * Process-wide cache for slug → service-id lookups. Keyed by
1881
+ * `${authBaseUrl}|${slug}` so multiple `TopoloClient` instances pointing at
1882
+ * the same Auth share, but staging vs prod don't poison each other.
1883
+ * Cleared via `TopoloClient.clearServiceIdCache()` if a test needs it.
1884
+ */
1885
+ static serviceIdCache = /* @__PURE__ */ new Map();
1886
+ /**
1887
+ * Drop the slug→service-id cache. Test-only — production callers should
1888
+ * let the 5-minute TTL expire naturally.
1889
+ */
1890
+ static clearServiceIdCache() {
1891
+ _TopoloClient.serviceIdCache.clear();
1892
+ }
1285
1893
  constructor(options) {
1286
- var _a;
1287
1894
  if (!options.credential) throw new TopoloAuthError("credential is required");
1288
- if (!((_a = options.agent) == null ? void 0 : _a.clientName)) throw new TopoloAuthError("agent.clientName is required");
1895
+ if (!options.agent?.clientName) throw new TopoloAuthError("agent.clientName is required");
1289
1896
  this.credential = options.credential;
1290
1897
  this.agent = options.agent;
1291
1898
  this.serviceUrls = options.serviceUrls;
1899
+ this.serviceIds = options.serviceIds;
1292
1900
  this.requireConfirmForWrites = options.requireConfirmForWrites !== false;
1293
1901
  this.timeoutMs = options.timeoutMs ?? 3e4;
1294
1902
  this.fetchImpl = options.fetch ?? fetch;
@@ -1323,7 +1931,7 @@ var TopoloClient = class {
1323
1931
  const headers = new Headers();
1324
1932
  headers.set("Accept", "application/json");
1325
1933
  if (opts.body !== void 0) headers.set("Content-Type", "application/json");
1326
- const platformServiceId = PLATFORM_SERVICE_IDS[opts.service];
1934
+ const platformServiceId = resolveConfiguredServiceId(opts.service, this.serviceIds);
1327
1935
  if (platformServiceId) headers.set("X-Service-ID", platformServiceId);
1328
1936
  applyAuthHeaders(headers, this.credential);
1329
1937
  const requestId = generateRequestId();
@@ -1397,6 +2005,115 @@ var TopoloClient = class {
1397
2005
  });
1398
2006
  return parsed;
1399
2007
  }
2008
+ /**
2009
+ * Resolve a service-slug → opaque service-id via caller config or TopoloAuth.
2010
+ *
2011
+ * Cache: 5 minutes per process per `(slug, auth_base_url)`. Negative
2012
+ * results (404) are cached for 60s so a typo doesn't hot-loop the
2013
+ * resolver. Returns null when the slug isn't registered — callers decide
2014
+ * whether to throw.
2015
+ *
2016
+ * No credential is sent: the endpoint is public (slugs aren't secret).
2017
+ * This keeps the resolver usable during early bootstrap before a caller
2018
+ * has acquired an access token.
2019
+ */
2020
+ async getServiceIdBySlug(slug) {
2021
+ if (typeof slug !== "string") return null;
2022
+ const normalized = slug.trim().toLowerCase();
2023
+ if (!normalized) return null;
2024
+ const configuredServiceId = resolveConfiguredServiceId(normalized, this.serviceIds);
2025
+ if (configuredServiceId) return configuredServiceId;
2026
+ const authBase = resolveServiceUrl("auth", this.serviceUrls);
2027
+ const cacheKey = `${authBase}|${normalized}`;
2028
+ const now = Date.now();
2029
+ const cached = _TopoloClient.serviceIdCache.get(cacheKey);
2030
+ if (cached && cached.expiresAt > now) {
2031
+ return cached.value;
2032
+ }
2033
+ const url = new URL(
2034
+ `/api/services/by-slug/${encodeURIComponent(normalized)}`,
2035
+ authBase.endsWith("/") ? authBase : `${authBase}/`
2036
+ ).toString();
2037
+ let res;
2038
+ try {
2039
+ res = await this.fetchImpl(url, {
2040
+ method: "GET",
2041
+ headers: { Accept: "application/json" }
2042
+ });
2043
+ } catch {
2044
+ return null;
2045
+ }
2046
+ if (res.status === 404) {
2047
+ _TopoloClient.serviceIdCache.set(cacheKey, {
2048
+ value: null,
2049
+ expiresAt: now + NEGATIVE_CACHE_TTL_MS
2050
+ });
2051
+ return null;
2052
+ }
2053
+ if (!res.ok) {
2054
+ return null;
2055
+ }
2056
+ const body = await res.json().catch(() => null);
2057
+ const serviceId = body?.data?.service_id;
2058
+ const value = typeof serviceId === "string" && serviceId ? serviceId : null;
2059
+ _TopoloClient.serviceIdCache.set(cacheKey, {
2060
+ value,
2061
+ expiresAt: now + POSITIVE_CACHE_TTL_MS
2062
+ });
2063
+ return value;
2064
+ }
2065
+ /**
2066
+ * List the platform service catalog from the live registry
2067
+ * (`GET /api/services/catalog` on TopoloAuth). Credential-aware: the
2068
+ * caller's credential is attached, so an authenticated caller in an
2069
+ * entitled org also receives the `developer_only` services its role
2070
+ * permits; an unauthenticated/agent caller receives `active` only.
2071
+ *
2072
+ * Resilient: on any network/HTTP failure this falls back to the
2073
+ * build-time generated `APPLICATIONS` snapshot so offline/degraded
2074
+ * callers still get a usable (if static) catalog. The live result is
2075
+ * authoritative; the snapshot is a floor, not a cap.
2076
+ */
2077
+ async listServices() {
2078
+ try {
2079
+ const res = await this.request({ service: "auth", method: "GET", path: "/api/services/catalog" });
2080
+ const raw = res.data?.services ?? res.services;
2081
+ if (Array.isArray(raw) && raw.length > 0) {
2082
+ const entries = [];
2083
+ for (const item of raw) {
2084
+ const s = item;
2085
+ const serviceId = typeof s.service_id === "string" ? s.service_id : typeof s.id === "string" ? s.id : null;
2086
+ if (!serviceId) continue;
2087
+ entries.push({
2088
+ serviceId,
2089
+ slug: typeof s.app_slug === "string" ? s.app_slug : null,
2090
+ name: typeof s.name === "string" ? s.name : null,
2091
+ description: typeof s.description === "string" ? s.description : null,
2092
+ baseUrl: typeof s.base_url === "string" ? s.base_url : null,
2093
+ status: typeof s.status === "string" ? s.status : null,
2094
+ surfaceKind: typeof s.surface_kind === "string" ? s.surface_kind : null,
2095
+ launchable: s.launchable === true
2096
+ });
2097
+ }
2098
+ if (entries.length > 0) return entries;
2099
+ }
2100
+ } catch {
2101
+ }
2102
+ return this.generatedCatalogFallback();
2103
+ }
2104
+ generatedCatalogFallback() {
2105
+ const apps = Object.values(APPLICATIONS);
2106
+ return apps.map((app) => ({
2107
+ serviceId: app.id,
2108
+ slug: app.id,
2109
+ name: app.name ?? app.id,
2110
+ description: null,
2111
+ baseUrl: app.productionUrl ?? null,
2112
+ status: "active",
2113
+ surfaceKind: "application",
2114
+ launchable: Boolean(app.productionUrl)
2115
+ }));
2116
+ }
1400
2117
  /**
1401
2118
  * Introspect the current credential. Returns the caller's resolved identity,
1402
2119
  * organization, and permission set. Used by CLI `whoami` and by MCP to gate
@@ -1433,6 +2150,26 @@ var TopoloClient = class {
1433
2150
  };
1434
2151
  }
1435
2152
  };
2153
+ function resolveConfiguredServiceId(slug, serviceIds) {
2154
+ for (const serviceKey of serviceKeyCandidates(slug)) {
2155
+ const configured = serviceIds?.[serviceKey];
2156
+ if (typeof configured === "string" && configured.trim()) return configured.trim();
2157
+ const envKey = `TOPOLO_SERVICE_ID_${serviceKey.replace(/\./g, "_").toUpperCase()}`;
2158
+ const envValue = typeof process !== "undefined" ? process.env?.[envKey] : void 0;
2159
+ if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
2160
+ }
2161
+ return null;
2162
+ }
2163
+ function serviceKeyCandidates(slug) {
2164
+ const normalized = slug.trim().toLowerCase();
2165
+ const withoutTopolo = normalized.startsWith("topolo-") ? normalized.slice("topolo-".length) : normalized;
2166
+ return [.../* @__PURE__ */ new Set([
2167
+ normalized,
2168
+ normalized.replace(/-/g, "_"),
2169
+ withoutTopolo,
2170
+ withoutTopolo.replace(/-/g, "_")
2171
+ ])];
2172
+ }
1436
2173
  function describeError(body, fallback) {
1437
2174
  if (body && typeof body === "object") {
1438
2175
  const maybe = body;
@@ -1473,7 +2210,6 @@ var CrmModule = class {
1473
2210
  }
1474
2211
  client;
1475
2212
  async listContacts(options = {}) {
1476
- var _a, _b, _c;
1477
2213
  const res = await this.client.request({
1478
2214
  service: "crm",
1479
2215
  path: "/api/contacts",
@@ -1483,12 +2219,12 @@ var CrmModule = class {
1483
2219
  pageSize: options.pageSize
1484
2220
  }
1485
2221
  });
1486
- const rows = Array.isArray(res == null ? void 0 : res.contacts) ? res.contacts : Array.isArray(res == null ? void 0 : res.data) ? res.data : [];
2222
+ const rows = Array.isArray(res?.contacts) ? res.contacts : Array.isArray(res?.data) ? res.data : [];
1487
2223
  return {
1488
2224
  contacts: rows.map(toSummary),
1489
- total: (res == null ? void 0 : res.total) ?? ((_a = res == null ? void 0 : res.pagination) == null ? void 0 : _a.total) ?? rows.length,
1490
- page: (res == null ? void 0 : res.page) ?? ((_b = res == null ? void 0 : res.pagination) == null ? void 0 : _b.page) ?? options.page ?? 1,
1491
- pageSize: (res == null ? void 0 : res.pageSize) ?? ((_c = res == null ? void 0 : res.pagination) == null ? void 0 : _c.pageSize) ?? options.pageSize ?? rows.length
2225
+ total: res?.total ?? res?.pagination?.total ?? rows.length,
2226
+ page: res?.page ?? res?.pagination?.page ?? options.page ?? 1,
2227
+ pageSize: res?.pageSize ?? res?.pagination?.pageSize ?? options.pageSize ?? rows.length
1492
2228
  };
1493
2229
  }
1494
2230
  async getContact(contactId) {
@@ -1638,7 +2374,7 @@ var TOOLS = [
1638
2374
  {
1639
2375
  name: "topolo_list_applications",
1640
2376
  title: "List every Topolo platform application",
1641
- description: "Returns the generated Topolo application catalog, including pages-only apps, tooling apps, and API-backed apps. Use this before choosing a service-specific or generic API operation. Pure metadata: no credential introspection, no permission check, no external call.",
2377
+ description: "Returns the live Topolo application catalog from the platform registry. Reflects apps as they are registered/removed with no client rebuild. Authenticated callers in an entitled org also see the developer_only apps their role permits. Falls back to a bundled snapshot only if the registry is unreachable.",
1642
2378
  requiredScopes: [],
1643
2379
  destructive: false,
1644
2380
  inputSchema: {
@@ -1646,14 +2382,14 @@ var TOOLS = [
1646
2382
  properties: {},
1647
2383
  additionalProperties: false
1648
2384
  },
1649
- handler: async () => ({
1650
- applications: APPLICATION_IDS.map((id) => APPLICATIONS[id])
2385
+ handler: async (topolo) => ({
2386
+ applications: await topolo.client.listServices()
1651
2387
  })
1652
2388
  },
1653
2389
  {
1654
2390
  name: "topolo_get_application",
1655
2391
  title: "Describe one Topolo platform application",
1656
- description: "Returns one application catalog entry with its package name, production URL, deploy targets, and SDK service IDs when the app has callable APIs. Pure metadata: no credential introspection, no permission check, no external call.",
2392
+ description: "Returns one live application catalog entry (service id, slug, name, base URL, status). Accepts the service id, slug, or name. Resolved against the live registry so newly-registered apps work without a client rebuild.",
1657
2393
  requiredScopes: [],
1658
2394
  destructive: false,
1659
2395
  inputSchema: {
@@ -1661,21 +2397,29 @@ var TOOLS = [
1661
2397
  properties: {
1662
2398
  application: {
1663
2399
  type: "string",
1664
- enum: APPLICATION_IDS,
1665
- description: "Application ID from topolo_list_applications."
2400
+ description: "Application identifier: service id, slug, or name from topolo_list_applications."
1666
2401
  }
1667
2402
  },
1668
2403
  required: ["application"],
1669
2404
  additionalProperties: false
1670
2405
  },
1671
- handler: async (_topolo, args) => {
2406
+ handler: async (topolo, args) => {
1672
2407
  const application = args["application"];
1673
- if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
2408
+ if (typeof application !== "string" || !application.trim()) {
2409
+ throw new Error("`application` must be a non-empty string.");
2410
+ }
2411
+ const needle = application.trim().toLowerCase();
2412
+ const catalog = await topolo.client.listServices();
2413
+ const match = catalog.find(
2414
+ (e) => e.serviceId.toLowerCase() === needle || e.slug && e.slug.toLowerCase() === needle || e.name && e.name.toLowerCase() === needle
2415
+ );
2416
+ if (!match) {
2417
+ const known = catalog.map((e) => e.slug || e.serviceId).sort().join(", ");
1674
2418
  throw new Error(
1675
- `Unknown application "${String(application)}". Known: ${APPLICATION_IDS.join(", ")}`
2419
+ `Unknown application "${application}". Known: ${known}`
1676
2420
  );
1677
2421
  }
1678
- return { application: APPLICATIONS[application] };
2422
+ return { application: match };
1679
2423
  }
1680
2424
  },
1681
2425
  {
@@ -1920,7 +2664,7 @@ function statusesAtOrWorse(threshold) {
1920
2664
  }
1921
2665
 
1922
2666
  // src/version.ts
1923
- var MCP_VERSION = "0.2.5";
2667
+ var MCP_VERSION = "0.4.0";
1924
2668
 
1925
2669
  // src/server.ts
1926
2670
  function buildServer(topolo, scopes, tools = TOOLS) {