@topolo/sdk 0.11.6 → 0.11.8

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