@stacksjs/ts-cloud 0.12.15 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/{chunk-9e22a51n.js → chunk-22c3pk8s.js} +78 -78
  3. package/dist/bin/chunk-2synp9gh.js +1 -0
  4. package/dist/bin/{chunk-ejqhbj1h.js → chunk-2v0qm547.js} +1 -1
  5. package/dist/bin/chunk-4qzpqmhe.js +1 -0
  6. package/dist/bin/chunk-5n3ejway.js +1 -0
  7. package/dist/bin/{chunk-ynr22ma8.js → chunk-7jwxgxxf.js} +1 -1
  8. package/dist/bin/{chunk-gd4w6bht.js → chunk-8bbw6qc2.js} +1 -1
  9. package/dist/bin/{chunk-7a7n6p2m.js → chunk-9jmnmhpy.js} +1 -1
  10. package/dist/bin/{chunk-pt2bz3kr.js → chunk-9qndhwbe.js} +1 -1
  11. package/dist/bin/chunk-9yra64dd.js +1 -0
  12. package/dist/bin/{chunk-ng0949x3.js → chunk-b48j6k55.js} +1 -1
  13. package/dist/bin/{chunk-r1w08y38.js → chunk-bdgkeqv6.js} +1 -1
  14. package/dist/bin/chunk-c82rh7qe.js +1 -0
  15. package/dist/bin/{chunk-zzsdhhmb.js → chunk-d4bb9qg9.js} +1 -1
  16. package/dist/bin/{chunk-pcyywgx7.js → chunk-d6kqbp8q.js} +1 -1
  17. package/dist/bin/{chunk-swete552.js → chunk-dk38j1qr.js} +9 -9
  18. package/dist/bin/{chunk-x42gb7pq.js → chunk-e1cxh9rj.js} +2 -2
  19. package/dist/bin/{chunk-9k60q9qz.js → chunk-edaq5jef.js} +3 -3
  20. package/dist/bin/chunk-fbe5kk6w.js +1 -0
  21. package/dist/bin/{chunk-n7eq4t9a.js → chunk-fbycbnvj.js} +4 -4
  22. package/dist/bin/chunk-fj89173b.js +1 -0
  23. package/dist/bin/{chunk-8tbj9h2a.js → chunk-gxwsq3k0.js} +40 -40
  24. package/dist/bin/{chunk-kc2e193t.js → chunk-hwp5xp1c.js} +63 -63
  25. package/dist/bin/chunk-j3w462ep.js +1 -0
  26. package/dist/bin/chunk-k2zzny51.js +1 -0
  27. package/dist/bin/{chunk-80zkjpfz.js → chunk-k3er0h4j.js} +1 -1
  28. package/dist/bin/chunk-kjatss6s.js +1 -0
  29. package/dist/bin/{chunk-w5hzt11d.js → chunk-kxa4t4wh.js} +2 -2
  30. package/dist/bin/{chunk-raj6j2j5.js → chunk-m5sjzxm3.js} +1 -1
  31. package/dist/bin/{chunk-dhxwmkhz.js → chunk-mcqkjhgp.js} +1 -1
  32. package/dist/bin/{chunk-77qpn2m8.js → chunk-n56c0j1e.js} +4 -4
  33. package/dist/bin/chunk-ntahmgqg.js +1 -0
  34. package/dist/bin/{chunk-57w9nsjk.js → chunk-p197a99s.js} +1 -1
  35. package/dist/bin/{chunk-vymg9ywg.js → chunk-pd8v6bpd.js} +1 -1
  36. package/dist/bin/{chunk-yhxpmk29.js → chunk-pthfzst7.js} +1 -1
  37. package/dist/bin/{chunk-5tsxt28g.js → chunk-ptt8me4h.js} +2 -2
  38. package/dist/bin/{chunk-7xvm2ygt.js → chunk-qmqmnxmm.js} +3 -3
  39. package/dist/bin/{chunk-r1vtnn8w.js → chunk-rzt92fwv.js} +3 -3
  40. package/dist/bin/chunk-t1eft7s7.js +1 -0
  41. package/dist/bin/{chunk-49sthm4q.js → chunk-t7seq21w.js} +1 -1
  42. package/dist/bin/chunk-t8n2961n.js +1 -0
  43. package/dist/bin/{chunk-vesvsvdy.js → chunk-vwzgtsn9.js} +1 -1
  44. package/dist/bin/{chunk-s1j941z1.js → chunk-w0g72e50.js} +1 -1
  45. package/dist/bin/chunk-wb8y7zey.js +1 -0
  46. package/dist/bin/{chunk-n8cwx54p.js → chunk-x4gsw45d.js} +5 -5
  47. package/dist/bin/{chunk-yx1qgp1q.js → chunk-xs62dg7t.js} +2 -2
  48. package/dist/bin/chunk-xtp2zf3j.js +1 -0
  49. package/dist/bin/chunk-xvn07b0e.js +1 -0
  50. package/dist/bin/{chunk-sdwr2tnp.js → chunk-xw9vcdwt.js} +1 -1
  51. package/dist/bin/{chunk-4zbnwt9b.js → chunk-y1r1evt0.js} +1 -1
  52. package/dist/bin/{chunk-c51xp8f7.js → chunk-zs8bfer0.js} +1 -1
  53. package/dist/bin/cli.js +98 -98
  54. package/dist/bin/dashboard-server.js +1 -1
  55. package/dist/chunk-05qawkra.js +1 -0
  56. package/dist/{chunk-jb8em9ba.js → chunk-0g2jkhy5.js} +1 -1
  57. package/dist/chunk-1jx53q5e.js +1 -0
  58. package/dist/{chunk-30h9rgfn.js → chunk-2s65yj3g.js} +4 -4
  59. package/dist/{chunk-x07tpsv0.js → chunk-3k60wm30.js} +5 -5
  60. package/dist/chunk-3qtce4mm.js +1 -0
  61. package/dist/chunk-3tt5em2c.js +1 -0
  62. package/dist/{chunk-hw3p6pth.js → chunk-42kv07cs.js} +1 -1
  63. package/dist/{chunk-wjgnfg6q.js → chunk-65ajja2a.js} +1 -1
  64. package/dist/{chunk-yq3pdbz7.js → chunk-6gtqjsg9.js} +3 -3
  65. package/dist/{chunk-6g81m01r.js → chunk-8s9m8pyb.js} +1 -1
  66. package/dist/{chunk-gd9g0v9w.js → chunk-asmv4fw1.js} +19 -19
  67. package/dist/{chunk-83p688yv.js → chunk-ds92qg3g.js} +4 -4
  68. package/dist/{chunk-6nvn041c.js → chunk-dzqz1sm0.js} +3 -3
  69. package/dist/{chunk-88nxsyry.js → chunk-hyj2ymp1.js} +6 -6
  70. package/dist/chunk-j4ed179k.js +2 -0
  71. package/dist/{chunk-g9mnmddy.js → chunk-m5r0dt28.js} +2 -2
  72. package/dist/{chunk-zftpjxkr.js → chunk-mcfdtg5w.js} +1 -1
  73. package/dist/{chunk-cy6qh4ea.js → chunk-ngdhqwf3.js} +3 -3
  74. package/dist/{chunk-6znnde1s.js → chunk-nhtz2k8d.js} +5 -5
  75. package/dist/{chunk-rbem58rx.js → chunk-nw0tvrrr.js} +1 -1
  76. package/dist/{chunk-hnkw6pde.js → chunk-p9fqsz06.js} +2 -2
  77. package/dist/{chunk-qzwack6w.js → chunk-r4dpn715.js} +7 -7
  78. package/dist/{chunk-678rwkz8.js → chunk-vk513ge7.js} +89 -89
  79. package/dist/{chunk-w495x89g.js → chunk-w5fmaaxa.js} +4 -4
  80. package/dist/chunk-wr7tn9j5.js +1 -0
  81. package/dist/{chunk-a6k322xc.js → chunk-xqx5szta.js} +30 -30
  82. package/dist/{chunk-jvqcw0b4.js → chunk-y13zcbnp.js} +101 -101
  83. package/dist/{chunk-2knc1zyy.js → chunk-ycs26jsj.js} +124 -124
  84. package/dist/{chunk-r5emv4x8.js → chunk-z7v4evbh.js} +2 -2
  85. package/dist/deploy/index.js +1 -1
  86. package/dist/dns/delegate-from-config.d.ts +50 -0
  87. package/dist/dns/delegate-from-config.test.d.ts +1 -0
  88. package/dist/dns/delegation.d.ts +110 -0
  89. package/dist/dns/delegation.test.d.ts +1 -0
  90. package/dist/dns/index.d.ts +4 -0
  91. package/dist/dns/index.js +1 -1
  92. package/dist/drivers/index.js +1 -1
  93. package/dist/drivers/shared/rpx-gateway.d.ts +17 -0
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.js +49 -49
  96. package/dist/operations/index.js +1 -1
  97. package/dist/protection/index.js +1 -1
  98. package/dist/spend/index.js +1 -1
  99. package/dist/ui/404.html +1 -1
  100. package/dist/ui/accept-invitation.html +1 -1
  101. package/dist/ui/access-denied.html +1 -1
  102. package/dist/ui/account/automation.html +5 -5
  103. package/dist/ui/account/security.html +2 -2
  104. package/dist/ui/applications/compose.html +5 -5
  105. package/dist/ui/applications/new.html +2 -2
  106. package/dist/ui/data/backups.html +6 -6
  107. package/dist/ui/data/services.html +6 -6
  108. package/dist/ui/data/volumes.html +6 -6
  109. package/dist/ui/index.html +5 -5
  110. package/dist/ui/infrastructure/topology.html +6 -6
  111. package/dist/ui/integrations.html +1 -1
  112. package/dist/ui/operations/alerts.html +5 -5
  113. package/dist/ui/operations/configuration.html +6 -6
  114. package/dist/ui/operations/jobs.html +6 -6
  115. package/dist/ui/operations/maintenance.html +5 -5
  116. package/dist/ui/operations/observability.html +6 -6
  117. package/dist/ui/operations/previews.html +6 -6
  118. package/dist/ui/operations/queue.html +6 -6
  119. package/dist/ui/operations/regions.html +5 -5
  120. package/dist/ui/operations/releases.html +6 -6
  121. package/dist/ui/operations/spend.html +6 -6
  122. package/dist/ui/operations/workloads.html +6 -6
  123. package/dist/ui/security.html +2 -2
  124. package/dist/ui/server/actions.html +5 -5
  125. package/dist/ui/server/activity.html +1 -1
  126. package/dist/ui/server/capacity.html +6 -6
  127. package/dist/ui/server/database.html +5 -5
  128. package/dist/ui/server/deployments.html +5 -5
  129. package/dist/ui/server/diagnostics.html +2 -2
  130. package/dist/ui/server/firewall.html +6 -6
  131. package/dist/ui/server/fleet.html +6 -6
  132. package/dist/ui/server/logs.html +6 -6
  133. package/dist/ui/server/metrics.html +5 -5
  134. package/dist/ui/server/security.html +2 -2
  135. package/dist/ui/server/services.html +2 -2
  136. package/dist/ui/server/sites.html +6 -6
  137. package/dist/ui/server/ssh-keys.html +6 -6
  138. package/dist/ui/server/team.html +6 -6
  139. package/dist/ui/server/terminal.html +2 -2
  140. package/dist/ui/serverless/alarms.html +6 -6
  141. package/dist/ui/serverless/assets.html +2 -2
  142. package/dist/ui/serverless/cost.html +2 -2
  143. package/dist/ui/serverless/data.html +6 -6
  144. package/dist/ui/serverless/deployments.html +2 -2
  145. package/dist/ui/serverless/firewall.html +2 -2
  146. package/dist/ui/serverless/functions.html +6 -6
  147. package/dist/ui/serverless/logs.html +6 -6
  148. package/dist/ui/serverless/metrics.html +2 -2
  149. package/dist/ui/serverless/queues.html +5 -5
  150. package/dist/ui/serverless/secrets.html +6 -6
  151. package/dist/ui/serverless/traces.html +6 -6
  152. package/dist/ui/serverless.html +6 -6
  153. package/dist/ui-src/src/charts.ts +1 -1
  154. package/dist/ui-src/src/topology.ts +1 -1
  155. package/package.json +3 -3
  156. package/dist/bin/chunk-1s4dny8d.js +0 -1
  157. package/dist/bin/chunk-4w80w3sm.js +0 -1
  158. package/dist/bin/chunk-4yntpqbe.js +0 -1
  159. package/dist/bin/chunk-7x0hrna6.js +0 -1
  160. package/dist/bin/chunk-971tfc6m.js +0 -1
  161. package/dist/bin/chunk-dpw8x3sr.js +0 -1
  162. package/dist/bin/chunk-h785hw6a.js +0 -1
  163. package/dist/bin/chunk-jyggrdh2.js +0 -1
  164. package/dist/bin/chunk-q524s7cx.js +0 -1
  165. package/dist/bin/chunk-q9gpw6wv.js +0 -1
  166. package/dist/bin/chunk-r6cvc2pr.js +0 -1
  167. package/dist/bin/chunk-rh2sqtew.js +0 -1
  168. package/dist/bin/chunk-tkzpbb7n.js +0 -1
  169. package/dist/bin/chunk-v78r5tx0.js +0 -1
  170. package/dist/bin/chunk-v7f4c62s.js +0 -1
  171. package/dist/bin/chunk-vx649y7t.js +0 -1
  172. package/dist/chunk-6t9tjvpy.js +0 -2
  173. package/dist/chunk-9w32efae.js +0 -1
  174. package/dist/chunk-atny1wp9.js +0 -1
  175. package/dist/chunk-fdexq9e1.js +0 -1
  176. package/dist/chunk-hn2v0b0d.js +0 -1
  177. package/dist/chunk-v46b25w9.js +0 -1
  178. /package/dist/bin/{chunk-bckm6fre.js → chunk-pdw0qjq1.js} +0 -0
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtqnlau5axkwxv"><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.dbee66d1.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 - Infrastructure map</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_1788750043336_6() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv0widaztnzl6"><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.dbee66d1.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 - Infrastructure map</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_1789014266032_6() {
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
5
  var initialTopology = {"mode":"server","project":"sample-project","environment":"production","provider":"hetzner","region":"fsn1","generatedAt":"","layers":[{"index":0,"id":"clients","label":"Clients"},{"index":1,"id":"dns","label":"DNS & TLS"},{"index":2,"id":"edge","label":"Edge"},{"index":3,"id":"routing","label":"Routing"},{"index":4,"id":"apps","label":"Applications"},{"index":5,"id":"runtime","label":"Background runtime"},{"index":6,"id":"data","label":"Data services"},{"index":7,"id":"durability","label":"Durability"}],"groups":[{"id":"box","label":"sample-production-app","sub":"hetzner · fsn1"}],"nodes":[{"id":"internet","label":"Internet","kind":"internet","layer":0,"status":"ok","sub":"Public traffic","facts":[],"external":true},{"id":"dns","label":"example.com","kind":"dns","layer":1,"status":"ok","sub":"DNS & certificates","facts":[],"external":true},{"id":"firewall","label":"Host firewall","kind":"firewall","layer":2,"status":"ok","sub":"Inbound filtering","facts":[],"group":"box"},{"id":"proxy","label":"rpx-gateway","kind":"proxy","layer":3,"status":"ok","sub":"TLS termination & routing","facts":[],"group":"box"},{"id":"site:main","label":"main","kind":"site","layer":4,"status":"ok","sub":"bun","facts":[],"group":"box"},{"id":"site:docs","label":"docs","kind":"site","layer":4,"status":"ok","sub":"static/bun","facts":[],"group":"box"},{"id":"worker:default","label":"default","kind":"worker","layer":5,"status":"ok","sub":"2 processes","facts":[],"group":"box"},{"id":"data:redis","label":"Redis","kind":"cache","layer":6,"status":"ok","sub":"redis","facts":[],"group":"box"},{"id":"data:mysql","label":"MySQL","kind":"database","layer":6,"status":"ok","sub":"mysql","facts":[],"group":"box"},{"id":"backup","label":"Backups","kind":"backup","layer":7,"status":"ok","sub":"off-box","facts":[]}],"links":[{"source":"internet","target":"dns","flow":"request","label":"https"},{"source":"dns","target":"firewall","flow":"request","label":"443/80"},{"source":"firewall","target":"proxy","flow":"request"},{"source":"proxy","target":"site:main","flow":"request"},{"source":"proxy","target":"site:docs","flow":"request"},{"source":"site:main","target":"worker:default","flow":"async","label":"queue"},{"source":"site:main","target":"data:redis","flow":"data","label":"localhost"},{"source":"site:main","target":"data:mysql","flow":"data","label":"localhost"},{"source":"worker:default","target":"data:mysql","flow":"data","label":"localhost"},{"source":"data:mysql","target":"backup","flow":"backup","label":"snapshot"}],"notes":[]};
@@ -858,9 +858,9 @@ zoomBy = __stxBundle_aadcc1d88d59["zoomBy"];
858
858
  zoomTo = __stxBundle_aadcc1d88d59["zoomTo"];
859
859
  return { STAGE_H, STAGE_W, animate, atPointer, builtAtLabel, canvasScale, canvasTransform, clear, counts, dim, dragging, fit, fitScale, flows, focus, geo, groups, hoveredId, isSample, isSnapshot, labelledLinks, lanes, lastUpdatedAt, linkClasses, linkOff, linkOn, links, load, manageHref, model, nodeClasses, nodes, notes, onDown, onMove, onUp, onWheel, panX, panY, pollingError, pollingState, query, refresh, restatus, select, selected, selectedFacts, selectedId, selectedLinks, shapeOf, stageCrop, toggleFlow, visible, zoom, zoomBy, zoomTo, __stxBundle_aadcc1d88d59 };
860
860
  }
861
- window.__stx_latestSetup=__stx_setup_1788750043336_6;
862
- if(window.stx)window.stx._latestSetup=__stx_setup_1788750043336_6;
863
- </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_1788750043336_6"><a data-stx-scope="stx_scope_nav_7" 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="" 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="active" 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">
861
+ window.__stx_latestSetup=__stx_setup_1789014266032_6;
862
+ if(window.stx)window.stx._latestSetup=__stx_setup_1789014266032_6;
863
+ </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_1789014266032_6"><a data-stx-scope="stx_scope_nav_8" 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="" 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="active" 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">
864
864
  (function() {
865
865
  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;
866
866
  var __destroyHooks = [];
@@ -1211,6 +1211,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1788750043336_6;
1211
1211
 
1212
1212
 
1213
1213
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
1214
- window.stx._scopes['stx_scope_nav_7'] = __scopeRegistration;
1214
+ window.stx._scopes['stx_scope_nav_8'] = __scopeRegistration;
1215
1215
  })();
1216
1216
  </script> <main class="topo-wrap wrap" id="main-content"><div class="crumbs">Infrastructure <span class="sep">/</span> Map</div><header class="page"><div><h1>Infrastructure map</h1><p>Every resource this environment deploys, in the order a request meets them. Hover to trace a path, click to inspect.</p></div><div class="header-actions"><span class="pill warn" @show="isSample()" x-cloak>sample topology</span><span class="pill" :class="pollingState() === 'live' ? 'ok' : 'warn'" x-cloak>{{ pollingState() }}</span><small x-cloak>{{ isSnapshot() ? builtAtLabel() : lastUpdatedAt() ? lastUpdatedAt().toLocaleTimeString() : 'connecting' }}</small><button class="btn ghost sm" type="button" @show="!isSnapshot()" @click="refresh()" x-cloak>Refresh</button></div></header><p class="topo-notice bad" role="alert" @show="!!pollingError()" x-cloak>{{ pollingError() }}</p><p class="topo-notice" role="status" @show="isSample() && !pollingError()" x-cloak>Showing a representative topology until this deployment reports one.</p><p class="topo-notice" role="status" @show="isSnapshot() && !isSample()" x-cloak>This cockpit was exported without its control plane, so the map cannot refresh. It shows the infrastructure as it stood when the dashboard was built.</p><p class="topo-notice" :for="note in notes" x-cloak>{{ note }}</p><section class="topo-summary" aria-label="Topology summary" x-cloak><article class="panel" x-cloak><b x-cloak>{{ model().mode === 'serverless' ? 'Serverless' : 'Server' }}</b><small x-cloak>{{ model().provider }} · {{ model().region }}</small></article><article class="panel" x-cloak><b x-cloak>{{ geo().nodes.length }} resources</b><small x-cloak>{{ geo().lanes.length }} layers · {{ geo().links.length }} connections</small></article><article class="panel" x-cloak><b x-cloak>{{ counts().ok }} healthy</b><small x-cloak>{{ counts().warn }} attention · {{ counts().bad }} failing · {{ counts().idle }} idle</small></article><article class="panel" x-cloak><b x-cloak>{{ model().environment }}</b><small x-cloak>{{ model().project }}</small></article></section><section class="topo-controls panel" aria-label="Diagram controls"><label class="topo-search"><span class="sr-only">Filter resources</span><input type="search" placeholder="Filter resources (name, kind, value)" :value="query()" @input="query.set($event.target.value)"></label><div class="topo-flows" role="group" aria-label="Connection types"><button type="button" class="chip request" :class="flows().request ? '' : 'off'" @click="toggleFlow('request')">Requests</button><button type="button" class="async chip" :class="flows().async ? '' : 'off'" @click="toggleFlow('async')">Async</button><button type="button" class="chip data" :class="flows().data ? '' : 'off'" @click="toggleFlow('data')">Data</button><button type="button" class="backup chip" :class="flows().backup ? '' : 'off'" @click="toggleFlow('backup')">Backup</button></div><div class="topo-zoom" x-cloak><button class="btn ghost sm" type="button" @click="animate.set(!animate())" x-cloak>{{ animate() ? 'Pause flow' : 'Animate flow' }}</button><button class="btn ghost sm" type="button" aria-label="Zoom out" @click="zoomBy(1 / 1.2)">−</button><span class="topo-level" x-cloak>{{ Math.round(zoom() * 100) }}%</span><button class="btn ghost sm" type="button" aria-label="Zoom in" @click="zoomBy(1.2)">+</button><button class="btn ghost sm" type="button" @click="fit()">Fit</button><button class="btn ghost sm" type="button" @click="clear()">Reset</button></div></section><div class="topo-stage"><section class="topo-panel panel"><div class="topo-viewport" :style="'aspect-ratio: 1600 / ' + stageCrop()"><svg class="topo-canvas" viewBox="0 0 1600 1200" preserveAspectRatio="xMidYMin meet" role="img" aria-label="Infrastructure topology diagram" @wheel="onWheel($event)" @pointerdown="onDown($event)" @pointermove="onMove($event)" @pointerup="onUp()" @pointerleave="onUp()"><defs><marker id="topo-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="currentColor"></path></marker></defs><g class="topo-canvas-inner" :transform="canvasTransform()"><g class="topo-lanes"><g :for="lane in lanes"><rect class="topo-lane" :x="lane.x" :y="lane.y" :width="lane.width" :height="lane.height" rx="18"></rect><text class="topo-lane-label" :x="lane.x + lane.width / 2" :y="lane.y - 24" text-anchor="middle" :text="lane.label"></text><text class="topo-lane-count" :x="lane.x + lane.width / 2" :y="lane.y - 8" text-anchor="middle" :text="lane.count + (lane.count === 1 ? ' resource' : ' resources')"></text></g></g><g class="topo-groups"><g :for="group in groups"><rect class="topo-group" :x="group.x" :y="group.y" :width="group.width" :height="group.height" rx="20"></rect><text class="topo-group-label" :x="group.x + 16" :y="group.y + 22" :text="group.sub ? group.label + ' · ' + group.sub : group.label"></text></g></g><g class="topo-edges"><path :for="link in links" class="topo-link" :class="linkClasses(link)" :d="link.d" marker-end="url(#topo-arrow)"></path></g><g class="topo-edge-labels"><text :for="link in labelledLinks" class="topo-edge-label" :class="{ dim: linkOff(link) }" :x="link.labelX" :y="link.labelY" text-anchor="middle" :text="link.label"></text></g><g class="topo-nodes"><g :for="node in nodes" class="topo-node" :class="nodeClasses(node)" :transform="'translate(' + node.x + ',' + node.y + ')'" tabindex="0" role="button" :aria-label="node.label + ', ' + node.kind + ', ' + node.status" @pointerenter="hoveredId.set(node.id)" @pointerleave="hoveredId.set('')" @focus="hoveredId.set(node.id)" @blur="hoveredId.set('')" @click="select(node)" @keydown.enter="select(node)"><rect class="topo-box" :width="node.width" :height="node.height" rx="14"></rect><g class="topo-icon" transform="translate(15,20) scale(0.83)"><path :d="node.icon"></path></g><text class="topo-label" x="48" y="27" :text="node.label"></text><text class="topo-sub" x="48" y="45" :text="node.sub || node.kind"></text><circle class="topo-dot" :cx="node.width - 17" cy="20" r="4.5"></circle></g></g></g></svg></div><p class="topo-hint">Drag to pan · scroll to zoom · Tab to walk the graph. Hovering a resource keeps its upstream path lit.</p></section><aside class="topo-detail panel" @show="!!selected()" aria-label="Resource detail" x-cloak><div class="topo-detail-head" x-cloak><div x-cloak><span class="pill" :class="selected()?.status === 'ok' ? 'ok' : selected()?.status === 'bad' ? 'bad' : 'warn'" x-cloak>{{ selected()?.status }}</span><h2 x-cloak>{{ selected()?.label }}</h2><p x-cloak>{{ selected()?.kind }} · {{ selected()?.sub }}</p></div><button class="btn ghost sm" type="button" @click="selectedId.set('')">Close</button></div><div class="kv" :for="fact in selectedFacts" x-cloak><span x-cloak>{{ fact.label }}</span><b x-cloak>{{ fact.value }}</b></div><p class="topo-empty-facts" @show="!selectedFacts().length" x-cloak>No further detail is reported for this resource.</p><h3>Connections</h3><div class="topo-conn" :for="link in selectedLinks" x-cloak><span class="chip" :class="link.flow" x-cloak>{{ link.flow }}</span><span x-cloak>{{ link.arrow }} {{ link.other }}</span><small x-cloak>{{ link.note }}</small></div><a class="btn sm" :href="manageHref(selected())" @show="!!selected()?.href" x-cloak>Manage this resource</a></aside></div><section class="topo-legend" aria-label="Legend"><span><i class="ok swatch"></i>healthy</span><span><i class="swatch warn"></i>needs attention</span><span><i class="bad swatch"></i>failing</span><span><i class="idle swatch"></i>idle</span><span><i class="swatch unknown"></i>not reported</span><span class="topo-legend-sep"></span><span><i class="stroke request"></i>request</span><span><i class="stroke async"></i>async</span><span><i class="stroke data"></i>data</span><span><i class="stroke backup"></i>backup</span></section></main><style> .topo-wrap { max-width: 1560px; } .topo-notice { margin: 10px 0; padding: 10px 14px; border-radius: 12px; background: rgba(255,255,255,0.04); border: 1px solid var(--panel-br); color: var(--txt2); font-size: 13px; } .topo-notice.bad { background: var(--badbg); border-color: rgba(240,115,110,0.3); color: var(--bad); } .topo-summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin: 16px 0 12px; } .topo-summary article { display: grid; gap: 5px; } .topo-summary b { font-size: 19px; } .topo-summary small { color: var(--txt3); } .topo-controls { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding: 12px 14px; } .topo-search { flex: 1 1 260px; } .topo-search input { width: 100%; background: var(--bg2); border: 1px solid var(--panel-br); border-radius: 10px; color: var(--txt); padding: 8px 12px; } .topo-flows, .topo-zoom { display: flex; align-items: center; gap: 7px; } .topo-level { min-width: 46px; text-align: center; color: var(--txt3); font: 600 12px var(--mono); } .chip { border: 1px solid var(--panel-br); background: rgba(255,255,255,0.04); color: var(--txt2); border-radius: 999px; padding: 5px 11px; font-size: 12px; font-weight: 600; cursor: pointer; } .chip::before { content: ''; display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 7px; vertical-align: 0; background: currentColor; } .chip.request { color: var(--accent); } .chip.async { color: #c08ae8; } .chip.data { color: var(--ok); } .chip.backup { color: var(--txt3); } .chip.off { opacity: .38; } .topo-stage { position: relative; } .topo-panel { padding: 8px; min-width: 0; } /* The svg is a fixed, over-tall stage; the viewport crops it to the band the drawing occupies. That crop is bound to the live geometry, so the diagram fills the panel even when a re-layout is taller than the baked stage. */ .topo-viewport { position: relative; width: 100%; max-height: 78vh; overflow: hidden; } .topo-canvas { display: block; width: 100%; height: auto; touch-action: none; cursor: grab; color: var(--txt3); } .topo-canvas:active { cursor: grabbing; } .topo-hint { padding: 6px 12px 4px; color: var(--txt3); font-size: 11.5px; } .topo-lane { fill: rgba(255,255,255,0.016); stroke: rgba(255,255,255,0.05); } .topo-lane-label { fill: var(--txt3); font: 700 13px 'Inter', sans-serif; letter-spacing: .09em; text-transform: uppercase; } .topo-lane-count { fill: var(--txt3); font: 600 12px var(--mono); opacity: .6; } .topo-group { fill: none; stroke: rgba(90,139,224,0.34); stroke-dasharray: 6 6; } .topo-group-label { fill: var(--accent); font: 700 13px 'Inter', sans-serif; } .topo-group-sub { fill: var(--txt3); font-weight: 500; } .topo-link { fill: none; stroke: var(--accent); stroke-width: 1.7; opacity: .55; color: var(--accent); transition: opacity .18s ease; } .topo-link.async { stroke: #c08ae8; color: #c08ae8; stroke-dasharray: 7 5; } .topo-link.data { stroke: var(--ok); color: var(--ok); } .topo-link.backup { stroke: var(--txt3); color: var(--txt3); stroke-dasharray: 2 6; } .topo-link.animate { stroke-dasharray: 9 7; animation: topo-flow 1.5s linear infinite; } .topo-link.dim { opacity: .07; animation: none; } @keyframes topo-flow { to { stroke-dashoffset: -32; } } @media (prefers-reduced-motion: reduce) { .topo-link.animate { animation: none; } } .topo-edge-label { fill: var(--txt3); font: 600 11.5px var(--mono); paint-order: stroke; stroke: var(--bg); stroke-width: 4px; } .topo-edge-label.dim { opacity: .06; } .topo-node { cursor: pointer; } .topo-node .topo-box { fill: rgba(20,26,38,0.94); stroke: var(--panel-br); stroke-width: 1.2; transition: stroke .18s ease, fill .18s ease; } .topo-node .topo-icon { fill: none; stroke: var(--txt2); stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; } .topo-node .topo-label { fill: var(--txt); font: 700 15px 'Inter', sans-serif; } .topo-node .topo-sub { fill: var(--txt3); font: 500 12px var(--mono); } .topo-node .topo-dot { fill: var(--txt3); } .topo-node.ok .topo-dot { fill: var(--ok); } .topo-node.warn .topo-dot { fill: var(--warn); } .topo-node.bad .topo-dot { fill: var(--bad); } .topo-node.idle .topo-dot { fill: var(--txt3); opacity: .5; } .topo-node.bad .topo-box { stroke: rgba(240,115,110,0.5); } .topo-node.warn .topo-box { stroke: rgba(237,185,73,0.42); } .topo-node.external .topo-box { fill: rgba(255,255,255,0.02); stroke-dasharray: 5 5; } .topo-node:hover .topo-box, .topo-node:focus-visible .topo-box { stroke: var(--accent); fill: rgba(28,38,58,0.98); } .topo-node:focus { outline: none; } .topo-node:focus-visible .topo-box { stroke-width: 2; } .topo-node.selected .topo-box { stroke: var(--accent); stroke-width: 2; } .topo-node.selected .topo-icon { stroke: var(--accent); } .topo-node.dim { opacity: .16; } /* Opaque: it floats over the diagram, and a translucent panel over moving edges is unreadable. */ .topo-detail { position: absolute; z-index: 5; top: 12px; right: 12px; width: 340px; display: grid; gap: 4px; max-height: calc(100% - 24px); overflow: auto; background: #0e131d; box-shadow: 0 22px 60px rgba(0,0,0,0.6); } .topo-detail-head { display: flex; justify-content: space-between; gap: 12px; align-items: start; margin-bottom: 8px; } .topo-detail-head h2 { font-size: 19px; margin-top: 6px; } .topo-detail-head p { color: var(--txt3); font-size: 12px; } .topo-detail h3 { margin: 16px 0 4px; font-size: 12px; letter-spacing: .09em; text-transform: uppercase; color: var(--txt3); } .topo-detail .kv b { font-family: var(--mono); font-size: 12.5px; text-align: right; word-break: break-all; } .topo-empty-facts { color: var(--txt3); font-size: 12px; padding: 8px 0; } .topo-conn { display: flex; align-items: center; gap: 9px; padding: 6px 0; color: var(--txt2); font-size: 12px; } .topo-conn .chip { cursor: default; padding: 2px 9px; font-size: 11px; } .topo-detail .btn { margin-top: 14px; text-align: center; text-decoration: none; } .topo-legend { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding: 14px 4px 0; color: var(--txt3); font-size: 12px; } .topo-legend span { display: inline-flex; align-items: center; gap: 7px; } .topo-legend .swatch { width: 9px; height: 9px; border-radius: 50%; background: var(--txt3); } .topo-legend .swatch.ok { background: var(--ok); } .topo-legend .swatch.warn { background: var(--warn); } .topo-legend .swatch.bad { background: var(--bad); } .topo-legend .swatch.idle { background: var(--txt3); opacity: .5; } .topo-legend .stroke { width: 20px; height: 0; border-top: 2px solid var(--accent); } .topo-legend .stroke.async { border-top-style: dashed; border-color: #c08ae8; } .topo-legend .stroke.data { border-color: var(--ok); } .topo-legend .stroke.backup { border-top-style: dotted; border-color: var(--txt3); } .topo-legend-sep { width: 1px; height: 14px; background: var(--panel-br); } @media (max-width: 1100px) { .topo-detail { position: static; width: auto; max-height: none; margin-top: 12px; } .topo-summary { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 640px) { .topo-summary { grid-template-columns: 1fr; } .topo-controls > * { width: 100%; } } </style></body></html>
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtqnlau5axkwxv"><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.dbee66d1.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Git integrations</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"><style> .source-hero { display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:start } .source-actions,.row-actions { display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end } .source-stats { display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px } .source-stat strong { display:block;font-size:1.8rem;margin-top:10px } .source-layout { display:grid;grid-template-columns:minmax(0,1.5fr) minmax(320px,.8fr);gap:18px;align-items:start } .source-stack,.connection-list,.repository-list,.binding-list,.webhook-list,.delivery-list { display:grid;gap:12px } .source-sidebar { position:sticky;top:20px } .connection,.repository,.binding,.webhook { border:1px solid var(--line);border-radius:11px;background:var(--panel);padding:16px;display:grid;gap:12px } .connection-head,.repository-head,.binding-head,.webhook-head { display:flex;gap:12px;justify-content:space-between;align-items:flex-start } .connection-title { display:flex;gap:10px;align-items:center }.provider-mark { display:grid;place-items:center;width:34px;height:34px;border-radius:9px;background:rgba(90,139,224,.12);color:var(--accent);font-weight:800;text-transform:uppercase } .connection h3,.repository h3,.binding h3,.webhook h3 { margin:0;font-size:1rem }.connection p,.repository p,.binding p,.webhook p { margin:3px 0 0 } .source-meta { display:flex;gap:7px;flex-wrap:wrap;align-items:center;color:var(--muted);font-size:.78rem } .source-filters { display:grid;grid-template-columns:minmax(180px,1fr) minmax(150px,.35fr);gap:8px;margin-bottom:12px } .source-filters input,.source-filters select,.source-dialog input,.source-dialog select,.source-dialog textarea { width:100%;min-width:0;background:rgba(255,255,255,.045);border:1px solid var(--panel-br);border-radius:8px;padding:9px 10px;color:var(--txt);font:inherit } .source-filters input:focus,.source-filters select:focus,.source-dialog input:focus,.source-dialog select:focus,.source-dialog textarea:focus { outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(90,139,224,.12) } .source-dialog { position:fixed;inset:50% auto auto 50%;transform:translate(-50%,-50%);margin:0;width:min(620px,calc(100vw - 32px));max-height:calc(100vh - 32px);overflow:auto;box-sizing:border-box;border:1px solid var(--line);border-radius:12px;background:#111722;color:inherit;padding:22px;box-shadow:0 24px 80px rgba(0,0,0,.55) } .source-dialog::backdrop { background:rgba(0,0,0,.68) }.source-dialog form { display:grid;gap:12px } .source-dialog label { display:grid;gap:6px;color:var(--txt3);font-size:.72rem;font-weight:750;letter-spacing:.04em }.source-dialog label :is(input,select,textarea) { color:var(--txt);font-weight:450;letter-spacing:0 } .form-grid { display:grid;grid-template-columns:1fr 1fr;gap:10px }.check-grid { display:grid;grid-template-columns:1fr 1fr;gap:9px }.check-grid label { display:flex;align-items:center;gap:8px;font-size:.82rem }.check-grid input { width:auto } .dialog-actions { display:flex;gap:8px;justify-content:flex-end }.status-line { min-height:1.3em;color:var(--muted) } .empty-source { padding:26px;text-align:center;border:1px dashed var(--line);border-radius:10px;color:var(--muted) } .delivery { display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;font-size:.78rem;border-top:1px solid var(--line);padding-top:8px } .impact-list { display:grid;gap:8px;max-height:240px;overflow:auto }.impact { padding:10px;border:1px solid var(--line);border-radius:8px } .secret-note { border-left:2px solid #e4c35e;padding-left:10px;color:var(--muted) } @media (max-width:900px) { .source-layout,.source-hero { grid-template-columns:1fr }.source-sidebar { position:static }.source-stats { grid-template-columns:1fr 1fr }.source-actions { justify-content:flex-start } } @media (max-width:560px) { .source-stats,.source-filters,.form-grid,.check-grid { grid-template-columns:1fr }.connection-head,.repository-head,.binding-head,.webhook-head { display:grid }.row-actions { justify-content:flex-start } } </style><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-auto><a data-stx-scope="stx_scope_nav_52" 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="active" 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="" 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">
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv0widaztnzl6"><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.dbee66d1.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Git integrations</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"><style> .source-hero { display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:start } .source-actions,.row-actions { display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end } .source-stats { display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px } .source-stat strong { display:block;font-size:1.8rem;margin-top:10px } .source-layout { display:grid;grid-template-columns:minmax(0,1.5fr) minmax(320px,.8fr);gap:18px;align-items:start } .source-stack,.connection-list,.repository-list,.binding-list,.webhook-list,.delivery-list { display:grid;gap:12px } .source-sidebar { position:sticky;top:20px } .connection,.repository,.binding,.webhook { border:1px solid var(--line);border-radius:11px;background:var(--panel);padding:16px;display:grid;gap:12px } .connection-head,.repository-head,.binding-head,.webhook-head { display:flex;gap:12px;justify-content:space-between;align-items:flex-start } .connection-title { display:flex;gap:10px;align-items:center }.provider-mark { display:grid;place-items:center;width:34px;height:34px;border-radius:9px;background:rgba(90,139,224,.12);color:var(--accent);font-weight:800;text-transform:uppercase } .connection h3,.repository h3,.binding h3,.webhook h3 { margin:0;font-size:1rem }.connection p,.repository p,.binding p,.webhook p { margin:3px 0 0 } .source-meta { display:flex;gap:7px;flex-wrap:wrap;align-items:center;color:var(--muted);font-size:.78rem } .source-filters { display:grid;grid-template-columns:minmax(180px,1fr) minmax(150px,.35fr);gap:8px;margin-bottom:12px } .source-filters input,.source-filters select,.source-dialog input,.source-dialog select,.source-dialog textarea { width:100%;min-width:0;background:rgba(255,255,255,.045);border:1px solid var(--panel-br);border-radius:8px;padding:9px 10px;color:var(--txt);font:inherit } .source-filters input:focus,.source-filters select:focus,.source-dialog input:focus,.source-dialog select:focus,.source-dialog textarea:focus { outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(90,139,224,.12) } .source-dialog { position:fixed;inset:50% auto auto 50%;transform:translate(-50%,-50%);margin:0;width:min(620px,calc(100vw - 32px));max-height:calc(100vh - 32px);overflow:auto;box-sizing:border-box;border:1px solid var(--line);border-radius:12px;background:#111722;color:inherit;padding:22px;box-shadow:0 24px 80px rgba(0,0,0,.55) } .source-dialog::backdrop { background:rgba(0,0,0,.68) }.source-dialog form { display:grid;gap:12px } .source-dialog label { display:grid;gap:6px;color:var(--txt3);font-size:.72rem;font-weight:750;letter-spacing:.04em }.source-dialog label :is(input,select,textarea) { color:var(--txt);font-weight:450;letter-spacing:0 } .form-grid { display:grid;grid-template-columns:1fr 1fr;gap:10px }.check-grid { display:grid;grid-template-columns:1fr 1fr;gap:9px }.check-grid label { display:flex;align-items:center;gap:8px;font-size:.82rem }.check-grid input { width:auto } .dialog-actions { display:flex;gap:8px;justify-content:flex-end }.status-line { min-height:1.3em;color:var(--muted) } .empty-source { padding:26px;text-align:center;border:1px dashed var(--line);border-radius:10px;color:var(--muted) } .delivery { display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;font-size:.78rem;border-top:1px solid var(--line);padding-top:8px } .impact-list { display:grid;gap:8px;max-height:240px;overflow:auto }.impact { padding:10px;border:1px solid var(--line);border-radius:8px } .secret-note { border-left:2px solid #e4c35e;padding-left:10px;color:var(--muted) } @media (max-width:900px) { .source-layout,.source-hero { grid-template-columns:1fr }.source-sidebar { position:static }.source-stats { grid-template-columns:1fr 1fr }.source-actions { justify-content:flex-start } } @media (max-width:560px) { .source-stats,.source-filters,.form-grid,.check-grid { grid-template-columns:1fr }.connection-head,.repository-head,.binding-head,.webhook-head { display:grid }.row-actions { justify-content:flex-start } } </style><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-auto><a data-stx-scope="stx_scope_nav_52" 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="active" 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="" 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">
2
2
  (function() {
3
3
  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;
4
4
  var __destroyHooks = [];
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtqnlau5axkwxv"><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 · Alerts &amp; health</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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1788750043334_4() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv0widaztnzl6"><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 · Alerts &amp; health</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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1789014266027_4() {
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
5
  var alertAction = undefined;
@@ -188,9 +188,9 @@ toggleChannel = __stxBundle_08b6fac34151["toggleChannel"];
188
188
  tone = __stxBundle_08b6fac34151["tone"];
189
189
  return { alertAction, alerts, api, body, duration, lastUpdatedAt, load, optional, pollingError, pollingState, refresh, retry, runCheck, submitChannel, submitHealth, submitRoute, submitRule, testChannel, toggle, toggleChannel, tone, __stxBundle_08b6fac34151 };
190
190
  }
191
- window.__stx_latestSetup=__stx_setup_1788750043334_4;
192
- if(window.stx)window.stx._latestSetup=__stx_setup_1788750043334_4;
193
- </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_1788750043334_4"><a data-stx-scope="stx_scope_nav_5" 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="active" 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">
191
+ window.__stx_latestSetup=__stx_setup_1789014266027_4;
192
+ if(window.stx)window.stx._latestSetup=__stx_setup_1789014266027_4;
193
+ </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_1789014266027_4"><a data-stx-scope="stx_scope_nav_5" 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="active" 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">
194
194
  (function() {
195
195
  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;
196
196
  var __destroyHooks = [];
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtqnlau5axkwxv"><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 · Environment &amp; secrets</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.dbee66d1.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1788750043333_3() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv0widaztnzl6"><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 · Environment &amp; secrets</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.dbee66d1.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1789014266024_1() {
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, 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;
4
4
 
5
5
  const entries = state([]);
@@ -266,9 +266,9 @@ onMount(() => {
266
266
 
267
267
  return { entries, effectiveEntries, scopeProject, environments, resources, functions, previews, warnings, configurationHash, tab, scopeType, scopeId, search, effective, selected, notice, error, busy, plan, editorOpen, importOpen, dotenvSource, secretKeys, currentEnv, endpoint, api, scopeContext, chooseDefault, changeScope, load, shown, selectTab, toggle, allSelected, when, scopeLabel, formData, previewChange, save, reveal, removeEntry, bulkDelete, transfer, importDotenv, exportVariables, searchTimer, searchChanged };
268
268
  }
269
- window.__stx_latestSetup=__stx_setup_1788750043333_3;
270
- if(window.stx)window.stx._latestSetup=__stx_setup_1788750043333_3;
271
- </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_1788750043333_3"><a data-stx-scope="stx_scope_nav_4" 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="" 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="active" 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">
269
+ window.__stx_latestSetup=__stx_setup_1789014266024_1;
270
+ if(window.stx)window.stx._latestSetup=__stx_setup_1789014266024_1;
271
+ </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_1789014266024_1"><a data-stx-scope="stx_scope_nav_2" 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="" 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="active" 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">
272
272
  (function() {
273
273
  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;
274
274
  var __destroyHooks = [];
@@ -619,6 +619,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1788750043333_3;
619
619
 
620
620
 
621
621
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
622
- window.stx._scopes['stx_scope_nav_4'] = __scopeRegistration;
622
+ window.stx._scopes['stx_scope_nav_2'] = __scopeRegistration;
623
623
  })();
624
624
  </script> <main class="configuration-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Environment &amp; secrets</div><header class="page"><div><h1>Environment &amp; secrets</h1><p>Manage inherited runtime configuration across project, environment, service, and preview scopes from one deploy-safe control plane.</p></div><div class="header-actions"><button class="btn ghost" @click="importOpen.set(!importOpen())">Import .env</button><button class="btn ghost" @click="exportVariables()">Export variables</button><button class="btn" @click="editorOpen.set(!editorOpen())" x-cloak>New {{ tab() }}</button></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!error()" x-cloak>{{ error() }}</p><section class="panel scope-bar" aria-label="Configuration scope"><div><span class="eyebrow">Scope</span><div class="segmented"><button :class="{active:scopeType()==='project'}" @click="changeScope('project')">Project</button><button :class="{active:scopeType()==='environment'}" @click="changeScope('environment')">Environment</button><button :class="{active:scopeType()==='service'}" @click="changeScope('service')">Service</button><button :class="{active:scopeType()==='function'}" @click="changeScope('function')">Function</button><button :class="{active:scopeType()==='preview'}" @click="changeScope('preview')">Preview</button></div></div><label @show="scopeType()==='project'" x-cloak><span>Target</span><select :value="scopeId()" @change="scopeId.set($event.currentTarget.value);selected.set([]);load()"><option :value="scopeProject()?.id">{{ scopeProject()?.name || 'Project' }}</option></select></label><label @show="scopeType()==='environment'" x-cloak><span>Target environment</span><select :value="scopeId()" @change="scopeId.set($event.currentTarget.value);selected.set([]);load()"><template :for="item in environments()"><option :value="item.id">{{ item.name || item.slug }}</option></template></select></label><label @show="scopeType()==='service'" x-cloak><span>Target service</span><select :value="scopeId()" @change="scopeId.set($event.currentTarget.value);selected.set([]);load()"><template :for="item in resources()"><option :value="item.id">{{ item.name || item.slug }}</option></template></select></label><label @show="scopeType()==='function'" x-cloak><span>Target function</span><select :value="scopeId()" @change="scopeId.set($event.currentTarget.value);selected.set([]);load()"><template :for="item in functions()"><option :value="item.id">{{ item.name || item.slug }}</option></template></select></label><label @show="scopeType()==='preview'" x-cloak><span>Target preview</span><select :value="scopeId()" @change="scopeId.set($event.currentTarget.value);selected.set([]);load()"><template :for="item in previews()"><option :value="item.id">{{ item.name }} · {{ item.status }}</option></template></select></label><div class="scope-health" x-cloak><span class="pill" :class="warnings().length?'warn':'ok'" x-cloak>{{ warnings().length ? warnings().length+' warning(s)' : 'references healthy' }}</span><code :title="configurationHash()" x-cloak>{{ configurationHash().slice(0,18) || 'not resolved' }}</code></div></section><section class="import-panel panel" @show="importOpen()" x-cloak><div><h2>Import dotenv</h2><p class="note">Paste or upload content. Conflicting duplicates stop the import; the preview and audit trail contain key names only.</p></div><form @submit="importDotenv($event)"><label>Dotenv content<textarea required rows="8" class="mono" :value="dotenvSource()" @input="dotenvSource.set($event.currentTarget.value)" placeholder="PUBLIC_URL=https://example.com&#10;DATABASE_URL=..."></textarea></label><label>Secret keys <input :value="secretKeys()" @input="secretKeys.set($event.currentTarget.value)" placeholder="DATABASE_URL, API_TOKEN"><span>Comma-separated. All other keys are plaintext variables and may be exported.</span></label><button class="btn" :disabled="busy()">Validate &amp; import</button></form></section><section class="editor-panel panel" @show="editorOpen()" x-cloak><form @submit="save($event)"><div x-cloak><h2 x-cloak>Set {{ tab() }}</h2><p class="note">Existing production values require typed confirmation. Secret values are write-only.</p></div><label>Key<input name="key" required pattern="[A-Za-z_][A-Za-z0-9_]*" placeholder="DATABASE_URL" autocomplete="off"></label><label @show="tab()==='secret'" x-cloak>Backend<select name="backend"><option value="local_encrypted">Encrypted local/box</option><option value="aws_secrets_manager">AWS Secrets Manager</option><option value="aws_ssm">AWS SSM Parameter Store</option><option value="external">External reference</option></select></label><label class="wide" x-cloak>{{ tab()==='secret'?'Value (write-only)':'Value' }}<textarea name="value" rows="3" :type="tab()==='secret'?'password':'text'" placeholder="Value, including multiline content"></textarea></label><label class="wide" @show="tab()==='secret'" x-cloak>External reference<input name="reference" placeholder="vault://team/app/token"><span>Used only when External reference is selected.</span></label><label class="check"><input name="required" type="checkbox"> Required at deployment</label><div class="actions"><button class="btn ghost" type="button" @click="previewChange($event.currentTarget.form)">Preview key diff</button><button class="btn" type="submit" :disabled="busy()" x-cloak>Save {{ tab() }}</button></div></form><div class="change-plan" @show="!!plan()" x-cloak><h3>Change preview</h3><p x-cloak><b x-cloak>{{ plan()?.added.length || 0 }}</b> add · <b x-cloak>{{ plan()?.changed.length || 0 }}</b> change · <b x-cloak>{{ plan()?.removed.length || 0 }}</b> remove · <b x-cloak>{{ plan()?.affectedResourceIds.length || 0 }}</b> affected services</p><code x-cloak>{{ [...(plan()?.added||[]),...(plan()?.changed||[]),...(plan()?.removed||[])].join(', ') }}</code></div></section><nav class="tabs" aria-label="Configuration kind" x-cloak><button :class="{active:tab()==='variable'}" @click="selectTab('variable')" x-cloak>Variables <span x-cloak>{{ entries().filter(item=>item.kind==='variable').length }}</span></button><button :class="{active:tab()==='secret'}" @click="selectTab('secret')" x-cloak>Secrets <span x-cloak>{{ entries().filter(item=>item.kind==='secret').length }}</span></button></nav><section class="panel table-tools"><input type="search" placeholder="Search keys" aria-label="Search configuration" @input="searchChanged($event.currentTarget.value)"><label class="check"><input type="checkbox" :checked="effective()" @change="effective.set($event.currentTarget.checked)"> Show inherited effective values</label><span class="spacer"></span><button class="btn danger sm" @show="selected().length" @click="bulkDelete()" x-cloak>Delete {{ selected().length }} selected</button><button class="btn ghost sm" @click="load()">Refresh</button></section><section class="config-table panel"><table><thead><tr><th scope="col"><input type="checkbox" aria-label="Select all" @change="allSelected()"></th><th scope="col">Key</th><th scope="col">Scope &amp; precedence</th><th scope="col" x-cloak>{{ tab()==='secret'?'Backend':'Value' }}</th><th scope="col">Use &amp; rotation</th><th scope="col" class="table-actions">Actions</th></tr></thead><tbody><template :for="item in shown()"><tr><td><input type="checkbox" :checked="selected().includes(item.id)" :disabled="item.inherited" :aria-label="'Select '+item.key" @change="toggle(item.id)"></td><td x-cloak><div class="key-cell" x-cloak><code x-cloak>{{ item.key }}</code><span class="pill" @show="item.required" x-cloak>required</span><span class="pill warn" @show="item.inherited" x-cloak>inherited</span><span class="pill" @show="item.overridden" x-cloak>overrides</span></div></td><td x-cloak><b x-cloak>{{ scopeLabel(item) }}</b><small x-cloak>{{ item.scope.type }} · v{{ item.version }}</small></td><td x-cloak><div @show="item.kind==='secret'" x-cloak><b x-cloak>{{ item.backend || 'restricted' }}</b><small x-cloak>{{ item.backendVersion ? 'backend v'+item.backendVersion : 'metadata hidden' }}</small><code @show="!!item.reference" x-cloak>{{ item.reference }}</code></div><code class="value-preview" @show="item.kind==='variable'" x-cloak>{{ item.value }}</code></td><td x-cloak><b x-cloak>{{ item.rotatedAt ? 'Rotated '+when(item.rotatedAt) : 'Not rotated' }}</b><small x-cloak>Last used {{ when(item.lastUsedAt) }}</small><small x-cloak>Updated {{ when(item.updatedAt) }}</small></td><td class="table-actions"><div class="row-actions"><button class="btn ghost sm" @show="item.kind==='secret'" @click="reveal(item)" x-cloak>Reveal &amp; copy</button><button class="btn ghost sm" @show="!item.inherited" @click="transfer(item)" x-cloak>Move / copy</button><button class="btn danger sm" @show="!item.inherited" @click="removeEntry(item)" x-cloak>Delete</button></div></td></tr></template><tr @show="!shown().length" x-cloak><td colspan="6" x-cloak><div class="compact empty" x-cloak><strong x-cloak>No {{ tab() }}s at this scope</strong><span>Create one here, import dotenv, or enable the inherited view.</span></div></td></tr></tbody></table></section><aside class="warning-list" @show="warnings().length" x-cloak><h2>Deployment warnings</h2><template :for="warning in warnings()"><p class="notice warn" x-cloak><code x-cloak>{{ warning.key || 'scope' }}</code> {{ warning.message }}</p></template></aside></main><style> .configuration-wrap{max-width:1500px}.scope-bar{display:grid;grid-template-columns:1.4fr 1fr auto;gap:24px;align-items:end}.eyebrow,.scope-bar label span{display:block;color:var(--txt3);font-size:12px;margin-bottom:8px;text-transform:uppercase;letter-spacing:.08em}.segmented{display:flex;gap:4px;background:var(--bg);padding:4px;border-radius:8px;width:max-content}.segmented button{border:0;background:transparent;color:var(--txt3);padding:8px 12px;border-radius:6px}.segmented button.active{background:var(--panel2);color:var(--txt)}.scope-bar select{min-width:240px;background:var(--bg)!important;color:var(--txt)!important;border:1px solid var(--line)!important}.scope-health{display:flex;flex-direction:column;align-items:flex-end;gap:8px}.import-panel,.editor-panel{margin-top:18px;padding:22px;display:grid;grid-template-columns:minmax(240px,.7fr) minmax(420px,1.3fr);gap:28px}.import-panel form,.editor-panel form{display:grid;grid-template-columns:1fr 1fr;gap:14px}.import-panel label:first-child,.wide{grid-column:1/-1}.editor-panel>form>div:first-child{grid-column:1/-1}.editor-panel label,.import-panel label{display:flex;flex-direction:column;gap:7px}.editor-panel label span,.import-panel label span{color:var(--txt3);font-size:12px}.change-plan{border-left:1px solid var(--line);padding-left:24px}.tabs{display:flex;gap:4px;margin-top:22px;border-bottom:1px solid var(--line)}.tabs button{border:0;background:transparent;color:var(--txt3);padding:12px 16px;border-bottom:2px solid transparent}.tabs button.active{color:var(--txt);border-bottom-color:var(--accent)}.tabs button span{opacity:.6}.table-tools{display:flex;gap:16px;align-items:center;padding:12px 16px;border-radius:0}.table-tools input[type=search]{max-width:360px}.spacer{flex:1}.config-table{overflow:auto;border-top-left-radius:0;border-top-right-radius:0}.config-table table{min-width:1100px}.config-table td{vertical-align:top}.config-table td:nth-child(3),.config-table td:nth-child(4),.config-table td:nth-child(5){display:table-cell}.config-table td b,.config-table td small,.config-table td code{display:block;margin-bottom:5px}.key-cell{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.key-cell code{font-weight:700;margin:0}.value-preview{max-width:320px;white-space:pre-wrap;overflow-wrap:anywhere}.row-actions{flex-wrap:wrap}.warning-list{margin-top:20px}.check{display:flex!important;flex-direction:row!important;align-items:center;gap:8px!important}.actions{display:flex;gap:10px;align-items:end}@media(max-width:900px){.scope-bar,.import-panel,.editor-panel{grid-template-columns:1fr}.scope-health{align-items:flex-start}.import-panel form,.editor-panel form{grid-template-columns:1fr}.config-table{overflow-x:auto}} </style></body></html>
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtqnlau5axkwxv"><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 · Workers &amp; schedules</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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1788750044261_8() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv0widaztnzl6"><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 · Workers &amp; schedules</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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1789014266972_14() {
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
5
  var actionError = undefined;
@@ -315,9 +315,9 @@ when = __stxBundle_da87383c4b96["when"];
315
315
  workers = __stxBundle_da87383c4b96["workers"];
316
316
  return { actionError, api, busy, createJob, duration, editJob, filteredJobs, formBody, history, jobAction, jobs, lastUpdatedAt, load, mode, notice, operations, pollingError, pollingState, preview, previewForm, previewTimer, providerFilter, queuePreview, reconcile, refresh, restartWorker, search, selectedJob, setPreset, showHistory, statusFilter, tab, tone, when, workers, __stxBundle_da87383c4b96 };
317
317
  }
318
- window.__stx_latestSetup=__stx_setup_1788750044261_8;
319
- if(window.stx)window.stx._latestSetup=__stx_setup_1788750044261_8;
320
- </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_1788750044261_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="" 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="active" 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">
318
+ window.__stx_latestSetup=__stx_setup_1789014266972_14;
319
+ if(window.stx)window.stx._latestSetup=__stx_setup_1789014266972_14;
320
+ </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_1789014266972_14"><a data-stx-scope="stx_scope_nav_18" 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="" 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="active" 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">
321
321
  (function() {
322
322
  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;
323
323
  var __destroyHooks = [];
@@ -668,6 +668,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1788750044261_8;
668
668
 
669
669
 
670
670
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
671
- window.stx._scopes['stx_scope_nav_11'] = __scopeRegistration;
671
+ window.stx._scopes['stx_scope_nav_18'] = __scopeRegistration;
672
672
  })();
673
673
  </script> <main class="jobs-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Workers &amp; schedules</div><header class="page"><div><h1>Workers &amp; schedules</h1><p>One control plane for cron, EventBridge schedules, recurring operations, queue workers, retries, and execution evidence.</p></div><div class="header-actions" x-cloak><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><button class="btn ghost sm" @click="reconcile()">Reconcile config</button></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!actionError() || !!pollingError()" x-cloak>{{ actionError() || pollingError() }}</p><div class="summary"><article class="panel"><b>Schedules</b><strong x-cloak>{{ jobs().length }}</strong><small x-cloak>{{ jobs().filter(item=>item.enabled).length }} enabled</small></article><article class="panel"><b>Workers</b><strong x-cloak>{{ workers().length }}</strong><small x-cloak>{{ workers().reduce((sum,item)=>sum+item.processes,0) }} processes</small></article><article class="panel"><b>Needs review</b><strong x-cloak>{{ jobs().filter(item=>['drifted','unsupported','unavailable'].includes(item.reconciliationStatus)).length + workers().filter(item=>['drifted','unsupported','unavailable'].includes(item.reconciliationStatus)).length }}</strong><small>drift or provider gaps</small></article><article class="panel"><b>Failed last run</b><strong x-cloak>{{ jobs().filter(item=>['failed','dead'].includes(item.lastExecution?.status)).length }}</strong><small>retry from history</small></article></div><nav class="tabs" aria-label="Jobs workspace"><button :class="{active:tab()==='schedules'}" @click="tab.set('schedules')">Schedules</button><button :class="{active:tab()==='workers'}" @click="tab.set('workers')">Workers</button><button :class="{active:tab()==='history'}" @click="tab.set('history')">Execution history</button></nav><section @show="tab()==='schedules'" class="schedule-layout" x-cloak><div><div class="filters panel"><input aria-label="Search schedules" type="search" placeholder="Search name, expression, timezone" @input="search.set($event.currentTarget.value)"><select aria-label="Filter provider" @change="providerFilter.set($event.currentTarget.value)"><option value="all">All providers</option><option value="server">Server cron</option><option value="eventbridge">EventBridge</option><option value="platform">Platform</option></select><select aria-label="Filter state" @change="statusFilter.set($event.currentTarget.value)"><option value="all">All states</option><option value="enabled">Enabled</option><option value="disabled">Disabled</option></select></div><div class="cards-list" x-cloak><template :for="item in filteredJobs()"><article class="job-card panel" x-cloak><div class="job-title" x-cloak><div x-cloak><span class="pill" :class="item.enabled?'ok':'warn'" x-cloak>{{ item.enabled?'enabled':'disabled' }}</span><span class="pill" x-cloak>{{ item.provider }}</span><span class="pill" :class="tone(item.reconciliationStatus)" x-cloak>{{ item.reconciliationStatus }}</span><h2 x-cloak>{{ item.name }}</h2></div><div class="actions"><button class="btn ghost sm" :disabled="busy()" @click="jobAction(item,'run')">Run now</button><button class="btn ghost sm" @click="showHistory(item)">History</button><button class="btn ghost sm" @click="editJob(item)">Edit</button><button class="btn ghost sm" @click="jobAction(item,item.enabled?'disable':'enable')" x-cloak>{{ item.enabled?'Disable':'Enable' }}</button><button class="btn danger sm" @show="item.origin!=='config'" @click="jobAction(item,'delete')" x-cloak>Delete</button></div></div><div class="job-grid"><div><small>Schedule</small><code x-cloak>{{ item.expression }}</code><span x-cloak>{{ item.timezone }}</span></div><div><small>Next run</small><b x-cloak>{{ when(item.nextRunAt) }}</b><span x-cloak>Last {{ when(item.lastExecution?.finishedAt || item.lastScheduledFor) }}</span></div><div><small>Target</small><b x-cloak>{{ item.target.operationId || item.target.action || item.target.functionName || item.target.kind }}</b><span x-cloak>{{ item.origin }} · owner {{ item.ownerActorId || 'configuration' }}</span></div><div><small>Policies</small><b x-cloak>{{ item.overlapPolicy }} overlap · {{ item.missedRunPolicy }}</b><span x-cloak>{{ item.retryPolicy.maxAttempts }} attempts · {{ item.timeoutSeconds }}s timeout</span></div></div><div class="run-preview"><small>Next five</small><span x-cloak>{{ item.preview?.nextRuns?.map(when).join(' · ') || 'No run in active window' }}</span></div><p class="bad note" @show="!!item.lastExecution?.error" x-cloak>{{ item.lastExecution.error }}</p></article></template><div class="empty panel" @show="!filteredJobs().length" x-cloak><strong>No schedules match</strong><span>Create a recurring operation or adjust the filters. Empty means no provider execution will occur.</span></div></div></div><form class="editor panel" @submit="createJob($event)" @input="queuePreview($event.currentTarget)"><h2>New schedule</h2><p class="note" x-cloak>Provider: <b x-cloak>{{ mode()==='serverless'?'EventBridge Scheduler':'server cron' }}</b>. Targets are constrained to safe, configured operations.</p><label>Name<input name="name" required maxlength="120" placeholder="Nightly backup verification"></label><label>Preset<select @change="setPreset($event)"><option value="">Custom</option><option value="every_minute">Every minute</option><option value="hourly">Hourly</option><option value="daily">Daily</option><option value="weekly">Weekly</option><option value="monthly">Monthly</option><option value="rate(5 minutes)">Every 5 minutes</option></select></label><label class="wide">Expression<input name="expression" class="mono" required value="0 * * * *" placeholder="cron or rate(5 minutes)"></label><label>Timezone<input name="timezone" required value="UTC" placeholder="America/Los_Angeles"></label><label @show="mode()==='server'" x-cloak><span>Allowlisted target</span><select name="operationId" :required="mode()==='server'"><option value="">Choose operation</option><template :for="operation in operations()"><option :value="operation.id">{{ operation.label }}</option></template></select></label><label>Starts at<input name="startsAt" type="datetime-local"></label><label>Ends at<input name="endsAt" type="datetime-local"></label><label>Flexible window (minutes)<input name="flexibleMinutes" type="number" min="0" max="1440" value="0"></label><label>Missed runs<select name="missedRunPolicy"><option value="skip">Skip</option><option value="catch_up">Catch up (max 10)</option></select></label><label>Overlap<select name="overlapPolicy"><option value="forbid">Forbid</option><option value="allow">Allow</option><option value="replace">Replace active run</option></select></label><label>Max attempts<input name="maxAttempts" type="number" min="1" max="20" value="3"></label><label>Backoff seconds<input name="backoffSeconds" type="number" min="0" value="30"></label><label>Timeout seconds<input name="timeoutSeconds" type="number" min="1" max="86400" value="900"></label><label class="wide">Dead-letter reference<input name="deadLetterRef" placeholder="arn://aws/sqs/... or secret://jobs/dlq"></label><label class="wide">Payload reference (optional)<input name="payloadRef" placeholder="secret://jobs/nightly-input"><span>Inline payload values are rejected. Use secret://, ssm://, arn://, or env:// references.</span></label><div class="preview wide" @show="!!preview()" x-cloak><b x-cloak>{{ preview()?.description }}</b><code x-cloak>{{ preview()?.normalized }}</code><ol><template :for="run in preview()?.nextRuns || []"><li x-cloak>{{ when(run) }}</li></template></ol><p class="note">Preview only—no production execution or incident is created.</p></div><button class="btn wide" type="submit" :disabled="busy() || (mode()==='server' && !operations().length)" x-cloak>{{ busy()?'Creating…':'Create schedule' }}</button><p class="bad note wide" @show="mode()==='server' && !operations().length" x-cloak>No safe recurring target is configured. Enable a scheduler, worker, or backup operation first.</p></form></section><section @show="tab()==='workers'" class="cards-list" x-cloak><template :for="item in workers()"><article class="panel worker-card" x-cloak><div x-cloak><span class="pill" x-cloak>{{ item.provider }}</span><span class="pill" :class="tone(item.observedState?.status || item.reconciliationStatus)" x-cloak>{{ item.observedState?.status || item.reconciliationStatus }}</span><h2 x-cloak>{{ item.name }}</h2></div><div class="job-grid"><div><small>Queue</small><b x-cloak>{{ item.queue }}</b><span x-cloak>{{ item.processes }} processes</span></div><div><small>Current job</small><b x-cloak>{{ item.observedState?.currentJob || 'idle / unavailable' }}</b><span x-cloak>{{ item.observedState?.processed || 0 }} processed</span></div><div><small>Failures</small><b x-cloak>{{ item.observedState?.failures || 0 }}</b><span x-cloak>{{ item.timeoutSeconds }}s timeout</span></div><div><small>Lifecycle</small><b x-cloak>{{ item.restartPolicy }}</b><span x-cloak>{{ item.origin }} · {{ item.reconciliationStatus }}</span></div></div><div class="actions"><button class="btn ghost sm" @show="item.provider==='systemd'" @click="restartWorker(item)" x-cloak>Graceful restart</button><span class="note" @show="item.provider!=='systemd'" x-cloak>Scaling and restarts remain provider/config managed for this worker.</span></div></article></template><div class="empty panel" @show="!workers().length" x-cloak><strong>No workers configured</strong><span>Add site queues or serverless queue definitions, then reconcile configuration.</span></div></section><section @show="tab()==='history'" x-cloak><div class="empty panel" @show="!selectedJob()" x-cloak><strong>Select a schedule</strong><span>Open History from a schedule to inspect attempts, retry state, duration, output, and redacted logs.</span></div><div @show="!!selectedJob()" x-cloak><header class="history-head" x-cloak><div x-cloak><h2 x-cloak>{{ selectedJob()?.name }}</h2><p class="note">At-least-once execution evidence; retries reuse the durable operation and preserve every log line.</p></div><button class="btn sm" @click="jobAction(selectedJob(),'run')">Run again</button></header><div class="cards-list" x-cloak><template :for="item in history()"><article class="execution panel" x-cloak><div class="execution-head" x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><b x-cloak>{{ when(item.scheduledFor) }}</b><span x-cloak>{{ item.trigger }} · attempt {{ item.attempt }} · {{ duration(item) }}</span></div><p class="bad note" @show="!!item.error" x-cloak>{{ item.error }}</p><pre @show="item.logs?.length" x-cloak>{{ item.logs?.map(log=>'['+log.stream+'] '+log.message).join('\n') }}</pre><pre @show="Object.keys(item.output||{}).length" x-cloak>{{ JSON.stringify(item.output,null,2) }}</pre></article></template><div class="empty panel" @show="!history().length" x-cloak><strong>No executions</strong><span>Run the schedule manually or wait for its next due time.</span></div></div></div></section></main><style> .jobs-wrap{max-width:1500px}.summary{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px}.summary article{display:grid;gap:5px}.summary strong{font-size:28px}.summary small{color:var(--txt3)}.tabs{display:flex;gap:5px;overflow:auto;border-bottom:1px solid var(--line);margin-bottom:18px}.tabs button{border:0;background:transparent;color:var(--txt3);padding:10px 14px;white-space:nowrap}.tabs button.active{color:var(--txt);border-bottom:2px solid var(--accent)}.schedule-layout{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(340px,.8fr);gap:14px;align-items:start}.filters{display:grid;grid-template-columns:1fr 170px 150px;gap:8px;margin-bottom:10px}.filters input,.filters select,.editor input,.editor select{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:9px}.cards-list{display:grid;gap:10px}.job-title,.execution-head,.history-head{display:flex;justify-content:space-between;gap:10px;align-items:center;flex-wrap:wrap}.job-title>div:first-child,.worker-card>div:first-child{display:flex;gap:7px;align-items:center;flex-wrap:wrap}.job-title h2,.worker-card h2{font-size:17px;margin:0 0 0 4px}.actions{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.job-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-top:14px}.job-grid>div{display:grid;gap:4px;min-width:0}.job-grid small,.run-preview small{color:var(--txt3);text-transform:uppercase;font-size:9px;letter-spacing:.08em}.job-grid span,.run-preview span{color:var(--txt3);font-size:11px;overflow-wrap:anywhere}.job-grid code{overflow-wrap:anywhere}.run-preview{display:grid;gap:4px;border-top:1px solid var(--line);margin-top:12px;padding-top:10px}.editor{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;position:sticky;top:10px}.editor h2,.editor>p{grid-column:1/-1;margin:0}.editor label{display:grid;gap:5px;color:var(--txt3);font-size:11px}.editor label span{font-size:10px}.wide{grid-column:1/-1}.preview{background:var(--bg2);border:1px solid var(--line);border-radius:8px;padding:10px;display:grid;gap:6px}.preview ol{margin:0;padding-left:20px;color:var(--txt2);font-size:11px}.worker-card .actions{margin-top:12px}.execution pre{max-height:260px;overflow:auto;background:var(--bg2);padding:10px;border-radius:8px;font-size:11px}.history-head{margin-bottom:10px}.mono,code{font-family:var(--mono)}@media(max-width:1050px){.schedule-layout{grid-template-columns:1fr}.editor{position:static}.job-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:720px){.summary{grid-template-columns:repeat(2,1fr)}.filters{grid-template-columns:1fr}.job-grid{grid-template-columns:1fr}}@media(max-width:480px){.summary{grid-template-columns:1fr}.editor{grid-template-columns:1fr}.editor>*{grid-column:1!important}} </style></body></html>