@stacksjs/ts-cloud 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/chunk-0rtn6q5x.js +3 -0
  3. package/dist/bin/chunk-258ehp9s.js +1 -0
  4. package/dist/bin/chunk-2yctv06c.js +1 -0
  5. package/dist/bin/chunk-3276rveh.js +37 -0
  6. package/dist/bin/chunk-3m665jwp.js +70 -0
  7. package/dist/bin/chunk-3s2p9vxj.js +1 -0
  8. package/dist/bin/chunk-4esma5m9.js +1 -0
  9. package/dist/bin/chunk-4n0j3n3b.js +2 -0
  10. package/dist/bin/chunk-54bqchag.js +92 -0
  11. package/dist/bin/{chunk-4q6tad44.js → chunk-5bhx3bsa.js} +121 -121
  12. package/dist/bin/chunk-5zagqd20.js +1 -0
  13. package/dist/bin/chunk-7hw2js5h.js +512 -0
  14. package/dist/bin/chunk-8h1qr6x4.js +50 -0
  15. package/dist/bin/{chunk-w32xv8n4.js → chunk-9vdc7adf.js} +6 -6
  16. package/dist/bin/chunk-a1dd6sby.js +1 -0
  17. package/dist/bin/chunk-a4dw35gs.js +1 -0
  18. package/dist/bin/chunk-a9d55ker.js +1 -0
  19. package/dist/bin/chunk-awa1qade.js +9 -0
  20. package/dist/bin/chunk-b6by94pk.js +2 -0
  21. package/dist/bin/chunk-c8sypnbe.js +2 -0
  22. package/dist/bin/chunk-cx4e3d4w.js +1 -0
  23. package/dist/bin/chunk-d5a3vheh.js +2 -0
  24. package/dist/bin/chunk-e1fym2bd.js +1 -0
  25. package/dist/bin/chunk-ej4h0q2y.js +1 -0
  26. package/dist/bin/chunk-ett305ym.js +4 -0
  27. package/dist/bin/chunk-f11xf3n6.js +2 -0
  28. package/dist/bin/chunk-fq7ktvgy.js +3 -0
  29. package/dist/bin/chunk-fyq4th2m.js +1 -0
  30. package/dist/bin/chunk-g67qr8yf.js +1 -0
  31. package/dist/bin/chunk-gc82cx4h.js +1 -0
  32. package/dist/bin/chunk-hchtvpr9.js +1 -0
  33. package/dist/bin/chunk-hpe4jjce.js +1 -0
  34. package/dist/bin/chunk-k5vprsef.js +6 -0
  35. package/dist/bin/chunk-m22krd4z.js +3 -0
  36. package/dist/bin/chunk-mkppcwz8.js +1 -0
  37. package/dist/bin/chunk-mpjg0kc7.js +2 -0
  38. package/dist/bin/chunk-mrm4m4dk.js +2 -0
  39. package/dist/bin/chunk-nff46rxd.js +1 -0
  40. package/dist/bin/chunk-np1z3bgt.js +1 -0
  41. package/dist/bin/chunk-nskxkk6r.js +1 -0
  42. package/dist/bin/chunk-pez932b1.js +111 -0
  43. package/dist/bin/chunk-qsdf5kzk.js +2 -0
  44. package/dist/bin/chunk-r61qmhv1.js +2 -0
  45. package/dist/bin/chunk-r6gdcz5c.js +1 -0
  46. package/dist/bin/chunk-satwnr42.js +2 -0
  47. package/dist/bin/{chunk-dz1ec589.js → chunk-scqmd4qv.js} +30 -30
  48. package/dist/bin/chunk-smbycpt5.js +44 -0
  49. package/dist/bin/chunk-sn7e0sn7.js +2 -0
  50. package/dist/bin/chunk-ss574pka.js +1 -0
  51. package/dist/bin/chunk-tj0xb2d8.js +585 -0
  52. package/dist/bin/chunk-v3rzf9d0.js +141 -0
  53. package/dist/bin/chunk-wnpma6t3.js +34 -0
  54. package/dist/bin/chunk-xan0e052.js +5 -0
  55. package/dist/bin/chunk-xbk2y43r.js +60 -0
  56. package/dist/bin/chunk-xjp3v95e.js +6 -0
  57. package/dist/bin/chunk-xyt490vp.js +6 -0
  58. package/dist/bin/chunk-yn9r02gy.js +1 -0
  59. package/dist/bin/chunk-zhkhn9cc.js +1 -0
  60. package/dist/bin/cli.js +444 -435
  61. package/dist/bin/dashboard-server.js +1 -1
  62. package/dist/chunk-0zf72ngj.js +1 -0
  63. package/dist/chunk-2hpjte1d.js +704 -0
  64. package/dist/chunk-4m6gwhwr.js +5 -0
  65. package/dist/chunk-5m29dhke.js +34 -0
  66. package/dist/chunk-6fzeemcs.js +114 -0
  67. package/dist/{chunk-jm5mg890.js → chunk-6xcbfs2r.js} +111 -111
  68. package/dist/chunk-bpnhqb70.js +6 -0
  69. package/dist/chunk-ead1nkbr.js +60 -0
  70. package/dist/chunk-fea461tj.js +141 -0
  71. package/dist/chunk-fvjczc73.js +1 -0
  72. package/dist/chunk-gearw6rk.js +4 -0
  73. package/dist/chunk-j60hesb3.js +2 -0
  74. package/dist/chunk-pmgtmt3d.js +1 -0
  75. package/dist/chunk-prf2pkvq.js +5 -0
  76. package/dist/chunk-q0wffgw5.js +37 -0
  77. package/dist/chunk-qcemnt35.js +50 -0
  78. package/dist/chunk-qvbwsaay.js +1 -0
  79. package/dist/chunk-r2pbqcnz.js +2 -0
  80. package/dist/chunk-r6110zv2.js +1 -0
  81. package/dist/{chunk-13qjvbqh.js → chunk-rr1yaj55.js} +1 -1
  82. package/dist/chunk-wcrj06cg.js +44 -0
  83. package/dist/chunk-wte9mh18.js +92 -0
  84. package/dist/{chunk-86ss83s2.js → chunk-y1dh3znq.js} +52 -52
  85. package/dist/chunk-y6e86wjs.js +445 -0
  86. package/dist/chunk-y8b7ht4v.js +1 -0
  87. package/dist/chunk-yf487g6e.js +2 -0
  88. package/dist/chunk-zmmc9j5f.js +2 -0
  89. package/dist/deploy/index.js +1 -1
  90. package/dist/dns/index.js +1 -1
  91. package/dist/drivers/index.js +1 -1
  92. package/dist/index.js +91 -91
  93. package/dist/pages/cloudflare-pages.d.ts +13 -0
  94. package/dist/protection/index.js +1 -1
  95. package/dist/push/index.js +1 -1
  96. package/dist/spend/index.js +1 -1
  97. package/dist/ui/404.html +1 -1
  98. package/dist/ui/accept-invitation.html +1 -1
  99. package/dist/ui/access-denied.html +1 -1
  100. package/dist/ui/account/automation.html +6 -6
  101. package/dist/ui/account/security.html +2 -2
  102. package/dist/ui/applications/compose.html +6 -6
  103. package/dist/ui/applications/new.html +2 -2
  104. package/dist/ui/data/backups.html +80 -80
  105. package/dist/ui/data/services.html +78 -78
  106. package/dist/ui/data/volumes.html +50 -50
  107. package/dist/ui/index.html +50 -50
  108. package/dist/ui/infrastructure/topology.html +118 -118
  109. package/dist/ui/integrations.html +2 -2
  110. package/dist/ui/operations/alerts.html +48 -48
  111. package/dist/ui/operations/configuration.html +6 -6
  112. package/dist/ui/operations/jobs.html +76 -76
  113. package/dist/ui/operations/maintenance.html +6 -6
  114. package/dist/ui/operations/observability.html +81 -81
  115. package/dist/ui/operations/previews.html +6 -6
  116. package/dist/ui/operations/queue.html +6 -6
  117. package/dist/ui/operations/regions.html +6 -6
  118. package/dist/ui/operations/releases.html +6 -6
  119. package/dist/ui/operations/spend.html +54 -54
  120. package/dist/ui/operations/workloads.html +104 -104
  121. package/dist/ui/security.html +2 -2
  122. package/dist/ui/server/actions.html +56 -56
  123. package/dist/ui/server/activity.html +2 -2
  124. package/dist/ui/server/capacity.html +6 -6
  125. package/dist/ui/server/database.html +106 -106
  126. package/dist/ui/server/deployments.html +50 -50
  127. package/dist/ui/server/diagnostics.html +1 -1
  128. package/dist/ui/server/firewall.html +76 -76
  129. package/dist/ui/server/fleet.html +33 -33
  130. package/dist/ui/server/logs.html +24 -24
  131. package/dist/ui/server/metrics.html +112 -112
  132. package/dist/ui/server/security.html +2 -2
  133. package/dist/ui/server/services.html +26 -26
  134. package/dist/ui/server/sites.html +119 -119
  135. package/dist/ui/server/ssh-keys.html +52 -52
  136. package/dist/ui/server/team.html +144 -144
  137. package/dist/ui/server/terminal.html +15 -15
  138. package/dist/ui/serverless/alarms.html +52 -52
  139. package/dist/ui/serverless/assets.html +27 -27
  140. package/dist/ui/serverless/cost.html +2 -2
  141. package/dist/ui/serverless/data.html +35 -35
  142. package/dist/ui/serverless/deployments.html +27 -27
  143. package/dist/ui/serverless/firewall.html +1 -1
  144. package/dist/ui/serverless/functions.html +39 -39
  145. package/dist/ui/serverless/logs.html +24 -24
  146. package/dist/ui/serverless/metrics.html +2 -2
  147. package/dist/ui/serverless/queues.html +48 -48
  148. package/dist/ui/serverless/secrets.html +52 -52
  149. package/dist/ui/serverless/traces.html +6 -6
  150. package/dist/ui/serverless.html +54 -54
  151. package/dist/ui-src/src/charts.ts +8721 -13558
  152. package/dist/ui-src/src/topology.ts +2 -2
  153. package/package.json +3 -3
  154. package/dist/bin/chunk-0zwknfwp.js +0 -1
  155. package/dist/bin/chunk-3aph4c1w.js +0 -2
  156. package/dist/bin/chunk-5nkqza92.js +0 -1
  157. package/dist/bin/chunk-64vczwwt.js +0 -1
  158. package/dist/bin/chunk-6tfwm33r.js +0 -6
  159. package/dist/bin/chunk-71t1gmsq.js +0 -1
  160. package/dist/bin/chunk-7g2ahkse.js +0 -1
  161. package/dist/bin/chunk-7zhgmp1s.js +0 -3
  162. package/dist/bin/chunk-82mj52xr.js +0 -141
  163. package/dist/bin/chunk-8ewncfce.js +0 -37
  164. package/dist/bin/chunk-9a88fp00.js +0 -2
  165. package/dist/bin/chunk-9kf0np8j.js +0 -44
  166. package/dist/bin/chunk-a7w13qfm.js +0 -2
  167. package/dist/bin/chunk-b4wt9jcg.js +0 -60
  168. package/dist/bin/chunk-btsyjhk7.js +0 -92
  169. package/dist/bin/chunk-c0bdafbx.js +0 -2
  170. package/dist/bin/chunk-cd0ps58j.js +0 -1
  171. package/dist/bin/chunk-cxt74wsj.js +0 -1
  172. package/dist/bin/chunk-d7ke90zt.js +0 -2
  173. package/dist/bin/chunk-djg4zyqk.js +0 -1
  174. package/dist/bin/chunk-dkaz333b.js +0 -1
  175. package/dist/bin/chunk-dkf4qsp2.js +0 -1
  176. package/dist/bin/chunk-e2bybahr.js +0 -3
  177. package/dist/bin/chunk-e5ab5twy.js +0 -50
  178. package/dist/bin/chunk-edvvx3hg.js +0 -1
  179. package/dist/bin/chunk-ehc63fvs.js +0 -2
  180. package/dist/bin/chunk-f06c5np9.js +0 -1
  181. package/dist/bin/chunk-g6baf9c5.js +0 -512
  182. package/dist/bin/chunk-gq8794k6.js +0 -1
  183. package/dist/bin/chunk-hq9x489e.js +0 -70
  184. package/dist/bin/chunk-ja1vjdn1.js +0 -6
  185. package/dist/bin/chunk-k3120rx6.js +0 -1
  186. package/dist/bin/chunk-kg61p5hw.js +0 -3
  187. package/dist/bin/chunk-mcr0r4at.js +0 -2
  188. package/dist/bin/chunk-mfrf9q4b.js +0 -2
  189. package/dist/bin/chunk-my3ewh3a.js +0 -34
  190. package/dist/bin/chunk-nw3d4k52.js +0 -1
  191. package/dist/bin/chunk-p70bc9yr.js +0 -1
  192. package/dist/bin/chunk-q5cmfpzt.js +0 -1
  193. package/dist/bin/chunk-rtecnmts.js +0 -4
  194. package/dist/bin/chunk-rv18092e.js +0 -585
  195. package/dist/bin/chunk-s4yzes15.js +0 -2
  196. package/dist/bin/chunk-sj5csg49.js +0 -2
  197. package/dist/bin/chunk-ta7sh0cc.js +0 -1
  198. package/dist/bin/chunk-tfbs8k8v.js +0 -111
  199. package/dist/bin/chunk-tvz9c388.js +0 -1
  200. package/dist/bin/chunk-x6f61g36.js +0 -9
  201. package/dist/bin/chunk-xhwqpgwq.js +0 -2
  202. package/dist/bin/chunk-xk08030d.js +0 -6
  203. package/dist/bin/chunk-xkfrqqcs.js +0 -1
  204. package/dist/bin/chunk-y1h63vpm.js +0 -1
  205. package/dist/bin/chunk-zdt2rjk6.js +0 -1
  206. package/dist/bin/chunk-zh2d4704.js +0 -1
  207. package/dist/bin/chunk-zpe64t4r.js +0 -1
  208. package/dist/chunk-152he7m3.js +0 -92
  209. package/dist/chunk-1qdne0bf.js +0 -1
  210. package/dist/chunk-3mgj3hrh.js +0 -5
  211. package/dist/chunk-6kpbveb8.js +0 -5
  212. package/dist/chunk-73ztr55z.js +0 -2
  213. package/dist/chunk-a84gmpyh.js +0 -1
  214. package/dist/chunk-aj025v2s.js +0 -4
  215. package/dist/chunk-b087qsyf.js +0 -704
  216. package/dist/chunk-by2bwzk6.js +0 -141
  217. package/dist/chunk-h42zck7h.js +0 -60
  218. package/dist/chunk-hn40z11p.js +0 -37
  219. package/dist/chunk-m8fs0233.js +0 -34
  220. package/dist/chunk-mz0dk78z.js +0 -6
  221. package/dist/chunk-nms5q44e.js +0 -1
  222. package/dist/chunk-nzqxdkch.js +0 -445
  223. package/dist/chunk-qm32ytbr.js +0 -1
  224. package/dist/chunk-t0xgmhd6.js +0 -114
  225. package/dist/chunk-t3t9ymec.js +0 -1
  226. package/dist/chunk-tz9myq9a.js +0 -2
  227. package/dist/chunk-wavjkdb8.js +0 -2
  228. package/dist/chunk-x3hay61c.js +0 -44
  229. package/dist/chunk-xcj8zfmg.js +0 -2
  230. package/dist/chunk-y2v22hkv.js +0 -1
  231. package/dist/chunk-y4xkj2f1.js +0 -50
@@ -1,31 +1,31 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt7l77jbzlapbv"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Spend &amp; budgets</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787597170331_8() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt7lgvq3gjbx1h"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Spend &amp; budgets</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787597622105_16() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
- var acknowledge = undefined;
6
- var api = undefined;
7
- var createBudget = undefined;
8
- var form = undefined;
9
- var guard = undefined;
10
- var lastUpdatedAt = undefined;
11
- var load = undefined;
12
- var money = undefined;
13
- var optional = undefined;
14
- var patchBudget = undefined;
15
- var pct = undefined;
16
- var pollingError = undefined;
17
- var pollingState = undefined;
18
- var refresh = undefined;
19
- var release = undefined;
20
- var removeBudget = undefined;
21
- var report = undefined;
22
- var runCheck = undefined;
23
- var scopeOf = undefined;
24
- var setPeriod = undefined;
25
- var severityTone = undefined;
26
- var tone = undefined;
27
- var trusted = undefined;
28
5
  var when = undefined;
6
+ var trusted = undefined;
7
+ var tone = undefined;
8
+ var severityTone = undefined;
9
+ var setPeriod = undefined;
10
+ var scopeOf = undefined;
11
+ var runCheck = undefined;
12
+ var report = undefined;
13
+ var removeBudget = undefined;
14
+ var release = undefined;
15
+ var refresh = undefined;
16
+ var pollingState = undefined;
17
+ var pollingError = undefined;
18
+ var pct = undefined;
19
+ var patchBudget = undefined;
20
+ var optional = undefined;
21
+ var money = undefined;
22
+ var load = undefined;
23
+ var lastUpdatedAt = undefined;
24
+ var guard = undefined;
25
+ var form = undefined;
26
+ var createBudget = undefined;
27
+ var api = undefined;
28
+ var acknowledge = undefined;
29
29
  var __stxBundle_55dcf44f8138 = (function() {
30
30
 
31
31
  function servedWithoutApi(error) {
@@ -177,37 +177,37 @@ function setPeriod(event) {
177
177
  period.set(event.currentTarget.value);
178
178
  refresh();
179
179
  }
180
- return { "acknowledge": acknowledge, "api": api, "createBudget": createBudget, "form": form, "guard": guard, "lastUpdatedAt": lastUpdatedAt, "load": load, "money": money, "optional": optional, "patchBudget": patchBudget, "pct": pct, "pollingError": pollingError, "pollingState": pollingState, "refresh": refresh, "release": release, "removeBudget": removeBudget, "report": report, "runCheck": runCheck, "scopeOf": scopeOf, "setPeriod": setPeriod, "severityTone": severityTone, "tone": tone, "trusted": trusted, "when": when };
180
+ return { "when": when, "trusted": trusted, "tone": tone, "severityTone": severityTone, "setPeriod": setPeriod, "scopeOf": scopeOf, "runCheck": runCheck, "report": report, "removeBudget": removeBudget, "release": release, "refresh": refresh, "pollingState": pollingState, "pollingError": pollingError, "pct": pct, "patchBudget": patchBudget, "optional": optional, "money": money, "load": load, "lastUpdatedAt": lastUpdatedAt, "guard": guard, "form": form, "createBudget": createBudget, "api": api, "acknowledge": acknowledge };
181
181
  })();
182
- acknowledge = __stxBundle_55dcf44f8138["acknowledge"];
183
- api = __stxBundle_55dcf44f8138["api"];
184
- createBudget = __stxBundle_55dcf44f8138["createBudget"];
185
- form = __stxBundle_55dcf44f8138["form"];
186
- guard = __stxBundle_55dcf44f8138["guard"];
187
- lastUpdatedAt = __stxBundle_55dcf44f8138["lastUpdatedAt"];
188
- load = __stxBundle_55dcf44f8138["load"];
189
- money = __stxBundle_55dcf44f8138["money"];
190
- optional = __stxBundle_55dcf44f8138["optional"];
191
- patchBudget = __stxBundle_55dcf44f8138["patchBudget"];
192
- pct = __stxBundle_55dcf44f8138["pct"];
193
- pollingError = __stxBundle_55dcf44f8138["pollingError"];
194
- pollingState = __stxBundle_55dcf44f8138["pollingState"];
195
- refresh = __stxBundle_55dcf44f8138["refresh"];
196
- release = __stxBundle_55dcf44f8138["release"];
197
- removeBudget = __stxBundle_55dcf44f8138["removeBudget"];
198
- report = __stxBundle_55dcf44f8138["report"];
199
- runCheck = __stxBundle_55dcf44f8138["runCheck"];
200
- scopeOf = __stxBundle_55dcf44f8138["scopeOf"];
201
- setPeriod = __stxBundle_55dcf44f8138["setPeriod"];
202
- severityTone = __stxBundle_55dcf44f8138["severityTone"];
203
- tone = __stxBundle_55dcf44f8138["tone"];
204
- trusted = __stxBundle_55dcf44f8138["trusted"];
205
182
  when = __stxBundle_55dcf44f8138["when"];
206
- return { acknowledge, api, createBudget, form, guard, lastUpdatedAt, load, money, optional, patchBudget, pct, pollingError, pollingState, refresh, release, removeBudget, report, runCheck, scopeOf, setPeriod, severityTone, tone, trusted, when, __stxBundle_55dcf44f8138 };
183
+ trusted = __stxBundle_55dcf44f8138["trusted"];
184
+ tone = __stxBundle_55dcf44f8138["tone"];
185
+ severityTone = __stxBundle_55dcf44f8138["severityTone"];
186
+ setPeriod = __stxBundle_55dcf44f8138["setPeriod"];
187
+ scopeOf = __stxBundle_55dcf44f8138["scopeOf"];
188
+ runCheck = __stxBundle_55dcf44f8138["runCheck"];
189
+ report = __stxBundle_55dcf44f8138["report"];
190
+ removeBudget = __stxBundle_55dcf44f8138["removeBudget"];
191
+ release = __stxBundle_55dcf44f8138["release"];
192
+ refresh = __stxBundle_55dcf44f8138["refresh"];
193
+ pollingState = __stxBundle_55dcf44f8138["pollingState"];
194
+ pollingError = __stxBundle_55dcf44f8138["pollingError"];
195
+ pct = __stxBundle_55dcf44f8138["pct"];
196
+ patchBudget = __stxBundle_55dcf44f8138["patchBudget"];
197
+ optional = __stxBundle_55dcf44f8138["optional"];
198
+ money = __stxBundle_55dcf44f8138["money"];
199
+ load = __stxBundle_55dcf44f8138["load"];
200
+ lastUpdatedAt = __stxBundle_55dcf44f8138["lastUpdatedAt"];
201
+ guard = __stxBundle_55dcf44f8138["guard"];
202
+ form = __stxBundle_55dcf44f8138["form"];
203
+ createBudget = __stxBundle_55dcf44f8138["createBudget"];
204
+ api = __stxBundle_55dcf44f8138["api"];
205
+ acknowledge = __stxBundle_55dcf44f8138["acknowledge"];
206
+ return { when, trusted, tone, severityTone, setPeriod, scopeOf, runCheck, report, removeBudget, release, refresh, pollingState, pollingError, pct, patchBudget, optional, money, load, lastUpdatedAt, guard, form, createBudget, api, acknowledge, __stxBundle_55dcf44f8138 };
207
207
  }
208
- window.__stx_latestSetup=__stx_setup_1787597170331_8;
209
- if(window.stx)window.stx._latestSetup=__stx_setup_1787597170331_8;
210
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787597170331_8"><a data-stx-scope="stx_scope_nav_11" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="active" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
208
+ window.__stx_latestSetup=__stx_setup_1787597622105_16;
209
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787597622105_16;
210
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787597622105_16"><a data-stx-scope="stx_scope_nav_20" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="active" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
211
211
  (function() {
212
212
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
213
213
  var __destroyHooks = [];
@@ -558,6 +558,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787597170331_8;
558
558
 
559
559
 
560
560
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
561
- window.stx._scopes['stx_scope_nav_11'] = __scopeRegistration;
561
+ window.stx._scopes['stx_scope_nav_20'] = __scopeRegistration;
562
562
  })();
563
563
  </script> <main class="wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Spend &amp; budgets</div><header class="page"><div><h1>Spend &amp; budgets</h1><p>Metered usage, soft and hard caps, enforcement in force, and anomaly detection. Costs are estimated from observed usage, so they update within the hour rather than waiting on a provider invoice.</p></div><div class="header-actions"><select aria-label="Budget period" @change="setPeriod($event)"><option value="monthly">Monthly</option><option value="weekly">Weekly</option><option value="daily">Daily</option></select><span class="pill" :class="pollingState()==='live'?'ok':'warn'" x-cloak>{{ pollingState() }}</span><small x-cloak>{{ lastUpdatedAt()?.toLocaleTimeString()||'connecting' }}</small><button class="btn ghost sm" @click="refresh()">Refresh</button></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!actionError()" x-cloak>{{ actionError() }}</p><p class="bad notice" role="alert" @show="!!pollingError()" x-cloak>{{ pollingError() }}</p><div class="notice panel warn" @show="enforcement().some(item=>!item.simulated)" x-cloak><strong>Spend enforcement is in force.</strong><span x-cloak>{{ enforcement().filter(item=>!item.simulated).map(item=>item.action).join(', ') }} — see the Enforcement tab.</span></div><nav class="tabs" aria-label="Spend workspace"><button :class="{active:tab()==='overview'}" @click="tab.set('overview')">Overview</button><button :class="{active:tab()==='budgets'}" @click="tab.set('budgets')">Budgets</button><button :class="{active:tab()==='enforcement'}" @click="tab.set('enforcement')">Enforcement</button><button :class="{active:tab()==='anomalies'}" @click="tab.set('anomalies')">Anomalies</button></nav><section @show="tab()==='overview'" x-cloak><div class="summary"><article class="panel"><b>Spent this period</b><strong x-cloak>{{ money(report()?.totalCents) }}</strong><small x-cloak>{{ report()?.window?.label||'—' }}</small></article><article class="panel"><b>Budgets</b><strong x-cloak>{{ report()?.budgets?.length||0 }}</strong><small x-cloak>{{ (report()?.budgets||[]).filter(b=>b.dryRun).length }} in dry run</small></article><article class="panel"><b>Enforcement</b><strong x-cloak>{{ report()?.enforcement?.strongestAction||'none' }}</strong><small x-cloak>{{ enforcement().length }} action(s) recorded</small></article><article class="panel"><b>Anomalies</b><strong x-cloak>{{ anomalies().filter(a=>!a.acknowledgedAt).length }}</strong><small>unacknowledged</small></article></div><h2>Budget headroom</h2><div class="cards-list" x-cloak><template :for="budget in (report()?.budgets||[])"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="tone(budget.level)" x-cloak>{{ budget.level }}</span><span class="pill" @show="budget.dryRun" x-cloak>dry run</span><b x-cloak>{{ budget.name }}</b><code x-cloak>{{ budget.period }}</code></div><p class="note" x-cloak>{{ money(budget.spentCents) }} of {{ money(budget.limitCents) }} · {{ pct(budget.usedPercent) }} used · {{ money(budget.remainingCents) }} remaining</p><progress :value="Math.min(100,budget.usedPercent||0)" max="100"></progress><p class="note" :class="trusted(budget)?'':'muted'" x-cloak> Projected {{ money(budget.projectedCents) }} ({{ pct(budget.projectedPercent) }}) at {{ pct((budget.projectionConfidence||0)*100) }} confidence. <template :if="!trusted(budget)" x-cloak><span> Too early in the period to act on this forecast.</span></template><template :if="budget.timeToCap" x-cloak><span x-cloak> Reaches the cap in {{ budget.timeToCap }}.</span></template></p><div class="actions" @show="!!budget.activeActions?.length" x-cloak><span class="bad pill" x-cloak>enforcing {{ budget.activeActions.join(', ') }}</span></div></article></template><div class="empty panel" @show="!(report()?.budgets||[]).length" x-cloak><strong>No budgets</strong><span>Usage is metered regardless, but nothing is capped. Create a budget to get warnings and, if you want them, hard caps.</span></div></div><h2>Usage by meter</h2><div class="panel table-wrap"><table><thead><tr><th scope="col">Meter</th><th scope="col">Provider</th><th scope="col">Quantity</th><th scope="col">Cost</th></tr></thead><tbody><template :for="row in (report()?.byMeter||[])"><tr><td x-cloak>{{ row.meter }}</td><td x-cloak>{{ row.provider||'—' }}</td><td x-cloak>{{ row.quantity.toLocaleString(undefined,{maximumFractionDigits:3}) }}</td><td x-cloak>{{ money(row.costCents) }}</td></tr></template></tbody></table><div class="empty" @show="!(report()?.byMeter||[]).length" x-cloak><strong>No metered usage yet</strong><span>Usage rolls up hourly. A freshly deployed project shows nothing until its first full hour.</span></div></div></section><section @show="tab()==='budgets'" class="split" x-cloak><div x-cloak><template :for="item in budgets()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="item.enabled?'ok':'warn'" x-cloak>{{ item.enabled?'enabled':'disabled' }}</span><span class="pill" @show="item.dryRun" x-cloak>dry run</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ scopeOf(item) }} · {{ item.period }} · {{ item.timezone }}</code></div><p class="note" x-cloak>Soft {{ money(item.softLimitCents,item.currency) }} · hard {{ money(item.hardLimitCents,item.currency) }} · grace {{ item.graceSeconds }}s · hysteresis {{ item.hysteresisPercent }}%</p><p class="note" x-cloak>Ladder: <template :for="threshold in item.thresholds"><span class="pill" x-cloak>{{ threshold.atPercent }}%{{ threshold.onProjection?' (forecast)':'' }} → {{ threshold.actions.join('+') }}</span></template></p><div class="actions" x-cloak><button class="btn ghost sm" :disabled="busy()" @click="patchBudget(item.id,{dryRun:!item.dryRun})" x-cloak>{{ item.dryRun?'Start enforcing':'Return to dry run' }}</button><button class="btn ghost sm" :disabled="busy()" @click="patchBudget(item.id,{enabled:!item.enabled})" x-cloak>{{ item.enabled?'Disable':'Enable' }}</button><button class="btn danger ghost sm" :disabled="busy()" @click="removeBudget(item.id,item.name)">Delete</button></div></article></template><div class="empty panel" @show="!budgets().length" x-cloak><strong>No budgets configured</strong><span>Nothing is capping this project.</span></div></div><form class="editor panel" @submit="createBudget($event)"><h2>New budget</h2><label>Name<input name="name" required placeholder="Production monthly"></label><label>Scope<select name="scope"><option value="project">This project</option><option value="environment">This environment</option><option value="organization">Whole organization</option></select></label><label>Period<select name="period"><option value="monthly">Monthly</option><option value="weekly">Weekly</option><option value="daily">Daily</option></select></label><label>Timezone<input name="timezone" value="UTC" placeholder="America/Los_Angeles"></label><label>Soft limit (warn only, dollars)<input name="soft" type="number" step="0.01" min="0"></label><label>Hard limit (enforces, dollars)<input name="hard" type="number" step="0.01" min="0"></label><label>Grace seconds<input name="graceSeconds" type="number" min="0" value="300"></label><label class="checkbox"><input name="dryRun" type="checkbox" checked> Dry run — evaluate and report, enforce nothing</label><button class="btn" type="submit" :disabled="busy()">Create budget</button><p class="note">New budgets start in dry run. Watch one for a full period before letting it enforce: the first thing enforcement does is stop your deployments.</p></form></section><section @show="tab()==='enforcement'" x-cloak><div class="header-actions"><button class="btn ghost sm" :disabled="busy()" @click="runCheck(false)">Preview a cycle</button><button class="btn sm" :disabled="busy()" @click="runCheck(true)">Run and apply</button></div><div class="panel table-wrap"><table><thead><tr><th scope="col">Action</th><th scope="col">Scope</th><th scope="col">Mode</th><th scope="col">Since</th><th scope="col">Reason</th><th scope="col"></th></tr></thead><tbody><template :for="item in enforcement()"><tr><td x-cloak><span class="pill" :class="item.simulated?'warn':'bad'" x-cloak>{{ item.action }}</span></td><td x-cloak>{{ scopeOf(item) }}</td><td x-cloak>{{ item.simulated?'dry run':'enforcing' }}</td><td x-cloak>{{ when(item.appliedAt) }}</td><td x-cloak>{{ item.reason }}</td><td><button class="btn ghost sm" :disabled="busy()" @click="release(item.budgetId,item.action)">Lift</button></td></tr></template></tbody></table><div class="empty" @show="!enforcement().length" x-cloak><strong>Nothing is being enforced</strong><span>Builds, deployments, and traffic are unrestricted by spend.</span></div></div><p class="note">Lifting an action is a stopgap. The next spend cycle re-applies it unless the underlying spend falls back below the threshold, or the budget is raised, disabled, or deleted.</p></section><section @show="tab()==='anomalies'" x-cloak><div class="cards-list" x-cloak><template :for="item in anomalies()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="severityTone(item.severity)" x-cloak>{{ item.severity }}</span><span class="pill" x-cloak>{{ item.direction }}</span><b x-cloak>{{ item.signal }}</b><code x-cloak>{{ when(item.bucketStart) }}</code></div><p class="note" x-cloak>Observed {{ money(item.observed) }} against an expected {{ money(item.expected) }} for this hour · score {{ item.score.toFixed(1) }}</p><p class="muted note">The baseline is the median of the same hour on previous days, so a normal daily peak is not an anomaly.</p><div class="actions"><button class="btn ghost sm" @show="!item.acknowledgedAt" :disabled="busy()" @click="acknowledge(item.id)" x-cloak>Acknowledge</button><span class="note" @show="!!item.acknowledgedAt" x-cloak>Acknowledged {{ when(item.acknowledgedAt) }}</span></div></article></template><div class="empty panel" @show="!anomalies().length" x-cloak><strong>No anomalies detected</strong><span>Detection needs several days of history before it reports anything, so a new project stays quiet at first.</span></div></div></section></main></body></html>
@@ -1,56 +1,56 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt7l77jbzlapbv"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Workloads</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
2
- function __stx_setup_1787597170334_10() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt7lgvq3gjbx1h"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Workloads</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
2
+ function __stx_setup_1787597622104_15() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
- var age = undefined;
6
- var bytes = undefined;
7
- var capability = undefined;
8
- var chooseUpload = undefined;
9
- var close = undefined;
10
- var columns = undefined;
11
- var connectStream = undefined;
12
- var disconnectStream = undefined;
13
- var eventStream = undefined;
14
- var execCommand = undefined;
15
- var fileBusy = undefined;
16
- var filePath = undefined;
17
- var fileRequest = undefined;
18
- var inventory = undefined;
19
- var lastUpdatedAt = undefined;
20
- var load = undefined;
21
- var logs = undefined;
22
- var logsBusy = undefined;
23
- var message = undefined;
24
- var open = undefined;
25
- var operationBusy = undefined;
26
- var params = undefined;
27
- var pollingError = undefined;
28
- var pollingLabel = undefined;
29
- var pollingState = undefined;
30
- var provider = undefined;
31
- var query = undefined;
32
- var readLogs = undefined;
33
- var refresh = undefined;
34
- var replicaLabel = undefined;
35
- var replicas = undefined;
36
- var run = undefined;
37
- var selected = undefined;
38
- var selectedId = undefined;
39
- var serviceFilter = undefined;
40
- var setFilter = undefined;
41
- var sources = undefined;
42
- var startExec = undefined;
43
- var startLogFollow = undefined;
44
- var status = undefined;
45
- var stopStream = undefined;
46
- var streamSession = undefined;
47
- var streamState = undefined;
48
- var syncUrl = undefined;
49
- var tone = undefined;
50
- var typed = undefined;
51
- var uploadBase64 = undefined;
52
- var uploadName = undefined;
53
5
  var visible = undefined;
6
+ var uploadName = undefined;
7
+ var uploadBase64 = undefined;
8
+ var typed = undefined;
9
+ var tone = undefined;
10
+ var syncUrl = undefined;
11
+ var streamState = undefined;
12
+ var streamSession = undefined;
13
+ var stopStream = undefined;
14
+ var status = undefined;
15
+ var startLogFollow = undefined;
16
+ var startExec = undefined;
17
+ var sources = undefined;
18
+ var setFilter = undefined;
19
+ var serviceFilter = undefined;
20
+ var selectedId = undefined;
21
+ var selected = undefined;
22
+ var run = undefined;
23
+ var replicas = undefined;
24
+ var replicaLabel = undefined;
25
+ var refresh = undefined;
26
+ var readLogs = undefined;
27
+ var query = undefined;
28
+ var provider = undefined;
29
+ var pollingState = undefined;
30
+ var pollingLabel = undefined;
31
+ var pollingError = undefined;
32
+ var params = undefined;
33
+ var operationBusy = undefined;
34
+ var open = undefined;
35
+ var message = undefined;
36
+ var logsBusy = undefined;
37
+ var logs = undefined;
38
+ var load = undefined;
39
+ var lastUpdatedAt = undefined;
40
+ var inventory = undefined;
41
+ var fileRequest = undefined;
42
+ var filePath = undefined;
43
+ var fileBusy = undefined;
44
+ var execCommand = undefined;
45
+ var eventStream = undefined;
46
+ var disconnectStream = undefined;
47
+ var connectStream = undefined;
48
+ var columns = undefined;
49
+ var close = undefined;
50
+ var chooseUpload = undefined;
51
+ var capability = undefined;
52
+ var bytes = undefined;
53
+ var age = undefined;
54
54
  var __stxBundle_cc737a64e01f = (function() {
55
55
 
56
56
  function servedWithoutApi(error) {
@@ -356,62 +356,62 @@ async function fileRequest(action) {
356
356
  fileBusy.set(false);
357
357
  }
358
358
  }
359
- return { "age": age, "bytes": bytes, "capability": capability, "chooseUpload": chooseUpload, "close": close, "columns": columns, "connectStream": connectStream, "disconnectStream": disconnectStream, "eventStream": eventStream, "execCommand": execCommand, "fileBusy": fileBusy, "filePath": filePath, "fileRequest": fileRequest, "inventory": inventory, "lastUpdatedAt": lastUpdatedAt, "load": load, "logs": logs, "logsBusy": logsBusy, "message": message, "open": open, "operationBusy": operationBusy, "params": params, "pollingError": pollingError, "pollingLabel": pollingLabel, "pollingState": pollingState, "provider": provider, "query": query, "readLogs": readLogs, "refresh": refresh, "replicaLabel": replicaLabel, "replicas": replicas, "run": run, "selected": selected, "selectedId": selectedId, "serviceFilter": serviceFilter, "setFilter": setFilter, "sources": sources, "startExec": startExec, "startLogFollow": startLogFollow, "status": status, "stopStream": stopStream, "streamSession": streamSession, "streamState": streamState, "syncUrl": syncUrl, "tone": tone, "typed": typed, "uploadBase64": uploadBase64, "uploadName": uploadName, "visible": visible };
359
+ return { "visible": visible, "uploadName": uploadName, "uploadBase64": uploadBase64, "typed": typed, "tone": tone, "syncUrl": syncUrl, "streamState": streamState, "streamSession": streamSession, "stopStream": stopStream, "status": status, "startLogFollow": startLogFollow, "startExec": startExec, "sources": sources, "setFilter": setFilter, "serviceFilter": serviceFilter, "selectedId": selectedId, "selected": selected, "run": run, "replicas": replicas, "replicaLabel": replicaLabel, "refresh": refresh, "readLogs": readLogs, "query": query, "provider": provider, "pollingState": pollingState, "pollingLabel": pollingLabel, "pollingError": pollingError, "params": params, "operationBusy": operationBusy, "open": open, "message": message, "logsBusy": logsBusy, "logs": logs, "load": load, "lastUpdatedAt": lastUpdatedAt, "inventory": inventory, "fileRequest": fileRequest, "filePath": filePath, "fileBusy": fileBusy, "execCommand": execCommand, "eventStream": eventStream, "disconnectStream": disconnectStream, "connectStream": connectStream, "columns": columns, "close": close, "chooseUpload": chooseUpload, "capability": capability, "bytes": bytes, "age": age };
360
360
  })();
361
- age = __stxBundle_cc737a64e01f["age"];
362
- bytes = __stxBundle_cc737a64e01f["bytes"];
363
- capability = __stxBundle_cc737a64e01f["capability"];
364
- chooseUpload = __stxBundle_cc737a64e01f["chooseUpload"];
365
- close = __stxBundle_cc737a64e01f["close"];
366
- columns = __stxBundle_cc737a64e01f["columns"];
367
- connectStream = __stxBundle_cc737a64e01f["connectStream"];
368
- disconnectStream = __stxBundle_cc737a64e01f["disconnectStream"];
369
- eventStream = __stxBundle_cc737a64e01f["eventStream"];
370
- execCommand = __stxBundle_cc737a64e01f["execCommand"];
371
- fileBusy = __stxBundle_cc737a64e01f["fileBusy"];
372
- filePath = __stxBundle_cc737a64e01f["filePath"];
373
- fileRequest = __stxBundle_cc737a64e01f["fileRequest"];
374
- inventory = __stxBundle_cc737a64e01f["inventory"];
375
- lastUpdatedAt = __stxBundle_cc737a64e01f["lastUpdatedAt"];
376
- load = __stxBundle_cc737a64e01f["load"];
377
- logs = __stxBundle_cc737a64e01f["logs"];
378
- logsBusy = __stxBundle_cc737a64e01f["logsBusy"];
379
- message = __stxBundle_cc737a64e01f["message"];
380
- open = __stxBundle_cc737a64e01f["open"];
381
- operationBusy = __stxBundle_cc737a64e01f["operationBusy"];
382
- params = __stxBundle_cc737a64e01f["params"];
383
- pollingError = __stxBundle_cc737a64e01f["pollingError"];
384
- pollingLabel = __stxBundle_cc737a64e01f["pollingLabel"];
385
- pollingState = __stxBundle_cc737a64e01f["pollingState"];
386
- provider = __stxBundle_cc737a64e01f["provider"];
387
- query = __stxBundle_cc737a64e01f["query"];
388
- readLogs = __stxBundle_cc737a64e01f["readLogs"];
389
- refresh = __stxBundle_cc737a64e01f["refresh"];
390
- replicaLabel = __stxBundle_cc737a64e01f["replicaLabel"];
391
- replicas = __stxBundle_cc737a64e01f["replicas"];
392
- run = __stxBundle_cc737a64e01f["run"];
393
- selected = __stxBundle_cc737a64e01f["selected"];
394
- selectedId = __stxBundle_cc737a64e01f["selectedId"];
395
- serviceFilter = __stxBundle_cc737a64e01f["serviceFilter"];
396
- setFilter = __stxBundle_cc737a64e01f["setFilter"];
397
- sources = __stxBundle_cc737a64e01f["sources"];
398
- startExec = __stxBundle_cc737a64e01f["startExec"];
399
- startLogFollow = __stxBundle_cc737a64e01f["startLogFollow"];
400
- status = __stxBundle_cc737a64e01f["status"];
401
- stopStream = __stxBundle_cc737a64e01f["stopStream"];
402
- streamSession = __stxBundle_cc737a64e01f["streamSession"];
403
- streamState = __stxBundle_cc737a64e01f["streamState"];
404
- syncUrl = __stxBundle_cc737a64e01f["syncUrl"];
405
- tone = __stxBundle_cc737a64e01f["tone"];
406
- typed = __stxBundle_cc737a64e01f["typed"];
407
- uploadBase64 = __stxBundle_cc737a64e01f["uploadBase64"];
408
- uploadName = __stxBundle_cc737a64e01f["uploadName"];
409
361
  visible = __stxBundle_cc737a64e01f["visible"];
410
- return { age, bytes, capability, chooseUpload, close, columns, connectStream, disconnectStream, eventStream, execCommand, fileBusy, filePath, fileRequest, inventory, lastUpdatedAt, load, logs, logsBusy, message, open, operationBusy, params, pollingError, pollingLabel, pollingState, provider, query, readLogs, refresh, replicaLabel, replicas, run, selected, selectedId, serviceFilter, setFilter, sources, startExec, startLogFollow, status, stopStream, streamSession, streamState, syncUrl, tone, typed, uploadBase64, uploadName, visible, __stxBundle_cc737a64e01f };
362
+ uploadName = __stxBundle_cc737a64e01f["uploadName"];
363
+ uploadBase64 = __stxBundle_cc737a64e01f["uploadBase64"];
364
+ typed = __stxBundle_cc737a64e01f["typed"];
365
+ tone = __stxBundle_cc737a64e01f["tone"];
366
+ syncUrl = __stxBundle_cc737a64e01f["syncUrl"];
367
+ streamState = __stxBundle_cc737a64e01f["streamState"];
368
+ streamSession = __stxBundle_cc737a64e01f["streamSession"];
369
+ stopStream = __stxBundle_cc737a64e01f["stopStream"];
370
+ status = __stxBundle_cc737a64e01f["status"];
371
+ startLogFollow = __stxBundle_cc737a64e01f["startLogFollow"];
372
+ startExec = __stxBundle_cc737a64e01f["startExec"];
373
+ sources = __stxBundle_cc737a64e01f["sources"];
374
+ setFilter = __stxBundle_cc737a64e01f["setFilter"];
375
+ serviceFilter = __stxBundle_cc737a64e01f["serviceFilter"];
376
+ selectedId = __stxBundle_cc737a64e01f["selectedId"];
377
+ selected = __stxBundle_cc737a64e01f["selected"];
378
+ run = __stxBundle_cc737a64e01f["run"];
379
+ replicas = __stxBundle_cc737a64e01f["replicas"];
380
+ replicaLabel = __stxBundle_cc737a64e01f["replicaLabel"];
381
+ refresh = __stxBundle_cc737a64e01f["refresh"];
382
+ readLogs = __stxBundle_cc737a64e01f["readLogs"];
383
+ query = __stxBundle_cc737a64e01f["query"];
384
+ provider = __stxBundle_cc737a64e01f["provider"];
385
+ pollingState = __stxBundle_cc737a64e01f["pollingState"];
386
+ pollingLabel = __stxBundle_cc737a64e01f["pollingLabel"];
387
+ pollingError = __stxBundle_cc737a64e01f["pollingError"];
388
+ params = __stxBundle_cc737a64e01f["params"];
389
+ operationBusy = __stxBundle_cc737a64e01f["operationBusy"];
390
+ open = __stxBundle_cc737a64e01f["open"];
391
+ message = __stxBundle_cc737a64e01f["message"];
392
+ logsBusy = __stxBundle_cc737a64e01f["logsBusy"];
393
+ logs = __stxBundle_cc737a64e01f["logs"];
394
+ load = __stxBundle_cc737a64e01f["load"];
395
+ lastUpdatedAt = __stxBundle_cc737a64e01f["lastUpdatedAt"];
396
+ inventory = __stxBundle_cc737a64e01f["inventory"];
397
+ fileRequest = __stxBundle_cc737a64e01f["fileRequest"];
398
+ filePath = __stxBundle_cc737a64e01f["filePath"];
399
+ fileBusy = __stxBundle_cc737a64e01f["fileBusy"];
400
+ execCommand = __stxBundle_cc737a64e01f["execCommand"];
401
+ eventStream = __stxBundle_cc737a64e01f["eventStream"];
402
+ disconnectStream = __stxBundle_cc737a64e01f["disconnectStream"];
403
+ connectStream = __stxBundle_cc737a64e01f["connectStream"];
404
+ columns = __stxBundle_cc737a64e01f["columns"];
405
+ close = __stxBundle_cc737a64e01f["close"];
406
+ chooseUpload = __stxBundle_cc737a64e01f["chooseUpload"];
407
+ capability = __stxBundle_cc737a64e01f["capability"];
408
+ bytes = __stxBundle_cc737a64e01f["bytes"];
409
+ age = __stxBundle_cc737a64e01f["age"];
410
+ return { visible, uploadName, uploadBase64, typed, tone, syncUrl, streamState, streamSession, stopStream, status, startLogFollow, startExec, sources, setFilter, serviceFilter, selectedId, selected, run, replicas, replicaLabel, refresh, readLogs, query, provider, pollingState, pollingLabel, pollingError, params, operationBusy, open, message, logsBusy, logs, load, lastUpdatedAt, inventory, fileRequest, filePath, fileBusy, execCommand, eventStream, disconnectStream, connectStream, columns, close, chooseUpload, capability, bytes, age, __stxBundle_cc737a64e01f };
411
411
  }
412
- window.__stx_latestSetup=__stx_setup_1787597170334_10;
413
- if(window.stx)window.stx._latestSetup=__stx_setup_1787597170334_10;
414
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787597170334_10"><a data-stx-scope="stx_scope_nav_14" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="active" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
412
+ window.__stx_latestSetup=__stx_setup_1787597622104_15;
413
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787597622104_15;
414
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787597622104_15"><a data-stx-scope="stx_scope_nav_19" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="active" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
415
415
  (function() {
416
416
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
417
417
  var __destroyHooks = [];
@@ -762,6 +762,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787597170334_10;
762
762
 
763
763
 
764
764
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
765
- window.stx._scopes['stx_scope_nav_14'] = __scopeRegistration;
765
+ window.stx._scopes['stx_scope_nav_19'] = __scopeRegistration;
766
766
  })();
767
767
  </script> <main class="workload-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Workloads</div><header class="page"><div><h1>Workloads</h1><p>One live inventory for services, containers, tasks, and functions—with explicit provider capabilities and release context.</p></div><div class="freshness" x-cloak><span class="pill" :class="pollingState() === 'live' ? 'ok' : 'warn'" x-cloak>{{ pollingLabel() }}</span><small x-cloak>{{ lastUpdatedAt() ? lastUpdatedAt().toLocaleTimeString() : 'connecting' }}</small><button class="btn ghost sm" type="button" @click="refresh()">Refresh</button></div></header><div class="bad notice" role="status" @show="!!pollingError()" x-cloak>{{ pollingError() }}</div><section class="source-strip" aria-label="Runtime discovery sources" x-cloak><template :for="item in sources()"><span :class="item.status === 'fresh' ? 'fresh' : 'degraded'" x-cloak><b x-cloak>{{ item.id }}</b> {{ item.status }} · {{ item.itemCount }}<small @show="!!item.message" x-cloak>{{ item.message }}</small></span></template></section><section class="panel workload-toolbar"><label class="search-label">Search<input type="search" placeholder="Name, ID, image, tag…" :value="query()" @input="setFilter(query, $event.target.value)"></label><label>Provider<select :value="provider()" @change="setFilter(provider, $event.target.value)"><option value="">All</option><option value="systemd">systemd</option><option value="docker">docker</option><option value="ecs">ecs</option><option value="lambda">lambda</option></select></label><label>Status<select :value="status()" @change="setFilter(status, $event.target.value)"><option value="">All</option><option value="running">running</option><option value="starting">starting</option><option value="degraded">degraded</option><option value="stopping">stopping</option><option value="stopped">stopped</option><option value="failed">failed</option><option value="unknown">unknown</option></select></label><details><summary>Columns</summary><div class="column-menu"><label><input type="checkbox" :checked="columns().replicas" @change="columns.set({...columns(), replicas: $event.target.checked})">Replicas</label><label><input type="checkbox" :checked="columns().image" @change="columns.set({...columns(), image: $event.target.checked})">Image/runtime</label><label><input type="checkbox" :checked="columns().resources" @change="columns.set({...columns(), resources: $event.target.checked})">Resources</label><label><input type="checkbox" :checked="columns().age" @change="columns.set({...columns(), age: $event.target.checked})">Age</label></div></details><button class="btn ghost sm" type="button" @show="!!serviceFilter()" @click="setFilter(serviceFilter, '')" x-cloak>Clear service: {{ serviceFilter() }}</button></section><div class="workload-layout" :class="{ inspecting: !!selected() }"><section class="panel workload-list"><div class="workload-table-wrap"><table class="workload-table"><thead><tr><th scope="col">Workload</th><th scope="col">Status</th><th scope="col">Provider</th><th scope="col" @show="columns().replicas" x-cloak>Replicas</th><th scope="col" @show="columns().image" x-cloak>Image / runtime</th><th scope="col" @show="columns().resources" x-cloak>Memory</th><th scope="col" @show="columns().age" x-cloak>Age</th></tr></thead><tbody><template :for="item in visible()"><tr class="workload-row" :class="{ selected: item.id === selectedId() }" tabindex="0" @click="open(item)" @keydown.enter="open(item)"><td x-cloak><b x-cloak>{{ item.displayName || item.name }}</b><small x-cloak>{{ item.links?.service || item.kind }} · {{ item.id }}</small></td><td x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><small x-cloak>{{ item.rawStatus || 'normalized' }}</small></td><td x-cloak><span class="tag" x-cloak>{{ item.provider }}</span><small x-cloak>{{ item.runtime || item.kind }}</small></td><td @show="columns().replicas" x-cloak>{{ replicaLabel(item) }}</td><td class="mono" @show="columns().image" x-cloak>{{ item.image || item.runtime || '—' }}</td><td @show="columns().resources" x-cloak>{{ bytes(item.resources?.memoryBytes || item.resources?.memoryLimitBytes) }}</td><td @show="columns().age" x-cloak>{{ age(item.ageSeconds) }}</td></tr></template></tbody></table></div><div class="empty" @show="pollingState() !== 'loading' && visible().length === 0" x-cloak><strong>No matching workloads</strong><span>Change the filters, or inspect degraded sources above for discovery guidance.</span></div></section><aside class="panel workload-detail" @show="!!selected()" x-cloak><button class="detail-close" type="button" aria-label="Close workload detail" @click="close()">×</button><template :if="selected()" x-cloak><div class="detail-content" x-cloak><span class="tag" x-cloak>{{ selected().provider }} · {{ selected().kind }}</span><h2 x-cloak>{{ selected().displayName || selected().name }}</h2><div class="detail-meta" x-cloak><span class="pill" :class="tone(selected().status)" x-cloak>{{ selected().status }}</span><span class="mono" x-cloak>{{ selected().id }}</span></div><nav class="context-links" aria-label="Related resources" x-cloak><a @show="!!selected().links?.service" :href="'/server/sites?service=' + encodeURIComponent(selected().links.service)" x-cloak>Service {{ selected().links?.service }}</a><a @show="!!selected().links?.release" :href="'/operations/releases?release=' + encodeURIComponent(selected().links.release)" x-cloak>Release {{ selected().links?.release }}</a><span @show="!!selected().links?.server" x-cloak>Server {{ selected().links?.server }}</span></nav><h3>Lifecycle</h3><div class="capability-grid"><button class="btn ghost sm" type="button" :disabled="operationBusy() || typed() !== selected().name || !capability(selected(), 'start').supported" :title="capability(selected(), 'start').supported ? `start ${selected().name}` : capability(selected(), 'start').reason" @click="run('start')">start</button><button class="btn danger sm" type="button" :disabled="operationBusy() || typed() !== selected().name || !capability(selected(), 'stop').supported" :title="capability(selected(), 'stop').supported ? `stop ${selected().name}` : capability(selected(), 'stop').reason" @click="run('stop')">stop</button><button class="btn ghost sm" type="button" :disabled="operationBusy() || typed() !== selected().name || !capability(selected(), 'restart').supported" :title="capability(selected(), 'restart').supported ? `restart ${selected().name}` : capability(selected(), 'restart').reason" @click="run('restart')">restart</button><button class="btn ghost sm" type="button" :disabled="operationBusy() || typed() !== selected().name || !capability(selected(), 'redeploy').supported" :title="capability(selected(), 'redeploy').supported ? `redeploy ${selected().name}` : capability(selected(), 'redeploy').reason" @click="run('redeploy')">redeploy</button><button class="btn ghost sm" type="button" :disabled="operationBusy() || typed() !== selected().name || !capability(selected(), 'scale').supported" :title="capability(selected(), 'scale').supported ? `scale ${selected().name}` : capability(selected(), 'scale').reason" @click="run('scale')">scale</button></div><div class="scale-row" @show="capability(selected(), 'scale').supported" x-cloak><label>Desired replicas<input type="number" min="0" max="10000" :value="replicas()" @input="replicas.set($event.target.value)"></label></div><label class="confirm-label" x-cloak>Type <b x-cloak>{{ selected().name }}</b> to run a mutation<input :value="typed()" @input="typed.set($event.target.value)" autocomplete="off"></label><p class="notice" role="status" @show="!!message()" x-cloak>{{ message() }}</p><details open><summary x-cloak>Replicas / processes ({{ selected().replicas?.length || 0 }})</summary><div class="detail-list" x-cloak><template :for="replica in selected().replicas || []"><div x-cloak><b x-cloak>{{ replica.name || replica.id }}</b><span x-cloak>{{ replica.status }} · PID {{ replica.pid || '—' }} · restarts {{ replica.restartCount || 0 }}</span></div></template><span @show="!(selected().replicas || []).length" x-cloak>Provider-managed or no active replica.</span></div></details><details><summary x-cloak>Networks ({{ selected().networks?.length || 0 }})</summary><pre x-cloak>{{ JSON.stringify(selected().networks || [], null, 2) }}</pre></details><details><summary x-cloak>Mounts ({{ selected().mounts?.length || 0 }})</summary><pre x-cloak>{{ JSON.stringify(selected().mounts || [], null, 2) }}</pre></details><details><summary>Redacted configuration</summary><pre x-cloak>{{ JSON.stringify(selected().config || {}, null, 2) }}</pre></details><details><summary>Provider capabilities</summary><div class="detail-list" x-cloak><template :for="entry in Object.entries(selected().capabilities || {})"><div x-cloak><b x-cloak>{{ entry[0] }}</b><span x-cloak>{{ entry[1].supported ? 'supported' : entry[1].reason }}</span></div></template></div></details><details @show="capability(selected(), 'exec').supported" x-cloak><summary>Elevated diagnostics and exec</summary><p class="note" x-cloak>Target: <b x-cloak>{{ selected().name }}</b> on {{ selected().links?.server || selected().provider }}. Presets are read-only; free-form access is container-only.</p><div class="capability-grid"><button class="btn ghost sm" type="button" :disabled="typed() !== selected().name || streamState() === 'live'" @click="startExec('process')">Process status</button><button class="btn ghost sm" type="button" :disabled="typed() !== selected().name || streamState() === 'live'" @click="startExec('sockets')">Listening sockets</button><button class="btn ghost sm" type="button" :disabled="typed() !== selected().name || streamState() === 'live'" @click="startExec('filesystem')">Filesystem usage</button></div><label class="confirm-label" @show="selected().provider === 'docker'" x-cloak>Container command<input :value="execCommand()" @input="execCommand.set($event.target.value)" placeholder="id"></label><button class="btn danger sm" type="button" @show="selected().provider === 'docker'" :disabled="typed() !== selected().name || !execCommand().trim() || streamState() === 'live'" @click="startExec('')" x-cloak>Run container command</button></details><details @show="capability(selected(), 'files').supported" x-cloak><summary>Scoped file transfer</summary><p class="note">Only service-owned roots and discovered mount targets are allowed. Transfers are capped at 48 KB and uploads replace files atomically with mode 0600.</p><label class="confirm-label">Absolute path<input :value="filePath()" @input="filePath.set($event.target.value)" placeholder="/var/www/project/service/file.txt"></label><label class="confirm-label">Upload file<input type="file" @change="chooseUpload($event)"></label><small @show="!!uploadName()" x-cloak>Ready: {{ uploadName() }}</small><div class="capability-grid"><button class="btn ghost sm" type="button" :disabled="typed() !== selected().name || !filePath() || fileBusy()" @click="fileRequest('read')">Download</button><button class="btn danger sm" type="button" :disabled="typed() !== selected().name || !filePath() || !uploadBase64() || fileBusy()" @click="fileRequest('write')">Upload and replace</button></div></details><div class="logs-head" x-cloak><h3 x-cloak>Logs <small x-cloak>{{ streamState() }}</small></h3><div class="capability-grid" x-cloak><button class="btn ghost sm" type="button" :disabled="logsBusy() || !capability(selected(), 'logs').supported" :title="capability(selected(), 'logs').reason || ''" @click="readLogs()" x-cloak>{{ logsBusy() ? 'Loading…' : 'Load logs' }}</button><button class="btn ghost sm" type="button" :disabled="streamState() === 'live' || !capability(selected(), 'logs').supported" @click="startLogFollow()">Follow</button><button class="btn danger sm" type="button" :disabled="!streamSession()" @click="stopStream()">Close stream</button></div></div><div class="logs" aria-live="polite" x-cloak><template :for="line in logs()"><div :class="line.stream === 'stderr' ? 'bad' : ''" x-cloak><span class="ts" x-cloak>{{ line.timestamp || '—' }}</span> {{ line.message }}</div></template><span @show="!logs().length" x-cloak>No log lines loaded.</span></div></div></template></aside></div></main><style> .workload-wrap{max-width:1540px}.freshness{display:flex;gap:8px;align-items:center;color:var(--txt3)}.source-strip{display:flex;gap:8px;overflow:auto;margin-bottom:12px}.source-strip>span{display:grid;min-width:max-content;padding:8px 10px;border:1px solid var(--line);border-radius:9px;color:var(--txt3);font-size:11px}.source-strip .fresh{border-color:color-mix(in srgb,var(--ok) 30%,var(--line))}.source-strip .degraded{border-color:color-mix(in srgb,var(--bad) 35%,var(--line))}.source-strip small{max-width:360px;white-space:normal;margin-top:3px}.workload-toolbar{display:flex;align-items:end;gap:10px;margin-bottom:14px;padding:14px}.workload-toolbar>label{display:grid;gap:5px;color:var(--txt3);font-size:11px}.workload-toolbar input,.workload-toolbar select,.confirm-label input,.scale-row input{background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:8px 10px}.search-label{flex:1;min-width:230px}.column-menu{position:absolute;z-index:5;display:grid;gap:8px;margin-top:6px;padding:12px;background:var(--panel);border:1px solid var(--line);border-radius:9px}.workload-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:14px}.workload-layout.inspecting{grid-template-columns:minmax(650px,1.5fr) minmax(360px,.7fr)}.workload-list{padding:0;overflow:hidden}.workload-table-wrap{overflow:auto}.workload-table{min-width:900px}.workload-row{cursor:pointer}.workload-row.selected{background:color-mix(in srgb,var(--accent) 9%,transparent)}.workload-row td small{display:block;max-width:330px;margin-top:4px;color:var(--txt3);font-size:10px;overflow:hidden;text-overflow:ellipsis}.workload-detail{position:sticky;top:14px;align-self:start;max-height:calc(100vh - 28px);overflow:auto;padding:20px}.detail-close{float:right;border:0;background:transparent;color:var(--txt3);font-size:24px;cursor:pointer}.detail-meta,.context-links,.capability-grid,.logs-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.detail-meta .mono{font-size:10px;color:var(--txt3);overflow-wrap:anywhere}.context-links{margin:12px 0}.context-links>*{font-size:11px}.capability-grid{margin:8px 0}.confirm-label,.scale-row label{display:grid;gap:6px;margin:12px 0;color:var(--txt3);font-size:11px}.workload-detail details{border-top:1px solid var(--line);padding:12px 0}.workload-detail summary{cursor:pointer;font-weight:700}.workload-detail pre{max-height:260px;overflow:auto;margin-top:10px;background:#090c12;padding:10px;border-radius:8px;font-size:10px;white-space:pre-wrap}.detail-list{display:grid;gap:8px;margin-top:10px}.detail-list>div{display:grid;gap:2px}.detail-list span{color:var(--txt3);font-size:11px}.logs-head{justify-content:space-between}.logs{min-height:80px}.notice{padding:9px 10px} @media(max-width:1100px){.workload-layout.inspecting{grid-template-columns:1fr}.workload-detail{position:static;max-height:none}} @media(max-width:700px){.source-strip{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:visible}.source-strip>span{min-width:0;overflow-wrap:anywhere}.workload-toolbar{align-items:stretch;flex-direction:column}.workload-toolbar>*{width:100%}.workload-table{min-width:0}.workload-table thead{display:none}.workload-table tbody,.workload-row{display:block}.workload-row{padding:12px}.workload-row td{display:grid;grid-template-columns:100px 1fr;padding:5px 0;border:0}.workload-row td:before{color:var(--txt3);font-size:10px}.workload-row td:nth-child(1):before{content:'Workload'}.workload-row td:nth-child(2):before{content:'Status'}.workload-row td:nth-child(3):before{content:'Provider'}.workload-row td:nth-child(4):before{content:'Replicas'}.workload-row td:nth-child(5):before{content:'Image'}.workload-row td:nth-child(6):before{content:'Memory'}.workload-row td:nth-child(7):before{content:'Age'}} </style></body></html>