@topolo/sdk 0.11.1 → 0.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2253 -2
- package/dist/index.d.cts +1357 -1
- package/dist/index.d.ts +1357 -1
- package/dist/index.js +2243 -2
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -21,6 +21,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
ACTION_CATALOG_DIGEST_ALGORITHM: () => ACTION_CATALOG_DIGEST_ALGORITHM,
|
|
24
|
+
APPLICATIONS: () => APPLICATIONS,
|
|
25
|
+
APPLICATION_REQUIREMENTS: () => APPLICATION_REQUIREMENTS,
|
|
26
|
+
APPLICATION_REQUIREMENTS_VERSION: () => APPLICATION_REQUIREMENTS_VERSION,
|
|
24
27
|
CrmModule: () => CrmModule,
|
|
25
28
|
DEFAULT_APP_URLS: () => DEFAULT_APP_URLS,
|
|
26
29
|
IdentityModule: () => IdentityModule,
|
|
@@ -39,7 +42,11 @@ __export(index_exports, {
|
|
|
39
42
|
WorkspacesModule: () => WorkspacesModule,
|
|
40
43
|
actionContractCompleteness: () => actionContractCompleteness,
|
|
41
44
|
applicationEntryFromCatalog: () => applicationEntryFromCatalog,
|
|
45
|
+
applicationRequirementScopes: () => applicationRequirementScopes,
|
|
42
46
|
assertTopoloServiceUrlEnvironment: () => assertTopoloServiceUrlEnvironment,
|
|
47
|
+
auditAllApplicationRequirements: () => auditAllApplicationRequirements,
|
|
48
|
+
auditApplicationEntries: () => auditApplicationEntries,
|
|
49
|
+
auditApplicationRequirements: () => auditApplicationRequirements,
|
|
43
50
|
canonicalTopoloErrorCode: () => canonicalTopoloErrorCode,
|
|
44
51
|
canonicalTopoloRequestId: () => canonicalTopoloRequestId,
|
|
45
52
|
canonicalTopoloRequired: () => canonicalTopoloRequired,
|
|
@@ -47,6 +54,7 @@ __export(index_exports, {
|
|
|
47
54
|
compactActionCatalogEntry: () => compactActionCatalogEntry,
|
|
48
55
|
compactActionPlan: () => compactActionPlan,
|
|
49
56
|
compactActionPreparation: () => compactActionPreparation,
|
|
57
|
+
compactActionResult: () => compactActionResult,
|
|
50
58
|
compactActionValidation: () => compactActionValidation,
|
|
51
59
|
createTopolo: () => createTopolo,
|
|
52
60
|
createTopoloAgentExecutionContext: () => createTopoloAgentExecutionContext,
|
|
@@ -65,9 +73,11 @@ __export(index_exports, {
|
|
|
65
73
|
friendlyAppId: () => friendlyAppId,
|
|
66
74
|
listApplicationDirectory: () => listApplicationDirectory,
|
|
67
75
|
parseTopoloActionUploadContract: () => parseTopoloActionUploadContract,
|
|
76
|
+
preferExactActionMatches: () => preferExactActionMatches,
|
|
68
77
|
prepareTopoloActionBase64UploadInput: () => prepareTopoloActionBase64UploadInput,
|
|
69
78
|
prepareTopoloActionUploadInput: () => prepareTopoloActionUploadInput,
|
|
70
79
|
publicTopoloErrorMessage: () => publicTopoloErrorMessage,
|
|
80
|
+
requirementsForApplication: () => requirementsForApplication,
|
|
71
81
|
resolveApplicationDirectoryEntry: () => resolveApplicationDirectoryEntry,
|
|
72
82
|
resolveCatalogServiceUrl: () => resolveCatalogServiceUrl,
|
|
73
83
|
resolveServiceUrl: () => resolveServiceUrl,
|
|
@@ -970,6 +980,18 @@ function prepareTopoloUrlSessionUploadInput(contractValue, byteLength, input, op
|
|
|
970
980
|
function topoloUploadResponseValue(response, path) {
|
|
971
981
|
return path.split(".").reduce((value, segment) => isRecord2(value) ? value[segment] : void 0, response);
|
|
972
982
|
}
|
|
983
|
+
function redactTopoloUrlSessionResult(response, uploadUrlPath) {
|
|
984
|
+
const redacted = cloneUploadValue(response);
|
|
985
|
+
let target = redacted;
|
|
986
|
+
const segments = uploadUrlPath.split(".");
|
|
987
|
+
for (const segment of segments.slice(0, -1)) {
|
|
988
|
+
target = isRecord2(target) ? target[segment] : void 0;
|
|
989
|
+
}
|
|
990
|
+
const finalSegment = segments.at(-1);
|
|
991
|
+
if (finalSegment && isRecord2(target) && finalSegment in target) target[finalSegment] = "[REDACTED]";
|
|
992
|
+
redactUploadHeaders(redacted);
|
|
993
|
+
return redacted;
|
|
994
|
+
}
|
|
973
995
|
function decodeTopoloActionBase64(contentBase64) {
|
|
974
996
|
if (!isCanonicalBase64(contentBase64)) {
|
|
975
997
|
throw new TopoloSdkError("invalid_upload_content", "Upload content must be canonical base64.");
|
|
@@ -988,6 +1010,28 @@ function mapUploadInput(contract, contentBase64, input, options) {
|
|
|
988
1010
|
[contract.fileNameField]: fileName
|
|
989
1011
|
};
|
|
990
1012
|
}
|
|
1013
|
+
function cloneUploadValue(value) {
|
|
1014
|
+
if (Array.isArray(value)) return value.map(cloneUploadValue);
|
|
1015
|
+
if (!isRecord2(value)) return value;
|
|
1016
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneUploadValue(item)]));
|
|
1017
|
+
}
|
|
1018
|
+
function redactUploadHeaders(value) {
|
|
1019
|
+
if (Array.isArray(value)) {
|
|
1020
|
+
value.forEach(redactUploadHeaders);
|
|
1021
|
+
return;
|
|
1022
|
+
}
|
|
1023
|
+
if (!isRecord2(value)) return;
|
|
1024
|
+
for (const [key, item] of Object.entries(value)) {
|
|
1025
|
+
if (key.toLowerCase() === "headers" && isRecord2(item)) {
|
|
1026
|
+
for (const header of Object.keys(item)) {
|
|
1027
|
+
if (["authorization", "cookie", "set-cookie", "proxy-authorization", "x-api-key"].includes(header.toLowerCase())) {
|
|
1028
|
+
item[header] = "[REDACTED]";
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
redactUploadHeaders(item);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
991
1035
|
function validateUploadMetadata(contract, byteLength, options) {
|
|
992
1036
|
const fileName = options.fileName.trim();
|
|
993
1037
|
const contentType = options.contentType.trim().toLowerCase();
|
|
@@ -1631,7 +1675,7 @@ var TopoloClient = class _TopoloClient {
|
|
|
1631
1675
|
throw new TopoloSdkError("invalid_upload_response", `Upload action response is missing ${contract.uploadUrlPath}.`);
|
|
1632
1676
|
}
|
|
1633
1677
|
await this.putUrlSessionContent(entry, uploadUrl, contract.uploadMethod, bytes, options);
|
|
1634
|
-
if (!contract.complete) return initiation;
|
|
1678
|
+
if (!contract.complete) return redactTopoloUrlSessionResult(initiation, contract.uploadUrlPath);
|
|
1635
1679
|
const completionValue = topoloUploadResponseValue(initiation, contract.complete.responsePath);
|
|
1636
1680
|
if (typeof completionValue !== "string" || !completionValue.trim()) {
|
|
1637
1681
|
throw new TopoloSdkError("invalid_upload_response", `Upload action response is missing ${contract.complete.responsePath}.`);
|
|
@@ -2160,6 +2204,7 @@ function mergeSignals(a, b) {
|
|
|
2160
2204
|
function compactActionCatalogEntry(action) {
|
|
2161
2205
|
const required = Array.isArray(action.inputSchema["required"]) ? action.inputSchema["required"].filter((value) => typeof value === "string") : [];
|
|
2162
2206
|
const examples = action.agentContract?.examples ?? [];
|
|
2207
|
+
const example = compactExample(examples[0]?.input);
|
|
2163
2208
|
return {
|
|
2164
2209
|
actionId: action.actionId,
|
|
2165
2210
|
title: action.title,
|
|
@@ -2171,13 +2216,75 @@ function compactActionCatalogEntry(action) {
|
|
|
2171
2216
|
requiredPermission: action.requiredPermission,
|
|
2172
2217
|
requiredInput: required,
|
|
2173
2218
|
resourceType: action.agentContract?.resource?.kind ?? null,
|
|
2174
|
-
exampleInput:
|
|
2219
|
+
exampleInput: example.value,
|
|
2220
|
+
exampleInputAvailable: example.available,
|
|
2175
2221
|
docsUrl: action.agentContract?.docsUrl ?? null
|
|
2176
2222
|
};
|
|
2177
2223
|
}
|
|
2224
|
+
function compactExample(input) {
|
|
2225
|
+
if (!input) return { value: null, available: false };
|
|
2226
|
+
const serialized = JSON.stringify(input);
|
|
2227
|
+
if (serialized.length > 512) return { value: null, available: true };
|
|
2228
|
+
return { value: input, available: true };
|
|
2229
|
+
}
|
|
2178
2230
|
function compactActionValidation(actionId, validation) {
|
|
2179
2231
|
return { actionId, valid: validation.valid, errors: validation.errors };
|
|
2180
2232
|
}
|
|
2233
|
+
var ACTION_RESULT_MAX_DEPTH = 4;
|
|
2234
|
+
var ACTION_RESULT_MAX_KEYS = 16;
|
|
2235
|
+
var ACTION_RESULT_MAX_ITEMS = 5;
|
|
2236
|
+
var ACTION_RESULT_MAX_SCALARS = 120;
|
|
2237
|
+
var ACTION_RESULT_MAX_STRING = 512;
|
|
2238
|
+
function resultKeyPriority(key) {
|
|
2239
|
+
if (/^(id|requestId|status|state|url|slug|name|title|version)$/i.test(key)) return 0;
|
|
2240
|
+
if (/(Id|Ids|Url|Uri|Status|State|Count|Total|Version|CreatedAt|UpdatedAt)$/i.test(key)) return 1;
|
|
2241
|
+
return 2;
|
|
2242
|
+
}
|
|
2243
|
+
function compactResultValue(value, depth, budget) {
|
|
2244
|
+
if (value === null || typeof value === "boolean" || typeof value === "number") {
|
|
2245
|
+
budget.scalars += 1;
|
|
2246
|
+
return value;
|
|
2247
|
+
}
|
|
2248
|
+
if (typeof value === "string") {
|
|
2249
|
+
budget.scalars += 1;
|
|
2250
|
+
if (value.length <= ACTION_RESULT_MAX_STRING) return value;
|
|
2251
|
+
return `${value.slice(0, ACTION_RESULT_MAX_STRING)}\u2026 (${value.length} chars)`;
|
|
2252
|
+
}
|
|
2253
|
+
if (depth >= ACTION_RESULT_MAX_DEPTH || budget.scalars >= ACTION_RESULT_MAX_SCALARS) {
|
|
2254
|
+
return Array.isArray(value) ? { count: value.length, omitted: true } : { omitted: true };
|
|
2255
|
+
}
|
|
2256
|
+
if (Array.isArray(value)) {
|
|
2257
|
+
const items = value.slice(0, ACTION_RESULT_MAX_ITEMS).map((item) => compactResultValue(item, depth + 1, budget));
|
|
2258
|
+
return value.length > ACTION_RESULT_MAX_ITEMS ? { count: value.length, items, omittedItems: value.length - ACTION_RESULT_MAX_ITEMS } : items;
|
|
2259
|
+
}
|
|
2260
|
+
if (typeof value === "object") {
|
|
2261
|
+
const record = value;
|
|
2262
|
+
const allKeys = Object.keys(record);
|
|
2263
|
+
const keys = allKeys.sort((left, right) => resultKeyPriority(left) - resultKeyPriority(right)).slice(0, ACTION_RESULT_MAX_KEYS);
|
|
2264
|
+
const compact = Object.fromEntries(keys.map((key) => [key, compactResultValue(record[key], depth + 1, budget)]));
|
|
2265
|
+
if (allKeys.length > keys.length) compact["_omittedKeys"] = allKeys.length - keys.length;
|
|
2266
|
+
return compact;
|
|
2267
|
+
}
|
|
2268
|
+
budget.scalars += 1;
|
|
2269
|
+
return String(value);
|
|
2270
|
+
}
|
|
2271
|
+
function compactActionResult(actionId, result) {
|
|
2272
|
+
let normalized = result;
|
|
2273
|
+
if (typeof result === "string") {
|
|
2274
|
+
try {
|
|
2275
|
+
normalized = JSON.parse(result);
|
|
2276
|
+
} catch {
|
|
2277
|
+
normalized = result;
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
return { actionId, result: compactResultValue(normalized, 0, { scalars: 0 }) };
|
|
2281
|
+
}
|
|
2282
|
+
function preferExactActionMatches(actions, query) {
|
|
2283
|
+
const expected = query?.trim().toLowerCase();
|
|
2284
|
+
if (!expected) return actions;
|
|
2285
|
+
const exact = actions.filter((action) => [action.actionId, action.name, action.toolName].some((candidate) => candidate?.trim().toLowerCase() === expected));
|
|
2286
|
+
return exact.length ? exact : actions;
|
|
2287
|
+
}
|
|
2181
2288
|
function compactActionPlan(plan) {
|
|
2182
2289
|
return {
|
|
2183
2290
|
actionId: plan.action.actionId,
|
|
@@ -2673,6 +2780,2140 @@ function actionContractCompleteness(action) {
|
|
|
2673
2780
|
};
|
|
2674
2781
|
}
|
|
2675
2782
|
|
|
2783
|
+
// src/applications-fallback.ts
|
|
2784
|
+
var APPLICATIONS = {
|
|
2785
|
+
"admin": {
|
|
2786
|
+
"id": "admin",
|
|
2787
|
+
"appDir": "TopoloAdmin",
|
|
2788
|
+
"name": "topolo-admin",
|
|
2789
|
+
"packageName": "topolo-admin",
|
|
2790
|
+
"productionUrl": "https://admin.topolo.app",
|
|
2791
|
+
"services": [],
|
|
2792
|
+
"deployTargets": [
|
|
2793
|
+
{
|
|
2794
|
+
"name": "topolo-admin",
|
|
2795
|
+
"kind": "worker",
|
|
2796
|
+
"apiUrl": "https://admin.topolo.app",
|
|
2797
|
+
"domains": [
|
|
2798
|
+
"admin.topolo.app"
|
|
2799
|
+
],
|
|
2800
|
+
"routes": [
|
|
2801
|
+
"admin.topolo.app"
|
|
2802
|
+
],
|
|
2803
|
+
"appId": null
|
|
2804
|
+
},
|
|
2805
|
+
{
|
|
2806
|
+
"name": "topolo-admin-api",
|
|
2807
|
+
"kind": "worker",
|
|
2808
|
+
"apiUrl": null,
|
|
2809
|
+
"domains": [],
|
|
2810
|
+
"routes": [],
|
|
2811
|
+
"appId": null
|
|
2812
|
+
}
|
|
2813
|
+
]
|
|
2814
|
+
},
|
|
2815
|
+
"agent": {
|
|
2816
|
+
"id": "agent",
|
|
2817
|
+
"appDir": "TopoloAgent",
|
|
2818
|
+
"name": "topolo-agent",
|
|
2819
|
+
"packageName": "topolo-agent",
|
|
2820
|
+
"productionUrl": "https://agent.topolo.app",
|
|
2821
|
+
"services": [
|
|
2822
|
+
"agent"
|
|
2823
|
+
],
|
|
2824
|
+
"deployTargets": [
|
|
2825
|
+
{
|
|
2826
|
+
"name": "topolo-agent",
|
|
2827
|
+
"kind": "worker",
|
|
2828
|
+
"apiUrl": "https://agent.topolo.app",
|
|
2829
|
+
"domains": [
|
|
2830
|
+
"agent.topolo.app"
|
|
2831
|
+
],
|
|
2832
|
+
"routes": [
|
|
2833
|
+
"agent.topolo.app"
|
|
2834
|
+
],
|
|
2835
|
+
"appId": "agent"
|
|
2836
|
+
},
|
|
2837
|
+
{
|
|
2838
|
+
"name": "topolo-agent-api",
|
|
2839
|
+
"kind": "worker",
|
|
2840
|
+
"apiUrl": null,
|
|
2841
|
+
"domains": [],
|
|
2842
|
+
"routes": [],
|
|
2843
|
+
"appId": null
|
|
2844
|
+
}
|
|
2845
|
+
]
|
|
2846
|
+
},
|
|
2847
|
+
"auth": {
|
|
2848
|
+
"id": "auth",
|
|
2849
|
+
"appDir": "TopoloAuth",
|
|
2850
|
+
"name": "topolo-auth",
|
|
2851
|
+
"packageName": "topolo-auth",
|
|
2852
|
+
"productionUrl": "https://auth.topolo.app",
|
|
2853
|
+
"services": [
|
|
2854
|
+
"auth"
|
|
2855
|
+
],
|
|
2856
|
+
"deployTargets": [
|
|
2857
|
+
{
|
|
2858
|
+
"name": "topolo-auth",
|
|
2859
|
+
"kind": "worker",
|
|
2860
|
+
"apiUrl": "https://auth.topolo.app",
|
|
2861
|
+
"domains": [
|
|
2862
|
+
"auth.topolo.app"
|
|
2863
|
+
],
|
|
2864
|
+
"routes": [
|
|
2865
|
+
"auth.topolo.app"
|
|
2866
|
+
],
|
|
2867
|
+
"appId": "auth"
|
|
2868
|
+
}
|
|
2869
|
+
]
|
|
2870
|
+
},
|
|
2871
|
+
"backup": {
|
|
2872
|
+
"id": "backup",
|
|
2873
|
+
"appDir": "TopoloBackup",
|
|
2874
|
+
"name": "topolo-backup",
|
|
2875
|
+
"packageName": "topolo-backup",
|
|
2876
|
+
"productionUrl": "https://backup.topolo.app",
|
|
2877
|
+
"services": [
|
|
2878
|
+
"backup"
|
|
2879
|
+
],
|
|
2880
|
+
"deployTargets": [
|
|
2881
|
+
{
|
|
2882
|
+
"name": "topolo-backup",
|
|
2883
|
+
"kind": "worker",
|
|
2884
|
+
"apiUrl": "https://backup.topolo.app",
|
|
2885
|
+
"domains": [
|
|
2886
|
+
"backup.topolo.app"
|
|
2887
|
+
],
|
|
2888
|
+
"routes": [
|
|
2889
|
+
"backup.topolo.app"
|
|
2890
|
+
],
|
|
2891
|
+
"appId": "backup"
|
|
2892
|
+
}
|
|
2893
|
+
]
|
|
2894
|
+
},
|
|
2895
|
+
"blog": {
|
|
2896
|
+
"id": "blog",
|
|
2897
|
+
"appDir": "TopoloBlog",
|
|
2898
|
+
"name": "topolo-blog",
|
|
2899
|
+
"packageName": "topolo-blog",
|
|
2900
|
+
"productionUrl": "https://blog.topolo.app",
|
|
2901
|
+
"services": [
|
|
2902
|
+
"blog"
|
|
2903
|
+
],
|
|
2904
|
+
"deployTargets": [
|
|
2905
|
+
{
|
|
2906
|
+
"name": "topolo-blog",
|
|
2907
|
+
"kind": "worker",
|
|
2908
|
+
"apiUrl": "https://blog.topolo.app",
|
|
2909
|
+
"domains": [
|
|
2910
|
+
"blog.topolo.app"
|
|
2911
|
+
],
|
|
2912
|
+
"routes": [
|
|
2913
|
+
"blog.topolo.app"
|
|
2914
|
+
],
|
|
2915
|
+
"appId": "blog"
|
|
2916
|
+
},
|
|
2917
|
+
{
|
|
2918
|
+
"name": "topolo-blog-api",
|
|
2919
|
+
"kind": "worker",
|
|
2920
|
+
"apiUrl": null,
|
|
2921
|
+
"domains": [],
|
|
2922
|
+
"routes": [],
|
|
2923
|
+
"appId": null
|
|
2924
|
+
}
|
|
2925
|
+
]
|
|
2926
|
+
},
|
|
2927
|
+
"books": {
|
|
2928
|
+
"id": "books",
|
|
2929
|
+
"appDir": "TopoloBooks",
|
|
2930
|
+
"name": "topolo-books",
|
|
2931
|
+
"packageName": "topolo-books",
|
|
2932
|
+
"productionUrl": "https://books.topolo.app",
|
|
2933
|
+
"services": [
|
|
2934
|
+
"books"
|
|
2935
|
+
],
|
|
2936
|
+
"deployTargets": [
|
|
2937
|
+
{
|
|
2938
|
+
"name": "topolo-books",
|
|
2939
|
+
"kind": "worker",
|
|
2940
|
+
"apiUrl": "https://books.topolo.app",
|
|
2941
|
+
"domains": [
|
|
2942
|
+
"books.topolo.app"
|
|
2943
|
+
],
|
|
2944
|
+
"routes": [
|
|
2945
|
+
"books.topolo.app"
|
|
2946
|
+
],
|
|
2947
|
+
"appId": "books"
|
|
2948
|
+
},
|
|
2949
|
+
{
|
|
2950
|
+
"name": "topolo-books-api",
|
|
2951
|
+
"kind": "worker",
|
|
2952
|
+
"apiUrl": null,
|
|
2953
|
+
"domains": [],
|
|
2954
|
+
"routes": [],
|
|
2955
|
+
"appId": null
|
|
2956
|
+
}
|
|
2957
|
+
]
|
|
2958
|
+
},
|
|
2959
|
+
"brand": {
|
|
2960
|
+
"id": "brand",
|
|
2961
|
+
"appDir": "TopoloBrand",
|
|
2962
|
+
"name": "topolo-brand",
|
|
2963
|
+
"packageName": "@topolo/topolo-brand",
|
|
2964
|
+
"productionUrl": "https://brand.topolo.app",
|
|
2965
|
+
"services": [
|
|
2966
|
+
"brand"
|
|
2967
|
+
],
|
|
2968
|
+
"deployTargets": [
|
|
2969
|
+
{
|
|
2970
|
+
"name": "topolo-brand",
|
|
2971
|
+
"kind": "worker",
|
|
2972
|
+
"apiUrl": "https://brand.topolo.app",
|
|
2973
|
+
"domains": [
|
|
2974
|
+
"brand.topolo.app"
|
|
2975
|
+
],
|
|
2976
|
+
"routes": [
|
|
2977
|
+
"brand.topolo.app"
|
|
2978
|
+
],
|
|
2979
|
+
"appId": "brand"
|
|
2980
|
+
},
|
|
2981
|
+
{
|
|
2982
|
+
"name": "topolo-brand-api",
|
|
2983
|
+
"kind": "worker",
|
|
2984
|
+
"apiUrl": null,
|
|
2985
|
+
"domains": [],
|
|
2986
|
+
"routes": [],
|
|
2987
|
+
"appId": null
|
|
2988
|
+
}
|
|
2989
|
+
]
|
|
2990
|
+
},
|
|
2991
|
+
"bugfix": {
|
|
2992
|
+
"id": "bugfix",
|
|
2993
|
+
"appDir": "TopoloBugFix",
|
|
2994
|
+
"name": "topolo-bugfix",
|
|
2995
|
+
"packageName": "topolo-bugfix",
|
|
2996
|
+
"productionUrl": "https://bugfix.topolo.app",
|
|
2997
|
+
"services": [
|
|
2998
|
+
"bugfix"
|
|
2999
|
+
],
|
|
3000
|
+
"deployTargets": [
|
|
3001
|
+
{
|
|
3002
|
+
"name": "topolo-bugfix",
|
|
3003
|
+
"kind": "worker",
|
|
3004
|
+
"apiUrl": "https://bugfix.topolo.app",
|
|
3005
|
+
"domains": [
|
|
3006
|
+
"bugfix.topolo.app"
|
|
3007
|
+
],
|
|
3008
|
+
"routes": [
|
|
3009
|
+
"bugfix.topolo.app"
|
|
3010
|
+
],
|
|
3011
|
+
"appId": "bugfix"
|
|
3012
|
+
}
|
|
3013
|
+
]
|
|
3014
|
+
},
|
|
3015
|
+
"bytes": {
|
|
3016
|
+
"id": "bytes",
|
|
3017
|
+
"appDir": "TopoloBytes",
|
|
3018
|
+
"name": "topolo-bytes",
|
|
3019
|
+
"packageName": "topolo-bytes",
|
|
3020
|
+
"productionUrl": "https://bytes.topolo.app",
|
|
3021
|
+
"services": [
|
|
3022
|
+
"bytes"
|
|
3023
|
+
],
|
|
3024
|
+
"deployTargets": [
|
|
3025
|
+
{
|
|
3026
|
+
"name": "topolo-bytes",
|
|
3027
|
+
"kind": "worker",
|
|
3028
|
+
"apiUrl": "https://bytes.topolo.app",
|
|
3029
|
+
"domains": [
|
|
3030
|
+
"bytes.topolo.app"
|
|
3031
|
+
],
|
|
3032
|
+
"routes": [
|
|
3033
|
+
"bytes.topolo.app"
|
|
3034
|
+
],
|
|
3035
|
+
"appId": "bytes"
|
|
3036
|
+
},
|
|
3037
|
+
{
|
|
3038
|
+
"name": "topolo-bytes-api",
|
|
3039
|
+
"kind": "worker",
|
|
3040
|
+
"apiUrl": null,
|
|
3041
|
+
"domains": [],
|
|
3042
|
+
"routes": [],
|
|
3043
|
+
"appId": null
|
|
3044
|
+
}
|
|
3045
|
+
]
|
|
3046
|
+
},
|
|
3047
|
+
"calendar": {
|
|
3048
|
+
"id": "calendar",
|
|
3049
|
+
"appDir": "TopoloCalendar",
|
|
3050
|
+
"name": "topolo-calendar",
|
|
3051
|
+
"packageName": "topolo-calendar",
|
|
3052
|
+
"productionUrl": "https://calendar.topolo.app",
|
|
3053
|
+
"services": [
|
|
3054
|
+
"calendar"
|
|
3055
|
+
],
|
|
3056
|
+
"deployTargets": [
|
|
3057
|
+
{
|
|
3058
|
+
"name": "topolo-calendar",
|
|
3059
|
+
"kind": "worker",
|
|
3060
|
+
"apiUrl": "https://calendar.topolo.app",
|
|
3061
|
+
"domains": [
|
|
3062
|
+
"calendar.topolo.app"
|
|
3063
|
+
],
|
|
3064
|
+
"routes": [
|
|
3065
|
+
"calendar.topolo.app"
|
|
3066
|
+
],
|
|
3067
|
+
"appId": "calendar"
|
|
3068
|
+
},
|
|
3069
|
+
{
|
|
3070
|
+
"name": "topolo-calendar-api",
|
|
3071
|
+
"kind": "worker",
|
|
3072
|
+
"apiUrl": null,
|
|
3073
|
+
"domains": [],
|
|
3074
|
+
"routes": [],
|
|
3075
|
+
"appId": null
|
|
3076
|
+
}
|
|
3077
|
+
]
|
|
3078
|
+
},
|
|
3079
|
+
"campaigns": {
|
|
3080
|
+
"id": "campaigns",
|
|
3081
|
+
"appDir": "TopoloCampaigns",
|
|
3082
|
+
"name": "topolo-campaigns",
|
|
3083
|
+
"packageName": "topolo-campaigns",
|
|
3084
|
+
"productionUrl": "https://campaigns.topolo.app",
|
|
3085
|
+
"services": [
|
|
3086
|
+
"campaigns"
|
|
3087
|
+
],
|
|
3088
|
+
"deployTargets": [
|
|
3089
|
+
{
|
|
3090
|
+
"name": "topolo-campaigns",
|
|
3091
|
+
"kind": "worker",
|
|
3092
|
+
"apiUrl": "https://campaigns.topolo.app",
|
|
3093
|
+
"domains": [
|
|
3094
|
+
"campaigns.topolo.app"
|
|
3095
|
+
],
|
|
3096
|
+
"routes": [
|
|
3097
|
+
"campaigns.topolo.app"
|
|
3098
|
+
],
|
|
3099
|
+
"appId": "campaigns"
|
|
3100
|
+
},
|
|
3101
|
+
{
|
|
3102
|
+
"name": "topolo-campaigns-api",
|
|
3103
|
+
"kind": "worker",
|
|
3104
|
+
"apiUrl": null,
|
|
3105
|
+
"domains": [],
|
|
3106
|
+
"routes": [],
|
|
3107
|
+
"appId": null
|
|
3108
|
+
}
|
|
3109
|
+
]
|
|
3110
|
+
},
|
|
3111
|
+
"capacity": {
|
|
3112
|
+
"id": "capacity",
|
|
3113
|
+
"appDir": "TopoloCapacity",
|
|
3114
|
+
"name": "topolo-capacity",
|
|
3115
|
+
"packageName": "topolo-capacity",
|
|
3116
|
+
"productionUrl": "https://capacity.topolo.app",
|
|
3117
|
+
"services": [
|
|
3118
|
+
"capacity"
|
|
3119
|
+
],
|
|
3120
|
+
"deployTargets": [
|
|
3121
|
+
{
|
|
3122
|
+
"name": "topolo-capacity",
|
|
3123
|
+
"kind": "worker",
|
|
3124
|
+
"apiUrl": "https://capacity.topolo.app",
|
|
3125
|
+
"domains": [
|
|
3126
|
+
"capacity.topolo.app"
|
|
3127
|
+
],
|
|
3128
|
+
"routes": [
|
|
3129
|
+
"capacity.topolo.app"
|
|
3130
|
+
],
|
|
3131
|
+
"appId": "capacity"
|
|
3132
|
+
}
|
|
3133
|
+
]
|
|
3134
|
+
},
|
|
3135
|
+
"chat": {
|
|
3136
|
+
"id": "chat",
|
|
3137
|
+
"appDir": "TopoloChat",
|
|
3138
|
+
"name": "topolo-chat",
|
|
3139
|
+
"packageName": "topolo-chat",
|
|
3140
|
+
"productionUrl": "https://chat.topolo.app",
|
|
3141
|
+
"services": [
|
|
3142
|
+
"chat"
|
|
3143
|
+
],
|
|
3144
|
+
"deployTargets": [
|
|
3145
|
+
{
|
|
3146
|
+
"name": "topolo-chat",
|
|
3147
|
+
"kind": "worker",
|
|
3148
|
+
"apiUrl": "https://chat.topolo.app",
|
|
3149
|
+
"domains": [
|
|
3150
|
+
"chat.topolo.app"
|
|
3151
|
+
],
|
|
3152
|
+
"routes": [
|
|
3153
|
+
"chat.topolo.app"
|
|
3154
|
+
],
|
|
3155
|
+
"appId": "chat"
|
|
3156
|
+
},
|
|
3157
|
+
{
|
|
3158
|
+
"name": "topolo-chat-api",
|
|
3159
|
+
"kind": "worker",
|
|
3160
|
+
"apiUrl": null,
|
|
3161
|
+
"domains": [],
|
|
3162
|
+
"routes": [],
|
|
3163
|
+
"appId": null
|
|
3164
|
+
}
|
|
3165
|
+
]
|
|
3166
|
+
},
|
|
3167
|
+
"commerce": {
|
|
3168
|
+
"id": "commerce",
|
|
3169
|
+
"appDir": "TopoloCommerce",
|
|
3170
|
+
"name": "topolo-commerce",
|
|
3171
|
+
"packageName": "topolo-commerce",
|
|
3172
|
+
"productionUrl": "https://commerce.topolo.app",
|
|
3173
|
+
"services": [
|
|
3174
|
+
"commerce"
|
|
3175
|
+
],
|
|
3176
|
+
"deployTargets": [
|
|
3177
|
+
{
|
|
3178
|
+
"name": "topolo-commerce-api",
|
|
3179
|
+
"kind": "worker",
|
|
3180
|
+
"apiUrl": null,
|
|
3181
|
+
"domains": [],
|
|
3182
|
+
"routes": [],
|
|
3183
|
+
"appId": null
|
|
3184
|
+
},
|
|
3185
|
+
{
|
|
3186
|
+
"name": "topolo-commerce-guest-web",
|
|
3187
|
+
"kind": "worker",
|
|
3188
|
+
"apiUrl": "https://guest.topolo.app",
|
|
3189
|
+
"domains": [
|
|
3190
|
+
"guest.topolo.app"
|
|
3191
|
+
],
|
|
3192
|
+
"routes": [
|
|
3193
|
+
"guest.topolo.app"
|
|
3194
|
+
],
|
|
3195
|
+
"appId": null
|
|
3196
|
+
},
|
|
3197
|
+
{
|
|
3198
|
+
"name": "topolo-commerce-ops-web",
|
|
3199
|
+
"kind": "worker",
|
|
3200
|
+
"apiUrl": "https://commerce.topolo.app",
|
|
3201
|
+
"domains": [
|
|
3202
|
+
"commerce.topolo.app"
|
|
3203
|
+
],
|
|
3204
|
+
"routes": [
|
|
3205
|
+
"commerce.topolo.app"
|
|
3206
|
+
],
|
|
3207
|
+
"appId": "commerce"
|
|
3208
|
+
},
|
|
3209
|
+
{
|
|
3210
|
+
"name": "topolo-commerce-station-web",
|
|
3211
|
+
"kind": "worker",
|
|
3212
|
+
"apiUrl": "https://station-commerce.topolo.app",
|
|
3213
|
+
"domains": [
|
|
3214
|
+
"station-commerce.topolo.app"
|
|
3215
|
+
],
|
|
3216
|
+
"routes": [
|
|
3217
|
+
"station-commerce.topolo.app"
|
|
3218
|
+
],
|
|
3219
|
+
"appId": null
|
|
3220
|
+
}
|
|
3221
|
+
]
|
|
3222
|
+
},
|
|
3223
|
+
"compose": {
|
|
3224
|
+
"id": "compose",
|
|
3225
|
+
"appDir": "TopoloCompose",
|
|
3226
|
+
"name": "topolo-compose",
|
|
3227
|
+
"packageName": "@topolo/compose",
|
|
3228
|
+
"productionUrl": "https://compose.topolo.app",
|
|
3229
|
+
"services": [
|
|
3230
|
+
"compose"
|
|
3231
|
+
],
|
|
3232
|
+
"deployTargets": [
|
|
3233
|
+
{
|
|
3234
|
+
"name": "topolo-compose",
|
|
3235
|
+
"kind": "worker",
|
|
3236
|
+
"apiUrl": "https://compose.topolo.app",
|
|
3237
|
+
"domains": [
|
|
3238
|
+
"compose.topolo.app"
|
|
3239
|
+
],
|
|
3240
|
+
"routes": [
|
|
3241
|
+
"compose.topolo.app"
|
|
3242
|
+
],
|
|
3243
|
+
"appId": "compose"
|
|
3244
|
+
},
|
|
3245
|
+
{
|
|
3246
|
+
"name": "topolo-compose-api",
|
|
3247
|
+
"kind": "worker",
|
|
3248
|
+
"apiUrl": null,
|
|
3249
|
+
"domains": [],
|
|
3250
|
+
"routes": [],
|
|
3251
|
+
"appId": null
|
|
3252
|
+
}
|
|
3253
|
+
]
|
|
3254
|
+
},
|
|
3255
|
+
"consent": {
|
|
3256
|
+
"id": "consent",
|
|
3257
|
+
"appDir": "TopoloConsent",
|
|
3258
|
+
"name": "topolo-consent",
|
|
3259
|
+
"packageName": "topolo-consent",
|
|
3260
|
+
"productionUrl": "https://consent.topolo.app",
|
|
3261
|
+
"services": [
|
|
3262
|
+
"consent"
|
|
3263
|
+
],
|
|
3264
|
+
"deployTargets": [
|
|
3265
|
+
{
|
|
3266
|
+
"name": "topolo-consent",
|
|
3267
|
+
"kind": "worker",
|
|
3268
|
+
"apiUrl": "https://consent.topolo.app",
|
|
3269
|
+
"domains": [
|
|
3270
|
+
"consent.topolo.app"
|
|
3271
|
+
],
|
|
3272
|
+
"routes": [
|
|
3273
|
+
"consent.topolo.app"
|
|
3274
|
+
],
|
|
3275
|
+
"appId": "consent"
|
|
3276
|
+
},
|
|
3277
|
+
{
|
|
3278
|
+
"name": "topolo-consent-api",
|
|
3279
|
+
"kind": "worker",
|
|
3280
|
+
"apiUrl": null,
|
|
3281
|
+
"domains": [],
|
|
3282
|
+
"routes": [],
|
|
3283
|
+
"appId": null
|
|
3284
|
+
}
|
|
3285
|
+
]
|
|
3286
|
+
},
|
|
3287
|
+
"crm": {
|
|
3288
|
+
"id": "crm",
|
|
3289
|
+
"appDir": "TopoloCRM",
|
|
3290
|
+
"name": "topolo-crm",
|
|
3291
|
+
"packageName": "topolo-crm",
|
|
3292
|
+
"productionUrl": "https://crm.topolo.app",
|
|
3293
|
+
"services": [
|
|
3294
|
+
"crm"
|
|
3295
|
+
],
|
|
3296
|
+
"deployTargets": [
|
|
3297
|
+
{
|
|
3298
|
+
"name": "topolo-crm-api",
|
|
3299
|
+
"kind": "worker",
|
|
3300
|
+
"apiUrl": null,
|
|
3301
|
+
"domains": [],
|
|
3302
|
+
"routes": [],
|
|
3303
|
+
"appId": null
|
|
3304
|
+
},
|
|
3305
|
+
{
|
|
3306
|
+
"name": "topolo-crm-app",
|
|
3307
|
+
"kind": "worker",
|
|
3308
|
+
"apiUrl": "https://crm.topolo.app",
|
|
3309
|
+
"domains": [
|
|
3310
|
+
"crm.topolo.app"
|
|
3311
|
+
],
|
|
3312
|
+
"routes": [
|
|
3313
|
+
"crm.topolo.app"
|
|
3314
|
+
],
|
|
3315
|
+
"appId": "crm"
|
|
3316
|
+
}
|
|
3317
|
+
]
|
|
3318
|
+
},
|
|
3319
|
+
"design": {
|
|
3320
|
+
"id": "design",
|
|
3321
|
+
"appDir": "TopoloDesign",
|
|
3322
|
+
"name": "topolo-design",
|
|
3323
|
+
"packageName": "@topolo-io/design",
|
|
3324
|
+
"productionUrl": "https://design.topolo.app",
|
|
3325
|
+
"services": [
|
|
3326
|
+
"design"
|
|
3327
|
+
],
|
|
3328
|
+
"deployTargets": [
|
|
3329
|
+
{
|
|
3330
|
+
"name": "topolo-design",
|
|
3331
|
+
"kind": "worker",
|
|
3332
|
+
"apiUrl": "https://design.topolo.app",
|
|
3333
|
+
"domains": [
|
|
3334
|
+
"design.topolo.app"
|
|
3335
|
+
],
|
|
3336
|
+
"routes": [
|
|
3337
|
+
"design.topolo.app"
|
|
3338
|
+
],
|
|
3339
|
+
"appId": "design"
|
|
3340
|
+
},
|
|
3341
|
+
{
|
|
3342
|
+
"name": "topolo-design-api",
|
|
3343
|
+
"kind": "worker",
|
|
3344
|
+
"apiUrl": null,
|
|
3345
|
+
"domains": [],
|
|
3346
|
+
"routes": [],
|
|
3347
|
+
"appId": null
|
|
3348
|
+
}
|
|
3349
|
+
]
|
|
3350
|
+
},
|
|
3351
|
+
"developers": {
|
|
3352
|
+
"id": "developers",
|
|
3353
|
+
"appDir": "TopoloDevelopers",
|
|
3354
|
+
"name": "topolo-developers",
|
|
3355
|
+
"packageName": "topolo-developers",
|
|
3356
|
+
"productionUrl": "https://developers.topolo.app",
|
|
3357
|
+
"services": [
|
|
3358
|
+
"developers"
|
|
3359
|
+
],
|
|
3360
|
+
"deployTargets": [
|
|
3361
|
+
{
|
|
3362
|
+
"name": "topolo-catalog-cron",
|
|
3363
|
+
"kind": "worker",
|
|
3364
|
+
"apiUrl": null,
|
|
3365
|
+
"domains": [],
|
|
3366
|
+
"routes": [],
|
|
3367
|
+
"appId": null
|
|
3368
|
+
},
|
|
3369
|
+
{
|
|
3370
|
+
"name": "topolo-developers",
|
|
3371
|
+
"kind": "worker",
|
|
3372
|
+
"apiUrl": "https://developers.topolo.app",
|
|
3373
|
+
"domains": [
|
|
3374
|
+
"developers.topolo.app"
|
|
3375
|
+
],
|
|
3376
|
+
"routes": [
|
|
3377
|
+
"developers.topolo.app"
|
|
3378
|
+
],
|
|
3379
|
+
"appId": "developers"
|
|
3380
|
+
},
|
|
3381
|
+
{
|
|
3382
|
+
"name": "topolo-developers-api",
|
|
3383
|
+
"kind": "worker",
|
|
3384
|
+
"apiUrl": null,
|
|
3385
|
+
"domains": [],
|
|
3386
|
+
"routes": [],
|
|
3387
|
+
"appId": null
|
|
3388
|
+
}
|
|
3389
|
+
]
|
|
3390
|
+
},
|
|
3391
|
+
"director": {
|
|
3392
|
+
"id": "director",
|
|
3393
|
+
"appDir": "TopoloDirector",
|
|
3394
|
+
"name": "topolo-director",
|
|
3395
|
+
"packageName": "topolo-director",
|
|
3396
|
+
"productionUrl": "https://director.topolo.app",
|
|
3397
|
+
"services": [
|
|
3398
|
+
"director"
|
|
3399
|
+
],
|
|
3400
|
+
"deployTargets": [
|
|
3401
|
+
{
|
|
3402
|
+
"name": "topolo-director",
|
|
3403
|
+
"kind": "worker",
|
|
3404
|
+
"apiUrl": "https://director.topolo.app",
|
|
3405
|
+
"domains": [
|
|
3406
|
+
"director.topolo.app"
|
|
3407
|
+
],
|
|
3408
|
+
"routes": [
|
|
3409
|
+
"director.topolo.app"
|
|
3410
|
+
],
|
|
3411
|
+
"appId": "director"
|
|
3412
|
+
},
|
|
3413
|
+
{
|
|
3414
|
+
"name": "topolo-director-api",
|
|
3415
|
+
"kind": "worker",
|
|
3416
|
+
"apiUrl": null,
|
|
3417
|
+
"domains": [],
|
|
3418
|
+
"routes": [],
|
|
3419
|
+
"appId": null
|
|
3420
|
+
}
|
|
3421
|
+
]
|
|
3422
|
+
},
|
|
3423
|
+
"docs": {
|
|
3424
|
+
"id": "docs",
|
|
3425
|
+
"appDir": "TopoloDocs",
|
|
3426
|
+
"name": "topolo-docs",
|
|
3427
|
+
"packageName": "topolo-docs",
|
|
3428
|
+
"productionUrl": "https://docs.topolo.app",
|
|
3429
|
+
"services": [],
|
|
3430
|
+
"deployTargets": [
|
|
3431
|
+
{
|
|
3432
|
+
"name": "topolo-docs",
|
|
3433
|
+
"kind": "worker",
|
|
3434
|
+
"apiUrl": "https://docs.topolo.app",
|
|
3435
|
+
"domains": [
|
|
3436
|
+
"docs.topolo.app"
|
|
3437
|
+
],
|
|
3438
|
+
"routes": [
|
|
3439
|
+
"docs.topolo.app"
|
|
3440
|
+
],
|
|
3441
|
+
"appId": null
|
|
3442
|
+
},
|
|
3443
|
+
{
|
|
3444
|
+
"name": "topolo-docs-api",
|
|
3445
|
+
"kind": "worker",
|
|
3446
|
+
"apiUrl": null,
|
|
3447
|
+
"domains": [],
|
|
3448
|
+
"routes": [],
|
|
3449
|
+
"appId": null
|
|
3450
|
+
}
|
|
3451
|
+
]
|
|
3452
|
+
},
|
|
3453
|
+
"feed": {
|
|
3454
|
+
"id": "feed",
|
|
3455
|
+
"appDir": "TopoloFeed",
|
|
3456
|
+
"name": "TopoloFeed",
|
|
3457
|
+
"packageName": "topolo-feed",
|
|
3458
|
+
"productionUrl": "https://feed.topolo.app",
|
|
3459
|
+
"services": [
|
|
3460
|
+
"feed"
|
|
3461
|
+
],
|
|
3462
|
+
"deployTargets": [
|
|
3463
|
+
{
|
|
3464
|
+
"name": "topolo-feed-analytics-api",
|
|
3465
|
+
"kind": "worker",
|
|
3466
|
+
"apiUrl": "https://feed-analytics-api.topolo.app",
|
|
3467
|
+
"domains": [
|
|
3468
|
+
"feed-analytics-api.topolo.app"
|
|
3469
|
+
],
|
|
3470
|
+
"routes": [
|
|
3471
|
+
"feed-analytics-api.topolo.app"
|
|
3472
|
+
],
|
|
3473
|
+
"appId": null
|
|
3474
|
+
},
|
|
3475
|
+
{
|
|
3476
|
+
"name": "topolo-feed-api",
|
|
3477
|
+
"kind": "worker",
|
|
3478
|
+
"apiUrl": "https://feed-api.topolo.app",
|
|
3479
|
+
"domains": [
|
|
3480
|
+
"feed-api.topolo.app"
|
|
3481
|
+
],
|
|
3482
|
+
"routes": [
|
|
3483
|
+
"feed-api.topolo.app"
|
|
3484
|
+
],
|
|
3485
|
+
"appId": null
|
|
3486
|
+
},
|
|
3487
|
+
{
|
|
3488
|
+
"name": "topolo-feed-web",
|
|
3489
|
+
"kind": "worker",
|
|
3490
|
+
"apiUrl": "https://feed.topolo.app",
|
|
3491
|
+
"domains": [
|
|
3492
|
+
"feed.topolo.app"
|
|
3493
|
+
],
|
|
3494
|
+
"routes": [
|
|
3495
|
+
"feed.topolo.app"
|
|
3496
|
+
],
|
|
3497
|
+
"appId": "feed"
|
|
3498
|
+
}
|
|
3499
|
+
]
|
|
3500
|
+
},
|
|
3501
|
+
"flow": {
|
|
3502
|
+
"id": "flow",
|
|
3503
|
+
"appDir": "TopoloFlow",
|
|
3504
|
+
"name": "topolo-flow",
|
|
3505
|
+
"packageName": "topolo-flow",
|
|
3506
|
+
"productionUrl": "https://flow.topolo.app",
|
|
3507
|
+
"services": [
|
|
3508
|
+
"flow"
|
|
3509
|
+
],
|
|
3510
|
+
"deployTargets": [
|
|
3511
|
+
{
|
|
3512
|
+
"name": "topolo-flow",
|
|
3513
|
+
"kind": "worker",
|
|
3514
|
+
"apiUrl": "https://flow.topolo.app",
|
|
3515
|
+
"domains": [
|
|
3516
|
+
"flow.topolo.app"
|
|
3517
|
+
],
|
|
3518
|
+
"routes": [
|
|
3519
|
+
"flow.topolo.app"
|
|
3520
|
+
],
|
|
3521
|
+
"appId": "flow"
|
|
3522
|
+
},
|
|
3523
|
+
{
|
|
3524
|
+
"name": "topolo-flow-api",
|
|
3525
|
+
"kind": "worker",
|
|
3526
|
+
"apiUrl": null,
|
|
3527
|
+
"domains": [],
|
|
3528
|
+
"routes": [],
|
|
3529
|
+
"appId": null
|
|
3530
|
+
}
|
|
3531
|
+
]
|
|
3532
|
+
},
|
|
3533
|
+
"forecast": {
|
|
3534
|
+
"id": "forecast",
|
|
3535
|
+
"appDir": "TopoloForecast",
|
|
3536
|
+
"name": "topolo-forecast",
|
|
3537
|
+
"packageName": "topolo-forecast",
|
|
3538
|
+
"productionUrl": "https://forecast.topolo.app",
|
|
3539
|
+
"services": [
|
|
3540
|
+
"forecast"
|
|
3541
|
+
],
|
|
3542
|
+
"deployTargets": [
|
|
3543
|
+
{
|
|
3544
|
+
"name": "topolo-forecast",
|
|
3545
|
+
"kind": "worker",
|
|
3546
|
+
"apiUrl": "https://forecast.topolo.app",
|
|
3547
|
+
"domains": [
|
|
3548
|
+
"forecast.topolo.app"
|
|
3549
|
+
],
|
|
3550
|
+
"routes": [
|
|
3551
|
+
"forecast.topolo.app"
|
|
3552
|
+
],
|
|
3553
|
+
"appId": "forecast"
|
|
3554
|
+
},
|
|
3555
|
+
{
|
|
3556
|
+
"name": "topolo-forecast-api",
|
|
3557
|
+
"kind": "worker",
|
|
3558
|
+
"apiUrl": null,
|
|
3559
|
+
"domains": [],
|
|
3560
|
+
"routes": [],
|
|
3561
|
+
"appId": null
|
|
3562
|
+
}
|
|
3563
|
+
]
|
|
3564
|
+
},
|
|
3565
|
+
"forms": {
|
|
3566
|
+
"id": "forms",
|
|
3567
|
+
"appDir": "TopoloForms",
|
|
3568
|
+
"name": "topolo-forms",
|
|
3569
|
+
"packageName": "topolo-forms",
|
|
3570
|
+
"productionUrl": "https://forms.topolo.app",
|
|
3571
|
+
"services": [
|
|
3572
|
+
"forms"
|
|
3573
|
+
],
|
|
3574
|
+
"deployTargets": [
|
|
3575
|
+
{
|
|
3576
|
+
"name": "topolo-forms",
|
|
3577
|
+
"kind": "worker",
|
|
3578
|
+
"apiUrl": "https://forms.topolo.app",
|
|
3579
|
+
"domains": [
|
|
3580
|
+
"forms.topolo.app"
|
|
3581
|
+
],
|
|
3582
|
+
"routes": [
|
|
3583
|
+
"forms.topolo.app"
|
|
3584
|
+
],
|
|
3585
|
+
"appId": "forms"
|
|
3586
|
+
},
|
|
3587
|
+
{
|
|
3588
|
+
"name": "topolo-forms-api",
|
|
3589
|
+
"kind": "worker",
|
|
3590
|
+
"apiUrl": null,
|
|
3591
|
+
"domains": [],
|
|
3592
|
+
"routes": [],
|
|
3593
|
+
"appId": null
|
|
3594
|
+
}
|
|
3595
|
+
]
|
|
3596
|
+
},
|
|
3597
|
+
"home": {
|
|
3598
|
+
"id": "home",
|
|
3599
|
+
"appDir": "TopoloHome",
|
|
3600
|
+
"name": "topolo-home",
|
|
3601
|
+
"packageName": "topolo-home",
|
|
3602
|
+
"productionUrl": "https://home.topolo.app",
|
|
3603
|
+
"services": [
|
|
3604
|
+
"home"
|
|
3605
|
+
],
|
|
3606
|
+
"deployTargets": [
|
|
3607
|
+
{
|
|
3608
|
+
"name": "topolo-home",
|
|
3609
|
+
"kind": "worker",
|
|
3610
|
+
"apiUrl": "https://home.topolo.app",
|
|
3611
|
+
"domains": [
|
|
3612
|
+
"home.topolo.app"
|
|
3613
|
+
],
|
|
3614
|
+
"routes": [
|
|
3615
|
+
"home.topolo.app"
|
|
3616
|
+
],
|
|
3617
|
+
"appId": "home"
|
|
3618
|
+
},
|
|
3619
|
+
{
|
|
3620
|
+
"name": "topolo-home-api",
|
|
3621
|
+
"kind": "worker",
|
|
3622
|
+
"apiUrl": null,
|
|
3623
|
+
"domains": [],
|
|
3624
|
+
"routes": [],
|
|
3625
|
+
"appId": null
|
|
3626
|
+
}
|
|
3627
|
+
]
|
|
3628
|
+
},
|
|
3629
|
+
"insights": {
|
|
3630
|
+
"id": "insights",
|
|
3631
|
+
"appDir": "TopoloInsights",
|
|
3632
|
+
"name": "topolo-insights",
|
|
3633
|
+
"packageName": "topolo-insights",
|
|
3634
|
+
"productionUrl": "https://insights.topolo.app",
|
|
3635
|
+
"services": [
|
|
3636
|
+
"insights"
|
|
3637
|
+
],
|
|
3638
|
+
"deployTargets": [
|
|
3639
|
+
{
|
|
3640
|
+
"name": "topolo-insights",
|
|
3641
|
+
"kind": "worker",
|
|
3642
|
+
"apiUrl": "https://insights.topolo.app",
|
|
3643
|
+
"domains": [
|
|
3644
|
+
"insights.topolo.app"
|
|
3645
|
+
],
|
|
3646
|
+
"routes": [
|
|
3647
|
+
"insights.topolo.app"
|
|
3648
|
+
],
|
|
3649
|
+
"appId": "insights"
|
|
3650
|
+
},
|
|
3651
|
+
{
|
|
3652
|
+
"name": "topolo-insights-api",
|
|
3653
|
+
"kind": "worker",
|
|
3654
|
+
"apiUrl": null,
|
|
3655
|
+
"domains": [],
|
|
3656
|
+
"routes": [],
|
|
3657
|
+
"appId": null
|
|
3658
|
+
}
|
|
3659
|
+
]
|
|
3660
|
+
},
|
|
3661
|
+
"inventory": {
|
|
3662
|
+
"id": "inventory",
|
|
3663
|
+
"appDir": "TopoloInventory",
|
|
3664
|
+
"name": "topolo-inventory",
|
|
3665
|
+
"packageName": "topolo-inventory",
|
|
3666
|
+
"productionUrl": "https://inventory.topolo.app",
|
|
3667
|
+
"services": [
|
|
3668
|
+
"inventory"
|
|
3669
|
+
],
|
|
3670
|
+
"deployTargets": [
|
|
3671
|
+
{
|
|
3672
|
+
"name": "topolo-inventory",
|
|
3673
|
+
"kind": "worker",
|
|
3674
|
+
"apiUrl": "https://inventory.topolo.app",
|
|
3675
|
+
"domains": [
|
|
3676
|
+
"inventory.topolo.app"
|
|
3677
|
+
],
|
|
3678
|
+
"routes": [
|
|
3679
|
+
"inventory.topolo.app"
|
|
3680
|
+
],
|
|
3681
|
+
"appId": "inventory"
|
|
3682
|
+
},
|
|
3683
|
+
{
|
|
3684
|
+
"name": "topolo-inventory-api",
|
|
3685
|
+
"kind": "worker",
|
|
3686
|
+
"apiUrl": null,
|
|
3687
|
+
"domains": [],
|
|
3688
|
+
"routes": [],
|
|
3689
|
+
"appId": null
|
|
3690
|
+
}
|
|
3691
|
+
]
|
|
3692
|
+
},
|
|
3693
|
+
"learn": {
|
|
3694
|
+
"id": "learn",
|
|
3695
|
+
"appDir": "TopoloLearn",
|
|
3696
|
+
"name": "topololearn",
|
|
3697
|
+
"packageName": "topolo-learn",
|
|
3698
|
+
"productionUrl": "https://learn.topolo.app",
|
|
3699
|
+
"services": [
|
|
3700
|
+
"learn"
|
|
3701
|
+
],
|
|
3702
|
+
"deployTargets": [
|
|
3703
|
+
{
|
|
3704
|
+
"name": "topolo-learn",
|
|
3705
|
+
"kind": "worker",
|
|
3706
|
+
"apiUrl": "https://learn.topolo.app",
|
|
3707
|
+
"domains": [
|
|
3708
|
+
"learn.topolo.app"
|
|
3709
|
+
],
|
|
3710
|
+
"routes": [
|
|
3711
|
+
"learn.topolo.app"
|
|
3712
|
+
],
|
|
3713
|
+
"appId": "learn"
|
|
3714
|
+
},
|
|
3715
|
+
{
|
|
3716
|
+
"name": "topolo-learn-api",
|
|
3717
|
+
"kind": "worker",
|
|
3718
|
+
"apiUrl": null,
|
|
3719
|
+
"domains": [],
|
|
3720
|
+
"routes": [],
|
|
3721
|
+
"appId": null
|
|
3722
|
+
}
|
|
3723
|
+
]
|
|
3724
|
+
},
|
|
3725
|
+
"localize": {
|
|
3726
|
+
"id": "localize",
|
|
3727
|
+
"appDir": "TopoloLocalize",
|
|
3728
|
+
"name": "topolo-localize",
|
|
3729
|
+
"packageName": "topolo-localize",
|
|
3730
|
+
"productionUrl": "https://localize.topolo.app",
|
|
3731
|
+
"services": [
|
|
3732
|
+
"localize"
|
|
3733
|
+
],
|
|
3734
|
+
"deployTargets": [
|
|
3735
|
+
{
|
|
3736
|
+
"name": "topolo-localize",
|
|
3737
|
+
"kind": "worker",
|
|
3738
|
+
"apiUrl": "https://localize.topolo.app",
|
|
3739
|
+
"domains": [
|
|
3740
|
+
"localize.topolo.app"
|
|
3741
|
+
],
|
|
3742
|
+
"routes": [
|
|
3743
|
+
"localize.topolo.app"
|
|
3744
|
+
],
|
|
3745
|
+
"appId": "localize"
|
|
3746
|
+
}
|
|
3747
|
+
]
|
|
3748
|
+
},
|
|
3749
|
+
"mail": {
|
|
3750
|
+
"id": "mail",
|
|
3751
|
+
"appDir": "TopoloMail",
|
|
3752
|
+
"name": "topolo-mail",
|
|
3753
|
+
"packageName": "topolo-mail",
|
|
3754
|
+
"productionUrl": "https://mail.topolo.app",
|
|
3755
|
+
"services": [
|
|
3756
|
+
"mail"
|
|
3757
|
+
],
|
|
3758
|
+
"deployTargets": [
|
|
3759
|
+
{
|
|
3760
|
+
"name": "topolo-mail",
|
|
3761
|
+
"kind": "worker",
|
|
3762
|
+
"apiUrl": "https://mail.topolo.app",
|
|
3763
|
+
"domains": [
|
|
3764
|
+
"mail.topolo.app"
|
|
3765
|
+
],
|
|
3766
|
+
"routes": [
|
|
3767
|
+
"mail.topolo.app"
|
|
3768
|
+
],
|
|
3769
|
+
"appId": "mail"
|
|
3770
|
+
},
|
|
3771
|
+
{
|
|
3772
|
+
"name": "topolo-mail-api",
|
|
3773
|
+
"kind": "worker",
|
|
3774
|
+
"apiUrl": null,
|
|
3775
|
+
"domains": [],
|
|
3776
|
+
"routes": [],
|
|
3777
|
+
"appId": null
|
|
3778
|
+
}
|
|
3779
|
+
]
|
|
3780
|
+
},
|
|
3781
|
+
"mdm": {
|
|
3782
|
+
"id": "mdm",
|
|
3783
|
+
"appDir": "TopoloMDM",
|
|
3784
|
+
"name": "TopoloMDM",
|
|
3785
|
+
"packageName": "topolo-mdm",
|
|
3786
|
+
"productionUrl": "https://mdm.topolo.app",
|
|
3787
|
+
"services": [
|
|
3788
|
+
"mdm"
|
|
3789
|
+
],
|
|
3790
|
+
"deployTargets": [
|
|
3791
|
+
{
|
|
3792
|
+
"name": "topolo-mdm-api",
|
|
3793
|
+
"kind": "worker",
|
|
3794
|
+
"apiUrl": null,
|
|
3795
|
+
"domains": [],
|
|
3796
|
+
"routes": [],
|
|
3797
|
+
"appId": null
|
|
3798
|
+
},
|
|
3799
|
+
{
|
|
3800
|
+
"name": "topolo-mdm-console",
|
|
3801
|
+
"kind": "worker",
|
|
3802
|
+
"apiUrl": "https://mdm.topolo.app",
|
|
3803
|
+
"domains": [
|
|
3804
|
+
"mdm.topolo.app"
|
|
3805
|
+
],
|
|
3806
|
+
"routes": [
|
|
3807
|
+
"mdm.topolo.app"
|
|
3808
|
+
],
|
|
3809
|
+
"appId": "mdm"
|
|
3810
|
+
}
|
|
3811
|
+
]
|
|
3812
|
+
},
|
|
3813
|
+
"messages": {
|
|
3814
|
+
"id": "messages",
|
|
3815
|
+
"appDir": "TopoloMessages",
|
|
3816
|
+
"name": "topolo-messages",
|
|
3817
|
+
"packageName": "topolo-messages",
|
|
3818
|
+
"productionUrl": "https://messages.topolo.app",
|
|
3819
|
+
"services": [
|
|
3820
|
+
"messages"
|
|
3821
|
+
],
|
|
3822
|
+
"deployTargets": [
|
|
3823
|
+
{
|
|
3824
|
+
"name": "topolo-messages",
|
|
3825
|
+
"kind": "worker",
|
|
3826
|
+
"apiUrl": "https://messages.topolo.app",
|
|
3827
|
+
"domains": [
|
|
3828
|
+
"messages.topolo.app"
|
|
3829
|
+
],
|
|
3830
|
+
"routes": [
|
|
3831
|
+
"messages.topolo.app"
|
|
3832
|
+
],
|
|
3833
|
+
"appId": "messages"
|
|
3834
|
+
},
|
|
3835
|
+
{
|
|
3836
|
+
"name": "topolo-messages-api",
|
|
3837
|
+
"kind": "worker",
|
|
3838
|
+
"apiUrl": null,
|
|
3839
|
+
"domains": [],
|
|
3840
|
+
"routes": [],
|
|
3841
|
+
"appId": null
|
|
3842
|
+
},
|
|
3843
|
+
{
|
|
3844
|
+
"name": "topolo-messages-dispatch",
|
|
3845
|
+
"kind": "worker",
|
|
3846
|
+
"apiUrl": null,
|
|
3847
|
+
"domains": [],
|
|
3848
|
+
"routes": [],
|
|
3849
|
+
"appId": null
|
|
3850
|
+
}
|
|
3851
|
+
]
|
|
3852
|
+
},
|
|
3853
|
+
"nexus": {
|
|
3854
|
+
"id": "nexus",
|
|
3855
|
+
"appDir": "TopoloNexus",
|
|
3856
|
+
"name": "topolo-nexus",
|
|
3857
|
+
"packageName": "topolo-nexus",
|
|
3858
|
+
"productionUrl": "https://nexus.topolo.app",
|
|
3859
|
+
"services": [
|
|
3860
|
+
"nexus"
|
|
3861
|
+
],
|
|
3862
|
+
"deployTargets": [
|
|
3863
|
+
{
|
|
3864
|
+
"name": "topolo-nexus-dashboard",
|
|
3865
|
+
"kind": "worker",
|
|
3866
|
+
"apiUrl": "https://nexus.topolo.app",
|
|
3867
|
+
"domains": [
|
|
3868
|
+
"nexus.topolo.app"
|
|
3869
|
+
],
|
|
3870
|
+
"routes": [
|
|
3871
|
+
"nexus.topolo.app"
|
|
3872
|
+
],
|
|
3873
|
+
"appId": null
|
|
3874
|
+
},
|
|
3875
|
+
{
|
|
3876
|
+
"name": "topolo-nexus-gateway",
|
|
3877
|
+
"kind": "worker",
|
|
3878
|
+
"apiUrl": "https://nexus.topolo.app",
|
|
3879
|
+
"domains": [
|
|
3880
|
+
"nexus.topolo.app"
|
|
3881
|
+
],
|
|
3882
|
+
"routes": [],
|
|
3883
|
+
"appId": "nexus"
|
|
3884
|
+
}
|
|
3885
|
+
]
|
|
3886
|
+
},
|
|
3887
|
+
"notify": {
|
|
3888
|
+
"id": "notify",
|
|
3889
|
+
"appDir": "TopoloNotify",
|
|
3890
|
+
"name": "topolo-notify",
|
|
3891
|
+
"packageName": "@topolo/notify",
|
|
3892
|
+
"productionUrl": "https://notify.topolo.app",
|
|
3893
|
+
"services": [
|
|
3894
|
+
"notify"
|
|
3895
|
+
],
|
|
3896
|
+
"deployTargets": [
|
|
3897
|
+
{
|
|
3898
|
+
"name": "topolo-notify",
|
|
3899
|
+
"kind": "worker",
|
|
3900
|
+
"apiUrl": "https://notify.topolo.app",
|
|
3901
|
+
"domains": [
|
|
3902
|
+
"notify.topolo.app"
|
|
3903
|
+
],
|
|
3904
|
+
"routes": [
|
|
3905
|
+
"notify.topolo.app"
|
|
3906
|
+
],
|
|
3907
|
+
"appId": "notify"
|
|
3908
|
+
}
|
|
3909
|
+
]
|
|
3910
|
+
},
|
|
3911
|
+
"observability_watch": {
|
|
3912
|
+
"id": "observability_watch",
|
|
3913
|
+
"appDir": "TopoloObservabilityWatch",
|
|
3914
|
+
"name": "topolo-observability-watch",
|
|
3915
|
+
"packageName": "topolo-observability-watch",
|
|
3916
|
+
"productionUrl": "https://observability-watch.topolo.app",
|
|
3917
|
+
"services": [
|
|
3918
|
+
"observability_watch"
|
|
3919
|
+
],
|
|
3920
|
+
"deployTargets": [
|
|
3921
|
+
{
|
|
3922
|
+
"name": "topolo-observability-watch",
|
|
3923
|
+
"kind": "worker",
|
|
3924
|
+
"apiUrl": "https://observability-watch.topolo.app",
|
|
3925
|
+
"domains": [
|
|
3926
|
+
"observability-watch.topolo.app"
|
|
3927
|
+
],
|
|
3928
|
+
"routes": [
|
|
3929
|
+
"observability-watch.topolo.app"
|
|
3930
|
+
],
|
|
3931
|
+
"appId": "observability_watch"
|
|
3932
|
+
}
|
|
3933
|
+
]
|
|
3934
|
+
},
|
|
3935
|
+
"one": {
|
|
3936
|
+
"id": "one",
|
|
3937
|
+
"appDir": "TopoloOne",
|
|
3938
|
+
"name": "TopoloOne",
|
|
3939
|
+
"packageName": "topolo-oneclick-sso",
|
|
3940
|
+
"productionUrl": "https://one.topolo.app",
|
|
3941
|
+
"services": [
|
|
3942
|
+
"one"
|
|
3943
|
+
],
|
|
3944
|
+
"deployTargets": [
|
|
3945
|
+
{
|
|
3946
|
+
"name": "topolo-one",
|
|
3947
|
+
"kind": "worker",
|
|
3948
|
+
"apiUrl": "https://one.topolo.app",
|
|
3949
|
+
"domains": [
|
|
3950
|
+
"one.topolo.app"
|
|
3951
|
+
],
|
|
3952
|
+
"routes": [
|
|
3953
|
+
"one.topolo.app/*"
|
|
3954
|
+
],
|
|
3955
|
+
"appId": null
|
|
3956
|
+
},
|
|
3957
|
+
{
|
|
3958
|
+
"name": "topolo-one-api",
|
|
3959
|
+
"kind": "worker",
|
|
3960
|
+
"apiUrl": "https://www.topolo.app",
|
|
3961
|
+
"domains": [
|
|
3962
|
+
"www.topolo.app"
|
|
3963
|
+
],
|
|
3964
|
+
"routes": [
|
|
3965
|
+
"www.topolo.app/*"
|
|
3966
|
+
],
|
|
3967
|
+
"appId": "one"
|
|
3968
|
+
},
|
|
3969
|
+
{
|
|
3970
|
+
"name": "topolo-one-website",
|
|
3971
|
+
"kind": "worker",
|
|
3972
|
+
"apiUrl": "https://topolo.io",
|
|
3973
|
+
"domains": [
|
|
3974
|
+
"topolo.io"
|
|
3975
|
+
],
|
|
3976
|
+
"routes": [
|
|
3977
|
+
"one.topolo.io",
|
|
3978
|
+
"topolo.io",
|
|
3979
|
+
"www.topolo.io"
|
|
3980
|
+
],
|
|
3981
|
+
"appId": null
|
|
3982
|
+
}
|
|
3983
|
+
]
|
|
3984
|
+
},
|
|
3985
|
+
"p2p": {
|
|
3986
|
+
"id": "p2p",
|
|
3987
|
+
"appDir": "TopoloP2P",
|
|
3988
|
+
"name": "topolo-p2p",
|
|
3989
|
+
"packageName": "topolo-p2p",
|
|
3990
|
+
"productionUrl": "https://p2p.topolo.app",
|
|
3991
|
+
"services": [
|
|
3992
|
+
"p2p"
|
|
3993
|
+
],
|
|
3994
|
+
"deployTargets": [
|
|
3995
|
+
{
|
|
3996
|
+
"name": "topolo-p2p",
|
|
3997
|
+
"kind": "worker",
|
|
3998
|
+
"apiUrl": "https://p2p.topolo.app",
|
|
3999
|
+
"domains": [
|
|
4000
|
+
"p2p.topolo.app"
|
|
4001
|
+
],
|
|
4002
|
+
"routes": [
|
|
4003
|
+
"p2p.topolo.app"
|
|
4004
|
+
],
|
|
4005
|
+
"appId": "p2p"
|
|
4006
|
+
},
|
|
4007
|
+
{
|
|
4008
|
+
"name": "topolo-p2p-api",
|
|
4009
|
+
"kind": "worker",
|
|
4010
|
+
"apiUrl": null,
|
|
4011
|
+
"domains": [],
|
|
4012
|
+
"routes": [],
|
|
4013
|
+
"appId": null
|
|
4014
|
+
}
|
|
4015
|
+
]
|
|
4016
|
+
},
|
|
4017
|
+
"pay": {
|
|
4018
|
+
"id": "pay",
|
|
4019
|
+
"appDir": "TopoloPay",
|
|
4020
|
+
"name": "topolo-pay",
|
|
4021
|
+
"packageName": "topolo-pay",
|
|
4022
|
+
"productionUrl": "https://pay.topolo.app",
|
|
4023
|
+
"services": [
|
|
4024
|
+
"pay"
|
|
4025
|
+
],
|
|
4026
|
+
"deployTargets": [
|
|
4027
|
+
{
|
|
4028
|
+
"name": "topolo-pay",
|
|
4029
|
+
"kind": "worker",
|
|
4030
|
+
"apiUrl": "https://pay.topolo.app",
|
|
4031
|
+
"domains": [
|
|
4032
|
+
"pay.topolo.app"
|
|
4033
|
+
],
|
|
4034
|
+
"routes": [
|
|
4035
|
+
"pay.topolo.app"
|
|
4036
|
+
],
|
|
4037
|
+
"appId": "pay"
|
|
4038
|
+
},
|
|
4039
|
+
{
|
|
4040
|
+
"name": "topolo-pay-api",
|
|
4041
|
+
"kind": "worker",
|
|
4042
|
+
"apiUrl": null,
|
|
4043
|
+
"domains": [],
|
|
4044
|
+
"routes": [],
|
|
4045
|
+
"appId": null
|
|
4046
|
+
}
|
|
4047
|
+
]
|
|
4048
|
+
},
|
|
4049
|
+
"people": {
|
|
4050
|
+
"id": "people",
|
|
4051
|
+
"appDir": "TopoloPeople",
|
|
4052
|
+
"name": "topolo-people",
|
|
4053
|
+
"packageName": "topolo-people",
|
|
4054
|
+
"productionUrl": "https://people.topolo.app",
|
|
4055
|
+
"services": [
|
|
4056
|
+
"people"
|
|
4057
|
+
],
|
|
4058
|
+
"deployTargets": [
|
|
4059
|
+
{
|
|
4060
|
+
"name": "topolo-people",
|
|
4061
|
+
"kind": "worker",
|
|
4062
|
+
"apiUrl": "https://people.topolo.app",
|
|
4063
|
+
"domains": [
|
|
4064
|
+
"people.topolo.app"
|
|
4065
|
+
],
|
|
4066
|
+
"routes": [
|
|
4067
|
+
"people.topolo.app"
|
|
4068
|
+
],
|
|
4069
|
+
"appId": "people"
|
|
4070
|
+
},
|
|
4071
|
+
{
|
|
4072
|
+
"name": "topolo-people-api",
|
|
4073
|
+
"kind": "worker",
|
|
4074
|
+
"apiUrl": null,
|
|
4075
|
+
"domains": [],
|
|
4076
|
+
"routes": [],
|
|
4077
|
+
"appId": null
|
|
4078
|
+
}
|
|
4079
|
+
]
|
|
4080
|
+
},
|
|
4081
|
+
"quro": {
|
|
4082
|
+
"id": "quro",
|
|
4083
|
+
"appDir": "TopoloQuro",
|
|
4084
|
+
"name": "TopoloQuro",
|
|
4085
|
+
"packageName": "topolo-quro",
|
|
4086
|
+
"productionUrl": "https://quro.topolo.app",
|
|
4087
|
+
"services": [
|
|
4088
|
+
"quro.api",
|
|
4089
|
+
"quro.redirect"
|
|
4090
|
+
],
|
|
4091
|
+
"deployTargets": [
|
|
4092
|
+
{
|
|
4093
|
+
"name": "quro-api",
|
|
4094
|
+
"kind": "worker",
|
|
4095
|
+
"apiUrl": "https://api.ol0.me",
|
|
4096
|
+
"domains": [
|
|
4097
|
+
"api.ol0.me"
|
|
4098
|
+
],
|
|
4099
|
+
"routes": [
|
|
4100
|
+
"api.ol0.me/*"
|
|
4101
|
+
],
|
|
4102
|
+
"appId": "quro.api"
|
|
4103
|
+
},
|
|
4104
|
+
{
|
|
4105
|
+
"name": "quro-redirect-system",
|
|
4106
|
+
"kind": "worker",
|
|
4107
|
+
"apiUrl": "https://ol0.me",
|
|
4108
|
+
"domains": [
|
|
4109
|
+
"ol0.me"
|
|
4110
|
+
],
|
|
4111
|
+
"routes": [
|
|
4112
|
+
"ol0.me/*"
|
|
4113
|
+
],
|
|
4114
|
+
"appId": "quro.redirect"
|
|
4115
|
+
},
|
|
4116
|
+
{
|
|
4117
|
+
"name": "quro-ui",
|
|
4118
|
+
"kind": "worker",
|
|
4119
|
+
"apiUrl": "https://quro.topolo.app",
|
|
4120
|
+
"domains": [
|
|
4121
|
+
"quro.topolo.app"
|
|
4122
|
+
],
|
|
4123
|
+
"routes": [
|
|
4124
|
+
"quro.topolo.app"
|
|
4125
|
+
],
|
|
4126
|
+
"appId": null
|
|
4127
|
+
}
|
|
4128
|
+
]
|
|
4129
|
+
},
|
|
4130
|
+
"roadmapper": {
|
|
4131
|
+
"id": "roadmapper",
|
|
4132
|
+
"appDir": "TopoloRoadmapper",
|
|
4133
|
+
"name": "topolo-roadmapper",
|
|
4134
|
+
"packageName": "topolo-roadmapper",
|
|
4135
|
+
"productionUrl": "https://roadmapper.topolo.app",
|
|
4136
|
+
"services": [
|
|
4137
|
+
"roadmapper"
|
|
4138
|
+
],
|
|
4139
|
+
"deployTargets": [
|
|
4140
|
+
{
|
|
4141
|
+
"name": "topolo-roadmapper",
|
|
4142
|
+
"kind": "worker",
|
|
4143
|
+
"apiUrl": "https://roadmapper.topolo.app",
|
|
4144
|
+
"domains": [
|
|
4145
|
+
"roadmapper.topolo.app"
|
|
4146
|
+
],
|
|
4147
|
+
"routes": [
|
|
4148
|
+
"roadmapper.topolo.app"
|
|
4149
|
+
],
|
|
4150
|
+
"appId": "roadmapper"
|
|
4151
|
+
},
|
|
4152
|
+
{
|
|
4153
|
+
"name": "topolo-roadmapper-api",
|
|
4154
|
+
"kind": "worker",
|
|
4155
|
+
"apiUrl": null,
|
|
4156
|
+
"domains": [],
|
|
4157
|
+
"routes": [],
|
|
4158
|
+
"appId": null
|
|
4159
|
+
}
|
|
4160
|
+
]
|
|
4161
|
+
},
|
|
4162
|
+
"sign": {
|
|
4163
|
+
"id": "sign",
|
|
4164
|
+
"appDir": "TopoloSign",
|
|
4165
|
+
"name": "topolo-sign",
|
|
4166
|
+
"packageName": "topolo-sign",
|
|
4167
|
+
"productionUrl": "https://sign.topolo.app",
|
|
4168
|
+
"services": [
|
|
4169
|
+
"sign"
|
|
4170
|
+
],
|
|
4171
|
+
"deployTargets": [
|
|
4172
|
+
{
|
|
4173
|
+
"name": "topolo-sign",
|
|
4174
|
+
"kind": "worker",
|
|
4175
|
+
"apiUrl": "https://sign.topolo.app",
|
|
4176
|
+
"domains": [
|
|
4177
|
+
"sign.topolo.app"
|
|
4178
|
+
],
|
|
4179
|
+
"routes": [
|
|
4180
|
+
"sign.topolo.app"
|
|
4181
|
+
],
|
|
4182
|
+
"appId": "sign"
|
|
4183
|
+
},
|
|
4184
|
+
{
|
|
4185
|
+
"name": "topolo-sign-api",
|
|
4186
|
+
"kind": "worker",
|
|
4187
|
+
"apiUrl": null,
|
|
4188
|
+
"domains": [],
|
|
4189
|
+
"routes": [],
|
|
4190
|
+
"appId": null
|
|
4191
|
+
}
|
|
4192
|
+
]
|
|
4193
|
+
},
|
|
4194
|
+
"social_studio": {
|
|
4195
|
+
"id": "social_studio",
|
|
4196
|
+
"appDir": "TopoloSocialStudio",
|
|
4197
|
+
"name": "topolo-social-studio",
|
|
4198
|
+
"packageName": "topolo-social-studio",
|
|
4199
|
+
"productionUrl": "https://studio.topolo.app",
|
|
4200
|
+
"services": [
|
|
4201
|
+
"social_studio"
|
|
4202
|
+
],
|
|
4203
|
+
"deployTargets": [
|
|
4204
|
+
{
|
|
4205
|
+
"name": "topolo-social-studio",
|
|
4206
|
+
"kind": "worker",
|
|
4207
|
+
"apiUrl": "https://studio.topolo.app",
|
|
4208
|
+
"domains": [
|
|
4209
|
+
"studio.topolo.app"
|
|
4210
|
+
],
|
|
4211
|
+
"routes": [
|
|
4212
|
+
"studio.topolo.app"
|
|
4213
|
+
],
|
|
4214
|
+
"appId": "social_studio"
|
|
4215
|
+
},
|
|
4216
|
+
{
|
|
4217
|
+
"name": "topolo-social-studio-api",
|
|
4218
|
+
"kind": "worker",
|
|
4219
|
+
"apiUrl": null,
|
|
4220
|
+
"domains": [],
|
|
4221
|
+
"routes": [],
|
|
4222
|
+
"appId": null
|
|
4223
|
+
},
|
|
4224
|
+
{
|
|
4225
|
+
"name": "topolo-social-studio-queue",
|
|
4226
|
+
"kind": "worker",
|
|
4227
|
+
"apiUrl": null,
|
|
4228
|
+
"domains": [],
|
|
4229
|
+
"routes": [],
|
|
4230
|
+
"appId": null
|
|
4231
|
+
}
|
|
4232
|
+
]
|
|
4233
|
+
},
|
|
4234
|
+
"socialize": {
|
|
4235
|
+
"id": "socialize",
|
|
4236
|
+
"appDir": "TopoloSocialize",
|
|
4237
|
+
"name": "socialize",
|
|
4238
|
+
"packageName": "topolo-socialize",
|
|
4239
|
+
"productionUrl": "https://socialize.topolo.app",
|
|
4240
|
+
"services": [
|
|
4241
|
+
"socialize"
|
|
4242
|
+
],
|
|
4243
|
+
"deployTargets": [
|
|
4244
|
+
{
|
|
4245
|
+
"name": "topolo-socialize",
|
|
4246
|
+
"kind": "worker",
|
|
4247
|
+
"apiUrl": "https://socialize.topolo.app",
|
|
4248
|
+
"domains": [
|
|
4249
|
+
"socialize.topolo.app"
|
|
4250
|
+
],
|
|
4251
|
+
"routes": [
|
|
4252
|
+
"socialize.topolo.app"
|
|
4253
|
+
],
|
|
4254
|
+
"appId": "socialize"
|
|
4255
|
+
},
|
|
4256
|
+
{
|
|
4257
|
+
"name": "topolo-socialize-api",
|
|
4258
|
+
"kind": "worker",
|
|
4259
|
+
"apiUrl": "https://socialize-api.topolo.app",
|
|
4260
|
+
"domains": [
|
|
4261
|
+
"socialize-api.topolo.app"
|
|
4262
|
+
],
|
|
4263
|
+
"routes": [
|
|
4264
|
+
"socialize-api.topolo.app"
|
|
4265
|
+
],
|
|
4266
|
+
"appId": null
|
|
4267
|
+
},
|
|
4268
|
+
{
|
|
4269
|
+
"name": "topolo-socialize-scheduler",
|
|
4270
|
+
"kind": "worker",
|
|
4271
|
+
"apiUrl": null,
|
|
4272
|
+
"domains": [],
|
|
4273
|
+
"routes": [],
|
|
4274
|
+
"appId": null
|
|
4275
|
+
}
|
|
4276
|
+
]
|
|
4277
|
+
},
|
|
4278
|
+
"spaces": {
|
|
4279
|
+
"id": "spaces",
|
|
4280
|
+
"appDir": "TopoloSpaces",
|
|
4281
|
+
"name": "topolo-spaces",
|
|
4282
|
+
"packageName": "@topolo/spaces",
|
|
4283
|
+
"productionUrl": "https://spaces.topolo.app",
|
|
4284
|
+
"services": [
|
|
4285
|
+
"spaces"
|
|
4286
|
+
],
|
|
4287
|
+
"deployTargets": [
|
|
4288
|
+
{
|
|
4289
|
+
"name": "topolo-spaces",
|
|
4290
|
+
"kind": "worker",
|
|
4291
|
+
"apiUrl": "https://spaces.topolo.app",
|
|
4292
|
+
"domains": [
|
|
4293
|
+
"spaces.topolo.app"
|
|
4294
|
+
],
|
|
4295
|
+
"routes": [
|
|
4296
|
+
"spaces.topolo.app"
|
|
4297
|
+
],
|
|
4298
|
+
"appId": "spaces"
|
|
4299
|
+
},
|
|
4300
|
+
{
|
|
4301
|
+
"name": "topolo-spaces-api",
|
|
4302
|
+
"kind": "worker",
|
|
4303
|
+
"apiUrl": null,
|
|
4304
|
+
"domains": [],
|
|
4305
|
+
"routes": [],
|
|
4306
|
+
"appId": null
|
|
4307
|
+
}
|
|
4308
|
+
]
|
|
4309
|
+
},
|
|
4310
|
+
"status": {
|
|
4311
|
+
"id": "status",
|
|
4312
|
+
"appDir": "TopoloStatus",
|
|
4313
|
+
"name": "topolo-status",
|
|
4314
|
+
"packageName": "topolo-status",
|
|
4315
|
+
"productionUrl": "https://status.topolo.app",
|
|
4316
|
+
"services": [
|
|
4317
|
+
"status"
|
|
4318
|
+
],
|
|
4319
|
+
"deployTargets": [
|
|
4320
|
+
{
|
|
4321
|
+
"name": "topolo-status",
|
|
4322
|
+
"kind": "worker",
|
|
4323
|
+
"apiUrl": "https://status.topolo.app",
|
|
4324
|
+
"domains": [
|
|
4325
|
+
"status.topolo.app"
|
|
4326
|
+
],
|
|
4327
|
+
"routes": [
|
|
4328
|
+
"status.topolo.app"
|
|
4329
|
+
],
|
|
4330
|
+
"appId": "status"
|
|
4331
|
+
}
|
|
4332
|
+
]
|
|
4333
|
+
},
|
|
4334
|
+
"success": {
|
|
4335
|
+
"id": "success",
|
|
4336
|
+
"appDir": "TopoloSuccess",
|
|
4337
|
+
"name": "topolo-success",
|
|
4338
|
+
"packageName": "topolo-success",
|
|
4339
|
+
"productionUrl": "https://success.topolo.app",
|
|
4340
|
+
"services": [
|
|
4341
|
+
"success"
|
|
4342
|
+
],
|
|
4343
|
+
"deployTargets": [
|
|
4344
|
+
{
|
|
4345
|
+
"name": "topolo-success",
|
|
4346
|
+
"kind": "worker",
|
|
4347
|
+
"apiUrl": "https://success.topolo.app",
|
|
4348
|
+
"domains": [
|
|
4349
|
+
"success.topolo.app"
|
|
4350
|
+
],
|
|
4351
|
+
"routes": [
|
|
4352
|
+
"success.topolo.app"
|
|
4353
|
+
],
|
|
4354
|
+
"appId": "success"
|
|
4355
|
+
},
|
|
4356
|
+
{
|
|
4357
|
+
"name": "topolo-success-api",
|
|
4358
|
+
"kind": "worker",
|
|
4359
|
+
"apiUrl": null,
|
|
4360
|
+
"domains": [],
|
|
4361
|
+
"routes": [],
|
|
4362
|
+
"appId": null
|
|
4363
|
+
}
|
|
4364
|
+
]
|
|
4365
|
+
},
|
|
4366
|
+
"support": {
|
|
4367
|
+
"id": "support",
|
|
4368
|
+
"appDir": "TopoloSupport",
|
|
4369
|
+
"name": "topolo-support",
|
|
4370
|
+
"packageName": "topolo-support",
|
|
4371
|
+
"productionUrl": "https://support.topolo.app",
|
|
4372
|
+
"services": [
|
|
4373
|
+
"support"
|
|
4374
|
+
],
|
|
4375
|
+
"deployTargets": [
|
|
4376
|
+
{
|
|
4377
|
+
"name": "topolo-support",
|
|
4378
|
+
"kind": "worker",
|
|
4379
|
+
"apiUrl": "https://support.topolo.app",
|
|
4380
|
+
"domains": [
|
|
4381
|
+
"support.topolo.app"
|
|
4382
|
+
],
|
|
4383
|
+
"routes": [
|
|
4384
|
+
"support.topolo.app/*"
|
|
4385
|
+
],
|
|
4386
|
+
"appId": "support"
|
|
4387
|
+
},
|
|
4388
|
+
{
|
|
4389
|
+
"name": "topolo-support-api",
|
|
4390
|
+
"kind": "worker",
|
|
4391
|
+
"apiUrl": null,
|
|
4392
|
+
"domains": [],
|
|
4393
|
+
"routes": [],
|
|
4394
|
+
"appId": null
|
|
4395
|
+
}
|
|
4396
|
+
]
|
|
4397
|
+
},
|
|
4398
|
+
"survey": {
|
|
4399
|
+
"id": "survey",
|
|
4400
|
+
"appDir": "TopoloSurvey",
|
|
4401
|
+
"name": "topolo-survey",
|
|
4402
|
+
"packageName": "topolo-survey",
|
|
4403
|
+
"productionUrl": "https://survey.topolo.app",
|
|
4404
|
+
"services": [
|
|
4405
|
+
"survey"
|
|
4406
|
+
],
|
|
4407
|
+
"deployTargets": [
|
|
4408
|
+
{
|
|
4409
|
+
"name": "topolo-survey",
|
|
4410
|
+
"kind": "worker",
|
|
4411
|
+
"apiUrl": "https://survey.topolo.app",
|
|
4412
|
+
"domains": [
|
|
4413
|
+
"survey.topolo.app"
|
|
4414
|
+
],
|
|
4415
|
+
"routes": [
|
|
4416
|
+
"survey.topolo.app"
|
|
4417
|
+
],
|
|
4418
|
+
"appId": "survey"
|
|
4419
|
+
},
|
|
4420
|
+
{
|
|
4421
|
+
"name": "topolo-survey-api",
|
|
4422
|
+
"kind": "worker",
|
|
4423
|
+
"apiUrl": null,
|
|
4424
|
+
"domains": [],
|
|
4425
|
+
"routes": [],
|
|
4426
|
+
"appId": null
|
|
4427
|
+
}
|
|
4428
|
+
]
|
|
4429
|
+
},
|
|
4430
|
+
"voice": {
|
|
4431
|
+
"id": "voice",
|
|
4432
|
+
"appDir": "TopoloVoice",
|
|
4433
|
+
"name": "topolo-voice",
|
|
4434
|
+
"packageName": "topolo-voice",
|
|
4435
|
+
"productionUrl": "https://voice.topolo.app",
|
|
4436
|
+
"services": [
|
|
4437
|
+
"voice"
|
|
4438
|
+
],
|
|
4439
|
+
"deployTargets": [
|
|
4440
|
+
{
|
|
4441
|
+
"name": "topolo-voice",
|
|
4442
|
+
"kind": "worker",
|
|
4443
|
+
"apiUrl": "https://voice.topolo.app",
|
|
4444
|
+
"domains": [
|
|
4445
|
+
"voice.topolo.app"
|
|
4446
|
+
],
|
|
4447
|
+
"routes": [
|
|
4448
|
+
"voice.topolo.app"
|
|
4449
|
+
],
|
|
4450
|
+
"appId": "voice"
|
|
4451
|
+
},
|
|
4452
|
+
{
|
|
4453
|
+
"name": "topolo-voice-api",
|
|
4454
|
+
"kind": "worker",
|
|
4455
|
+
"apiUrl": null,
|
|
4456
|
+
"domains": [],
|
|
4457
|
+
"routes": [],
|
|
4458
|
+
"appId": null
|
|
4459
|
+
}
|
|
4460
|
+
]
|
|
4461
|
+
},
|
|
4462
|
+
"web": {
|
|
4463
|
+
"id": "web",
|
|
4464
|
+
"appDir": "TopoloWeb",
|
|
4465
|
+
"name": "topoloweb",
|
|
4466
|
+
"packageName": "topolo-web",
|
|
4467
|
+
"productionUrl": "https://web.topolo.app",
|
|
4468
|
+
"services": [
|
|
4469
|
+
"web"
|
|
4470
|
+
],
|
|
4471
|
+
"deployTargets": [
|
|
4472
|
+
{
|
|
4473
|
+
"name": "topolo-web-api",
|
|
4474
|
+
"kind": "worker",
|
|
4475
|
+
"apiUrl": null,
|
|
4476
|
+
"domains": [],
|
|
4477
|
+
"routes": [],
|
|
4478
|
+
"appId": null
|
|
4479
|
+
},
|
|
4480
|
+
{
|
|
4481
|
+
"name": "topolo-web-runtime",
|
|
4482
|
+
"kind": "worker",
|
|
4483
|
+
"apiUrl": "https://sites.topolo.app",
|
|
4484
|
+
"domains": [
|
|
4485
|
+
"sites.topolo.app"
|
|
4486
|
+
],
|
|
4487
|
+
"routes": [
|
|
4488
|
+
"*.sites.topolo.app/*",
|
|
4489
|
+
"sites.topolo.app"
|
|
4490
|
+
],
|
|
4491
|
+
"appId": null
|
|
4492
|
+
},
|
|
4493
|
+
{
|
|
4494
|
+
"name": "topolo-web-studio",
|
|
4495
|
+
"kind": "worker",
|
|
4496
|
+
"apiUrl": "https://web.topolo.app",
|
|
4497
|
+
"domains": [
|
|
4498
|
+
"web.topolo.app"
|
|
4499
|
+
],
|
|
4500
|
+
"routes": [
|
|
4501
|
+
"web.topolo.app"
|
|
4502
|
+
],
|
|
4503
|
+
"appId": "web"
|
|
4504
|
+
}
|
|
4505
|
+
]
|
|
4506
|
+
}
|
|
4507
|
+
};
|
|
4508
|
+
|
|
4509
|
+
// src/application-requirements.ts
|
|
4510
|
+
var STATIC_APPLICATIONS = APPLICATIONS;
|
|
4511
|
+
var APPLICATION_REQUIREMENTS_VERSION = "2026-08-11.1";
|
|
4512
|
+
var APPLICATION_REQUIREMENTS = [
|
|
4513
|
+
{
|
|
4514
|
+
id: "platform-metadata",
|
|
4515
|
+
title: "Register the application in platform metadata",
|
|
4516
|
+
summary: "Every app must have a stable application ID, CloudControl metadata for deployed surfaces, and package metadata where code is shipped.",
|
|
4517
|
+
appliesTo: ["all"],
|
|
4518
|
+
evidence: [
|
|
4519
|
+
"topolo.cloudcontrol.json exists for every deployed app surface",
|
|
4520
|
+
"package.json names the package or app when the repo ships code",
|
|
4521
|
+
"The live platform registry exposes the app through topolo apps and MCP discovery"
|
|
4522
|
+
],
|
|
4523
|
+
implementation: [
|
|
4524
|
+
"Register the app in the live platform registry (Auth service catalog) before exposing it to agents",
|
|
4525
|
+
"Keep production URLs, Worker names, Pages projects, routes, domains, and bindings current in CloudControl metadata",
|
|
4526
|
+
"Do not leave a new Topolo* app directory without an explicit application ID"
|
|
4527
|
+
]
|
|
4528
|
+
},
|
|
4529
|
+
{
|
|
4530
|
+
id: "canonical-docs",
|
|
4531
|
+
title: "Update canonical docs with the code change",
|
|
4532
|
+
summary: "TopoloDocs is the source of truth for application behavior, ownership, deployment shape, auth boundaries, and operations.",
|
|
4533
|
+
appliesTo: ["all"],
|
|
4534
|
+
evidence: [
|
|
4535
|
+
"Matching system registry entry exists in TopoloDocs",
|
|
4536
|
+
"Internal handbook coverage exists for the system",
|
|
4537
|
+
"npm run validate passes in TopoloDocs when docs are touched"
|
|
4538
|
+
],
|
|
4539
|
+
implementation: [
|
|
4540
|
+
"Read the matching TopoloDocs system entry before coding",
|
|
4541
|
+
"Update docs in the same change when behavior, API, auth, data ownership, deployment, or operations change",
|
|
4542
|
+
"Update last_verified dates on touched canonical pages"
|
|
4543
|
+
]
|
|
4544
|
+
},
|
|
4545
|
+
{
|
|
4546
|
+
id: "shared-auth-boundary",
|
|
4547
|
+
title: "Use the shared Topolo auth boundary",
|
|
4548
|
+
summary: "Applications must derive identity, organization, scopes, and app entitlement from TopoloAuth rather than inventing parallel auth state.",
|
|
4549
|
+
appliesTo: ["browser", "api", "tooling", "agent_surface"],
|
|
4550
|
+
evidence: [
|
|
4551
|
+
"@topolo/auth-client or @topolo-io/worker-runtime is used where applicable",
|
|
4552
|
+
"No public command, tool, or SDK method accepts orgId",
|
|
4553
|
+
"App slug and Auth app registration are documented for protected APIs"
|
|
4554
|
+
],
|
|
4555
|
+
implementation: [
|
|
4556
|
+
"Use shared auth/runtime packages instead of copying token parsing, gateway, or browser storage flows",
|
|
4557
|
+
"Derive organization from the credential on every request",
|
|
4558
|
+
"Route OAuth, refresh, logout, and SSO paths according to the shared Auth contract"
|
|
4559
|
+
]
|
|
4560
|
+
},
|
|
4561
|
+
{
|
|
4562
|
+
id: "shared-shell-and-launcher",
|
|
4563
|
+
title: "Use the shared shell, launcher, and account menu",
|
|
4564
|
+
summary: "Browser applications should feel like one platform and should not create isolated navigation or account surfaces.",
|
|
4565
|
+
appliesTo: ["browser"],
|
|
4566
|
+
evidence: [
|
|
4567
|
+
"@topolo-io/app-shell is used for the platform shell where the app has authenticated UI",
|
|
4568
|
+
"@topolo-io/app-launcher keeps the shared launcher/app switcher reachable from authenticated app chrome",
|
|
4569
|
+
"Account menu and sign-out behavior use TopoloAppShell or the ui-kit TopoloAccountMenu primitive",
|
|
4570
|
+
"Repeated app body surfaces use shared TopoloAppLayout primitives instead of local stat cards, empty states, or status badges",
|
|
4571
|
+
"Local preview supports deterministic visual QA fixtures for overview, list, detail, settings, and empty/loading states",
|
|
4572
|
+
"Authenticated app body content stays inside the viewport on mobile and desktop widths"
|
|
4573
|
+
],
|
|
4574
|
+
implementation: [
|
|
4575
|
+
"Use @topolo-io/app-shell TopoloAppShell for authenticated app layouts",
|
|
4576
|
+
"Use the @topolo-io/ui-kit TopoloAccountMenu primitive when a partial-shell surface still needs account chrome",
|
|
4577
|
+
"Pass app-specific account actions as additive menu items instead of forking dropdowns",
|
|
4578
|
+
"Use shared design tokens and platform UI primitives before creating local equivalents",
|
|
4579
|
+
"Use TopoloAppMetricCard, TopoloAppEmptyState, TopoloAppStatusBadge, TopoloAppGrid, and TopoloAppSection for repeated app body patterns",
|
|
4580
|
+
"Keep visual QA fixtures available through visualQa=1 or __devpreview=1 so screenshot checks do not depend on live API state",
|
|
4581
|
+
"Keep mobile and desktop shell behavior aligned with the platform UI kit",
|
|
4582
|
+
"Constrain the app workspace-view layout wrappers with min-width: 0, width: auto, and viewport-aware max-width so shell padding cannot create page-level horizontal overflow"
|
|
4583
|
+
]
|
|
4584
|
+
},
|
|
4585
|
+
{
|
|
4586
|
+
id: "app-registration-and-scopes",
|
|
4587
|
+
title: "Register protected APIs as platform apps",
|
|
4588
|
+
summary: "Callable app APIs need a stable app ID, app slug, permissions, role bundles, and API-key scopes before agents or users rely on them.",
|
|
4589
|
+
appliesTo: ["api"],
|
|
4590
|
+
evidence: [
|
|
4591
|
+
"Auth app catalog contains the app ID and slug",
|
|
4592
|
+
"Permissions, role bundles, and API-key scopes exist for the app",
|
|
4593
|
+
"SDK, CLI, and MCP app discovery include the callable production API",
|
|
4594
|
+
"CloudControl production HTTP targets classify agent reachability with sdk_app_id or agent_callable:false"
|
|
4595
|
+
],
|
|
4596
|
+
implementation: [
|
|
4597
|
+
"Add production Worker api_url metadata and sdk_app_id for every agent-callable API target",
|
|
4598
|
+
"Mark browser, documentation, and runtime-only Worker targets with agent_callable:false",
|
|
4599
|
+
"Expose stable app IDs through live catalog discovery",
|
|
4600
|
+
"Keep typed SDK/CLI/MCP surfaces in sync when an API contract stabilizes"
|
|
4601
|
+
]
|
|
4602
|
+
},
|
|
4603
|
+
{
|
|
4604
|
+
id: "organization-scoped-data",
|
|
4605
|
+
title: "Keep application data organization-scoped",
|
|
4606
|
+
summary: "Protected data access must be scoped by the authenticated organization at the backend boundary, not by client-provided hints.",
|
|
4607
|
+
appliesTo: ["api"],
|
|
4608
|
+
evidence: [
|
|
4609
|
+
"Backend request handlers derive org membership from credential validation",
|
|
4610
|
+
"Queries and Durable Object keys include the authenticated organization boundary where data is tenant-owned",
|
|
4611
|
+
"MCP and CLI inputs do not include orgId overrides"
|
|
4612
|
+
],
|
|
4613
|
+
implementation: [
|
|
4614
|
+
"Reject or ignore organization hints supplied by clients",
|
|
4615
|
+
"Bind SQL, KV, R2, queue, and Durable Object access to the authenticated organization",
|
|
4616
|
+
"Document service-local exceptions explicitly in the system security assurance record"
|
|
4617
|
+
]
|
|
4618
|
+
},
|
|
4619
|
+
{
|
|
4620
|
+
id: "cloudflare-deployment-contract",
|
|
4621
|
+
title: "Keep Cloudflare deployment metadata complete",
|
|
4622
|
+
summary: "Workers, Pages, bindings, routes, env vars, queues, cron triggers, and deployment commands must be discoverable through CloudControl metadata.",
|
|
4623
|
+
appliesTo: ["browser", "api"],
|
|
4624
|
+
evidence: [
|
|
4625
|
+
"topolo.cloudcontrol.json lists production deploy targets and URLs",
|
|
4626
|
+
"Wrangler/Pages configuration matches CloudControl metadata",
|
|
4627
|
+
"Secrets and environment variables are not committed"
|
|
4628
|
+
],
|
|
4629
|
+
implementation: [
|
|
4630
|
+
"Update CloudControl metadata whenever deployment topology changes",
|
|
4631
|
+
"Prefer Cloudflare-native runtime surfaces for new Topolo app infrastructure",
|
|
4632
|
+
"Keep Worker bindings and Pages domains explicit enough for agents to inspect before deploying"
|
|
4633
|
+
]
|
|
4634
|
+
},
|
|
4635
|
+
{
|
|
4636
|
+
id: "agent-and-operator-surfaces",
|
|
4637
|
+
title: "Expose agent-safe operations through SDK, CLI, and MCP",
|
|
4638
|
+
summary: "Agent-accessible functionality should be discoverable, scope-gated, and write-confirmed instead of hidden behind ad hoc HTTP calls.",
|
|
4639
|
+
appliesTo: ["api", "tooling", "agent_surface"],
|
|
4640
|
+
evidence: [
|
|
4641
|
+
"Read operations have typed SDK/CLI/MCP surfaces once their contract stabilizes",
|
|
4642
|
+
"Mutating generic calls require --confirm or confirm:true",
|
|
4643
|
+
"MCP tools never accept orgId and advertise only appropriate scope-gated tools"
|
|
4644
|
+
],
|
|
4645
|
+
implementation: [
|
|
4646
|
+
"Add SDK types first, then CLI commands and MCP tools for durable workflows",
|
|
4647
|
+
"Use generic API passthrough only as a temporary escape hatch",
|
|
4648
|
+
"Keep command output JSON-stable for agents and human-readable with --no-json"
|
|
4649
|
+
]
|
|
4650
|
+
},
|
|
4651
|
+
{
|
|
4652
|
+
id: "native-dashboard-widget",
|
|
4653
|
+
title: "Expose a native dashboard widget contract",
|
|
4654
|
+
summary: "Launchable first-party applications must populate TopoloOne live workspace through an app-owned /api/widget endpoint using the SDK widget response contract.",
|
|
4655
|
+
appliesTo: ["api"],
|
|
4656
|
+
evidence: [
|
|
4657
|
+
"The app-owned API exposes GET /api/widget",
|
|
4658
|
+
"The endpoint returns TopoloWidgetApiResponse from @topolo/sdk",
|
|
4659
|
+
"Every returned widget includes snapshot.summary with app-owned operational prose",
|
|
4660
|
+
"The endpoint derives organization/user context from the app auth boundary"
|
|
4661
|
+
],
|
|
4662
|
+
implementation: [
|
|
4663
|
+
"Import createTopoloWidgetResponse from @topolo/sdk in the app backend",
|
|
4664
|
+
"Return native app metrics or action widgets instead of generic launch-card fallbacks",
|
|
4665
|
+
"Populate snapshot.summary in the producing app for every widget instead of synthesizing summaries in TopoloOne",
|
|
4666
|
+
"Add a route-level test that validates the response with validateTopoloWidgetResponse"
|
|
4667
|
+
]
|
|
4668
|
+
},
|
|
4669
|
+
{
|
|
4670
|
+
id: "observability-and-audit",
|
|
4671
|
+
title: "Emit platform audit and debugging signals",
|
|
4672
|
+
summary: "Requests, agent actions, and operational workflows need traceable IDs, client labels, and useful failure evidence.",
|
|
4673
|
+
appliesTo: ["api", "tooling", "agent_surface"],
|
|
4674
|
+
evidence: [
|
|
4675
|
+
"Requests carry X-Topolo-Client and X-Topolo-Request-Id where the SDK is involved",
|
|
4676
|
+
"Agent-originated calls can include X-Topolo-Agent",
|
|
4677
|
+
"Failure modes are documented with request IDs or deployment/log lookup paths"
|
|
4678
|
+
],
|
|
4679
|
+
implementation: [
|
|
4680
|
+
"Use TopoloClient for platform API calls rather than raw fetch where practical",
|
|
4681
|
+
"Keep logs free of secrets and tokens",
|
|
4682
|
+
"Document live smoke commands and request-id correlation in canonical docs"
|
|
4683
|
+
]
|
|
4684
|
+
},
|
|
4685
|
+
{
|
|
4686
|
+
id: "verification-gates",
|
|
4687
|
+
title: "Ship with build, test, docs, and smoke verification",
|
|
4688
|
+
summary: "A Topolo app change is not complete until the relevant code checks and docs checks have been run or explicitly reported as blocked.",
|
|
4689
|
+
appliesTo: ["all"],
|
|
4690
|
+
evidence: [
|
|
4691
|
+
"Relevant package build/typecheck/test commands pass",
|
|
4692
|
+
"TopoloDocs validation passes when docs are touched",
|
|
4693
|
+
"Live or local smoke evidence is captured for user-visible or API behavior"
|
|
4694
|
+
],
|
|
4695
|
+
implementation: [
|
|
4696
|
+
"Prefer existing package scripts before adding new tooling",
|
|
4697
|
+
"Run app-specific checks and shared docs validation for behavior changes",
|
|
4698
|
+
"Report any skipped verification with the blocker and residual risk"
|
|
4699
|
+
]
|
|
4700
|
+
}
|
|
4701
|
+
];
|
|
4702
|
+
function applicationRequirementScopes(application) {
|
|
4703
|
+
const scopes = /* @__PURE__ */ new Set(["all"]);
|
|
4704
|
+
const appId = application.id;
|
|
4705
|
+
const hasBrowserSurface = Boolean(application.productionUrl) || // String() keeps this guard valid after the Pages->Worker migration narrowed
|
|
4706
|
+
// the generated kind union to "worker" (no "pages" literal remains).
|
|
4707
|
+
application.deployTargets.some((target) => String(target.kind) === "pages");
|
|
4708
|
+
const hasApiSurface = application.services.length > 0 || application.deployTargets.some((target) => Boolean(target.appId));
|
|
4709
|
+
if (hasBrowserSurface) scopes.add("browser");
|
|
4710
|
+
if (hasApiSurface) scopes.add("api");
|
|
4711
|
+
if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
|
|
4712
|
+
scopes.add("tooling");
|
|
4713
|
+
}
|
|
4714
|
+
if (appId === "cli" || appId === "mcp" || hasApiSurface) {
|
|
4715
|
+
scopes.add("agent_surface");
|
|
4716
|
+
}
|
|
4717
|
+
return Array.from(scopes);
|
|
4718
|
+
}
|
|
4719
|
+
function fallbackApplication(id) {
|
|
4720
|
+
const entry = STATIC_APPLICATIONS[id];
|
|
4721
|
+
if (!entry) {
|
|
4722
|
+
throw new Error(
|
|
4723
|
+
`Unknown application "${id}" in the static fallback snapshot. Resolve applications from the live registry (resolveApplicationDirectoryEntry) and pass the entry directly.`
|
|
4724
|
+
);
|
|
4725
|
+
}
|
|
4726
|
+
return entry;
|
|
4727
|
+
}
|
|
4728
|
+
function requirementsForApplication(applicationOrId) {
|
|
4729
|
+
const application = typeof applicationOrId === "string" ? fallbackApplication(applicationOrId) : applicationOrId;
|
|
4730
|
+
const scopes = new Set(applicationRequirementScopes(application));
|
|
4731
|
+
return APPLICATION_REQUIREMENTS.filter(
|
|
4732
|
+
(requirement) => requirement.appliesTo.some((scope) => scopes.has(scope))
|
|
4733
|
+
);
|
|
4734
|
+
}
|
|
4735
|
+
function auditApplicationRequirements(applicationOrId) {
|
|
4736
|
+
const application = typeof applicationOrId === "string" ? fallbackApplication(applicationOrId) : applicationOrId;
|
|
4737
|
+
const scopes = applicationRequirementScopes(application);
|
|
4738
|
+
const findings = requirementsForApplication(application).map(
|
|
4739
|
+
(requirement) => evaluateRequirement(application, requirement)
|
|
4740
|
+
);
|
|
4741
|
+
return {
|
|
4742
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
4743
|
+
application,
|
|
4744
|
+
scopes,
|
|
4745
|
+
score: scoreFindings(findings),
|
|
4746
|
+
findings
|
|
4747
|
+
};
|
|
4748
|
+
}
|
|
4749
|
+
function auditApplicationEntries(applications) {
|
|
4750
|
+
return buildAuditReport(
|
|
4751
|
+
applications.map((application) => auditApplicationRequirements(application))
|
|
4752
|
+
);
|
|
4753
|
+
}
|
|
4754
|
+
function auditAllApplicationRequirements(applicationIds = Object.keys(APPLICATIONS).sort()) {
|
|
4755
|
+
return buildAuditReport(
|
|
4756
|
+
applicationIds.map((applicationId) => auditApplicationRequirements(applicationId))
|
|
4757
|
+
);
|
|
4758
|
+
}
|
|
4759
|
+
function buildAuditReport(applications) {
|
|
4760
|
+
const migrationQueue = applications.flatMap(
|
|
4761
|
+
(audit) => audit.findings.filter((finding2) => finding2.status !== "met").map((finding2) => ({
|
|
4762
|
+
applicationId: audit.application.id,
|
|
4763
|
+
applicationName: audit.application.name,
|
|
4764
|
+
requirementId: finding2.requirementId,
|
|
4765
|
+
title: finding2.title,
|
|
4766
|
+
status: finding2.status,
|
|
4767
|
+
reason: finding2.reason,
|
|
4768
|
+
nextActions: finding2.nextActions
|
|
4769
|
+
}))
|
|
4770
|
+
).sort((a, b) => {
|
|
4771
|
+
const statusOrder = statusRank(a.status) - statusRank(b.status);
|
|
4772
|
+
if (statusOrder !== 0) return statusOrder;
|
|
4773
|
+
const appOrder = a.applicationId.localeCompare(b.applicationId);
|
|
4774
|
+
if (appOrder !== 0) return appOrder;
|
|
4775
|
+
return a.requirementId.localeCompare(b.requirementId);
|
|
4776
|
+
});
|
|
4777
|
+
return {
|
|
4778
|
+
version: APPLICATION_REQUIREMENTS_VERSION,
|
|
4779
|
+
applications,
|
|
4780
|
+
migrationQueue
|
|
4781
|
+
};
|
|
4782
|
+
}
|
|
4783
|
+
function evaluateRequirement(application, requirement) {
|
|
4784
|
+
const evidence = [];
|
|
4785
|
+
switch (requirement.id) {
|
|
4786
|
+
case "platform-metadata": {
|
|
4787
|
+
if (application.packageName) evidence.push(`package=${application.packageName}`);
|
|
4788
|
+
if (application.productionUrl) evidence.push(`productionUrl=${application.productionUrl}`);
|
|
4789
|
+
if (application.deployTargets.length > 0) {
|
|
4790
|
+
evidence.push(`deployTargets=${application.deployTargets.length}`);
|
|
4791
|
+
}
|
|
4792
|
+
if (application.services.length > 0) {
|
|
4793
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
4794
|
+
}
|
|
4795
|
+
if (evidence.length === 0) {
|
|
4796
|
+
return finding(requirement, "missing", "No package, production URL, deploy target, or service metadata is available.", evidence);
|
|
4797
|
+
}
|
|
4798
|
+
return finding(requirement, "met", "Catalog metadata exists for this application.", evidence);
|
|
4799
|
+
}
|
|
4800
|
+
case "canonical-docs":
|
|
4801
|
+
return finding(
|
|
4802
|
+
requirement,
|
|
4803
|
+
"needs_review",
|
|
4804
|
+
"Catalog metadata cannot verify matching TopoloDocs system and handbook coverage.",
|
|
4805
|
+
evidence
|
|
4806
|
+
);
|
|
4807
|
+
case "shared-auth-boundary":
|
|
4808
|
+
return finding(
|
|
4809
|
+
requirement,
|
|
4810
|
+
"needs_review",
|
|
4811
|
+
"Catalog metadata cannot verify that implementation uses shared Topolo auth packages and derives org from credentials.",
|
|
4812
|
+
evidence
|
|
4813
|
+
);
|
|
4814
|
+
case "shared-shell-and-launcher":
|
|
4815
|
+
return finding(
|
|
4816
|
+
requirement,
|
|
4817
|
+
"needs_review",
|
|
4818
|
+
"Catalog metadata cannot verify shared shell, launcher, and account menu adoption.",
|
|
4819
|
+
evidence
|
|
4820
|
+
);
|
|
4821
|
+
case "app-registration-and-scopes": {
|
|
4822
|
+
if (application.services.length > 0) {
|
|
4823
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
4824
|
+
return finding(
|
|
4825
|
+
requirement,
|
|
4826
|
+
"partial",
|
|
4827
|
+
"SDK service discovery exists, but Auth catalog permissions, role bundles, and API-key scopes still need confirmation.",
|
|
4828
|
+
evidence
|
|
4829
|
+
);
|
|
4830
|
+
}
|
|
4831
|
+
return finding(requirement, "missing", "No SDK app API id is registered for this callable API surface.", evidence);
|
|
4832
|
+
}
|
|
4833
|
+
case "organization-scoped-data":
|
|
4834
|
+
return finding(
|
|
4835
|
+
requirement,
|
|
4836
|
+
"needs_review",
|
|
4837
|
+
"Catalog metadata cannot verify backend tenant filters, storage keys, or Durable Object boundaries.",
|
|
4838
|
+
evidence
|
|
4839
|
+
);
|
|
4840
|
+
case "cloudflare-deployment-contract": {
|
|
4841
|
+
if (application.deployTargets.length < 1) {
|
|
4842
|
+
return finding(requirement, "missing", "No CloudControl deploy targets are registered.", evidence);
|
|
4843
|
+
}
|
|
4844
|
+
evidence.push(`deployTargets=${application.deployTargets.length}`);
|
|
4845
|
+
if (application.productionUrl) evidence.push(`productionUrl=${application.productionUrl}`);
|
|
4846
|
+
return finding(requirement, "met", "CloudControl deploy target metadata is present.", evidence);
|
|
4847
|
+
}
|
|
4848
|
+
case "agent-and-operator-surfaces": {
|
|
4849
|
+
const appId = application.id;
|
|
4850
|
+
if (application.services.length > 0) {
|
|
4851
|
+
evidence.push(`services=${application.services.join(",")}`);
|
|
4852
|
+
return finding(requirement, "partial", "SDK service discovery exists; typed SDK/CLI/MCP workflow coverage should be checked as APIs stabilize.", evidence);
|
|
4853
|
+
}
|
|
4854
|
+
if (appId === "cli" || appId === "mcp" || appId === "cloudcontrol") {
|
|
4855
|
+
evidence.push(`tooling=${appId}`);
|
|
4856
|
+
return finding(requirement, "met", "This application is itself an agent/operator surface.", evidence);
|
|
4857
|
+
}
|
|
4858
|
+
return finding(requirement, "missing", "No SDK service or tooling surface is registered.", evidence);
|
|
4859
|
+
}
|
|
4860
|
+
case "native-dashboard-widget":
|
|
4861
|
+
return finding(
|
|
4862
|
+
requirement,
|
|
4863
|
+
"needs_review",
|
|
4864
|
+
"Catalog metadata cannot verify app-owned /api/widget implementation details.",
|
|
4865
|
+
evidence
|
|
4866
|
+
);
|
|
4867
|
+
case "observability-and-audit":
|
|
4868
|
+
return finding(
|
|
4869
|
+
requirement,
|
|
4870
|
+
"needs_review",
|
|
4871
|
+
"Catalog metadata cannot verify runtime request IDs, client labels, or log redaction.",
|
|
4872
|
+
evidence
|
|
4873
|
+
);
|
|
4874
|
+
case "verification-gates":
|
|
4875
|
+
return finding(
|
|
4876
|
+
requirement,
|
|
4877
|
+
"needs_review",
|
|
4878
|
+
"Catalog metadata cannot verify package checks, docs validation, or smoke evidence.",
|
|
4879
|
+
evidence
|
|
4880
|
+
);
|
|
4881
|
+
default:
|
|
4882
|
+
return finding(requirement, "needs_review", "No automated evaluator exists for this requirement yet.", evidence);
|
|
4883
|
+
}
|
|
4884
|
+
}
|
|
4885
|
+
function finding(requirement, status, reason, evidence) {
|
|
4886
|
+
return {
|
|
4887
|
+
requirementId: requirement.id,
|
|
4888
|
+
title: requirement.title,
|
|
4889
|
+
status,
|
|
4890
|
+
reason,
|
|
4891
|
+
evidence,
|
|
4892
|
+
nextActions: status === "met" ? [] : requirement.implementation
|
|
4893
|
+
};
|
|
4894
|
+
}
|
|
4895
|
+
function scoreFindings(findings) {
|
|
4896
|
+
const met = findings.filter((finding2) => finding2.status === "met").length;
|
|
4897
|
+
const partial = findings.filter((finding2) => finding2.status === "partial").length;
|
|
4898
|
+
const missing = findings.filter((finding2) => finding2.status === "missing").length;
|
|
4899
|
+
const needsReview = findings.filter((finding2) => finding2.status === "needs_review").length;
|
|
4900
|
+
const total = findings.length;
|
|
4901
|
+
const weighted = met + partial * 0.5;
|
|
4902
|
+
return {
|
|
4903
|
+
met,
|
|
4904
|
+
partial,
|
|
4905
|
+
missing,
|
|
4906
|
+
needsReview,
|
|
4907
|
+
total,
|
|
4908
|
+
percent: total === 0 ? 100 : Math.round(weighted / total * 100)
|
|
4909
|
+
};
|
|
4910
|
+
}
|
|
4911
|
+
function statusRank(status) {
|
|
4912
|
+
if (status === "missing") return 0;
|
|
4913
|
+
if (status === "partial") return 1;
|
|
4914
|
+
return 2;
|
|
4915
|
+
}
|
|
4916
|
+
|
|
2676
4917
|
// src/modules/crm.ts
|
|
2677
4918
|
var CrmModule = class {
|
|
2678
4919
|
constructor(client) {
|
|
@@ -3261,6 +5502,9 @@ function createTopolo(options) {
|
|
|
3261
5502
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3262
5503
|
0 && (module.exports = {
|
|
3263
5504
|
ACTION_CATALOG_DIGEST_ALGORITHM,
|
|
5505
|
+
APPLICATIONS,
|
|
5506
|
+
APPLICATION_REQUIREMENTS,
|
|
5507
|
+
APPLICATION_REQUIREMENTS_VERSION,
|
|
3264
5508
|
CrmModule,
|
|
3265
5509
|
DEFAULT_APP_URLS,
|
|
3266
5510
|
IdentityModule,
|
|
@@ -3279,7 +5523,11 @@ function createTopolo(options) {
|
|
|
3279
5523
|
WorkspacesModule,
|
|
3280
5524
|
actionContractCompleteness,
|
|
3281
5525
|
applicationEntryFromCatalog,
|
|
5526
|
+
applicationRequirementScopes,
|
|
3282
5527
|
assertTopoloServiceUrlEnvironment,
|
|
5528
|
+
auditAllApplicationRequirements,
|
|
5529
|
+
auditApplicationEntries,
|
|
5530
|
+
auditApplicationRequirements,
|
|
3283
5531
|
canonicalTopoloErrorCode,
|
|
3284
5532
|
canonicalTopoloRequestId,
|
|
3285
5533
|
canonicalTopoloRequired,
|
|
@@ -3287,6 +5535,7 @@ function createTopolo(options) {
|
|
|
3287
5535
|
compactActionCatalogEntry,
|
|
3288
5536
|
compactActionPlan,
|
|
3289
5537
|
compactActionPreparation,
|
|
5538
|
+
compactActionResult,
|
|
3290
5539
|
compactActionValidation,
|
|
3291
5540
|
createTopolo,
|
|
3292
5541
|
createTopoloAgentExecutionContext,
|
|
@@ -3305,9 +5554,11 @@ function createTopolo(options) {
|
|
|
3305
5554
|
friendlyAppId,
|
|
3306
5555
|
listApplicationDirectory,
|
|
3307
5556
|
parseTopoloActionUploadContract,
|
|
5557
|
+
preferExactActionMatches,
|
|
3308
5558
|
prepareTopoloActionBase64UploadInput,
|
|
3309
5559
|
prepareTopoloActionUploadInput,
|
|
3310
5560
|
publicTopoloErrorMessage,
|
|
5561
|
+
requirementsForApplication,
|
|
3311
5562
|
resolveApplicationDirectoryEntry,
|
|
3312
5563
|
resolveCatalogServiceUrl,
|
|
3313
5564
|
resolveServiceUrl,
|