@stacksjs/ts-cloud 0.13.0 → 0.14.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.
- package/dist/aws/index.js +1 -1
- package/dist/bin/{chunk-5n3ejway.js → chunk-1qn174w2.js} +1 -1
- package/dist/bin/{chunk-qmqmnxmm.js → chunk-fr69rgea.js} +2 -2
- package/dist/bin/chunk-k8wscjd9.js +2 -0
- package/dist/bin/{chunk-k2zzny51.js → chunk-kdk3jhyc.js} +1 -1
- package/dist/bin/cli.js +5 -5
- package/dist/bin/dashboard-server.js +1 -1
- package/dist/{chunk-mcfdtg5w.js → chunk-1bxqrj7m.js} +1 -1
- package/dist/{chunk-2s65yj3g.js → chunk-4w8d2mf0.js} +2 -2
- package/dist/{chunk-r4dpn715.js → chunk-9s5sm0wt.js} +6 -6
- package/dist/{chunk-asmv4fw1.js → chunk-a0d0h33y.js} +19 -19
- package/dist/chunk-a6jazwvy.js +1 -0
- package/dist/{chunk-vk513ge7.js → chunk-b2b79jtk.js} +60 -60
- package/dist/{chunk-y13zcbnp.js → chunk-b9pm7mbd.js} +84 -84
- package/dist/{chunk-hyj2ymp1.js → chunk-bkv2p4hp.js} +6 -6
- package/dist/{chunk-z7v4evbh.js → chunk-cwjskpj4.js} +2 -2
- package/dist/{chunk-xqx5szta.js → chunk-dky93h4d.js} +17 -17
- package/dist/{chunk-dzqz1sm0.js → chunk-etmbw4er.js} +3 -3
- package/dist/{chunk-p9fqsz06.js → chunk-gdbtz492.js} +2 -2
- package/dist/chunk-h1anhx3y.js +1 -0
- package/dist/chunk-hxhe2rkx.js +1 -0
- package/dist/{chunk-42kv07cs.js → chunk-jghkvdgt.js} +1 -1
- package/dist/{chunk-w5fmaaxa.js → chunk-jnt7ab86.js} +4 -4
- package/dist/{chunk-ycs26jsj.js → chunk-kggfqsgn.js} +94 -94
- package/dist/chunk-kgw1dd9b.js +1 -0
- package/dist/{chunk-3k60wm30.js → chunk-mgkgsp9f.js} +5 -5
- package/dist/chunk-phr1cqgf.js +1 -0
- package/dist/{chunk-nhtz2k8d.js → chunk-q4bk0htq.js} +5 -5
- package/dist/{chunk-ngdhqwf3.js → chunk-srh0ctd4.js} +3 -3
- package/dist/{chunk-8s9m8pyb.js → chunk-sxtgx8fj.js} +1 -1
- package/dist/{chunk-65ajja2a.js → chunk-t054j0zn.js} +1 -1
- package/dist/{chunk-6gtqjsg9.js → chunk-t5e5phth.js} +1 -1
- package/dist/{chunk-ds92qg3g.js → chunk-tg6yasej.js} +3 -3
- package/dist/{chunk-0g2jkhy5.js → chunk-trsaqsgv.js} +1 -1
- package/dist/chunk-vjcxf8ma.js +2 -0
- package/dist/{chunk-m5r0dt28.js → chunk-xacvkpf8.js} +2 -2
- package/dist/{chunk-nw0tvrrr.js → chunk-xv3w9q1a.js} +1 -1
- package/dist/deploy/index.js +1 -1
- package/dist/dns/delegate-from-config.d.ts +39 -0
- package/dist/dns/index.d.ts +2 -2
- package/dist/dns/index.js +1 -1
- package/dist/dns/porkbun-nameservers.test.d.ts +1 -0
- package/dist/drivers/index.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +36 -36
- package/dist/operations/index.js +1 -1
- package/dist/protection/index.js +1 -1
- package/dist/spend/index.js +1 -1
- package/dist/ui/404.html +1 -1
- package/dist/ui/accept-invitation.html +1 -1
- package/dist/ui/access-denied.html +1 -1
- package/dist/ui/account/automation.html +6 -6
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +6 -6
- package/dist/ui/applications/new.html +1 -1
- package/dist/ui/data/backups.html +6 -6
- package/dist/ui/data/services.html +6 -6
- package/dist/ui/data/volumes.html +5 -5
- package/dist/ui/index.html +6 -6
- package/dist/ui/infrastructure/topology.html +5 -5
- package/dist/ui/integrations.html +2 -2
- package/dist/ui/operations/alerts.html +6 -6
- package/dist/ui/operations/configuration.html +5 -5
- package/dist/ui/operations/jobs.html +6 -6
- package/dist/ui/operations/maintenance.html +5 -5
- package/dist/ui/operations/observability.html +6 -6
- package/dist/ui/operations/previews.html +6 -6
- package/dist/ui/operations/queue.html +6 -6
- package/dist/ui/operations/regions.html +5 -5
- package/dist/ui/operations/releases.html +6 -6
- package/dist/ui/operations/spend.html +6 -6
- package/dist/ui/operations/workloads.html +6 -6
- package/dist/ui/security.html +2 -2
- package/dist/ui/server/actions.html +6 -6
- package/dist/ui/server/activity.html +1 -1
- package/dist/ui/server/capacity.html +6 -6
- package/dist/ui/server/database.html +5 -5
- package/dist/ui/server/deployments.html +6 -6
- package/dist/ui/server/diagnostics.html +2 -2
- package/dist/ui/server/firewall.html +6 -6
- package/dist/ui/server/fleet.html +5 -5
- package/dist/ui/server/logs.html +5 -5
- package/dist/ui/server/metrics.html +6 -6
- package/dist/ui/server/security.html +2 -2
- package/dist/ui/server/services.html +2 -2
- package/dist/ui/server/sites.html +5 -5
- package/dist/ui/server/ssh-keys.html +5 -5
- package/dist/ui/server/team.html +5 -5
- package/dist/ui/server/terminal.html +2 -2
- package/dist/ui/serverless/alarms.html +6 -6
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +2 -2
- package/dist/ui/serverless/data.html +6 -6
- package/dist/ui/serverless/deployments.html +2 -2
- package/dist/ui/serverless/firewall.html +2 -2
- package/dist/ui/serverless/functions.html +6 -6
- package/dist/ui/serverless/logs.html +6 -6
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +6 -6
- package/dist/ui/serverless/secrets.html +6 -6
- package/dist/ui/serverless/traces.html +6 -6
- package/dist/ui/serverless.html +6 -6
- package/package.json +3 -3
- package/dist/bin/chunk-ptt8me4h.js +0 -2
- package/dist/chunk-05qawkra.js +0 -1
- package/dist/chunk-1jx53q5e.js +0 -1
- package/dist/chunk-3qtce4mm.js +0 -1
- package/dist/chunk-3tt5em2c.js +0 -1
- package/dist/chunk-j4ed179k.js +0 -2
- package/dist/chunk-wr7tn9j5.js +0 -1
|
@@ -1,4 +1,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"> <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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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="mtv3cwav94m73g"><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_51" 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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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 = [];
|
|
@@ -349,7 +349,7 @@
|
|
|
349
349
|
|
|
350
350
|
|
|
351
351
|
try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
|
|
352
|
-
window.stx._scopes['
|
|
352
|
+
window.stx._scopes['stx_scope_nav_51'] = __scopeRegistration;
|
|
353
353
|
})();
|
|
354
354
|
</script> <div class="wrap" id="main-content"><div class="crumbs"><a href="/">Project</a><span class="sep">/</span> Git integrations</div><header class="page source-hero"><div><h1>Git integrations</h1><p>Connect source once, bind repositories to applications, and deploy verified pushes or pull requests.</p></div><div class="source-actions"><button class="btn ghost" id="refresh-sources" type="button">Refresh</button><button class="btn" id="add-connection" type="button">Add connection</button></div></header><div class="section source-stats" aria-label="Git integration summary"><div class="panel source-stat"><span class="note">Connections</span><strong id="connection-count">—</strong><small>Provider credentials</small></div><div class="panel source-stat"><span class="note">Repositories</span><strong id="repository-count">—</strong><small>Authorized sources</small></div><div class="panel source-stat"><span class="note">Auto deploy</span><strong id="binding-count">—</strong><small>Active bindings</small></div><div class="panel source-stat"><span class="note">Needs attention</span><strong id="unhealthy-count">—</strong><small>Connections or hooks</small></div></div><div class="section source-layout"><main class="source-stack"><section><div class="section-heading"><div><h2>Connections</h2><p class="note">Credentials stay encrypted and are never returned to this page.</p></div></div><div class="connection-list" id="connection-list"><div class="empty-source">Loading connections…</div></div></section><section><div class="section-heading"><div><h2>Repositories</h2><p class="note">Browse only repositories granted to a connection.</p></div></div><div class="source-filters"><input id="repository-search" type="search" placeholder="Search repositories…" aria-label="Search repositories"><select id="repository-connection" aria-label="Connection"><option value="">All connections</option></select></div><div class="repository-list" id="repository-list"><div class="empty-source">No repositories synchronized yet.</div></div></section></main><aside class="source-sidebar source-stack"><section class="panel"><div class="section-heading"><div><h2>Application bindings</h2><p class="note">Branch, tag, root, and watched-path rules.</p></div></div><div class="binding-list" id="binding-list"><div class="note">No source bindings.</div></div></section><section class="panel"><div class="section-heading"><div><h2>Webhook delivery</h2><p class="note">Verified, replay-safe event history.</p></div></div><div class="webhook-list" id="webhook-list"><div class="note">No webhooks configured.</div></div></section></aside></div><p class="status-line" id="page-status" role="status"></p></div><dialog class="source-dialog" id="connection-dialog"><form id="connection-form"><div><h2>Add Git connection</h2><p class="note">Request read-only repository metadata/content and webhook scopes whenever the provider permits it.</p></div><div class="form-grid"><label>Provider<select name="provider"><option value="github">GitHub App</option><option value="gitlab">GitLab</option><option value="bitbucket">Bitbucket</option><option value="gitea">Gitea</option><option value="generic_https">Generic HTTPS</option><option value="generic_ssh">Generic SSH</option></select></label><label>Connection name<input name="name" maxlength="80" required placeholder="Production GitHub"></label></div><div class="form-grid"><label>Host<input name="host" type="url" required value="https://github.com"></label><label>Owner / workspace<input name="owner" placeholder="acme"></label></div><div data-app-fields><div class="form-grid"><label>GitHub App ID<input name="appId" autocomplete="off"></label><label>Installation ID<input name="installationId" autocomplete="off"></label></div><label>GitHub App private key<textarea name="privateKey" rows="4" autocomplete="off" spellcheck="false"></textarea></label></div><div data-token-fields hidden><div class="form-grid"><label>Access token<input name="token" type="password" autocomplete="new-password"></label><label>Token username (optional)<input name="username" autocomplete="off"></label></div></div><div data-generic-fields hidden><div class="form-grid"><label>Repository name<input name="repositoryFullName" placeholder="acme/web"></label><label>Default branch<input name="defaultBranch" value="main"></label></div><label>Credential-free clone URL<input name="repositoryUrl" placeholder="https://git.example/acme/web.git"></label></div><div data-ssh-fields hidden><label>Deploy key name<input name="deployKeyName" maxlength="80" placeholder="Readonly production"></label><label>Public key<textarea name="publicKey" rows="2" autocomplete="off" spellcheck="false" placeholder="ssh-ed25519 …"></textarea></label><label>Private key<textarea name="deployPrivateKey" rows="4" autocomplete="off" spellcheck="false" placeholder="-----BEGIN OPENSSH PRIVATE KEY-----"></textarea></label><div class="form-grid"><label>SSH host<input name="sshHost" placeholder="git.example"></label><label>Pinned host key<textarea name="hostKey" rows="2" autocomplete="off" spellcheck="false" placeholder="ssh-ed25519 …"></textarea></label></div></div><p class="secret-note">Tokens and private keys are encrypted at rest. Clone URLs containing credentials are rejected.</p><div class="dialog-actions"><button class="btn ghost" type="button" data-close>Cancel</button><button class="btn" type="submit">Connect</button></div><p class="status-line" id="connection-status" role="status"></p></form></dialog><dialog class="source-dialog" id="binding-dialog"><form id="binding-form"><div><h2>Bind repository</h2><p class="note" id="binding-repository"></p></div><input type="hidden" name="connectionId"><input type="hidden" name="repositoryId"><input type="hidden" name="repositoryFullName"><div class="form-grid"><label>Application<select name="resourceId" required></select></label><label>Deploy branch<select name="defaultBranch" required><option>main</option></select></label></div><div class="form-grid"><label>Branch rule<input name="branchRule" placeholder="main or release/**"></label><label>Tag rule<input name="tagRule" placeholder="v*"></label></div><div class="form-grid"><label>Monorepo root<input name="monorepoRoot" value="." placeholder="apps/web"></label><label>SSH deploy key<select name="deployKeyId"><option value="">Provider credential / none</option></select></label></div><div class="form-grid"><label>Include paths<textarea name="includePaths" rows="3" placeholder="apps/web/** packages/shared/**"></textarea></label><label>Exclude paths<textarea name="excludePaths" rows="3" placeholder="**/*.md docs/**"></textarea></label></div><div class="form-grid"><label>Clone history<select name="cloneDepth"><option value="20">Shallow · 20 commits</option><option value="1">Shallow · latest commit</option><option value="">Full history</option></select></label><label>Event types<select name="events"><option value="push,pr">Push + pull request</option><option value="push">Push only</option><option value="pr">Pull request only</option></select></label></div><div class="check-grid"><label><input type="checkbox" name="submodules"> Include submodules</label><label><input type="checkbox" name="autoDeploy" checked> Auto-deploy pushes</label></div><div class="dialog-actions"><button class="btn ghost" type="button" data-close>Cancel</button><button class="btn" type="submit">Create binding</button></div><p class="status-line" id="binding-status" role="status"></p></form></dialog><dialog class="source-dialog" id="rotate-dialog"><form id="rotate-form"><div><h2>Rotate credential</h2><p class="note" id="rotate-name"></p></div><input type="hidden" name="id"><label>Replacement access token<input name="token" type="password" autocomplete="new-password"></label><label>Credential expiry (optional)<input name="expiresAt" type="datetime-local"></label><p class="secret-note">The old encrypted credential is replaced immediately. Test the connection after rotation.</p><div class="dialog-actions"><button class="btn ghost" type="button" data-close>Cancel</button><button class="btn" type="submit">Rotate</button></div><p class="status-line" id="rotate-status"></p></form></dialog><dialog class="source-dialog" id="disconnect-dialog"><form id="disconnect-form"><div><h2>Disconnect source</h2><p class="note">Dependent automatic deploys will be disabled; they never fall back to another credential.</p></div><input type="hidden" name="id"><div class="impact-list" id="impact-list"></div><div class="dialog-actions"><button class="btn ghost" type="button" data-close>Cancel</button><button class="btn danger" type="submit">Disconnect and disable</button></div><p class="status-line" id="disconnect-status"></p></form></dialog> <script data-stx-scoped data-stx-run="always">
|
|
355
355
|
;(function() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv3cwav94m73g"><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 & 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_1789018389812_2() {
|
|
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=
|
|
192
|
-
if(window.stx)window.stx._latestSetup=
|
|
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="
|
|
191
|
+
window.__stx_latestSetup=__stx_setup_1789018389812_2;
|
|
192
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1789018389812_2;
|
|
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_1789018389812_2"><a data-stx-scope="stx_scope_nav_3" 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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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 = [];
|
|
@@ -541,6 +541,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1789014266027_4;
|
|
|
541
541
|
|
|
542
542
|
|
|
543
543
|
try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
|
|
544
|
-
window.stx._scopes['
|
|
544
|
+
window.stx._scopes['stx_scope_nav_3'] = __scopeRegistration;
|
|
545
545
|
})();
|
|
546
546
|
</script> <main class="alert-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Alerts & health</div><header class="page"><div><h1>Alerts & health</h1><p>Health checks, stateful alert evaluation, ownership, silences, routing, and delivery diagnostics.</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></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!pollingError()" x-cloak>{{ pollingError() }}</p><nav class="tabs" aria-label="Alert workspace"><button :class="{active:tab()==='alerts'}" @click="tab.set('alerts')">Alerts</button><button :class="{active:tab()==='health'}" @click="tab.set('health')">Health checks</button><button :class="{active:tab()==='rules'}" @click="tab.set('rules')">Rules</button><button :class="{active:tab()==='routing'}" @click="tab.set('routing')">Channels & routing</button><button :class="{active:tab()==='delivery'}" @click="tab.set('delivery')">Delivery</button></nav><section @show="tab()==='alerts'" x-cloak><div class="summary"><article class="panel"><b>Firing</b><strong x-cloak>{{ alerts().filter(x=>x.state==='firing').length }}</strong></article><article class="panel"><b>Pending</b><strong x-cloak>{{ alerts().filter(x=>x.state==='pending').length }}</strong></article><article class="panel"><b>Silenced</b><strong x-cloak>{{ alerts().filter(x=>x.state==='silenced').length }}</strong></article><article class="panel"><b>Resolved</b><strong x-cloak>{{ alerts().filter(x=>x.state==='resolved').length }}</strong></article></div><div class="cards-list" x-cloak><template :for="item in alerts()"><article class="alert-card panel" x-cloak><div x-cloak><span class="pill" :class="tone(item.state)" x-cloak>{{ item.state }}</span><span class="pill" x-cloak>{{ item.severity }}</span><h2 x-cloak>{{ item.title }}</h2></div><p class="note" x-cloak>First {{ new Date(item.firstSeenAt).toLocaleString() }} · last {{ new Date(item.lastSeenAt).toLocaleString() }} · duration {{ duration(item) }} · occurrences {{ item.occurrenceCount }}</p><pre x-cloak>{{ JSON.stringify(item.evidence,null,2) }}</pre><div class="meta" x-cloak><span x-cloak>Owner {{ item.ownerActorId||'unassigned' }}</span><span x-cloak>{{ item.acknowledgedAt?'Acknowledged '+new Date(item.acknowledgedAt).toLocaleString():'Unacknowledged' }}</span></div><div class="actions"><button class="btn ghost sm" @show="!item.acknowledgedAt" @click="alertAction(item.id,'acknowledge')" x-cloak>Acknowledge</button><button class="btn ghost sm" @click="alertAction(item.id,'assign',{ownerActorId:'me'})">Assign to me</button><button class="btn ghost sm" @show="item.state==='firing'" @click="alertAction(item.id,'silence',{until:new Date(Date.now()+3600000).toISOString()})" x-cloak>Silence 1h</button><a class="btn ghost sm" :href="'/operations/observability?releaseId='+encodeURIComponent(item.evidence?.releaseId||'')">Correlate</a></div></article></template><div class="empty panel" @show="!alerts().length" x-cloak><strong>No alerts</strong><span>Healthy and empty are distinct. Add a check or metric rule to begin evaluation.</span></div></div></section><section @show="tab()==='health'" class="split" x-cloak><div x-cloak><template :for="item in checks()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="tone(item.results?.[0]?.status==='unhealthy'?'firing':item.results?.[0]?.status||'pending')" x-cloak>{{ item.results?.[0]?.status||'no data' }}</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ item.kind }} · {{ item.target }}</code></div><p class="note" x-cloak>every {{ item.intervalSeconds }}s · timeout {{ item.timeoutSeconds }}s · fail {{ item.failureThreshold }} / recover {{ item.recoveryThreshold }} · agents {{ item.regions.join(', ')||'local' }}</p><div class="actions"><button class="btn ghost sm" @click="runCheck(item.id,true)">Preview/test</button><button class="btn ghost sm" @click="runCheck(item.id,false)">Run & evaluate</button><button class="btn ghost sm" @click="toggle('/api/health/checks',item.id,!item.enabled)" x-cloak>{{ item.enabled?'Disable':'Enable' }}</button></div></article></template></div><form class="editor panel" @submit="submitHealth($event)"><h2>New health check</h2><label>Name<input name="name" required></label><label>Kind<select name="kind"><option>http</option><option>tcp</option><option>command</option></select></label><label>Target<input name="target" required placeholder="https://app.example/health or host"></label><label>HTTP method<input name="method" value="GET"></label><label>Expected statuses<input name="expectedStatuses" value="200"></label><label>Expected body (optional)<input name="expectedBody"></label><label>TCP port<input name="port" type="number"></label><label>Command argv (admin only)<input name="command" placeholder="/usr/bin/systemctl is-active app"></label><label>Interval seconds<input name="intervalSeconds" type="number" min="10" value="60"></label><label>Timeout seconds<input name="timeoutSeconds" type="number" min="1" value="10"></label><label>Failure threshold<input name="failureThreshold" type="number" min="1" value="3"></label><label>Recovery threshold<input name="recoveryThreshold" type="number" min="1" value="2"></label><label>Agents / regions<input name="regions" value="local"></label><button class="btn" type="submit">Create check</button><p class="note">Preview/test records no production incident. Commands are argv-only and never run through a shell.</p></form></section><section @show="tab()==='rules'" class="split" x-cloak><div x-cloak><template :for="item in rules()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" x-cloak>{{ item.severity }}</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ item.signal }} {{ item.operator }} {{ item.threshold??'unhealthy' }}</code></div><p class="note" x-cloak>{{ item.consecutive }} failures · {{ item.recoveryConsecutive }} recoveries · no-data {{ item.noDataPolicy }} · v{{ item.version }}</p><button class="btn ghost sm" @click="toggle('/api/alerts/rules',item.id,!item.enabled)" x-cloak>{{ item.enabled?'Disable':'Enable' }}</button></article></template></div><form class="editor panel" @submit="submitRule($event)"><h2>New alert rule</h2><label>Name<input name="name" required></label><label>Health check<select name="healthCheckId"><option value="">Metric query</option><template :for="check in checks()"><option :value="check.id">{{ check.name }}</option></template></select></label><label>Metric signal<input name="signal" placeholder="errors.count"></label><label>Operator<select name="operator"><option value="unhealthy">unhealthy</option><option value="gt">greater than</option><option value="gte">greater/equal</option><option value="lt">less than</option><option value="lte">less/equal</option></select></label><label>Threshold<input name="threshold" type="number" step="any"></label><label>Recovery threshold<input name="recoveryThreshold" type="number" step="any"></label><label>Window minutes<input name="windowMinutes" type="number" value="5"></label><label>Consecutive failures<input name="consecutive" type="number" min="1" value="3"></label><label>Consecutive recoveries<input name="recoveryConsecutive" type="number" min="1" value="2"></label><label>No data<select name="noDataPolicy"><option>pending</option><option>ignore</option><option>firing</option></select></label><label>Severity<select name="severity"><option>warning</option><option>critical</option><option>info</option></select></label><label>Group by<input name="groupBy" placeholder="resourceId,region"></label><button class="btn" type="submit">Create rule</button></form></section><section @show="tab()==='routing'" class="routing-grid" x-cloak><div><h2>Channels</h2><template :for="item in channels()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ item.kind }} · credential {{ item.credentialFingerprint||'none' }}</code></div><div class="actions"><button class="btn ghost sm" @click="testChannel(item.id)">Test</button><button class="btn ghost sm" @click="toggleChannel(item.id,item.status==='active'?'paused':'active')" x-cloak>{{ item.status==='active'?'Pause':'Resume' }}</button></div><p class="bad note" @show="!!item.lastError" x-cloak>{{ item.lastError }}</p></article></template><form class="editor panel" @submit="submitChannel($event)"><h3>New channel</h3><label>Name<input name="name" required></label><label>Type<select name="kind"><option>slack</option><option>discord</option><option>teams</option><option>telegram</option><option>email</option><option>webhook</option></select></label><label>Destination (email recipients or Telegram chat ID)<input name="destination"></label><label>From (email)<input name="from"></label><label>Encrypted credential<input name="credential" type="password" autocomplete="new-password" placeholder="Webhook URL, bot token, or {url,signingSecret}"></label><button class="btn" type="submit">Create channel</button></form></div><div><h2>Routing rules</h2><template :for="item in routes()"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" x-cloak>priority {{ item.priority }}</span><b x-cloak>{{ item.name }}</b></div><p class="note" x-cloak>{{ item.channelIds.length }} channels · quiet {{ item.quietHours?item.quietHours.start+'–'+item.quietHours.end+' '+item.quietHours.timezone:'off' }} · reminder {{ item.reminderSeconds?item.reminderSeconds+'s':'off' }} · limit {{ item.rateLimitPerMinute }}/min</p><button class="btn ghost sm" @click="toggle('/api/notifications/routes',item.id,!item.enabled)" x-cloak>{{ item.enabled?'Disable':'Enable' }}</button></article></template><form class="editor panel" @submit="submitRoute($event)"><h3>New route</h3><label>Name<input name="name" required></label><label>Priority<input name="priority" type="number" value="0"></label><label>Severity<select name="severity"><option value="">Any</option><option>critical</option><option>warning</option><option>info</option></select></label><label>Event<select name="eventType"><option value="">Any</option><option>firing</option><option>resolved</option><option>reminder</option><option>escalation</option></select></label><label x-cloak>Channel<select name="channelId" required><template :for="channel in channels()"><option :value="channel.id">{{ channel.name }}</option></template></select></label><label>Quiet start<input name="quietStart" type="time"></label><label>Quiet end<input name="quietEnd" type="time"></label><label>Timezone<input name="timezone" value="UTC"></label><label>Group wait seconds<input name="groupWaitSeconds" type="number" value="30"></label><label>Reminder minutes<input name="reminderMinutes" type="number"></label><label>Rate limit / minute<input name="rateLimitPerMinute" type="number" min="1" value="60"></label><label x-cloak>Message template<input name="template" placeholder="[{{severity}}] {{title}} · {{state}}"></label><button class="btn" type="submit">Create route</button></form></div></section><section @show="tab()==='delivery'" x-cloak><div class="panel table-wrap"><table><thead><tr><th scope="col">Updated</th><th scope="col">Event</th><th scope="col">Channel</th><th scope="col">State</th><th scope="col">Attempts</th><th scope="col">Diagnostic</th><th scope="col">Actions</th></tr></thead><tbody><template :for="item in deliveries()"><tr><td x-cloak>{{ new Date(item.updatedAt).toLocaleString() }}</td><td x-cloak>{{ item.eventType }}</td><td class="mono" x-cloak>{{ item.channelId }}</td><td x-cloak><span class="pill" :class="tone(item.state)" x-cloak>{{ item.state }}</span></td><td x-cloak>{{ item.attempt }}/{{ item.maxAttempts }}</td><td x-cloak>{{ item.error||item.responseStatus||'—' }}</td><td><button class="btn ghost sm" @show="item.state!=='delivered'" @click="retry(item.id)" x-cloak>Retry</button></td></tr></template></tbody></table><div class="empty" @show="!deliveries().length" x-cloak><strong>No notification deliveries</strong><span>Channel tests are tracked on the channel and do not create fake incidents.</span></div></div></section></main><style> .alert-wrap{max-width:1450px}.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)}.summary{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.summary article{display:grid;gap:8px}.summary strong{font-size:28px}.cards-list{display:grid;gap:10px;margin-top:12px}.alert-card h2{display:inline;font-size:17px;margin-left:8px}.alert-card pre{max-height:150px;overflow:auto;background:var(--bg2);padding:10px;border-radius:8px}.meta,.actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.meta{justify-content:space-between;color:var(--txt3);font-size:11px}.split,.routing-grid{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(300px,1fr);gap:14px}.row-card{margin-bottom:9px}.row-card>div:first-child{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.row-card code{color:var(--txt3)}.editor{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-content:start;position:sticky;top:10px}.editor h2,.editor h3,.editor .note,.editor button{grid-column:1/-1}.editor label{display:grid;gap:5px;color:var(--txt3);font-size:11px}.editor input,.editor select{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:8px}.routing-grid>div>h2{margin-top:0}.table-wrap{overflow:auto}.mono{font-family:var(--mono);font-size:11px}@media(max-width:850px){.summary{grid-template-columns:repeat(2,1fr)}.split,.routing-grid{grid-template-columns:1fr}.editor{position:static}}@media(max-width:520px){.summary{grid-template-columns:1fr}.editor{grid-template-columns:1fr}.editor>*{grid-column:1!important}} </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="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv3cwav94m73g"><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 & 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_1789018389811_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=
|
|
270
|
-
if(window.stx)window.stx._latestSetup=
|
|
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="
|
|
269
|
+
window.__stx_latestSetup=__stx_setup_1789018389811_1;
|
|
270
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1789018389811_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_1789018389811_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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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 = [];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv3cwav94m73g"><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 & 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_1789018390725_8() {
|
|
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=
|
|
319
|
-
if(window.stx)window.stx._latestSetup=
|
|
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="
|
|
318
|
+
window.__stx_latestSetup=__stx_setup_1789018390725_8;
|
|
319
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1789018390725_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_1789018390725_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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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_1789014266972_14;
|
|
|
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['
|
|
671
|
+
window.stx._scopes['stx_scope_nav_11'] = __scopeRegistration;
|
|
672
672
|
})();
|
|
673
673
|
</script> <main class="jobs-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Workers & schedules</div><header class="page"><div><h1>Workers & 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>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mtv3cwav94m73g"><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 · Maintenance & disaster recovery</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_1789018390837_16() {
|
|
3
3
|
const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
|
|
4
4
|
|
|
5
5
|
const data = state({ manifests: [], windows: [], campaigns: [], cleanups: [], drills: [] }), tab = state("upgrades"), error = state(""), notice = state(""), busy = state(false);
|
|
@@ -60,9 +60,9 @@ function bytes(value) {
|
|
|
60
60
|
|
|
61
61
|
return { data, api, load, pollingState, pollingError, lastUpdatedAt, refresh, post, preview, cleanup, drill, runDrill, tone, bytes };
|
|
62
62
|
}
|
|
63
|
-
window.__stx_latestSetup=
|
|
64
|
-
if(window.stx)window.stx._latestSetup=
|
|
65
|
-
</script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.b7a99a5c.css"></head><body data-stx="
|
|
63
|
+
window.__stx_latestSetup=__stx_setup_1789018390837_16;
|
|
64
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1789018390837_16;
|
|
65
|
+
</script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.b7a99a5c.css"></head><body data-stx="__stx_setup_1789018390837_16"><a data-stx-scope="stx_scope_nav_20" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="active" 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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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">
|
|
66
66
|
(function() {
|
|
67
67
|
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;
|
|
68
68
|
var __destroyHooks = [];
|