@topolo/mcp 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -5
- package/dist/dispatch.js +30 -20
- package/dist/index.js +531 -210
- package/package.json +4 -2
package/dist/index.js
CHANGED
|
@@ -61,6 +61,7 @@ var TopoloHttpError = class extends TopoloSdkError {
|
|
|
61
61
|
var SERVICES = {
|
|
62
62
|
agent: "https://agent-api.topolo.app",
|
|
63
63
|
auth: "https://auth.topolo.app",
|
|
64
|
+
backup: "https://backup.topolo.app",
|
|
64
65
|
books: "https://books.topolo.app",
|
|
65
66
|
bugfix: "https://bugfix.topolo.app",
|
|
66
67
|
bytes: "https://bytes-api.topolo.app",
|
|
@@ -71,7 +72,6 @@ var SERVICES = {
|
|
|
71
72
|
compose: "https://compose.topolo.app",
|
|
72
73
|
consent: "https://consent.topolo.app",
|
|
73
74
|
crm: "https://crm-api.topolo.app",
|
|
74
|
-
customer_success: "https://success.topolo.app",
|
|
75
75
|
developers: "https://developers.topolo.app",
|
|
76
76
|
director: "https://director.topolo.app",
|
|
77
77
|
feed: "https://feed-api.topolo.app",
|
|
@@ -85,9 +85,10 @@ var SERVICES = {
|
|
|
85
85
|
localize: "https://localize.topolo.app",
|
|
86
86
|
mail: "https://mail.topolo.app",
|
|
87
87
|
mdm: "https://mdm-api.topolo.app",
|
|
88
|
-
|
|
88
|
+
messages: "https://messages.topolo.app",
|
|
89
89
|
nexus: "https://nexus-api.topolo.app",
|
|
90
90
|
notify: "https://notify.topolo.app",
|
|
91
|
+
observability_watch: "https://observability-watch.topolo.app",
|
|
91
92
|
one: "https://one.topolo.app",
|
|
92
93
|
p2p: "https://p2p.topolo.app",
|
|
93
94
|
pay: "https://pay.topolo.app",
|
|
@@ -101,6 +102,7 @@ var SERVICES = {
|
|
|
101
102
|
socialize: "https://socialize-api.topolo.app",
|
|
102
103
|
spaces: "https://spaces.topolo.app",
|
|
103
104
|
status: "https://status.topolo.app",
|
|
105
|
+
success: "https://success.topolo.app",
|
|
104
106
|
support: "https://support.topolo.app",
|
|
105
107
|
survey: "https://survey.topolo.app",
|
|
106
108
|
voice: "https://voice.topolo.app",
|
|
@@ -117,13 +119,21 @@ var APPLICATIONS = {
|
|
|
117
119
|
"deployTargets": [
|
|
118
120
|
{
|
|
119
121
|
"name": "topolo-admin",
|
|
120
|
-
"kind": "
|
|
121
|
-
"apiUrl":
|
|
122
|
+
"kind": "worker",
|
|
123
|
+
"apiUrl": "https://admin.topolo.app",
|
|
122
124
|
"domains": [
|
|
123
125
|
"admin.topolo.app"
|
|
124
126
|
],
|
|
125
127
|
"routes": [],
|
|
126
128
|
"serviceId": null
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "topolo-admin-api",
|
|
132
|
+
"kind": "worker",
|
|
133
|
+
"apiUrl": null,
|
|
134
|
+
"domains": [],
|
|
135
|
+
"routes": [],
|
|
136
|
+
"serviceId": null
|
|
127
137
|
}
|
|
128
138
|
]
|
|
129
139
|
},
|
|
@@ -140,7 +150,7 @@ var APPLICATIONS = {
|
|
|
140
150
|
{
|
|
141
151
|
"name": "topolo-agent",
|
|
142
152
|
"kind": "worker",
|
|
143
|
-
"apiUrl":
|
|
153
|
+
"apiUrl": "https://agent.topolo.app",
|
|
144
154
|
"domains": [
|
|
145
155
|
"agent.topolo.app"
|
|
146
156
|
],
|
|
@@ -148,7 +158,7 @@ var APPLICATIONS = {
|
|
|
148
158
|
"serviceId": null
|
|
149
159
|
},
|
|
150
160
|
{
|
|
151
|
-
"name": "topolo-agent-
|
|
161
|
+
"name": "topolo-agent-api",
|
|
152
162
|
"kind": "worker",
|
|
153
163
|
"apiUrl": "https://agent-api.topolo.app",
|
|
154
164
|
"domains": [
|
|
@@ -188,16 +198,20 @@ var APPLICATIONS = {
|
|
|
188
198
|
"appDir": "TopoloBackup",
|
|
189
199
|
"name": "topolo-backup",
|
|
190
200
|
"packageName": "topolo-backup",
|
|
191
|
-
"productionUrl":
|
|
192
|
-
"services": [
|
|
201
|
+
"productionUrl": "https://backup.topolo.app",
|
|
202
|
+
"services": [
|
|
203
|
+
"backup"
|
|
204
|
+
],
|
|
193
205
|
"deployTargets": [
|
|
194
206
|
{
|
|
195
207
|
"name": "topolo-backup",
|
|
196
208
|
"kind": "worker",
|
|
197
|
-
"apiUrl":
|
|
198
|
-
"domains": [
|
|
209
|
+
"apiUrl": "https://backup.topolo.app",
|
|
210
|
+
"domains": [
|
|
211
|
+
"backup.topolo.app"
|
|
212
|
+
],
|
|
199
213
|
"routes": [],
|
|
200
|
-
"serviceId":
|
|
214
|
+
"serviceId": "backup"
|
|
201
215
|
}
|
|
202
216
|
]
|
|
203
217
|
},
|
|
@@ -218,10 +232,16 @@ var APPLICATIONS = {
|
|
|
218
232
|
"domains": [
|
|
219
233
|
"books.topolo.app"
|
|
220
234
|
],
|
|
221
|
-
"routes": [
|
|
222
|
-
"books.topolo.app"
|
|
223
|
-
],
|
|
235
|
+
"routes": [],
|
|
224
236
|
"serviceId": "books"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"name": "topolo-books-api",
|
|
240
|
+
"kind": "worker",
|
|
241
|
+
"apiUrl": null,
|
|
242
|
+
"domains": [],
|
|
243
|
+
"routes": [],
|
|
244
|
+
"serviceId": null
|
|
225
245
|
}
|
|
226
246
|
]
|
|
227
247
|
},
|
|
@@ -242,9 +262,7 @@ var APPLICATIONS = {
|
|
|
242
262
|
"domains": [
|
|
243
263
|
"bugfix.topolo.app"
|
|
244
264
|
],
|
|
245
|
-
"routes": [
|
|
246
|
-
"bugfix.topolo.app"
|
|
247
|
-
],
|
|
265
|
+
"routes": [],
|
|
248
266
|
"serviceId": "bugfix"
|
|
249
267
|
}
|
|
250
268
|
]
|
|
@@ -261,8 +279,8 @@ var APPLICATIONS = {
|
|
|
261
279
|
"deployTargets": [
|
|
262
280
|
{
|
|
263
281
|
"name": "topolo-bytes",
|
|
264
|
-
"kind": "
|
|
265
|
-
"apiUrl":
|
|
282
|
+
"kind": "worker",
|
|
283
|
+
"apiUrl": "https://bytes.topolo.app",
|
|
266
284
|
"domains": [
|
|
267
285
|
"bytes.topolo.app"
|
|
268
286
|
],
|
|
@@ -298,10 +316,16 @@ var APPLICATIONS = {
|
|
|
298
316
|
"domains": [
|
|
299
317
|
"calendar.topolo.app"
|
|
300
318
|
],
|
|
301
|
-
"routes": [
|
|
302
|
-
"calendar.topolo.app"
|
|
303
|
-
],
|
|
319
|
+
"routes": [],
|
|
304
320
|
"serviceId": "calendar"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"name": "topolo-calendar-api",
|
|
324
|
+
"kind": "worker",
|
|
325
|
+
"apiUrl": null,
|
|
326
|
+
"domains": [],
|
|
327
|
+
"routes": [],
|
|
328
|
+
"serviceId": null
|
|
305
329
|
}
|
|
306
330
|
]
|
|
307
331
|
},
|
|
@@ -344,22 +368,19 @@ var APPLICATIONS = {
|
|
|
344
368
|
"domains": [
|
|
345
369
|
"chat.topolo.app"
|
|
346
370
|
],
|
|
347
|
-
"routes": [
|
|
348
|
-
"chat.topolo.app"
|
|
349
|
-
],
|
|
371
|
+
"routes": [],
|
|
350
372
|
"serviceId": "chat"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"name": "topolo-chat-api",
|
|
376
|
+
"kind": "worker",
|
|
377
|
+
"apiUrl": null,
|
|
378
|
+
"domains": [],
|
|
379
|
+
"routes": [],
|
|
380
|
+
"serviceId": null
|
|
351
381
|
}
|
|
352
382
|
]
|
|
353
383
|
},
|
|
354
|
-
"cloudcontrol": {
|
|
355
|
-
"id": "cloudcontrol",
|
|
356
|
-
"appDir": "TopoloCloudControl",
|
|
357
|
-
"name": "cloudcontrol",
|
|
358
|
-
"packageName": "topolo-cloudcontrol",
|
|
359
|
-
"productionUrl": null,
|
|
360
|
-
"services": [],
|
|
361
|
-
"deployTargets": []
|
|
362
|
-
},
|
|
363
384
|
"commerce": {
|
|
364
385
|
"id": "commerce",
|
|
365
386
|
"appDir": "TopoloCommerce",
|
|
@@ -382,8 +403,8 @@ var APPLICATIONS = {
|
|
|
382
403
|
},
|
|
383
404
|
{
|
|
384
405
|
"name": "topolo-commerce-guest-web",
|
|
385
|
-
"kind": "
|
|
386
|
-
"apiUrl":
|
|
406
|
+
"kind": "worker",
|
|
407
|
+
"apiUrl": "https://guest.topolo.app",
|
|
387
408
|
"domains": [
|
|
388
409
|
"guest.topolo.app"
|
|
389
410
|
],
|
|
@@ -392,8 +413,8 @@ var APPLICATIONS = {
|
|
|
392
413
|
},
|
|
393
414
|
{
|
|
394
415
|
"name": "topolo-commerce-ops-web",
|
|
395
|
-
"kind": "
|
|
396
|
-
"apiUrl":
|
|
416
|
+
"kind": "worker",
|
|
417
|
+
"apiUrl": "https://commerce.topolo.app",
|
|
397
418
|
"domains": [
|
|
398
419
|
"commerce.topolo.app"
|
|
399
420
|
],
|
|
@@ -402,8 +423,8 @@ var APPLICATIONS = {
|
|
|
402
423
|
},
|
|
403
424
|
{
|
|
404
425
|
"name": "topolo-commerce-station-web",
|
|
405
|
-
"kind": "
|
|
406
|
-
"apiUrl":
|
|
426
|
+
"kind": "worker",
|
|
427
|
+
"apiUrl": "https://station-commerce.topolo.app",
|
|
407
428
|
"domains": [
|
|
408
429
|
"station-commerce.topolo.app"
|
|
409
430
|
],
|
|
@@ -429,10 +450,16 @@ var APPLICATIONS = {
|
|
|
429
450
|
"domains": [
|
|
430
451
|
"compose.topolo.app"
|
|
431
452
|
],
|
|
432
|
-
"routes": [
|
|
433
|
-
"compose.topolo.app"
|
|
434
|
-
],
|
|
453
|
+
"routes": [],
|
|
435
454
|
"serviceId": "compose"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"name": "topolo-compose-api",
|
|
458
|
+
"kind": "worker",
|
|
459
|
+
"apiUrl": null,
|
|
460
|
+
"domains": [],
|
|
461
|
+
"routes": [],
|
|
462
|
+
"serviceId": null
|
|
436
463
|
}
|
|
437
464
|
]
|
|
438
465
|
},
|
|
@@ -453,10 +480,16 @@ var APPLICATIONS = {
|
|
|
453
480
|
"domains": [
|
|
454
481
|
"consent.topolo.app"
|
|
455
482
|
],
|
|
456
|
-
"routes": [
|
|
457
|
-
"consent.topolo.app"
|
|
458
|
-
],
|
|
483
|
+
"routes": [],
|
|
459
484
|
"serviceId": "consent"
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"name": "topolo-consent-api",
|
|
488
|
+
"kind": "worker",
|
|
489
|
+
"apiUrl": null,
|
|
490
|
+
"domains": [],
|
|
491
|
+
"routes": [],
|
|
492
|
+
"serviceId": null
|
|
460
493
|
}
|
|
461
494
|
]
|
|
462
495
|
},
|
|
@@ -483,7 +516,7 @@ var APPLICATIONS = {
|
|
|
483
516
|
{
|
|
484
517
|
"name": "topolo-crm-app",
|
|
485
518
|
"kind": "worker",
|
|
486
|
-
"apiUrl":
|
|
519
|
+
"apiUrl": "https://crm.topolo.app",
|
|
487
520
|
"domains": [
|
|
488
521
|
"crm.topolo.app"
|
|
489
522
|
],
|
|
@@ -492,30 +525,6 @@ var APPLICATIONS = {
|
|
|
492
525
|
}
|
|
493
526
|
]
|
|
494
527
|
},
|
|
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"
|
|
516
|
-
}
|
|
517
|
-
]
|
|
518
|
-
},
|
|
519
528
|
"developers": {
|
|
520
529
|
"id": "developers",
|
|
521
530
|
"appDir": "TopoloDevelopers",
|
|
@@ -543,6 +552,14 @@ var APPLICATIONS = {
|
|
|
543
552
|
],
|
|
544
553
|
"routes": [],
|
|
545
554
|
"serviceId": "developers"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"name": "topolo-developers-api",
|
|
558
|
+
"kind": "worker",
|
|
559
|
+
"apiUrl": null,
|
|
560
|
+
"domains": [],
|
|
561
|
+
"routes": [],
|
|
562
|
+
"serviceId": null
|
|
546
563
|
}
|
|
547
564
|
]
|
|
548
565
|
},
|
|
@@ -563,10 +580,16 @@ var APPLICATIONS = {
|
|
|
563
580
|
"domains": [
|
|
564
581
|
"director.topolo.app"
|
|
565
582
|
],
|
|
566
|
-
"routes": [
|
|
567
|
-
"director.topolo.app"
|
|
568
|
-
],
|
|
583
|
+
"routes": [],
|
|
569
584
|
"serviceId": "director"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"name": "topolo-director-api",
|
|
588
|
+
"kind": "worker",
|
|
589
|
+
"apiUrl": null,
|
|
590
|
+
"domains": [],
|
|
591
|
+
"routes": [],
|
|
592
|
+
"serviceId": null
|
|
570
593
|
}
|
|
571
594
|
]
|
|
572
595
|
},
|
|
@@ -580,13 +603,21 @@ var APPLICATIONS = {
|
|
|
580
603
|
"deployTargets": [
|
|
581
604
|
{
|
|
582
605
|
"name": "topolo-docs",
|
|
583
|
-
"kind": "
|
|
584
|
-
"apiUrl":
|
|
606
|
+
"kind": "worker",
|
|
607
|
+
"apiUrl": "https://docs.topolo.app",
|
|
585
608
|
"domains": [
|
|
586
609
|
"docs.topolo.app"
|
|
587
610
|
],
|
|
588
611
|
"routes": [],
|
|
589
612
|
"serviceId": null
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"name": "topolo-docs-api",
|
|
616
|
+
"kind": "worker",
|
|
617
|
+
"apiUrl": null,
|
|
618
|
+
"domains": [],
|
|
619
|
+
"routes": [],
|
|
620
|
+
"serviceId": null
|
|
590
621
|
}
|
|
591
622
|
]
|
|
592
623
|
},
|
|
@@ -595,7 +626,7 @@ var APPLICATIONS = {
|
|
|
595
626
|
"appDir": "TopoloFeed",
|
|
596
627
|
"name": "TopoloFeed",
|
|
597
628
|
"packageName": "topolo-feed",
|
|
598
|
-
"productionUrl": "https://feed
|
|
629
|
+
"productionUrl": "https://feed.topolo.app",
|
|
599
630
|
"services": [
|
|
600
631
|
"feed"
|
|
601
632
|
],
|
|
@@ -607,9 +638,7 @@ var APPLICATIONS = {
|
|
|
607
638
|
"domains": [
|
|
608
639
|
"feed-analytics-api.topolo.app"
|
|
609
640
|
],
|
|
610
|
-
"routes": [
|
|
611
|
-
"feed-analytics-api.topolo.app"
|
|
612
|
-
],
|
|
641
|
+
"routes": [],
|
|
613
642
|
"serviceId": null
|
|
614
643
|
},
|
|
615
644
|
{
|
|
@@ -619,10 +648,18 @@ var APPLICATIONS = {
|
|
|
619
648
|
"domains": [
|
|
620
649
|
"feed-api.topolo.app"
|
|
621
650
|
],
|
|
622
|
-
"routes": [
|
|
623
|
-
"feed-api.topolo.app"
|
|
624
|
-
],
|
|
651
|
+
"routes": [],
|
|
625
652
|
"serviceId": "feed"
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"name": "topolo-feed-web",
|
|
656
|
+
"kind": "worker",
|
|
657
|
+
"apiUrl": "https://feed.topolo.app",
|
|
658
|
+
"domains": [
|
|
659
|
+
"feed.topolo.app"
|
|
660
|
+
],
|
|
661
|
+
"routes": [],
|
|
662
|
+
"serviceId": null
|
|
626
663
|
}
|
|
627
664
|
]
|
|
628
665
|
},
|
|
@@ -643,17 +680,23 @@ var APPLICATIONS = {
|
|
|
643
680
|
"domains": [
|
|
644
681
|
"flow.topolo.app"
|
|
645
682
|
],
|
|
646
|
-
"routes": [
|
|
647
|
-
"flow.topolo.app"
|
|
648
|
-
],
|
|
683
|
+
"routes": [],
|
|
649
684
|
"serviceId": "flow"
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"name": "topolo-flow-api",
|
|
688
|
+
"kind": "worker",
|
|
689
|
+
"apiUrl": null,
|
|
690
|
+
"domains": [],
|
|
691
|
+
"routes": [],
|
|
692
|
+
"serviceId": null
|
|
650
693
|
}
|
|
651
694
|
]
|
|
652
695
|
},
|
|
653
696
|
"forecast": {
|
|
654
697
|
"id": "forecast",
|
|
655
698
|
"appDir": "TopoloForecast",
|
|
656
|
-
"name": "forecast
|
|
699
|
+
"name": "topolo-forecast",
|
|
657
700
|
"packageName": "topolo-forecast",
|
|
658
701
|
"productionUrl": "https://forecast.topolo.app",
|
|
659
702
|
"services": [
|
|
@@ -663,7 +706,7 @@ var APPLICATIONS = {
|
|
|
663
706
|
{
|
|
664
707
|
"name": "topolo-forecast",
|
|
665
708
|
"kind": "worker",
|
|
666
|
-
"apiUrl":
|
|
709
|
+
"apiUrl": "https://forecast.topolo.app",
|
|
667
710
|
"domains": [
|
|
668
711
|
"forecast.topolo.app"
|
|
669
712
|
],
|
|
@@ -699,10 +742,16 @@ var APPLICATIONS = {
|
|
|
699
742
|
"domains": [
|
|
700
743
|
"forms.topolo.app"
|
|
701
744
|
],
|
|
702
|
-
"routes": [
|
|
703
|
-
"forms.topolo.app"
|
|
704
|
-
],
|
|
745
|
+
"routes": [],
|
|
705
746
|
"serviceId": "forms"
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
"name": "topolo-forms-api",
|
|
750
|
+
"kind": "worker",
|
|
751
|
+
"apiUrl": null,
|
|
752
|
+
"domains": [],
|
|
753
|
+
"routes": [],
|
|
754
|
+
"serviceId": null
|
|
706
755
|
}
|
|
707
756
|
]
|
|
708
757
|
},
|
|
@@ -723,10 +772,16 @@ var APPLICATIONS = {
|
|
|
723
772
|
"domains": [
|
|
724
773
|
"home.topolo.app"
|
|
725
774
|
],
|
|
726
|
-
"routes": [
|
|
727
|
-
"home.topolo.app"
|
|
728
|
-
],
|
|
775
|
+
"routes": [],
|
|
729
776
|
"serviceId": "home"
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"name": "topolo-home-api",
|
|
780
|
+
"kind": "worker",
|
|
781
|
+
"apiUrl": null,
|
|
782
|
+
"domains": [],
|
|
783
|
+
"routes": [],
|
|
784
|
+
"serviceId": null
|
|
730
785
|
}
|
|
731
786
|
]
|
|
732
787
|
},
|
|
@@ -747,10 +802,16 @@ var APPLICATIONS = {
|
|
|
747
802
|
"domains": [
|
|
748
803
|
"insights.topolo.app"
|
|
749
804
|
],
|
|
750
|
-
"routes": [
|
|
751
|
-
"insights.topolo.app"
|
|
752
|
-
],
|
|
805
|
+
"routes": [],
|
|
753
806
|
"serviceId": "insights"
|
|
807
|
+
},
|
|
808
|
+
{
|
|
809
|
+
"name": "topolo-insights-api",
|
|
810
|
+
"kind": "worker",
|
|
811
|
+
"apiUrl": null,
|
|
812
|
+
"domains": [],
|
|
813
|
+
"routes": [],
|
|
814
|
+
"serviceId": null
|
|
754
815
|
}
|
|
755
816
|
]
|
|
756
817
|
},
|
|
@@ -771,10 +832,16 @@ var APPLICATIONS = {
|
|
|
771
832
|
"domains": [
|
|
772
833
|
"inventory.topolo.app"
|
|
773
834
|
],
|
|
774
|
-
"routes": [
|
|
775
|
-
"inventory.topolo.app"
|
|
776
|
-
],
|
|
835
|
+
"routes": [],
|
|
777
836
|
"serviceId": "inventory"
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
"name": "topolo-inventory-api",
|
|
840
|
+
"kind": "worker",
|
|
841
|
+
"apiUrl": null,
|
|
842
|
+
"domains": [],
|
|
843
|
+
"routes": [],
|
|
844
|
+
"serviceId": null
|
|
778
845
|
}
|
|
779
846
|
]
|
|
780
847
|
},
|
|
@@ -791,7 +858,7 @@ var APPLICATIONS = {
|
|
|
791
858
|
{
|
|
792
859
|
"name": "topolo-learn",
|
|
793
860
|
"kind": "worker",
|
|
794
|
-
"apiUrl":
|
|
861
|
+
"apiUrl": "https://learn.topolo.app",
|
|
795
862
|
"domains": [
|
|
796
863
|
"learn.topolo.app"
|
|
797
864
|
],
|
|
@@ -851,10 +918,16 @@ var APPLICATIONS = {
|
|
|
851
918
|
"domains": [
|
|
852
919
|
"mail.topolo.app"
|
|
853
920
|
],
|
|
854
|
-
"routes": [
|
|
855
|
-
"mail.topolo.app"
|
|
856
|
-
],
|
|
921
|
+
"routes": [],
|
|
857
922
|
"serviceId": "mail"
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
"name": "topolo-mail-api",
|
|
926
|
+
"kind": "worker",
|
|
927
|
+
"apiUrl": null,
|
|
928
|
+
"domains": [],
|
|
929
|
+
"routes": [],
|
|
930
|
+
"serviceId": null
|
|
858
931
|
}
|
|
859
932
|
]
|
|
860
933
|
},
|
|
@@ -875,47 +948,51 @@ var APPLICATIONS = {
|
|
|
875
948
|
"domains": [
|
|
876
949
|
"mdm-api.topolo.app"
|
|
877
950
|
],
|
|
878
|
-
"routes": [
|
|
879
|
-
"mdm-api.topolo.app"
|
|
880
|
-
],
|
|
951
|
+
"routes": [],
|
|
881
952
|
"serviceId": "mdm"
|
|
882
953
|
},
|
|
883
954
|
{
|
|
884
955
|
"name": "topolo-mdm-console",
|
|
885
956
|
"kind": "worker",
|
|
886
|
-
"apiUrl":
|
|
957
|
+
"apiUrl": "https://mdm.topolo.app",
|
|
887
958
|
"domains": [
|
|
888
959
|
"mdm.topolo.app"
|
|
889
960
|
],
|
|
890
|
-
"routes": [
|
|
891
|
-
"mdm.topolo.app"
|
|
892
|
-
],
|
|
961
|
+
"routes": [],
|
|
893
962
|
"serviceId": null
|
|
894
963
|
}
|
|
895
964
|
]
|
|
896
965
|
},
|
|
897
|
-
"
|
|
898
|
-
"id": "
|
|
899
|
-
"appDir": "
|
|
900
|
-
"name": "topolo-
|
|
901
|
-
"packageName": "topolo-
|
|
966
|
+
"messages": {
|
|
967
|
+
"id": "messages",
|
|
968
|
+
"appDir": "TopoloMessages",
|
|
969
|
+
"name": "topolo-messages",
|
|
970
|
+
"packageName": "topolo-messages",
|
|
902
971
|
"productionUrl": "https://messages.topolo.app",
|
|
903
972
|
"services": [
|
|
904
|
-
"
|
|
973
|
+
"messages"
|
|
905
974
|
],
|
|
906
975
|
"deployTargets": [
|
|
907
976
|
{
|
|
908
|
-
"name": "topolo-
|
|
977
|
+
"name": "topolo-messages",
|
|
909
978
|
"kind": "worker",
|
|
910
979
|
"apiUrl": "https://messages.topolo.app",
|
|
911
980
|
"domains": [
|
|
912
981
|
"messages.topolo.app"
|
|
913
982
|
],
|
|
914
983
|
"routes": [],
|
|
915
|
-
"serviceId": "
|
|
984
|
+
"serviceId": "messages"
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"name": "topolo-messages-api",
|
|
988
|
+
"kind": "worker",
|
|
989
|
+
"apiUrl": null,
|
|
990
|
+
"domains": [],
|
|
991
|
+
"routes": [],
|
|
992
|
+
"serviceId": null
|
|
916
993
|
},
|
|
917
994
|
{
|
|
918
|
-
"name": "topolo-
|
|
995
|
+
"name": "topolo-messages-dispatch",
|
|
919
996
|
"kind": "worker",
|
|
920
997
|
"apiUrl": null,
|
|
921
998
|
"domains": [],
|
|
@@ -985,9 +1062,22 @@ var APPLICATIONS = {
|
|
|
985
1062
|
"appDir": "TopoloObservabilityWatch",
|
|
986
1063
|
"name": "topolo-observability-watch",
|
|
987
1064
|
"packageName": "topolo-observability-watch",
|
|
988
|
-
"productionUrl":
|
|
989
|
-
"services": [
|
|
990
|
-
|
|
1065
|
+
"productionUrl": "https://observability-watch.topolo.app",
|
|
1066
|
+
"services": [
|
|
1067
|
+
"observability_watch"
|
|
1068
|
+
],
|
|
1069
|
+
"deployTargets": [
|
|
1070
|
+
{
|
|
1071
|
+
"name": "topolo-observability-watch",
|
|
1072
|
+
"kind": "worker",
|
|
1073
|
+
"apiUrl": "https://observability-watch.topolo.app",
|
|
1074
|
+
"domains": [
|
|
1075
|
+
"observability-watch.topolo.app"
|
|
1076
|
+
],
|
|
1077
|
+
"routes": [],
|
|
1078
|
+
"serviceId": "observability_watch"
|
|
1079
|
+
}
|
|
1080
|
+
]
|
|
991
1081
|
},
|
|
992
1082
|
"one": {
|
|
993
1083
|
"id": "one",
|
|
@@ -1001,40 +1091,37 @@ var APPLICATIONS = {
|
|
|
1001
1091
|
"deployTargets": [
|
|
1002
1092
|
{
|
|
1003
1093
|
"name": "topolo-one",
|
|
1004
|
-
"kind": "pages",
|
|
1005
|
-
"apiUrl": null,
|
|
1006
|
-
"domains": [
|
|
1007
|
-
"one.topolo.app"
|
|
1008
|
-
],
|
|
1009
|
-
"routes": [],
|
|
1010
|
-
"serviceId": null
|
|
1011
|
-
},
|
|
1012
|
-
{
|
|
1013
|
-
"name": "topolo-one-website",
|
|
1014
1094
|
"kind": "worker",
|
|
1015
1095
|
"apiUrl": null,
|
|
1016
|
-
"domains": [
|
|
1017
|
-
"topolo.io",
|
|
1018
|
-
"www.topolo.io"
|
|
1019
|
-
],
|
|
1096
|
+
"domains": [],
|
|
1020
1097
|
"routes": [],
|
|
1021
1098
|
"serviceId": null
|
|
1022
1099
|
},
|
|
1023
1100
|
{
|
|
1024
|
-
"name": "topolo-one-
|
|
1101
|
+
"name": "topolo-one-api",
|
|
1025
1102
|
"kind": "worker",
|
|
1026
1103
|
"apiUrl": "https://one.topolo.app",
|
|
1027
1104
|
"domains": [
|
|
1028
|
-
"one.topolo.app"
|
|
1029
|
-
"topolo.app",
|
|
1030
|
-
"www.topolo.app"
|
|
1105
|
+
"one.topolo.app"
|
|
1031
1106
|
],
|
|
1032
1107
|
"routes": [
|
|
1033
1108
|
"one.topolo.app/*",
|
|
1034
|
-
"topolo.app",
|
|
1035
1109
|
"www.topolo.app/*"
|
|
1036
1110
|
],
|
|
1037
1111
|
"serviceId": "one"
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
"name": "topolo-one-website",
|
|
1115
|
+
"kind": "worker",
|
|
1116
|
+
"apiUrl": "https://topolo.io",
|
|
1117
|
+
"domains": [
|
|
1118
|
+
"topolo.io"
|
|
1119
|
+
],
|
|
1120
|
+
"routes": [
|
|
1121
|
+
"topolo.io",
|
|
1122
|
+
"www.topolo.io"
|
|
1123
|
+
],
|
|
1124
|
+
"serviceId": null
|
|
1038
1125
|
}
|
|
1039
1126
|
]
|
|
1040
1127
|
},
|
|
@@ -1055,10 +1142,16 @@ var APPLICATIONS = {
|
|
|
1055
1142
|
"domains": [
|
|
1056
1143
|
"p2p.topolo.app"
|
|
1057
1144
|
],
|
|
1058
|
-
"routes": [
|
|
1059
|
-
"p2p.topolo.app"
|
|
1060
|
-
],
|
|
1145
|
+
"routes": [],
|
|
1061
1146
|
"serviceId": "p2p"
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
"name": "topolo-p2p-api",
|
|
1150
|
+
"kind": "worker",
|
|
1151
|
+
"apiUrl": null,
|
|
1152
|
+
"domains": [],
|
|
1153
|
+
"routes": [],
|
|
1154
|
+
"serviceId": null
|
|
1062
1155
|
}
|
|
1063
1156
|
]
|
|
1064
1157
|
},
|
|
@@ -1081,6 +1174,14 @@ var APPLICATIONS = {
|
|
|
1081
1174
|
],
|
|
1082
1175
|
"routes": [],
|
|
1083
1176
|
"serviceId": "pay"
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
"name": "topolo-pay-api",
|
|
1180
|
+
"kind": "worker",
|
|
1181
|
+
"apiUrl": null,
|
|
1182
|
+
"domains": [],
|
|
1183
|
+
"routes": [],
|
|
1184
|
+
"serviceId": null
|
|
1084
1185
|
}
|
|
1085
1186
|
]
|
|
1086
1187
|
},
|
|
@@ -1101,10 +1202,16 @@ var APPLICATIONS = {
|
|
|
1101
1202
|
"domains": [
|
|
1102
1203
|
"people.topolo.app"
|
|
1103
1204
|
],
|
|
1104
|
-
"routes": [
|
|
1105
|
-
"people.topolo.app"
|
|
1106
|
-
],
|
|
1205
|
+
"routes": [],
|
|
1107
1206
|
"serviceId": "people"
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
"name": "topolo-people-api",
|
|
1210
|
+
"kind": "worker",
|
|
1211
|
+
"apiUrl": null,
|
|
1212
|
+
"domains": [],
|
|
1213
|
+
"routes": [],
|
|
1214
|
+
"serviceId": null
|
|
1108
1215
|
}
|
|
1109
1216
|
]
|
|
1110
1217
|
},
|
|
@@ -1125,10 +1232,16 @@ var APPLICATIONS = {
|
|
|
1125
1232
|
"domains": [
|
|
1126
1233
|
"pulse.topolo.app"
|
|
1127
1234
|
],
|
|
1128
|
-
"routes": [
|
|
1129
|
-
"pulse.topolo.app"
|
|
1130
|
-
],
|
|
1235
|
+
"routes": [],
|
|
1131
1236
|
"serviceId": "pulse"
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
"name": "topolo-pulse-api",
|
|
1240
|
+
"kind": "worker",
|
|
1241
|
+
"apiUrl": null,
|
|
1242
|
+
"domains": [],
|
|
1243
|
+
"routes": [],
|
|
1244
|
+
"serviceId": null
|
|
1132
1245
|
}
|
|
1133
1246
|
]
|
|
1134
1247
|
},
|
|
@@ -1150,7 +1263,9 @@ var APPLICATIONS = {
|
|
|
1150
1263
|
"domains": [
|
|
1151
1264
|
"api.ol0.me"
|
|
1152
1265
|
],
|
|
1153
|
-
"routes": [
|
|
1266
|
+
"routes": [
|
|
1267
|
+
"api.ol0.me/*"
|
|
1268
|
+
],
|
|
1154
1269
|
"serviceId": "quro.api"
|
|
1155
1270
|
},
|
|
1156
1271
|
{
|
|
@@ -1168,7 +1283,7 @@ var APPLICATIONS = {
|
|
|
1168
1283
|
{
|
|
1169
1284
|
"name": "quro-ui",
|
|
1170
1285
|
"kind": "worker",
|
|
1171
|
-
"apiUrl":
|
|
1286
|
+
"apiUrl": "https://quro.topolo.app",
|
|
1172
1287
|
"domains": [
|
|
1173
1288
|
"quro.topolo.app"
|
|
1174
1289
|
],
|
|
@@ -1190,7 +1305,7 @@ var APPLICATIONS = {
|
|
|
1190
1305
|
{
|
|
1191
1306
|
"name": "topolo-roadmapper",
|
|
1192
1307
|
"kind": "worker",
|
|
1193
|
-
"apiUrl":
|
|
1308
|
+
"apiUrl": "https://roadmapper.topolo.app",
|
|
1194
1309
|
"domains": [
|
|
1195
1310
|
"roadmapper.topolo.app"
|
|
1196
1311
|
],
|
|
@@ -1226,10 +1341,16 @@ var APPLICATIONS = {
|
|
|
1226
1341
|
"domains": [
|
|
1227
1342
|
"sign.topolo.app"
|
|
1228
1343
|
],
|
|
1229
|
-
"routes": [
|
|
1230
|
-
"sign.topolo.app"
|
|
1231
|
-
],
|
|
1344
|
+
"routes": [],
|
|
1232
1345
|
"serviceId": "sign"
|
|
1346
|
+
},
|
|
1347
|
+
{
|
|
1348
|
+
"name": "topolo-sign-api",
|
|
1349
|
+
"kind": "worker",
|
|
1350
|
+
"apiUrl": null,
|
|
1351
|
+
"domains": [],
|
|
1352
|
+
"routes": [],
|
|
1353
|
+
"serviceId": null
|
|
1233
1354
|
}
|
|
1234
1355
|
]
|
|
1235
1356
|
},
|
|
@@ -1246,7 +1367,7 @@ var APPLICATIONS = {
|
|
|
1246
1367
|
{
|
|
1247
1368
|
"name": "topolo-social-studio",
|
|
1248
1369
|
"kind": "worker",
|
|
1249
|
-
"apiUrl":
|
|
1370
|
+
"apiUrl": "https://studio.topolo.app",
|
|
1250
1371
|
"domains": [
|
|
1251
1372
|
"studio.topolo.app"
|
|
1252
1373
|
],
|
|
@@ -1285,8 +1406,8 @@ var APPLICATIONS = {
|
|
|
1285
1406
|
"deployTargets": [
|
|
1286
1407
|
{
|
|
1287
1408
|
"name": "topolo-socialize",
|
|
1288
|
-
"kind": "
|
|
1289
|
-
"apiUrl":
|
|
1409
|
+
"kind": "worker",
|
|
1410
|
+
"apiUrl": "https://socialize.topolo.app",
|
|
1290
1411
|
"domains": [
|
|
1291
1412
|
"socialize.topolo.app"
|
|
1292
1413
|
],
|
|
@@ -1330,10 +1451,16 @@ var APPLICATIONS = {
|
|
|
1330
1451
|
"domains": [
|
|
1331
1452
|
"spaces.topolo.app"
|
|
1332
1453
|
],
|
|
1333
|
-
"routes": [
|
|
1334
|
-
"spaces.topolo.app"
|
|
1335
|
-
],
|
|
1454
|
+
"routes": [],
|
|
1336
1455
|
"serviceId": "spaces"
|
|
1456
|
+
},
|
|
1457
|
+
{
|
|
1458
|
+
"name": "topolo-spaces-api",
|
|
1459
|
+
"kind": "worker",
|
|
1460
|
+
"apiUrl": null,
|
|
1461
|
+
"domains": [],
|
|
1462
|
+
"routes": [],
|
|
1463
|
+
"serviceId": null
|
|
1337
1464
|
}
|
|
1338
1465
|
]
|
|
1339
1466
|
},
|
|
@@ -1354,10 +1481,40 @@ var APPLICATIONS = {
|
|
|
1354
1481
|
"domains": [
|
|
1355
1482
|
"status.topolo.app"
|
|
1356
1483
|
],
|
|
1484
|
+
"routes": [],
|
|
1485
|
+
"serviceId": "status"
|
|
1486
|
+
}
|
|
1487
|
+
]
|
|
1488
|
+
},
|
|
1489
|
+
"success": {
|
|
1490
|
+
"id": "success",
|
|
1491
|
+
"appDir": "TopoloSuccess",
|
|
1492
|
+
"name": "topolo-success",
|
|
1493
|
+
"packageName": "topolo-success",
|
|
1494
|
+
"productionUrl": "https://success.topolo.app",
|
|
1495
|
+
"services": [
|
|
1496
|
+
"success"
|
|
1497
|
+
],
|
|
1498
|
+
"deployTargets": [
|
|
1499
|
+
{
|
|
1500
|
+
"name": "topolo-success",
|
|
1501
|
+
"kind": "worker",
|
|
1502
|
+
"apiUrl": "https://success.topolo.app",
|
|
1503
|
+
"domains": [
|
|
1504
|
+
"success.topolo.app"
|
|
1505
|
+
],
|
|
1357
1506
|
"routes": [
|
|
1358
|
-
"
|
|
1507
|
+
"success.topolo.app"
|
|
1359
1508
|
],
|
|
1360
|
-
"serviceId": "
|
|
1509
|
+
"serviceId": "success"
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"name": "topolo-success-api",
|
|
1513
|
+
"kind": "worker",
|
|
1514
|
+
"apiUrl": null,
|
|
1515
|
+
"domains": [],
|
|
1516
|
+
"routes": [],
|
|
1517
|
+
"serviceId": null
|
|
1361
1518
|
}
|
|
1362
1519
|
]
|
|
1363
1520
|
},
|
|
@@ -1382,6 +1539,14 @@ var APPLICATIONS = {
|
|
|
1382
1539
|
"support.topolo.app/*"
|
|
1383
1540
|
],
|
|
1384
1541
|
"serviceId": "support"
|
|
1542
|
+
},
|
|
1543
|
+
{
|
|
1544
|
+
"name": "topolo-support-api",
|
|
1545
|
+
"kind": "worker",
|
|
1546
|
+
"apiUrl": null,
|
|
1547
|
+
"domains": [],
|
|
1548
|
+
"routes": [],
|
|
1549
|
+
"serviceId": null
|
|
1385
1550
|
}
|
|
1386
1551
|
]
|
|
1387
1552
|
},
|
|
@@ -1402,10 +1567,16 @@ var APPLICATIONS = {
|
|
|
1402
1567
|
"domains": [
|
|
1403
1568
|
"survey.topolo.app"
|
|
1404
1569
|
],
|
|
1405
|
-
"routes": [
|
|
1406
|
-
"survey.topolo.app"
|
|
1407
|
-
],
|
|
1570
|
+
"routes": [],
|
|
1408
1571
|
"serviceId": "survey"
|
|
1572
|
+
},
|
|
1573
|
+
{
|
|
1574
|
+
"name": "topolo-survey-api",
|
|
1575
|
+
"kind": "worker",
|
|
1576
|
+
"apiUrl": null,
|
|
1577
|
+
"domains": [],
|
|
1578
|
+
"routes": [],
|
|
1579
|
+
"serviceId": null
|
|
1409
1580
|
}
|
|
1410
1581
|
]
|
|
1411
1582
|
},
|
|
@@ -1426,10 +1597,16 @@ var APPLICATIONS = {
|
|
|
1426
1597
|
"domains": [
|
|
1427
1598
|
"voice.topolo.app"
|
|
1428
1599
|
],
|
|
1429
|
-
"routes": [
|
|
1430
|
-
"voice.topolo.app"
|
|
1431
|
-
],
|
|
1600
|
+
"routes": [],
|
|
1432
1601
|
"serviceId": "voice"
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
"name": "topolo-voice-api",
|
|
1605
|
+
"kind": "worker",
|
|
1606
|
+
"apiUrl": null,
|
|
1607
|
+
"domains": [],
|
|
1608
|
+
"routes": [],
|
|
1609
|
+
"serviceId": null
|
|
1433
1610
|
}
|
|
1434
1611
|
]
|
|
1435
1612
|
},
|
|
@@ -1460,13 +1637,16 @@ var APPLICATIONS = {
|
|
|
1460
1637
|
"domains": [
|
|
1461
1638
|
"sites.topolo.app"
|
|
1462
1639
|
],
|
|
1463
|
-
"routes": [
|
|
1640
|
+
"routes": [
|
|
1641
|
+
"*.sites.topolo.app/*",
|
|
1642
|
+
"sites.topolo.app"
|
|
1643
|
+
],
|
|
1464
1644
|
"serviceId": null
|
|
1465
1645
|
},
|
|
1466
1646
|
{
|
|
1467
1647
|
"name": "topolo-web-studio",
|
|
1468
1648
|
"kind": "worker",
|
|
1469
|
-
"apiUrl":
|
|
1649
|
+
"apiUrl": "https://web.topolo.app",
|
|
1470
1650
|
"domains": [
|
|
1471
1651
|
"web.topolo.app"
|
|
1472
1652
|
],
|
|
@@ -1516,12 +1696,12 @@ var APPLICATION_REQUIREMENTS = [
|
|
|
1516
1696
|
summary: "Applications must derive identity, organization, scopes, and service entitlement from TopoloAuth rather than inventing parallel auth state.",
|
|
1517
1697
|
appliesTo: ["browser", "api", "tooling", "agent_surface"],
|
|
1518
1698
|
evidence: [
|
|
1519
|
-
"@topolo/auth-client or @topolo/
|
|
1699
|
+
"@topolo/auth-client or @topolo-io/worker-runtime is used where applicable",
|
|
1520
1700
|
"No public command, tool, or SDK method accepts orgId",
|
|
1521
1701
|
"Service slug and Auth service registration are documented for protected services"
|
|
1522
1702
|
],
|
|
1523
1703
|
implementation: [
|
|
1524
|
-
"Use shared auth packages instead of copying token parsing or browser storage flows",
|
|
1704
|
+
"Use shared auth/runtime packages instead of copying token parsing, gateway, or browser storage flows",
|
|
1525
1705
|
"Derive organization from the credential on every request",
|
|
1526
1706
|
"Route OAuth, refresh, logout, and SSO paths according to the shared Auth contract"
|
|
1527
1707
|
]
|
|
@@ -1554,11 +1734,13 @@ var APPLICATION_REQUIREMENTS = [
|
|
|
1554
1734
|
evidence: [
|
|
1555
1735
|
"Auth service catalog contains the service ID and slug",
|
|
1556
1736
|
"Permissions, role bundles, and API-key scopes exist for the service",
|
|
1557
|
-
"SDK, CLI, and MCP service discovery include the callable production API"
|
|
1737
|
+
"SDK, CLI, and MCP service discovery include the callable production API",
|
|
1738
|
+
"CloudControl production HTTP targets classify agent reachability with sdk_service_id or agent_callable:false"
|
|
1558
1739
|
],
|
|
1559
1740
|
implementation: [
|
|
1560
|
-
"Add production Worker api_url metadata
|
|
1561
|
-
"
|
|
1741
|
+
"Add production Worker api_url metadata and sdk_service_id for every agent-callable API target",
|
|
1742
|
+
"Mark browser, documentation, and runtime-only Worker targets with agent_callable:false",
|
|
1743
|
+
"Expose stable service IDs through generated DEFAULT_SERVICE_URLS and live catalog discovery",
|
|
1562
1744
|
"Keep typed SDK/CLI/MCP surfaces in sync when an API contract stabilizes"
|
|
1563
1745
|
]
|
|
1564
1746
|
},
|
|
@@ -1662,8 +1844,10 @@ var APPLICATION_REQUIREMENTS = [
|
|
|
1662
1844
|
function applicationRequirementScopes(application) {
|
|
1663
1845
|
const scopes = /* @__PURE__ */ new Set(["all"]);
|
|
1664
1846
|
const appId = application.id;
|
|
1665
|
-
const hasBrowserSurface = Boolean(application.productionUrl) ||
|
|
1666
|
-
|
|
1847
|
+
const hasBrowserSurface = Boolean(application.productionUrl) || // String() keeps this guard valid after the Pages->Worker migration narrowed
|
|
1848
|
+
// the generated kind union to "worker" (no "pages" literal remains).
|
|
1849
|
+
application.deployTargets.some((target) => String(target.kind) === "pages");
|
|
1850
|
+
const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.serviceId));
|
|
1667
1851
|
if (hasBrowserSurface) scopes.add("browser");
|
|
1668
1852
|
if (hasApiSurface) scopes.add("api");
|
|
1669
1853
|
if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
|
|
@@ -1780,7 +1964,7 @@ function evaluateRequirement(application, requirement) {
|
|
|
1780
1964
|
evidence
|
|
1781
1965
|
);
|
|
1782
1966
|
case "cloudflare-deployment-contract": {
|
|
1783
|
-
if (application.deployTargets.length
|
|
1967
|
+
if (application.deployTargets.length < 1) {
|
|
1784
1968
|
return finding(requirement, "missing", "No CloudControl deploy targets are registered.", evidence);
|
|
1785
1969
|
}
|
|
1786
1970
|
evidence.push(`deployTargets=${application.deployTargets.length}`);
|
|
@@ -1867,6 +2051,7 @@ function resolveServiceUrl(service, overrides) {
|
|
|
1867
2051
|
var WRITE_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
1868
2052
|
var POSITIVE_CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
1869
2053
|
var NEGATIVE_CACHE_TTL_MS = 60 * 1e3;
|
|
2054
|
+
var CATALOG_CACHE_TTL_MS = 60 * 1e3;
|
|
1870
2055
|
var TopoloClient = class _TopoloClient {
|
|
1871
2056
|
credential;
|
|
1872
2057
|
agent;
|
|
@@ -1876,6 +2061,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1876
2061
|
timeoutMs;
|
|
1877
2062
|
fetchImpl;
|
|
1878
2063
|
debug;
|
|
2064
|
+
serviceCatalogCache = null;
|
|
1879
2065
|
/**
|
|
1880
2066
|
* Process-wide cache for slug → service-id lookups. Keyed by
|
|
1881
2067
|
* `${authBaseUrl}|${slug}` so multiple `TopoloClient` instances pointing at
|
|
@@ -1921,7 +2107,8 @@ var TopoloClient = class _TopoloClient {
|
|
|
1921
2107
|
`Mutating ${method} requests require { confirm: true }. This guardrail prevents agents from issuing writes without an explicit human-in-the-loop acknowledgement.`
|
|
1922
2108
|
);
|
|
1923
2109
|
}
|
|
1924
|
-
const
|
|
2110
|
+
const resolvedService = await this.resolveRequestService(opts.service);
|
|
2111
|
+
const baseUrl = resolvedService.baseUrl;
|
|
1925
2112
|
const url = new URL(opts.path, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
|
|
1926
2113
|
if (opts.query) {
|
|
1927
2114
|
for (const [k, v] of Object.entries(opts.query)) {
|
|
@@ -1931,7 +2118,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1931
2118
|
const headers = new Headers();
|
|
1932
2119
|
headers.set("Accept", "application/json");
|
|
1933
2120
|
if (opts.body !== void 0) headers.set("Content-Type", "application/json");
|
|
1934
|
-
const platformServiceId = resolveConfiguredServiceId(
|
|
2121
|
+
const platformServiceId = resolveConfiguredServiceId(resolvedService.serviceKey, this.serviceIds);
|
|
1935
2122
|
if (platformServiceId) headers.set("X-Service-ID", platformServiceId);
|
|
1936
2123
|
applyAuthHeaders(headers, this.credential);
|
|
1937
2124
|
const requestId = generateRequestId();
|
|
@@ -1944,7 +2131,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1944
2131
|
const signal = opts.signal ? mergeSignals(opts.signal, controller.signal) : controller.signal;
|
|
1945
2132
|
const urlStr = url.toString();
|
|
1946
2133
|
const startedAt = Date.now();
|
|
1947
|
-
this.emit({ phase: "request", method, service:
|
|
2134
|
+
this.emit({ phase: "request", method, service: resolvedService.serviceKey, path: opts.path, url: urlStr, requestId });
|
|
1948
2135
|
let res;
|
|
1949
2136
|
try {
|
|
1950
2137
|
res = await this.fetchImpl(urlStr, {
|
|
@@ -1957,7 +2144,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1957
2144
|
this.emit({
|
|
1958
2145
|
phase: "error",
|
|
1959
2146
|
method,
|
|
1960
|
-
service:
|
|
2147
|
+
service: resolvedService.serviceKey,
|
|
1961
2148
|
path: opts.path,
|
|
1962
2149
|
url: urlStr,
|
|
1963
2150
|
requestId,
|
|
@@ -1976,7 +2163,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1976
2163
|
this.emit({
|
|
1977
2164
|
phase: "error",
|
|
1978
2165
|
method,
|
|
1979
|
-
service:
|
|
2166
|
+
service: resolvedService.serviceKey,
|
|
1980
2167
|
path: opts.path,
|
|
1981
2168
|
url: urlStr,
|
|
1982
2169
|
requestId,
|
|
@@ -1991,12 +2178,12 @@ var TopoloClient = class _TopoloClient {
|
|
|
1991
2178
|
extractRequired(parsed)
|
|
1992
2179
|
);
|
|
1993
2180
|
}
|
|
1994
|
-
throw new TopoloHttpError(
|
|
2181
|
+
throw new TopoloHttpError(resolvedService.serviceKey, opts.path, res.status, parsed);
|
|
1995
2182
|
}
|
|
1996
2183
|
this.emit({
|
|
1997
2184
|
phase: "response",
|
|
1998
2185
|
method,
|
|
1999
|
-
service:
|
|
2186
|
+
service: resolvedService.serviceKey,
|
|
2000
2187
|
path: opts.path,
|
|
2001
2188
|
url: urlStr,
|
|
2002
2189
|
requestId,
|
|
@@ -2005,6 +2192,31 @@ var TopoloClient = class _TopoloClient {
|
|
|
2005
2192
|
});
|
|
2006
2193
|
return parsed;
|
|
2007
2194
|
}
|
|
2195
|
+
async resolveRequestService(service) {
|
|
2196
|
+
const serviceKey = normalizeLookupKey(service);
|
|
2197
|
+
if (!serviceKey) {
|
|
2198
|
+
throw new TopoloSdkError("unknown_service", "service is required");
|
|
2199
|
+
}
|
|
2200
|
+
const overrideUrl = resolveConfiguredServiceUrl(serviceKey, this.serviceUrls);
|
|
2201
|
+
if (overrideUrl) return { serviceKey, baseUrl: overrideUrl };
|
|
2202
|
+
const staticUrl = DEFAULT_SERVICE_URLS[serviceKey];
|
|
2203
|
+
if (staticUrl) return { serviceKey, baseUrl: staticUrl };
|
|
2204
|
+
const live = await this.resolveLiveCallableService(serviceKey);
|
|
2205
|
+
if (live) return live;
|
|
2206
|
+
throw new TopoloSdkError(
|
|
2207
|
+
"unknown_service",
|
|
2208
|
+
`Unknown Topolo service "${service}". Run service discovery first and pass a callable service id or slug.`
|
|
2209
|
+
);
|
|
2210
|
+
}
|
|
2211
|
+
async resolveLiveCallableService(serviceKey) {
|
|
2212
|
+
const catalog = await this.listServices();
|
|
2213
|
+
const match = catalog.find((entry) => catalogEntryMatches(entry, serviceKey));
|
|
2214
|
+
if (!match?.baseUrl || !isCallableCatalogEntry(match)) return null;
|
|
2215
|
+
return {
|
|
2216
|
+
serviceKey: normalizeLookupKey(match.slug || match.name || match.serviceId) || serviceKey,
|
|
2217
|
+
baseUrl: match.baseUrl
|
|
2218
|
+
};
|
|
2219
|
+
}
|
|
2008
2220
|
/**
|
|
2009
2221
|
* Resolve a service-slug → opaque service-id via caller config or TopoloAuth.
|
|
2010
2222
|
*
|
|
@@ -2062,6 +2274,68 @@ var TopoloClient = class _TopoloClient {
|
|
|
2062
2274
|
});
|
|
2063
2275
|
return value;
|
|
2064
2276
|
}
|
|
2277
|
+
/**
|
|
2278
|
+
* List the platform service catalog from the live registry
|
|
2279
|
+
* (`GET /api/services/catalog` on TopoloAuth). Credential-aware: the
|
|
2280
|
+
* caller's credential is attached, so an authenticated caller in an
|
|
2281
|
+
* entitled org also receives the `developer_only` services its role
|
|
2282
|
+
* permits; an unauthenticated/agent caller receives `active` only.
|
|
2283
|
+
*
|
|
2284
|
+
* Resilient: on any network/HTTP failure this falls back to the
|
|
2285
|
+
* build-time generated `APPLICATIONS` snapshot so offline/degraded
|
|
2286
|
+
* callers still get a usable (if static) catalog. The live result is
|
|
2287
|
+
* authoritative; the snapshot is a floor, not a cap.
|
|
2288
|
+
*/
|
|
2289
|
+
async listServices() {
|
|
2290
|
+
const now = Date.now();
|
|
2291
|
+
if (this.serviceCatalogCache && this.serviceCatalogCache.expiresAt > now) {
|
|
2292
|
+
return this.serviceCatalogCache.entries;
|
|
2293
|
+
}
|
|
2294
|
+
try {
|
|
2295
|
+
const res = await this.request({ service: "auth", method: "GET", path: "/api/services/catalog" });
|
|
2296
|
+
const raw = res.data?.services ?? res.services;
|
|
2297
|
+
if (Array.isArray(raw) && raw.length > 0) {
|
|
2298
|
+
const entries = [];
|
|
2299
|
+
for (const item of raw) {
|
|
2300
|
+
const s = item;
|
|
2301
|
+
const serviceId = typeof s.service_id === "string" ? s.service_id : typeof s.id === "string" ? s.id : null;
|
|
2302
|
+
if (!serviceId) continue;
|
|
2303
|
+
entries.push({
|
|
2304
|
+
serviceId,
|
|
2305
|
+
slug: typeof s.app_slug === "string" ? s.app_slug : null,
|
|
2306
|
+
name: typeof s.name === "string" ? s.name : null,
|
|
2307
|
+
description: typeof s.description === "string" ? s.description : null,
|
|
2308
|
+
baseUrl: typeof s.base_url === "string" ? s.base_url : null,
|
|
2309
|
+
status: typeof s.status === "string" ? s.status : null,
|
|
2310
|
+
surfaceKind: typeof s.surface_kind === "string" ? s.surface_kind : null,
|
|
2311
|
+
launchable: s.launchable === true
|
|
2312
|
+
});
|
|
2313
|
+
}
|
|
2314
|
+
if (entries.length > 0) {
|
|
2315
|
+
this.serviceCatalogCache = {
|
|
2316
|
+
entries,
|
|
2317
|
+
expiresAt: now + CATALOG_CACHE_TTL_MS
|
|
2318
|
+
};
|
|
2319
|
+
return entries;
|
|
2320
|
+
}
|
|
2321
|
+
}
|
|
2322
|
+
} catch {
|
|
2323
|
+
}
|
|
2324
|
+
return this.generatedCatalogFallback();
|
|
2325
|
+
}
|
|
2326
|
+
generatedCatalogFallback() {
|
|
2327
|
+
const apps = Object.values(APPLICATIONS);
|
|
2328
|
+
return apps.map((app) => ({
|
|
2329
|
+
serviceId: app.id,
|
|
2330
|
+
slug: app.id,
|
|
2331
|
+
name: app.name ?? app.id,
|
|
2332
|
+
description: null,
|
|
2333
|
+
baseUrl: app.productionUrl ?? null,
|
|
2334
|
+
status: "active",
|
|
2335
|
+
surfaceKind: "application",
|
|
2336
|
+
launchable: Boolean(app.productionUrl)
|
|
2337
|
+
}));
|
|
2338
|
+
}
|
|
2065
2339
|
/**
|
|
2066
2340
|
* Introspect the current credential. Returns the caller's resolved identity,
|
|
2067
2341
|
* organization, and permission set. Used by CLI `whoami` and by MCP to gate
|
|
@@ -2108,8 +2382,18 @@ function resolveConfiguredServiceId(slug, serviceIds) {
|
|
|
2108
2382
|
}
|
|
2109
2383
|
return null;
|
|
2110
2384
|
}
|
|
2385
|
+
function resolveConfiguredServiceUrl(slug, serviceUrls) {
|
|
2386
|
+
for (const serviceKey of serviceKeyCandidates(slug)) {
|
|
2387
|
+
const configured = serviceUrls?.[serviceKey];
|
|
2388
|
+
if (typeof configured === "string" && configured.trim()) return configured.trim();
|
|
2389
|
+
const envKey = `TOPOLO_SERVICE_URL_${serviceKey.replace(/\./g, "_").toUpperCase()}`;
|
|
2390
|
+
const envValue = typeof process !== "undefined" ? process.env?.[envKey] : void 0;
|
|
2391
|
+
if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
|
|
2392
|
+
}
|
|
2393
|
+
return null;
|
|
2394
|
+
}
|
|
2111
2395
|
function serviceKeyCandidates(slug) {
|
|
2112
|
-
const normalized = slug
|
|
2396
|
+
const normalized = normalizeLookupKey(slug);
|
|
2113
2397
|
const withoutTopolo = normalized.startsWith("topolo-") ? normalized.slice("topolo-".length) : normalized;
|
|
2114
2398
|
return [.../* @__PURE__ */ new Set([
|
|
2115
2399
|
normalized,
|
|
@@ -2118,6 +2402,33 @@ function serviceKeyCandidates(slug) {
|
|
|
2118
2402
|
withoutTopolo.replace(/-/g, "_")
|
|
2119
2403
|
])];
|
|
2120
2404
|
}
|
|
2405
|
+
function normalizeLookupKey(value) {
|
|
2406
|
+
return String(value || "").trim().toLowerCase();
|
|
2407
|
+
}
|
|
2408
|
+
function catalogEntryMatches(entry, needle) {
|
|
2409
|
+
return catalogEntryLookupKeys(entry).includes(needle);
|
|
2410
|
+
}
|
|
2411
|
+
function catalogEntryLookupKeys(entry) {
|
|
2412
|
+
const values = [entry.serviceId, entry.slug, entry.name].filter((value) => typeof value === "string" && value.trim().length > 0);
|
|
2413
|
+
const keys = /* @__PURE__ */ new Set();
|
|
2414
|
+
for (const value of values) {
|
|
2415
|
+
const normalized = normalizeLookupKey(value);
|
|
2416
|
+
if (!normalized) continue;
|
|
2417
|
+
keys.add(normalized);
|
|
2418
|
+
keys.add(normalized.replace(/-/g, "_"));
|
|
2419
|
+
if (normalized.startsWith("topolo-")) {
|
|
2420
|
+
const withoutTopolo = normalized.slice("topolo-".length);
|
|
2421
|
+
keys.add(withoutTopolo);
|
|
2422
|
+
keys.add(withoutTopolo.replace(/-/g, "_"));
|
|
2423
|
+
}
|
|
2424
|
+
}
|
|
2425
|
+
return [...keys];
|
|
2426
|
+
}
|
|
2427
|
+
function isCallableCatalogEntry(entry) {
|
|
2428
|
+
const kind = normalizeLookupKey(entry.surfaceKind || "");
|
|
2429
|
+
if (kind === "api" || kind === "technical_service" || kind === "service") return true;
|
|
2430
|
+
return Boolean(entry.slug && Object.prototype.hasOwnProperty.call(DEFAULT_SERVICE_URLS, catalogEntryLookupKeys(entry)[0] ?? ""));
|
|
2431
|
+
}
|
|
2121
2432
|
function describeError(body, fallback) {
|
|
2122
2433
|
if (body && typeof body === "object") {
|
|
2123
2434
|
const maybe = body;
|
|
@@ -2283,7 +2594,6 @@ function splitService(servicePart) {
|
|
|
2283
2594
|
|
|
2284
2595
|
// src/tools.ts
|
|
2285
2596
|
var APPLICATION_IDS = Object.keys(APPLICATIONS).sort();
|
|
2286
|
-
var SERVICE_IDS = Object.keys(DEFAULT_SERVICE_URLS).sort();
|
|
2287
2597
|
var HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
|
|
2288
2598
|
var TOOLS = [
|
|
2289
2599
|
{
|
|
@@ -2322,7 +2632,7 @@ var TOOLS = [
|
|
|
2322
2632
|
{
|
|
2323
2633
|
name: "topolo_list_applications",
|
|
2324
2634
|
title: "List every Topolo platform application",
|
|
2325
|
-
description: "Returns the
|
|
2635
|
+
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.",
|
|
2326
2636
|
requiredScopes: [],
|
|
2327
2637
|
destructive: false,
|
|
2328
2638
|
inputSchema: {
|
|
@@ -2330,14 +2640,14 @@ var TOOLS = [
|
|
|
2330
2640
|
properties: {},
|
|
2331
2641
|
additionalProperties: false
|
|
2332
2642
|
},
|
|
2333
|
-
handler: async () => ({
|
|
2334
|
-
applications:
|
|
2643
|
+
handler: async (topolo) => ({
|
|
2644
|
+
applications: await topolo.client.listServices()
|
|
2335
2645
|
})
|
|
2336
2646
|
},
|
|
2337
2647
|
{
|
|
2338
2648
|
name: "topolo_get_application",
|
|
2339
2649
|
title: "Describe one Topolo platform application",
|
|
2340
|
-
description: "Returns one application catalog entry
|
|
2650
|
+
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.",
|
|
2341
2651
|
requiredScopes: [],
|
|
2342
2652
|
destructive: false,
|
|
2343
2653
|
inputSchema: {
|
|
@@ -2345,21 +2655,29 @@ var TOOLS = [
|
|
|
2345
2655
|
properties: {
|
|
2346
2656
|
application: {
|
|
2347
2657
|
type: "string",
|
|
2348
|
-
|
|
2349
|
-
description: "Application ID from topolo_list_applications."
|
|
2658
|
+
description: "Application identifier: service id, slug, or name from topolo_list_applications."
|
|
2350
2659
|
}
|
|
2351
2660
|
},
|
|
2352
2661
|
required: ["application"],
|
|
2353
2662
|
additionalProperties: false
|
|
2354
2663
|
},
|
|
2355
|
-
handler: async (
|
|
2664
|
+
handler: async (topolo, args) => {
|
|
2356
2665
|
const application = args["application"];
|
|
2357
|
-
if (typeof application !== "string" || !
|
|
2666
|
+
if (typeof application !== "string" || !application.trim()) {
|
|
2667
|
+
throw new Error("`application` must be a non-empty string.");
|
|
2668
|
+
}
|
|
2669
|
+
const needle = application.trim().toLowerCase();
|
|
2670
|
+
const catalog = await topolo.client.listServices();
|
|
2671
|
+
const match = catalog.find(
|
|
2672
|
+
(e) => e.serviceId.toLowerCase() === needle || e.slug && e.slug.toLowerCase() === needle || e.name && e.name.toLowerCase() === needle
|
|
2673
|
+
);
|
|
2674
|
+
if (!match) {
|
|
2675
|
+
const known = catalog.map((e) => e.slug || e.serviceId).sort().filter((value) => typeof value === "string" && value.length > 0);
|
|
2358
2676
|
throw new Error(
|
|
2359
|
-
`Unknown application "${
|
|
2677
|
+
`Unknown application "${application}". ${formatKnownValues(known, "applications")}`
|
|
2360
2678
|
);
|
|
2361
2679
|
}
|
|
2362
|
-
return { application:
|
|
2680
|
+
return { application: match };
|
|
2363
2681
|
}
|
|
2364
2682
|
},
|
|
2365
2683
|
{
|
|
@@ -2373,7 +2691,6 @@ var TOOLS = [
|
|
|
2373
2691
|
properties: {
|
|
2374
2692
|
application: {
|
|
2375
2693
|
type: "string",
|
|
2376
|
-
enum: APPLICATION_IDS,
|
|
2377
2694
|
description: "Optional application ID from topolo_list_applications."
|
|
2378
2695
|
}
|
|
2379
2696
|
},
|
|
@@ -2391,7 +2708,7 @@ var TOOLS = [
|
|
|
2391
2708
|
}
|
|
2392
2709
|
if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
|
|
2393
2710
|
throw new Error(
|
|
2394
|
-
`Unknown application "${String(application)}".
|
|
2711
|
+
`Unknown application "${String(application)}". ${formatKnownValues(APPLICATION_IDS, "applications")}`
|
|
2395
2712
|
);
|
|
2396
2713
|
}
|
|
2397
2714
|
const app = APPLICATIONS[application];
|
|
@@ -2414,7 +2731,6 @@ var TOOLS = [
|
|
|
2414
2731
|
properties: {
|
|
2415
2732
|
application: {
|
|
2416
2733
|
type: "string",
|
|
2417
|
-
enum: APPLICATION_IDS,
|
|
2418
2734
|
description: "Optional application ID from topolo_list_applications."
|
|
2419
2735
|
},
|
|
2420
2736
|
failOn: {
|
|
@@ -2439,7 +2755,7 @@ var TOOLS = [
|
|
|
2439
2755
|
}
|
|
2440
2756
|
if (typeof application !== "string" || !APPLICATION_IDS.includes(application)) {
|
|
2441
2757
|
throw new Error(
|
|
2442
|
-
`Unknown application "${String(application)}".
|
|
2758
|
+
`Unknown application "${String(application)}". ${formatKnownValues(APPLICATION_IDS, "applications")}`
|
|
2443
2759
|
);
|
|
2444
2760
|
}
|
|
2445
2761
|
report = auditAllApplicationRequirements([application]);
|
|
@@ -2472,7 +2788,7 @@ var TOOLS = [
|
|
|
2472
2788
|
{
|
|
2473
2789
|
name: "topolo_api_call",
|
|
2474
2790
|
title: "Call any Topolo platform service",
|
|
2475
|
-
description:
|
|
2791
|
+
description: "Low-level passthrough to any Topolo service. Use when no domain-specific tool exists for the operation you need. The request is signed with the current credential and scoped to the caller's organization \u2014 the target service will return 403 if your scopes do not permit the operation, even though this tool is advertised. Mutating calls (non-GET methods) require confirm:true. Call topolo_list_services first to discover callable service IDs; the SDK can also resolve live Auth-catalog service ids/slugs for newly registered API surfaces.",
|
|
2476
2792
|
requiredScopes: [],
|
|
2477
2793
|
destructive: true,
|
|
2478
2794
|
inputSchema: {
|
|
@@ -2480,7 +2796,6 @@ var TOOLS = [
|
|
|
2480
2796
|
properties: {
|
|
2481
2797
|
service: {
|
|
2482
2798
|
type: "string",
|
|
2483
|
-
enum: SERVICE_IDS,
|
|
2484
2799
|
description: "Target service ID from the platform registry."
|
|
2485
2800
|
},
|
|
2486
2801
|
method: {
|
|
@@ -2513,8 +2828,8 @@ var TOOLS = [
|
|
|
2513
2828
|
handler: async (topolo, args) => {
|
|
2514
2829
|
const service = args["service"];
|
|
2515
2830
|
const path = args["path"];
|
|
2516
|
-
if (typeof service !== "string" || !
|
|
2517
|
-
throw new Error(
|
|
2831
|
+
if (typeof service !== "string" || !service.trim()) {
|
|
2832
|
+
throw new Error("service is required. Call topolo_list_services first to discover callable services.");
|
|
2518
2833
|
}
|
|
2519
2834
|
if (typeof path !== "string" || !path) {
|
|
2520
2835
|
throw new Error("path is required");
|
|
@@ -2529,7 +2844,7 @@ var TOOLS = [
|
|
|
2529
2844
|
Object.entries(query).map(([k, v]) => [k, String(v)])
|
|
2530
2845
|
) : void 0;
|
|
2531
2846
|
return topolo.client.request({
|
|
2532
|
-
service,
|
|
2847
|
+
service: service.trim(),
|
|
2533
2848
|
method,
|
|
2534
2849
|
path,
|
|
2535
2850
|
body: args["body"],
|
|
@@ -2602,9 +2917,15 @@ function statusesAtOrWorse(threshold) {
|
|
|
2602
2917
|
if (threshold === "needs_review") return ["missing", "needs_review"];
|
|
2603
2918
|
return ["missing", "needs_review", "partial"];
|
|
2604
2919
|
}
|
|
2920
|
+
function formatKnownValues(values, label) {
|
|
2921
|
+
const sorted = [...values].sort();
|
|
2922
|
+
const preview = sorted.slice(0, 25).join(", ");
|
|
2923
|
+
const suffix = sorted.length > 25 ? `, ... +${sorted.length - 25} more` : "";
|
|
2924
|
+
return `Run discovery for the full ${label} list. Known snapshot sample: ${preview}${suffix}`;
|
|
2925
|
+
}
|
|
2605
2926
|
|
|
2606
2927
|
// src/version.ts
|
|
2607
|
-
var MCP_VERSION = "0.
|
|
2928
|
+
var MCP_VERSION = "0.4.1";
|
|
2608
2929
|
|
|
2609
2930
|
// src/server.ts
|
|
2610
2931
|
function buildServer(topolo, scopes, tools = TOOLS) {
|