@chisquare-tech/origine-ngx-apps-services 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -636,9 +636,13 @@ class ServicesNewPage {
|
|
|
636
636
|
<span class="o-hint">Injects {{ engine()?.envVar }} into the app and redeploys it.</span>
|
|
637
637
|
</div>
|
|
638
638
|
<div class="o-g2">
|
|
639
|
-
|
|
640
|
-
<
|
|
641
|
-
|
|
639
|
+
@if (engine()?.id === 'mysql') {
|
|
640
|
+
<div class="o-fld"><label>Backups</label><input class="o-in" value="Every hour" readonly aria-label="Backups" /></div>
|
|
641
|
+
} @else {
|
|
642
|
+
<div class="o-fld"><label for="svc-hour">Daily backup at</label>
|
|
643
|
+
<select id="svc-hour" class="o-in" [ngModel]="hour()" (ngModelChange)="hour.set(+$event)">@for (h of hours; track h) {<option [ngValue]="h">{{ utc(h) }}</option>}</select>
|
|
644
|
+
</div>
|
|
645
|
+
}
|
|
642
646
|
<div class="o-fld"><label for="svc-keep">Retention</label>
|
|
643
647
|
<select id="svc-keep" class="o-in" [ngModel]="keep()" (ngModelChange)="keep.set(+$event)">@for (d of keeps; track d) {<option [ngValue]="d">{{ d }} days</option>}</select>
|
|
644
648
|
</div>
|
|
@@ -658,7 +662,7 @@ class ServicesNewPage {
|
|
|
658
662
|
<span class="o-k">Size</span><span>{{ plan() ? plan()!.cpu + ' vCPU · ' + ram(plan()!) + ' · ' + plan()!.diskGb + ' GB' : '' }}</span>
|
|
659
663
|
<span class="o-k">Region</span><span>{{ region() }}</span>
|
|
660
664
|
<span class="o-k">Network</span><span>Private · TLS</span>
|
|
661
|
-
<span class="o-k">Backups</span><span>Daily{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>
|
|
665
|
+
<span class="o-k">Backups</span><span>{{ engine()?.id === 'mysql' ? 'Hourly' : 'Daily' }}{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>
|
|
662
666
|
</div>
|
|
663
667
|
<div class="o-flex" style="border-top:1px solid var(--o-line-soft);padding-top:10px"><span class="o-mut">Monthly</span><b class="o-r o-mono o-md">{{ plan() ? price(plan()!.priceCents) + '/mo' : '' }}</b></div>
|
|
664
668
|
<span class="o-hint">Billed by instance hour. Free plan: one {{ catalog()?.freePlan || 'db-s-1' }}, hard limit.</span>
|
|
@@ -751,9 +755,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
751
755
|
<span class="o-hint">Injects {{ engine()?.envVar }} into the app and redeploys it.</span>
|
|
752
756
|
</div>
|
|
753
757
|
<div class="o-g2">
|
|
754
|
-
|
|
755
|
-
<
|
|
756
|
-
|
|
758
|
+
@if (engine()?.id === 'mysql') {
|
|
759
|
+
<div class="o-fld"><label>Backups</label><input class="o-in" value="Every hour" readonly aria-label="Backups" /></div>
|
|
760
|
+
} @else {
|
|
761
|
+
<div class="o-fld"><label for="svc-hour">Daily backup at</label>
|
|
762
|
+
<select id="svc-hour" class="o-in" [ngModel]="hour()" (ngModelChange)="hour.set(+$event)">@for (h of hours; track h) {<option [ngValue]="h">{{ utc(h) }}</option>}</select>
|
|
763
|
+
</div>
|
|
764
|
+
}
|
|
757
765
|
<div class="o-fld"><label for="svc-keep">Retention</label>
|
|
758
766
|
<select id="svc-keep" class="o-in" [ngModel]="keep()" (ngModelChange)="keep.set(+$event)">@for (d of keeps; track d) {<option [ngValue]="d">{{ d }} days</option>}</select>
|
|
759
767
|
</div>
|
|
@@ -773,7 +781,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
773
781
|
<span class="o-k">Size</span><span>{{ plan() ? plan()!.cpu + ' vCPU · ' + ram(plan()!) + ' · ' + plan()!.diskGb + ' GB' : '' }}</span>
|
|
774
782
|
<span class="o-k">Region</span><span>{{ region() }}</span>
|
|
775
783
|
<span class="o-k">Network</span><span>Private · TLS</span>
|
|
776
|
-
<span class="o-k">Backups</span><span>Daily{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>
|
|
784
|
+
<span class="o-k">Backups</span><span>{{ engine()?.id === 'mysql' ? 'Hourly' : 'Daily' }}{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>
|
|
777
785
|
</div>
|
|
778
786
|
<div class="o-flex" style="border-top:1px solid var(--o-line-soft);padding-top:10px"><span class="o-mut">Monthly</span><b class="o-r o-mono o-md">{{ plan() ? price(plan()!.priceCents) + '/mo' : '' }}</b></div>
|
|
779
787
|
<span class="o-hint">Billed by instance hour. Free plan: one {{ catalog()?.freePlan || 'db-s-1' }}, hard limit.</span>
|
|
@@ -1309,7 +1317,8 @@ class ServicePage {
|
|
|
1309
1317
|
const w = d.window;
|
|
1310
1318
|
if (!w?.from)
|
|
1311
1319
|
return 'Available after the first backup.';
|
|
1312
|
-
|
|
1320
|
+
const span = `Any second since ${when(w.from)}${w.to ? ' until ' + when(w.to) : ''}.`;
|
|
1321
|
+
return d.engine === 'mysql' ? `${span} MySQL's window ends at the latest hourly backup.` : span;
|
|
1313
1322
|
}
|
|
1314
1323
|
keepLine(b, days) {
|
|
1315
1324
|
if (b.kind === 'on-demand')
|
|
@@ -1557,7 +1566,7 @@ class ServicePage {
|
|
|
1557
1566
|
<div class="o-cf">{{ rotateNote() }}@if (openRotation(); as r) {@if (d.canManage) { · <button type="button" class="o-lnk" (click)="retire(d, r)" [disabled]="busy()">Retire the old password now</button>}}</div>
|
|
1558
1567
|
</div>
|
|
1559
1568
|
<div class="o-card">
|
|
1560
|
-
<div class="o-ch"><b>Backups</b><span class="o-r">Daily · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>
|
|
1569
|
+
<div class="o-ch"><b>Backups</b><span class="o-r">{{ d.engine === 'mysql' ? 'Hourly' : 'Daily' }} · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>
|
|
1561
1570
|
@for (b of backups().slice(0, 3); track b.name) {
|
|
1562
1571
|
<div class="o-row"><span>{{ when(b.startedAt) || 'Pending' }}</span><span class="o-faint">{{ backupNote(b) }}</span><span class="o-chip">{{ kind(b) }}</span>@if (b.phase === 'completed' && d.canManage) {<button type="button" class="o-lnk o-r" (click)="askRestore(d, b)">Restore to new instance</button>}</div>
|
|
1563
1572
|
} @empty {<div class="o-empty">The first backup is taken once {{ d.name }} is running.</div>}
|
|
@@ -1627,7 +1636,11 @@ class ServicePage {
|
|
|
1627
1636
|
<div class="o-card o-cb o-form">
|
|
1628
1637
|
<b>Schedule</b>
|
|
1629
1638
|
<div class="o-g2">
|
|
1630
|
-
|
|
1639
|
+
@if (d.engine === 'mysql') {
|
|
1640
|
+
<div class="o-fld"><label>Runs</label><input class="o-in" value="Every hour, on the hour" readonly aria-label="Runs" /><span class="o-hint">MySQL restores to any second up to the latest backup: at most an hour behind.</span></div>
|
|
1641
|
+
} @else {
|
|
1642
|
+
<div class="o-fld"><label for="svc-bh">Daily at</label><select id="svc-bh" class="o-in" [disabled]="!d.canManage" [ngModel]="d.backupHour" (ngModelChange)="save(d, { backupHour: +$event }, 'Backups now run daily at ' + utc(+$event) + '.')">@for (h of hours; track h) {<option [ngValue]="h">{{ utc(h) }}</option>}</select></div>
|
|
1643
|
+
}
|
|
1631
1644
|
<div class="o-fld"><label for="svc-rd">Keep for</label><select id="svc-rd" class="o-in" [disabled]="!d.canManage" [ngModel]="d.retentionDays" (ngModelChange)="save(d, { retentionDays: +$event }, 'Backups are now kept ' + $event + ' days.')">@for (k of keeps; track k) {<option [ngValue]="k">{{ k }} days</option>}</select></div>
|
|
1632
1645
|
</div>
|
|
1633
1646
|
</div>
|
|
@@ -1822,7 +1835,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
1822
1835
|
<div class="o-cf">{{ rotateNote() }}@if (openRotation(); as r) {@if (d.canManage) { · <button type="button" class="o-lnk" (click)="retire(d, r)" [disabled]="busy()">Retire the old password now</button>}}</div>
|
|
1823
1836
|
</div>
|
|
1824
1837
|
<div class="o-card">
|
|
1825
|
-
<div class="o-ch"><b>Backups</b><span class="o-r">Daily · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>
|
|
1838
|
+
<div class="o-ch"><b>Backups</b><span class="o-r">{{ d.engine === 'mysql' ? 'Hourly' : 'Daily' }} · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>
|
|
1826
1839
|
@for (b of backups().slice(0, 3); track b.name) {
|
|
1827
1840
|
<div class="o-row"><span>{{ when(b.startedAt) || 'Pending' }}</span><span class="o-faint">{{ backupNote(b) }}</span><span class="o-chip">{{ kind(b) }}</span>@if (b.phase === 'completed' && d.canManage) {<button type="button" class="o-lnk o-r" (click)="askRestore(d, b)">Restore to new instance</button>}</div>
|
|
1828
1841
|
} @empty {<div class="o-empty">The first backup is taken once {{ d.name }} is running.</div>}
|
|
@@ -1892,7 +1905,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
1892
1905
|
<div class="o-card o-cb o-form">
|
|
1893
1906
|
<b>Schedule</b>
|
|
1894
1907
|
<div class="o-g2">
|
|
1895
|
-
|
|
1908
|
+
@if (d.engine === 'mysql') {
|
|
1909
|
+
<div class="o-fld"><label>Runs</label><input class="o-in" value="Every hour, on the hour" readonly aria-label="Runs" /><span class="o-hint">MySQL restores to any second up to the latest backup: at most an hour behind.</span></div>
|
|
1910
|
+
} @else {
|
|
1911
|
+
<div class="o-fld"><label for="svc-bh">Daily at</label><select id="svc-bh" class="o-in" [disabled]="!d.canManage" [ngModel]="d.backupHour" (ngModelChange)="save(d, { backupHour: +$event }, 'Backups now run daily at ' + utc(+$event) + '.')">@for (h of hours; track h) {<option [ngValue]="h">{{ utc(h) }}</option>}</select></div>
|
|
1912
|
+
}
|
|
1896
1913
|
<div class="o-fld"><label for="svc-rd">Keep for</label><select id="svc-rd" class="o-in" [disabled]="!d.canManage" [ngModel]="d.retentionDays" (ngModelChange)="save(d, { retentionDays: +$event }, 'Backups are now kept ' + $event + ' days.')">@for (k of keeps; track k) {<option [ngValue]="k">{{ k }} days</option>}</select></div>
|
|
1897
1914
|
</div>
|
|
1898
1915
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chisquare-tech-origine-ngx-apps-services.mjs","sources":["../../../projects/services/src/lib/host.ts","../../../projects/services/src/lib/services.api.ts","../../../projects/services/src/lib/look.ts","../../../projects/services/src/lib/list.page.ts","../../../projects/services/src/lib/new.page.ts","../../../projects/services/src/lib/logs.tab.ts","../../../projects/services/src/lib/metrics.tab.ts","../../../projects/services/src/lib/service.page.ts","../../../projects/services/src/public-api.ts","../../../projects/services/src/chisquare-tech-origine-ngx-apps-services.ts"],"sourcesContent":["import { Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/** The project the screens are on. */\nexport interface ServicesProject {\n id: string;\n key: string;\n name: string;\n /** The caller's capabilities on the project: view, resources.manage (Maintainer+), … */\n capabilities: string[];\n /** The organization's region, as the wizard shows it (\"EU · Frankfurt\"). */\n region?: string;\n archivedAt?: string;\n}\n\n/** An app services can be attached to, with the environments it runs in. */\nexport interface ServicesApp {\n name: string;\n environments: string[];\n}\n\n/**\n * What the Services screens need from the app that mounts them (cloud/web provides it, as it\n * provides DesignHost, CodeHost, DeployHost and DebugHost): where the person is, links inside the\n * project, and the project's apps (deploy's, for \"Attach to app\"; the module never calls deploy).\n */\nexport abstract class ServicesHost {\n abstract readonly project: Signal<ServicesProject | null>;\n abstract readonly projectLoaded: Signal<boolean>;\n /** A router link to a path inside the current project ('' is its overview). */\n abstract link(path?: string): string[];\n /** The project's apps; empty when there are none (attaching then takes a typed name). */\n abstract apps(projectKey: string): Observable<ServicesApp[]>;\n /**\n * A stored series of one exporter metric for the service ([unix ms, value] points), as debug's\n * engine dashboard reads it; null when the cell keeps no telemetry (the Metrics tab then shows\n * live readings only). agg: sum, max, rate…; range: 1h, 6h, 24h, 7d.\n */\n abstract history(projectKey: string, service: string, metric: string, agg: string, range: string): Observable<[number, number][] | null>;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ApiService } from '@thescaffold/ngx-core';\nimport { Observable, map } from 'rxjs';\n\n// The services app's API (gox-apps/libs/services, mounted at /api/v1/services). Shapes mirror the Go JSON.\n\nexport type State = 'Provisioning' | 'Running' | 'Updating' | 'Maintenance' | 'Restoring' | 'Degraded' | 'Failed' | 'Suspended' | 'Deleting' | 'Deleted';\n\nexport interface EngineVersion {\n id: string;\n label: string;\n default?: boolean;\n}\n\nexport interface Engine {\n id: string;\n name: string;\n description: string;\n versions: EngineVersion[];\n envVar: string;\n pitr: boolean;\n port: number;\n available: boolean;\n tag?: string;\n databases: boolean;\n}\n\nexport interface Plan {\n id: string;\n cpu: string;\n memory: string;\n diskGb: number;\n priceCents: number;\n label: string;\n}\n\nexport interface Catalog {\n engines: Engine[];\n plans: Plan[];\n freePlan: string;\n maxDiskGb: number;\n}\n\nexport interface Quota {\n plan: string;\n used: number;\n limit: number;\n onlyPlan?: string;\n}\n\nexport interface Summary {\n id: string;\n name: string;\n engine: string;\n engineName: string;\n version: string;\n plan: string;\n planLabel: string;\n diskGb: number;\n environment: string;\n state: State;\n message?: string;\n attached: string[];\n lastBackup?: string;\n pitr: boolean;\n monthlyCents: number;\n createdAt: string;\n deletedAt?: string;\n purgeAt?: string;\n}\n\nexport interface ServiceList {\n items: Summary[];\n quota?: Quota;\n}\n\nexport interface Database {\n name: string;\n createdBy: string;\n createdAt: string;\n}\n\nexport interface UserView {\n name: string;\n preset: 'owner' | 'admin' | 'read-write' | 'read-only' | string;\n generation: number;\n rotating: boolean;\n attached: string[];\n createdAt: string;\n}\n\nexport interface Backup {\n name: string;\n kind: 'scheduled' | 'on-demand' | string;\n request?: string;\n phase: 'pending' | 'running' | 'completed' | 'failed' | string;\n startedAt?: string;\n stoppedAt?: string;\n error?: string;\n}\n\nexport interface Attachment {\n id: string;\n instanceId: string;\n environment: string;\n app: string;\n prefix: string;\n user: string;\n database: string;\n state: 'pending' | 'live' | 'failed' | string;\n message: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Rotation {\n id: string;\n user: string;\n fromGeneration: number;\n toGeneration: number;\n state: string;\n graceSeconds: number;\n graceUntil?: string;\n apps: { app: string; environment: string; state: string; message?: string }[] | null;\n message: string;\n createdAt: string;\n finishedAt?: string;\n}\n\nexport interface Connection {\n host: string;\n port: number;\n database?: string;\n user: string;\n sslMode: string;\n snippets: Record<string, string>;\n}\n\nexport interface Detail extends Summary {\n host: string;\n port: number;\n backupHour: number;\n retentionDays: number;\n maintenanceDay: string;\n maintenanceHour: number;\n publicEnabled: boolean;\n allowedCidrs: string[];\n databases: Database[];\n users: UserView[] | null;\n backups: Backup[] | null;\n window?: { from?: string; to?: string };\n attachments: Attachment[];\n connection?: Connection;\n rotations: Rotation[];\n restoreOf?: Summary;\n restorePoint?: string;\n restoreBackup?: string;\n provisionedAt?: string;\n finalBackup: boolean;\n canManage: boolean;\n}\n\nexport interface Revealed {\n user: string;\n login: string;\n generation: number;\n password: string;\n connection: Connection;\n}\n\nexport interface Gauge {\n used: number | null;\n limit: number;\n percent: number | null;\n unit: string;\n source?: 'volume' | 'engine';\n}\n\nexport interface Figure {\n key: string;\n label: string;\n value: number;\n unit: string;\n counter?: boolean;\n rate?: number;\n}\n\nexport interface PodView {\n name: string;\n role: string;\n ready: boolean;\n restarts: number;\n startedAt?: string;\n cpuCores: number;\n memoryBytes: number;\n}\n\nexport interface Metrics {\n at: string;\n state: State;\n available: boolean;\n message?: string;\n pods: PodView[];\n cpu?: Gauge;\n memory?: Gauge;\n disk?: Gauge;\n connections?: Gauge;\n figures: Figure[];\n}\n\nexport type LogKind = 'all' | 'errors' | 'slow' | 'connections';\n\nexport interface LogLine {\n time: string;\n pod: string;\n level: string;\n kind: 'error' | 'slow' | 'connection' | 'log';\n message: string;\n}\n\nexport interface Logs {\n kind: LogKind;\n available: boolean;\n message?: string;\n lines: LogLine[];\n}\n\nexport interface CreateInput {\n name: string;\n engine: string;\n version?: string;\n plan: string;\n environment?: string;\n database?: string;\n backupHour?: number;\n retentionDays?: number;\n attach?: { app: string; environment?: string; prefix?: string };\n}\n\nexport interface UpdateInput {\n plan?: string;\n diskGb?: number;\n backupHour?: number;\n retentionDays?: number;\n maintenanceDay?: string;\n maintenanceHour?: number;\n publicEnabled?: boolean;\n allowedCidrs?: string[];\n}\n\nconst S = 'v1/services';\nconst enc = encodeURIComponent;\nconst data = <T>(r: any): T => r?.data as T;\n\nexport function apiMessage(err: any, fallback = 'Something went wrong. Try again.'): string {\n return err?.error?.message || err?.body?.message || err?.message || fallback;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ServicesApi {\n private readonly api = inject(ApiService);\n\n private i(project: string, id = '', path = '') {\n return `${S}/project/${enc(project)}/instance${id ? '/' + enc(id) : ''}${path ? '/' + path : ''}`;\n }\n\n catalog(): Observable<Catalog> {\n return this.api.get(`${S}/catalog`).pipe(map((r) => data<Catalog>(r)));\n }\n list(project: string): Observable<ServiceList> {\n return this.api.get(this.i(project)).pipe(map((r) => data<ServiceList>(r) ?? { items: [] }));\n }\n get(project: string, id: string): Observable<Detail> {\n return this.api.get(this.i(project, id)).pipe(map((r) => data<Detail>(r)));\n }\n create(project: string, body: CreateInput): Observable<Detail> {\n return this.api.post(this.i(project), body).pipe(map((r) => data<Detail>(r)));\n }\n update(project: string, id: string, body: UpdateInput): Observable<Detail> {\n return this.api.patch(this.i(project, id), body).pipe(map((r) => data<Detail>(r)));\n }\n remove(project: string, id: string, confirm: string, finalBackup: boolean): Observable<Detail> {\n return this.api.post(this.i(project, id, 'delete'), { confirm, finalBackup }).pipe(map((r) => data<Detail>(r)));\n }\n undelete(project: string, id: string): Observable<Detail> {\n return this.api.post(this.i(project, id, 'undelete'), {}).pipe(map((r) => data<Detail>(r)));\n }\n reveal(project: string, id: string, user = ''): Observable<Revealed> {\n return this.api.post(this.i(project, id, 'reveal'), user ? { user } : {}).pipe(map((r) => data<Revealed>(r)));\n }\n addDatabase(project: string, id: string, name: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'database'), { name });\n }\n removeDatabase(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'database/' + enc(name)));\n }\n addUser(project: string, id: string, name: string, preset: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'user'), { name, preset });\n }\n removeUser(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'user/' + enc(name)));\n }\n rotate(project: string, id: string, user = '', graceMinutes?: number): Observable<Rotation> {\n return this.api.post(this.i(project, id, 'rotate'), { user, graceMinutes }).pipe(map((r) => data<Rotation>(r)));\n }\n retire(project: string, id: string, rotation: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'rotation/' + enc(rotation) + '/retire'), {});\n }\n backupNow(project: string, id: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'backup'), {});\n }\n deleteBackup(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'backup/' + enc(name)));\n }\n restore(project: string, id: string, body: { pointInTime?: string; backup?: string; name?: string }): Observable<Detail> {\n return this.api.post(this.i(project, id, 'restore'), body).pipe(map((r) => data<Detail>(r)));\n }\n attach(project: string, id: string, body: { app: string; environment?: string; prefix?: string }): Observable<Attachment> {\n return this.api.post(this.i(project, id, 'attachment'), body).pipe(map((r) => data<Attachment>(r)));\n }\n detach(project: string, id: string, attachment: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'attachment/' + enc(attachment)));\n }\n swap(project: string, id: string, from: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'swap'), { from });\n }\n metrics(project: string, id: string): Observable<Metrics> {\n return this.api.get(this.i(project, id, 'metrics')).pipe(map((r) => data<Metrics>(r)));\n }\n logs(project: string, id: string, kind: LogKind, limit = 200): Observable<Logs> {\n return this.api.get(this.i(project, id, 'logs'), { kind, limit }).pipe(map((r) => data<Logs>(r)));\n }\n}\n","import { Backup, Gauge, State, Summary } from './services.api';\n\n// Small helpers the Services screens share; colours and wording follow the prototype.\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** The prototype's engine squares: Postgres accent, MySQL amber, Valkey red. */\nexport const ENGINE_COLOUR: Record<string, string> = {\n postgres: 'var(--o-acc)', mysql: 'var(--o-run)', valkey: 'var(--o-bad-solid)', nats: 'var(--o-ok)', rabbitmq: 'var(--o-run)',\n};\n\n/** State chips (prototype stCls): green running, blue in motion, amber attention, red failing or going. */\nconst STATE_CLASS: Record<string, string> = {\n Running: 'o-grn', Provisioning: 'o-blu', Restoring: 'o-blu', Updating: 'o-blu', Maintenance: 'o-amb', Degraded: 'o-amb', Suspended: 'o-amb',\n Failed: 'o-red', Deleting: 'o-red', Deleted: 'o-red',\n};\nexport function stateChip(s: State | string): string {\n return 'o-chip ' + (STATE_CLASS[s] ?? '');\n}\nexport function stateDot(s: State | string): string {\n const c = STATE_CLASS[s];\n return 'o-dot ' + (c === 'o-grn' ? 'o-grn' : c === 'o-blu' ? 'o-blu' : c === 'o-red' ? 'o-red' : 'o-amb');\n}\n/** States that change by themselves: the screens poll while one shows. */\nexport function moving(s: State | string): boolean {\n return ['Provisioning', 'Updating', 'Restoring', 'Deleting', 'Maintenance'].includes(s);\n}\n\nexport const LIFECYCLE = 'Provisioning · Running · Updating · Maintenance · Restoring · Degraded · Failed · Deleting';\n\nexport function money(cents: number): string {\n const d = cents / 100;\n return '$' + (Number.isInteger(d) ? d.toFixed(0) : d.toFixed(2));\n}\n\nexport function bytes(v: number | null | undefined): string {\n if (v == null || Number.isNaN(v)) return '–';\n const u = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n let x = v;\n while (x >= 1024 && i < u.length - 1) {\n x /= 1024;\n i++;\n }\n return `${x >= 100 || i === 0 ? x.toFixed(0) : x.toFixed(1)} ${u[i]}`;\n}\n\nexport function num(v: number | null | undefined, digits = 0): string {\n if (v == null || Number.isNaN(v)) return '–';\n return v.toLocaleString('en-US', { maximumFractionDigits: digits, minimumFractionDigits: 0 });\n}\n\nexport function pct(v: number | null | undefined): string {\n if (v == null || Number.isNaN(v)) return '–';\n return `${v < 10 && v > 0 ? v.toFixed(1) : Math.round(v)}%`;\n}\n\n/** \"42 / 100\" for a count gauge. */\nexport function ratio(g?: Gauge): string {\n if (!g || g.used == null) return '–';\n return `${num(g.used)} / ${num(g.limit)}`;\n}\n\nfunction pad(n: number) {\n return String(n).padStart(2, '0');\n}\n\nexport function hhmm(iso: string | number): string {\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${pad(t.getHours())}:${pad(t.getMinutes())}`;\n}\n\nexport function hhmmss(iso: string | number): string {\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${hhmm(iso)}:${pad(t.getSeconds())}`;\n}\n\nexport function shortDate(iso?: string): string {\n if (!iso) return '';\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}`;\n}\n\n/** \"Today 03:00\", \"Yesterday 03:00\", \"Oct 26, 03:00\". */\nexport function when(iso?: string, now = Date.now()): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const d = new Date(t);\n if (d.toDateString() === new Date(now).toDateString()) return `Today ${hhmm(iso)}`;\n if (d.toDateString() === new Date(now - 86400000).toDateString()) return `Yesterday ${hhmm(iso)}`;\n return `${shortDate(iso)}, ${hhmm(iso)}`;\n}\n\n/** The hour as the wizard and schedule show it: \"03:00 UTC\". */\nexport function utcHour(h: number): string {\n return `${pad(h)}:00 UTC`;\n}\n\n/** The list's Backups column: \"Today 03:00 · PITR\", or when the first one comes. */\nexport function backupsLine(s: Summary): string {\n if (!s.lastBackup) return s.state === 'Provisioning' ? 'first backup after provisioning' : 'none yet';\n return when(s.lastBackup) + (s.pitr ? ' · PITR' : ' · snapshot');\n}\n\nexport function backupKind(b: Backup): string {\n return b.kind === 'on-demand' ? 'on-demand' : 'scheduled';\n}\n\n/** <input type=\"datetime-local\"> value (local time) ↔ ISO. */\nexport function toLocalInput(iso?: string): string {\n if (!iso) return '';\n const t = new Date(iso);\n if (Number.isNaN(t.getTime())) return '';\n return `${t.getFullYear()}-${pad(t.getMonth() + 1)}-${pad(t.getDate())}T${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}`;\n}\nexport function fromLocalInput(v: string): string {\n const t = new Date(v);\n return Number.isNaN(t.getTime()) ? '' : t.toISOString();\n}\n\n/** A small SVG sparkline for values in a w×h box: the line, and the area under it. A flat series sits mid-height. */\nexport function sparkPath(values: number[], w = 200, h = 60): string {\n return spark(values, w, h).line;\n}\nexport function spark(values: number[], w = 200, h = 60): { line: string; area: string } {\n if (values.length < 2) return { line: '', area: '' };\n const min = Math.min(...values);\n const max = Math.max(...values);\n const span = max - min;\n const pts = values.map((v, i) => [(i / (values.length - 1)) * w, span ? h - 4 - ((v - min) / span) * (h - 12) : h / 2] as const);\n const line = pts.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');\n return { line, area: `${line} L${w},${h} L0,${h} Z` };\n}\n\nexport const PRESETS: { id: string; label: string }[] = [\n { id: 'read-only', label: 'read-only' },\n { id: 'read-write', label: 'read-write' },\n { id: 'admin', label: 'admin' },\n];\nexport function presetChip(p: string): string {\n return 'o-chip ' + (p === 'admin' || p === 'owner' ? 'o-red' : p === 'read-write' ? 'o-blu' : '');\n}\n\nexport const DAYS = [\n { id: 'sun', label: 'Sunday' }, { id: 'mon', label: 'Monday' }, { id: 'tue', label: 'Tuesday' }, { id: 'wed', label: 'Wednesday' },\n { id: 'thu', label: 'Thursday' }, { id: 'fri', label: 'Friday' }, { id: 'sat', label: 'Saturday' },\n];\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { ServicesHost } from './host';\nimport { ENGINE_COLOUR, LIFECYCLE, backupsLine, money, moving, stateChip } from './look';\nimport { ServiceList, ServicesApi, Summary, apiMessage } from './services.api';\n\n// /{org}/{project}/services (prototype \"services_list\"): the project's instances with their state,\n// what they are attached to, their backups and price, and the organization's quota line (SVC-01, 26).\n@Component({\n selector: 'o-services-list',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · private network · TLS enforced</span><h1 class=\"o-t\">Services</h1></div>\n <div class=\"o-acts\">\n <span class=\"o-faint o-sm\" data-testid=\"svc-quota\">{{ quotaLine() }}</span>\n @if (canManage()) {<a class=\"o-btn o-dark\" [routerLink]=\"host.link('services/new')\" data-testid=\"svc-create\">+ Create service</a>}\n </div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (created(); as c) {<div class=\"o-note\" [class.o-grn]=\"c.running\" role=\"status\" data-testid=\"svc-created\">{{ c.text }}</div>}\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" style=\"min-width:860px\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\">Name</div><div class=\"o-th\">Engine</div><div class=\"o-th\">Plan</div><div class=\"o-th\">Environment</div><div class=\"o-th\">State</div><div class=\"o-th\">Attached to</div><div class=\"o-th\">Backups</div><div class=\"o-th o-num\">Monthly</div></div></div>\n <div class=\"o-tbody\">\n @for (v of rows(); track v.id) {\n <div class=\"o-tr o-click\" (click)=\"open(v)\" (keydown.enter)=\"open(v)\" tabindex=\"0\" role=\"link\" [attr.data-testid]=\"'svc-row-' + v.name\">\n <div class=\"o-td o-b5 o-mono\">{{ v.name }}</div>\n <div class=\"o-td\"><span class=\"o-flex\"><span class=\"o-sq\" [style.background]=\"colour(v.engine)\"></span>{{ v.engineName }} {{ v.version }}</span></div>\n <div class=\"o-td o-mut o-sm\">{{ v.plan }} · {{ v.planLabel.split(' · ').slice(0, 2).join(' · ') }} · {{ v.diskGb }} GB</div>\n <div class=\"o-td o-mut\">{{ v.environment || 'shared' }}</div>\n <div class=\"o-td\"><span [class]=\"chip(v.state)\" [attr.title]=\"v.message || null\">{{ v.state }}</span></div>\n <div class=\"o-td o-sm\">{{ v.attached.length ? v.attached.join(', ') : '—' }}</div>\n <div class=\"o-td o-faint o-sm\">{{ backups(v) }}</div>\n <div class=\"o-td o-num o-mono\">{{ price(v.monthlyCents) }}</div>\n </div>\n } @empty {\n <div class=\"o-empty\">\n @if (loaded()) {\n No services yet. @if (canManage()) {<a [routerLink]=\"host.link('services/new')\">Create a database or cache</a>, attach it to an app, and it is injected as <span class=\"o-mono\">DATABASE_URL</span>.}\n } @else {Loading…}\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"o-g2\">\n <div class=\"o-card o-cb o-flex\"><span class=\"o-sq\" style=\"background:var(--o-ok)\"></span><div class=\"o-col\" style=\"gap:2px\"><b>NATS with JetStream</b><span class=\"o-faint o-sm\">Streams, consumers, KV buckets · 3-node cluster</span></div><b class=\"o-ph-tag o-ga o-r\">GA</b></div>\n <div class=\"o-card o-cb o-flex\"><span class=\"o-sq\" style=\"background:var(--o-run)\"></span><div class=\"o-col\" style=\"gap:2px\"><b>RabbitMQ</b><span class=\"o-faint o-sm\">Quorum queues · management UI through Origine</span></div><b class=\"o-ph-tag o-ga o-r\">GA</b></div>\n </div>\n <span class=\"o-faint o-sm\">Lifecycle states: {{ lifecycle }}. Open-source engines only.</span>\n </div>\n `,\n})\nexport class ServicesListPage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly router = inject(Router);\n\n protected readonly list = signal<ServiceList>({ items: [] });\n protected readonly loaded = signal(false);\n protected readonly error = signal('');\n protected readonly lifecycle = LIFECYCLE;\n protected readonly chip = stateChip;\n protected readonly colour = (e: string) => ENGINE_COLOUR[e] ?? 'var(--o-line-mid)';\n protected readonly backups = backupsLine;\n protected readonly price = money;\n\n protected readonly rows = computed(() => this.list().items.filter((s) => !s.deletedAt || s.state === 'Deleting'));\n protected readonly canManage = computed(() => this.host.project()?.capabilities.includes('resources.manage') ?? false);\n protected readonly quotaLine = computed(() => {\n const q = this.list().quota;\n if (!q) return '';\n const n = q.limit ? `${q.used} of ${q.limit} instance${q.limit === 1 ? '' : 's'}` : `${q.used} instance${q.used === 1 ? '' : 's'}`;\n return `${n} · ${q.plan} plan${q.onlyPlan ? ' · ' + q.onlyPlan + ' only' : ''}`;\n });\n\n // After the wizard: provisioning, then running (with what was injected where).\n private readonly route = inject(ActivatedRoute);\n private readonly createdName = signal(this.route.snapshot.queryParamMap.get('created') ?? '');\n private readonly createdApp = this.route.snapshot.queryParamMap.get('attached') ?? '';\n private readonly createdVar = this.route.snapshot.queryParamMap.get('envVar') ?? '';\n protected readonly created = computed(() => {\n const n = this.createdName();\n const s = n ? this.list().items.find((i) => i.name === n) : undefined;\n if (!s) return null;\n if (s.state === 'Running') {\n const inj = this.createdApp ? ` · ${this.createdVar} injected into ${this.createdApp}` : '';\n return { running: true, text: `${n} is running${inj} · dashboard and default alert rules created` };\n }\n if (s.state === 'Failed') return { running: false, text: `${n} failed to provision: ${s.message || 'see the instance page'}` };\n return { running: false, text: `${n} provisioning · usually under 5 minutes` };\n });\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n private key = '';\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p && p.key !== this.key) {\n this.key = p.key;\n untracked(() => this.load());\n }\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n private load() {\n clearTimeout(this.timer);\n const key = this.key;\n this.api.list(key).subscribe({\n next: (l) => {\n if (key !== this.key) return;\n this.list.set(l);\n this.loaded.set(true);\n this.error.set('');\n // Provisioning, resizing, restoring: look again until they settle.\n if (l.items.some((s) => moving(s.state))) this.timer = setTimeout(() => this.load(), 5000);\n },\n error: (e) => {\n this.loaded.set(true);\n this.error.set(apiMessage(e, 'Services could not be loaded.'));\n },\n });\n }\n\n protected open(v: Summary) {\n this.router.navigate(this.host.link('services/' + v.name));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesApp, ServicesHost } from './host';\nimport { money, utcHour } from './look';\nimport { Catalog, Engine, Plan, Quota, ServicesApi, apiMessage } from './services.api';\n\nconst NAME = /^[a-z]([-a-z0-9]{0,28}[a-z0-9])?$/;\nconst DEFAULT_NAME: Record<string, string> = { postgres: 'orders-db', mysql: 'ledger-mysql', valkey: 'cache' };\n\n// /{org}/{project}/services/new (prototype \"services_new\"): engine and version, size and region,\n// name and environment, with the summary and price beside it (SVC-02…05). Creating returns to the\n// list, where the instance shows Provisioning until the cell reports it Running.\n@Component({\n selector: 'o-services-new',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · ready in under 5 minutes</span><h1 class=\"o-t\">Create a service</h1></div></div>\n <div class=\"o-flex\" style=\"gap:6px\">\n @for (s of steps; track s.n; let i = $index) {\n <button type=\"button\" class=\"o-flex\" style=\"border:none;background:none;cursor:pointer;gap:8px;padding:0\" (click)=\"go(s.n)\" [attr.aria-current]=\"step() === s.n ? 'step' : null\">\n <span class=\"o-av\" [style.background]=\"s.n <= step() ? 'var(--o-tx)' : 'var(--o-line-soft)'\" [style.color]=\"s.n <= step() ? 'var(--o-acc-fg)' : 'var(--o-mut)'\">{{ s.n < step() ? '✓' : s.n }}</span>\n <span class=\"o-sm\" [style.color]=\"s.n === step() ? 'var(--o-tx)' : 'var(--o-mut)'\">{{ s.label }}</span>\n </button>\n @if (i < steps.length - 1) {<span style=\"flex:1;border-top:1px solid var(--o-line);min-width:30px\"></span>}\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-new-error\">{{ error() }}</div>}\n <div class=\"o-split\" style=\"grid-template-columns:minmax(0,1fr) 250px\">\n <div class=\"o-col\" style=\"gap:14px\">\n @if (step() === 1) {\n <div class=\"o-g2\">\n @for (e of engines(); track e.id) {\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"engine()?.id === e.id\" [class.o-dis]=\"!e.available\" (click)=\"pickEngine(e)\" [attr.data-testid]=\"'svc-engine-' + e.id\">\n <span class=\"o-rad\" [class.o-on]=\"engine()?.id === e.id\"></span>\n <div class=\"o-col\" style=\"gap:3px;flex:1\"><span class=\"o-flex\"><b>{{ e.name }}</b>@if (e.tag) {<b class=\"o-ph-tag o-ga\">{{ e.tag }}</b>}</span><span class=\"o-faint o-sm o-lh\">{{ e.description }}</span></div>\n </button>\n }\n </div>\n <div class=\"o-fld\">\n <label>Version</label>\n <div class=\"o-seg\" style=\"align-self:flex-start\">\n @for (v of engine()?.versions ?? []; track v.id) {<button type=\"button\" [class.o-on]=\"version() === v.id\" (click)=\"version.set(v.id)\">{{ v.label }}</button>}\n </div>\n <span class=\"o-hint\">Minor patches apply in your maintenance window with 7 days' notice.</span>\n </div>\n }\n @if (step() === 2) {\n <div class=\"o-card\"><div class=\"o-tbl\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\"></div><div class=\"o-th\">Plan</div><div class=\"o-th\">vCPU</div><div class=\"o-th\">RAM</div><div class=\"o-th\">Disk</div><div class=\"o-th o-num\">Monthly</div></div></div>\n <div class=\"o-tbody\">\n @for (z of plans(); track z.id) {\n <div class=\"o-tr\" [class.o-click]=\"allowed(z)\" [style.opacity]=\"allowed(z) ? 1 : 0.5\" (click)=\"pickPlan(z)\" [attr.data-testid]=\"'svc-plan-' + z.id\" [attr.title]=\"allowed(z) ? null : quota()?.plan + ' includes ' + quota()?.onlyPlan + ' only'\">\n <div class=\"o-td\"><span class=\"o-rad\" [class.o-on]=\"plan()?.id === z.id\"></span></div>\n <div class=\"o-td o-mono o-b5\">{{ z.id }}</div><div class=\"o-td\">{{ z.cpu }} vCPU</div><div class=\"o-td\">{{ ram(z) }}</div><div class=\"o-td\">{{ z.diskGb }} GB</div>\n <div class=\"o-td o-num o-mono\">{{ price(z.priceCents) }}/mo</div>\n </div>\n }\n </div>\n </div></div>\n @if (quota()?.onlyPlan) {<span class=\"o-hint\">The {{ quota()?.plan }} plan includes one {{ quota()?.onlyPlan }}. Upgrade in Billing for larger plans.</span>}\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label>Region</label><input class=\"o-in\" [value]=\"region()\" readonly aria-label=\"Region\" /></div>\n <div class=\"o-fld\"><label>High availability <b class=\"o-ph-tag o-ga\">GA</b></label><div class=\"o-flex\"><button type=\"button\" class=\"o-tog\" disabled aria-label=\"High availability (GA)\"></button><span class=\"o-sm\">Standby node with automatic failover</span></div></div>\n </div>\n }\n @if (step() === 3) {\n <div class=\"o-card o-cb o-form\">\n <div class=\"o-fld\">\n <label for=\"svc-name\">Name</label>\n <input id=\"svc-name\" class=\"o-in o-mono\" [ngModel]=\"name()\" (ngModelChange)=\"name.set($event); nameTouched.set(true)\" data-testid=\"svc-name\" autocomplete=\"off\" />\n @if (nameError()) {<span class=\"o-hint\" style=\"color:var(--o-bad-tx)\">{{ nameError() }}</span>} @else {<span class=\"o-hint\">Internal host: <b class=\"o-mono\">{{ hostName() }}</b></span>}\n </div>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label>Project</label><select class=\"o-in\" disabled aria-label=\"Project\"><option>{{ host.project()?.key }} · {{ host.project()?.name }}</option></select></div>\n <div class=\"o-fld\"><label for=\"svc-env\">Environment</label>\n <select id=\"svc-env\" class=\"o-in\" [ngModel]=\"env()\" (ngModelChange)=\"env.set($event)\" data-testid=\"svc-env\">\n @for (e of envs(); track e) {<option [value]=\"e\">{{ e }}</option>}\n </select>\n </div>\n </div>\n <div class=\"o-fld\"><label for=\"svc-attach\">Attach after create</label>\n @if (apps().length) {\n <select id=\"svc-attach\" class=\"o-in\" [ngModel]=\"attach()\" (ngModelChange)=\"attach.set($event)\" data-testid=\"svc-attach\">\n <option value=\"\">Don't attach yet</option>\n @for (a of apps(); track a.name) {<option [value]=\"a.name\">{{ a.name }}</option>}\n </select>\n } @else {\n <input id=\"svc-attach\" class=\"o-in o-mono\" placeholder=\"app name (optional)\" [ngModel]=\"attach()\" (ngModelChange)=\"attach.set($event)\" data-testid=\"svc-attach\" />\n }\n <span class=\"o-hint\">Injects {{ engine()?.envVar }} into the app and redeploys it.</span>\n </div>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"svc-hour\">Daily backup at</label>\n <select id=\"svc-hour\" class=\"o-in\" [ngModel]=\"hour()\" (ngModelChange)=\"hour.set(+$event)\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ utc(h) }}</option>}</select>\n </div>\n <div class=\"o-fld\"><label for=\"svc-keep\">Retention</label>\n <select id=\"svc-keep\" class=\"o-in\" [ngModel]=\"keep()\" (ngModelChange)=\"keep.set(+$event)\">@for (d of keeps; track d) {<option [ngValue]=\"d\">{{ d }} days</option>}</select>\n </div>\n </div>\n </div>\n }\n <div class=\"o-flex\">\n @if (step() > 1) {<button type=\"button\" class=\"o-btn\" (click)=\"go(step() - 1)\">Back</button>}\n <button type=\"button\" class=\"o-btn o-dark o-r\" (click)=\"next()\" [disabled]=\"busy() || !canNext()\" data-testid=\"svc-next\">{{ step() < 3 ? 'Continue' : 'Create ' + name() }}</button>\n </div>\n </div>\n <div class=\"o-card o-cb o-col\" style=\"gap:10px;position:sticky;top:0;align-self:start\">\n <b>Summary</b>\n <div class=\"o-kv\" style=\"grid-template-columns:70px 1fr;font-size:12px;row-gap:6px\">\n <span class=\"o-k\">Engine</span><span>{{ engine()?.name }} {{ versionLabel() }}</span>\n <span class=\"o-k\">Plan</span><span class=\"o-mono\">{{ plan()?.id }}</span>\n <span class=\"o-k\">Size</span><span>{{ plan() ? plan()!.cpu + ' vCPU · ' + ram(plan()!) + ' · ' + plan()!.diskGb + ' GB' : '' }}</span>\n <span class=\"o-k\">Region</span><span>{{ region() }}</span>\n <span class=\"o-k\">Network</span><span>Private · TLS</span>\n <span class=\"o-k\">Backups</span><span>Daily{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>\n </div>\n <div class=\"o-flex\" style=\"border-top:1px solid var(--o-line-soft);padding-top:10px\"><span class=\"o-mut\">Monthly</span><b class=\"o-r o-mono o-md\">{{ plan() ? price(plan()!.priceCents) + '/mo' : '' }}</b></div>\n <span class=\"o-hint\">Billed by instance hour. Free plan: one {{ catalog()?.freePlan || 'db-s-1' }}, hard limit.</span>\n </div>\n </div>\n </div>\n `,\n})\nexport class ServicesNewPage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly router = inject(Router);\n\n protected readonly steps = [{ n: 1, label: 'Engine and version' }, { n: 2, label: 'Size and region' }, { n: 3, label: 'Name and environment' }];\n protected readonly hours = Array.from({ length: 24 }, (_, i) => (i + 3) % 24);\n protected readonly keeps = [7, 14, 35];\n protected readonly price = money;\n protected readonly utc = utcHour;\n\n protected readonly catalog = signal<Catalog | null>(null);\n protected readonly quota = signal<Quota | null>(null);\n protected readonly apps = signal<ServicesApp[]>([]);\n protected readonly step = signal(1);\n protected readonly engine = signal<Engine | null>(null);\n protected readonly version = signal('');\n protected readonly plan = signal<Plan | null>(null);\n protected readonly name = signal('orders-db');\n protected readonly nameTouched = signal(false);\n protected readonly env = signal('production');\n protected readonly attach = signal('');\n protected readonly hour = signal(3);\n protected readonly keep = signal(7);\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n\n protected readonly engines = computed(() => this.catalog()?.engines ?? []);\n protected readonly plans = computed(() => this.catalog()?.plans ?? []);\n protected readonly region = computed(() => this.host.project()?.region || \"Your organization's region\");\n protected readonly versionLabel = computed(() => this.engine()?.versions.find((v) => v.id === this.version())?.label ?? this.version());\n protected readonly envs = computed(() => {\n const set = new Set<string>(['production', 'staging']);\n for (const a of this.apps()) a.environments.forEach((e) => set.add(e));\n return [...set, 'shared'];\n });\n protected readonly hostName = computed(() => {\n const n = this.name() || 'name';\n const e = this.engine()?.id;\n const ns = 's-' + (this.host.project()?.id ?? 'project');\n return e === 'mysql' ? `moco-${n}-primary.${ns}.svc` : e === 'valkey' ? `${n}.${ns}.svc` : `${n}-rw.${ns}.svc`;\n });\n protected readonly nameError = computed(() => {\n const n = this.name();\n if (!n) return 'A name is required.';\n if (!NAME.test(n)) return 'Lowercase letters, digits and dashes; starts with a letter; at most 30 characters.';\n return '';\n });\n\n private key = '';\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p && p.key !== this.key) {\n this.key = p.key;\n untracked(() => this.load(p.key));\n }\n });\n }\n\n private load(key: string) {\n forkJoin({\n catalog: this.api.catalog(),\n list: this.api.list(key).pipe(catchError(() => of({ items: [], quota: undefined }))),\n apps: this.host.apps(key).pipe(catchError(() => of([] as ServicesApp[]))),\n }).subscribe({\n next: ({ catalog, list, apps }) => {\n this.catalog.set(catalog);\n this.quota.set(list.quota ?? null);\n this.apps.set(apps);\n const first = catalog.engines.find((e) => e.available) ?? null;\n if (first) this.pickEngine(first);\n this.plan.set(catalog.plans.find((p) => p.id === (list.quota?.onlyPlan || catalog.plans[0]?.id)) ?? catalog.plans[0] ?? null);\n },\n error: (e) => this.error.set(apiMessage(e, 'The catalogue could not be loaded.')),\n });\n }\n\n protected ram(p: Plan): string {\n const m = /^(\\d+)Gi$/.exec(p.memory);\n return m ? `${m[1]} GB` : p.memory;\n }\n\n protected allowed(p: Plan): boolean {\n const only = this.quota()?.onlyPlan;\n return !only || p.id === only;\n }\n\n protected pickEngine(e: Engine) {\n if (!e.available) {\n this.error.set(`${e.name} arrives at GA.`);\n return;\n }\n this.error.set('');\n const before = this.engine()?.id;\n this.engine.set(e);\n this.version.set((e.versions.find((v) => v.default) ?? e.versions[0])?.id ?? '');\n // Follow the engine with a fitting default name until the person types one.\n if (!this.nameTouched() || this.name() === DEFAULT_NAME[before ?? '']) this.name.set(DEFAULT_NAME[e.id] ?? e.id);\n }\n\n protected pickPlan(p: Plan) {\n if (this.allowed(p)) this.plan.set(p);\n }\n\n protected go(n: number) {\n if (n >= 1 && n <= 3) this.step.set(n);\n }\n\n protected canNext(): boolean {\n if (!this.engine() || !this.plan()) return false;\n return this.step() < 3 || !this.nameError();\n }\n\n protected next() {\n if (this.step() < 3) {\n this.go(this.step() + 1);\n return;\n }\n const e = this.engine();\n const p = this.plan();\n if (!e || !p || this.nameError()) return;\n this.busy.set(true);\n this.error.set('');\n const env = this.env() === 'shared' ? '' : this.env();\n const attach = this.attach().trim();\n this.api\n .create(this.key, {\n name: this.name(), engine: e.id, version: this.version(), plan: p.id, environment: env, backupHour: this.hour(), retentionDays: this.keep(),\n attach: attach ? { app: attach, environment: env || 'production' } : undefined,\n })\n .subscribe({\n next: (d) => {\n this.busy.set(false);\n this.router.navigate(this.host.link('services'), { queryParams: { created: d.name, attached: attach || null, envVar: attach ? e.envVar : null } });\n },\n error: (err) => {\n this.busy.set(false);\n this.error.set(apiMessage(err, 'The service could not be created.'));\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { hhmmss } from './look';\nimport { LogKind, LogLine, ServicesApi, apiMessage } from './services.api';\n\nconst COLOUR: Record<string, string> = { ERROR: 'var(--o-bad-solid)', FATAL: 'var(--o-bad-solid)', PANIC: 'var(--o-bad-solid)', WARNING: 'var(--o-run)' };\n\n// The instance page's Logs tab (prototype \"svc · logs\"): the engine's own log from its pods —\n// all, errors, the slow log, connections — newest first, refreshed every 10 s.\n@Component({\n selector: 'o-svc-logs',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"tablist\" aria-label=\"Log kind\">\n @for (k of kinds; track k.id) {<button type=\"button\" role=\"tab\" [class.o-on]=\"kind() === k.id\" [attr.aria-selected]=\"kind() === k.id\" (click)=\"pick(k.id)\" [attr.data-testid]=\"'svc-log-' + k.id\">{{ k.label }}</button>}\n </div>\n <a class=\"o-btn o-sm o-r\" [routerLink]=\"debugLogs()\" [queryParams]=\"{ service: service() }\">Open in Debug</a>\n </div>\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n <div class=\"o-term\" style=\"min-height:260px;max-height:520px;overflow:auto\" data-testid=\"svc-logs\">\n @for (l of lines(); track $index) {\n <div class=\"o-flex\" style=\"gap:12px;white-space:nowrap\"><span class=\"o-c\">{{ ts(l.time) }}</span><span style=\"width:60px\" [style.color]=\"colour(l.level)\">{{ l.level }}</span><span class=\"o-ell\" [attr.title]=\"l.message\">{{ l.message }}</span></div>\n } @empty {<div class=\"o-c\">{{ loaded() ? 'No lines of this kind in the engine log.' : 'Loading…' }}</div>}\n </div>\n <span class=\"o-faint o-sm\">Engine logs are kept 7 days and labelled service={{ service() }}, project={{ projectKey() }}, environment={{ environment() || 'shared' }}.</span>\n `,\n})\nexport class ServiceLogsTab {\n private readonly api = inject(ServicesApi);\n\n readonly projectKey = input('');\n readonly id = input('');\n readonly service = input('');\n readonly environment = input('');\n readonly debugLogs = input<string[]>([]);\n\n protected readonly kinds: { id: LogKind; label: string }[] = [\n { id: 'all', label: 'All' }, { id: 'errors', label: 'Errors' }, { id: 'slow', label: 'Slow log' }, { id: 'connections', label: 'Connections' },\n ];\n protected readonly kind = signal<LogKind>('all');\n protected readonly lines = signal<LogLine[]>([]);\n protected readonly note = signal('');\n protected readonly loaded = signal(false);\n protected readonly ts = hhmmss;\n protected readonly colour = (l: string) => COLOUR[l] ?? '#8fa3c0';\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n effect(() => {\n const [p, id, k] = [this.projectKey(), this.id(), this.kind()];\n if (p && id) untracked(() => this.load(p, id, k));\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n protected pick(k: LogKind) {\n this.loaded.set(false);\n this.kind.set(k);\n }\n\n private load(p: string, id: string, k: LogKind) {\n clearTimeout(this.timer);\n this.api.logs(p, id, k).subscribe({\n next: (l) => {\n if (k !== this.kind()) return;\n this.lines.set(l.lines ?? []);\n this.note.set(l.message ?? '');\n this.loaded.set(true);\n this.timer = setTimeout(() => this.load(p, id, k), 10_000);\n },\n error: (e) => {\n this.loaded.set(true);\n this.note.set(apiMessage(e, 'The engine log could not be read.'));\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesHost } from './host';\nimport { bytes, hhmmss, num, pct, ratio, spark, when } from './look';\nimport { Figure, Gauge, LogLine, Metrics } from './services.api';\n\n/** One chart card: a title, the latest value, and its points. */\ninterface Chart {\n key: string;\n title: string;\n value: string;\n points: number[];\n warn?: boolean;\n}\n\ntype Range = 'live' | '1h' | '6h' | '24h' | '7d';\nconst RANGES: { id: Range; label: string }[] = [{ id: '1h', label: '1 h' }, { id: '6h', label: '6 h' }, { id: '24h', label: '24 h' }, { id: '7d', label: '7 d' }];\n\n/**\n * The stored series behind each chart: the exporter metrics debug's engine dashboards read (PLAN,\n * \"Service metrics\"), and the Collector's pod memory. Charts without one draw the live readings.\n */\nconst HISTORY: Record<string, Record<string, [string, string]>> = {\n postgres: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['cnpg_backends_total', 'sum'], transactions: ['cnpg_pg_stat_database_xact_commit', 'rate'],\n rollbacks: ['cnpg_pg_stat_database_xact_rollback', 'rate'], database_size: ['cnpg_pg_database_size_bytes', 'sum'], replication_lag: ['cnpg_pg_replication_lag', 'max'],\n },\n mysql: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['mysql_global_status_threads_connected', 'sum'], queries: ['mysql_global_status_queries', 'rate'],\n slow_queries: ['mysql_global_status_slow_queries', 'rate'], replication_lag: ['mysql_slave_status_seconds_behind_master', 'max'],\n },\n valkey: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['redis_connected_clients', 'sum'], commands: ['redis_commands_processed_total', 'rate'],\n memory_used: ['redis_memory_used_bytes', 'max'], keys: ['redis_db_keys', 'sum'], evictions: ['redis_evicted_keys_total', 'rate'],\n },\n};\n\n// The instance page's Metrics tab (prototype \"svc · metrics\"): the figures the cell reports now,\n// drawn over 1 h to 7 d from the series the Collector stores (the auto-created dashboard's data);\n// a cell without telemetry stores shows the readings taken while the page is open.\n@Component({\n selector: 'o-svc-metrics',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-flex\">\n <div class=\"o-seg\">\n @if (stored() === false) {<button type=\"button\" class=\"o-on\">Live</button>}\n @else {@for (r of ranges; track r.id) {<button type=\"button\" [class.o-on]=\"range() === r.id\" (click)=\"range.set(r.id)\" [attr.data-testid]=\"'svc-range-' + r.id\">{{ r.label }}</button>}}\n </div>\n @if (stored() === false) {<span class=\"o-faint o-sm\">readings every 10 s since you opened the page · this cell keeps no telemetry history</span>}\n <a class=\"o-r o-faint o-sm\" [routerLink]=\"dashboard()\">Same data as the auto-created dashboard</a>\n </div>\n @if (latest(); as m) {\n @if (!m.available || m.message) {<div class=\"o-note\" role=\"status\">{{ m.message || 'Metrics are not available yet.' }}</div>}\n }\n <div class=\"o-g3\">\n @for (c of charts(); track c.key) {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\" [attr.data-testid]=\"'svc-chart-' + c.key\">\n <div class=\"o-flex\"><b class=\"o-b5\">{{ c.title }}</b><span class=\"o-r o-mono o-sm\">{{ c.value }}</span></div>\n <svg class=\"o-chart\" viewBox=\"0 0 200 60\" preserveAspectRatio=\"none\" style=\"height:70px;width:100%;display:block\" role=\"img\" [attr.aria-label]=\"c.title + ' ' + c.value\">\n @if (draw(c.points); as s) {\n <path [attr.d]=\"s.area\" [attr.fill]=\"c.warn ? 'var(--o-bad-solid)' : 'var(--o-vio)'\" fill-opacity=\"0.08\" stroke=\"none\" />\n <path [attr.d]=\"s.line\" fill=\"none\" [attr.stroke]=\"c.warn ? 'var(--o-bad-solid)' : 'var(--o-vio)'\" stroke-width=\"1.5\" vector-effect=\"non-scaling-stroke\" />\n } @else {<line x1=\"0\" y1=\"30\" x2=\"200\" y2=\"30\" stroke=\"var(--o-line-soft)\" stroke-dasharray=\"3 3\" vector-effect=\"non-scaling-stroke\" />}\n </svg>\n </div>\n }\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Slow queries</b><span class=\"o-faint o-sm\">the latest from the slow log · over 250 ms</span><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r o-faint o-sm\">normalised, top by total time at GA</span></div>\n <div class=\"o-tbl\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\">Query</div><div class=\"o-th o-num\">Duration</div><div class=\"o-th o-num\">When</div></div></div>\n <div class=\"o-tbody\">\n @for (q of slow(); track $index) {\n <div class=\"o-tr\"><div class=\"o-td o-mono o-sm o-ell\" style=\"max-width:520px\" [attr.title]=\"q.statement\">{{ q.statement }}</div><div class=\"o-td o-num o-mono\">{{ q.duration }}</div><div class=\"o-td o-num o-mono o-faint\">{{ q.when }}</div></div>\n } @empty {<div class=\"o-empty\">{{ engine() === 'valkey' ? 'Valkey keeps its slow log in memory (SLOWLOG GET).' : 'No statement over 250 ms in the engine log.' }}</div>}\n </div>\n </div>\n </div>\n `,\n})\nexport class ServiceMetricsTab {\n private readonly host = inject(ServicesHost);\n\n readonly readings = input<Metrics[]>([]);\n readonly slowLines = input<LogLine[]>([]);\n readonly engine = input('');\n readonly projectKey = input('');\n readonly service = input('');\n readonly dashboard = input<string[]>([]);\n\n protected readonly ranges = RANGES;\n protected readonly range = signal<Range>('1h');\n /** null: not known yet; false: the cell keeps no telemetry. */\n protected readonly stored = signal<boolean | null>(null);\n private readonly series = signal<Record<string, number[]>>({});\n\n protected readonly latest = computed(() => this.readings().at(-1) ?? null);\n protected readonly draw = (v: number[]) => (v.length >= 2 ? spark(v) : null);\n\n constructor() {\n effect(() => {\n const [p, s, e, r] = [this.projectKey(), this.service(), this.engine(), this.range()];\n if (p && s && e && r !== 'live') untracked(() => this.load(p, s, e, r));\n });\n }\n\n private load(p: string, s: string, e: string, r: Range) {\n const wanted = HISTORY[e] ?? {};\n const keys = Object.keys(wanted);\n if (!keys.length) return;\n forkJoin(keys.map((k) => this.host.history(p, s, wanted[k][0], wanted[k][1], r).pipe(catchError(() => of(null))))).subscribe((all) => {\n if (r !== this.range()) return;\n if (all.every((x) => x === null)) {\n this.stored.set(false);\n this.range.set('live');\n return;\n }\n this.stored.set(true);\n const out: Record<string, number[]> = {};\n keys.forEach((k, i) => (out[k] = (all[i] ?? []).map(([, v]) => v).filter((v) => Number.isFinite(v))));\n this.series.set(out);\n });\n }\n\n protected readonly charts = computed<Chart[]>(() => {\n const rs = this.readings();\n const m = rs.at(-1);\n const stored = this.range() !== 'live' ? this.series() : {};\n const pick = (key: string, live: number[]) => (stored[key]?.length ? stored[key] : live);\n const gauge = (key: 'cpu' | 'memory' | 'disk' | 'connections', title: string, show: (g?: Gauge) => string, warnAt = 85): Chart => ({\n key, title, value: show(m?.[key]),\n points: pick(key, rs.map((r) => r[key]?.used ?? NaN).filter((x) => !Number.isNaN(x))),\n warn: (m?.[key]?.percent ?? 0) >= warnAt,\n });\n const out: Chart[] = [\n gauge('cpu', 'CPU', (g) => (g?.percent != null ? `${pct(g.percent)} of ${num(g.limit)} vCPU` : '–')),\n gauge('memory', 'Memory', (g) => (g?.used != null ? `${bytes(g.used)} · ${pct(g.percent)}` : '–')),\n gauge('disk', 'Disk used', (g) => (g?.used != null ? `${bytes(g.used)} of ${bytes(g.limit)}` : `– of ${bytes(g?.limit)}`)),\n gauge('connections', 'Connections', (g) => ratio(g)),\n ];\n for (const f of m?.figures ?? []) {\n const live = rs.map((r) => r.figures.find((x) => x.key === f.key)).filter((x): x is Figure => !!x).map((x) => (x.counter ? x.rate : x.value)).filter((x): x is number => x != null);\n out.push({ key: f.key, title: f.counter ? `${f.label} / s` : f.label, value: show(f), points: pick(f.key, live) });\n }\n return out;\n });\n\n protected readonly slow = computed(() =>\n this.slowLines()\n .slice(0, 8)\n .map((l) => {\n const m = /^duration: ([\\d.]+) ms\\s+statement:\\s*(.*)$/s.exec(l.message);\n return { statement: m ? m[2] : l.message, duration: m ? `${num(Number(m[1]), 1)} ms` : '', when: when(l.time) || hhmmss(l.time) };\n }),\n );\n}\n\nfunction show(f: Figure): string {\n if (f.counter) return f.rate != null ? `${num(f.rate, f.rate < 10 ? 1 : 0)}/s` : `${num(f.value)} total`;\n switch (f.unit) {\n case '%':\n return pct(f.value);\n case 'bytes':\n return bytes(f.value);\n case 's':\n return f.key === 'uptime' ? `${num(f.value / 3600, 1)} h` : `${num(f.value, 1)} s`;\n }\n return num(f.value);\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesApp, ServicesHost } from './host';\nimport { ServiceLogsTab } from './logs.tab';\nimport { DAYS, PRESETS, backupKind, bytes, shortDate, fromLocalInput, money, moving, num, pct, presetChip, ratio, stateChip, toLocalInput, utcHour, when } from './look';\nimport { ServiceMetricsTab } from './metrics.tab';\nimport { Attachment, Backup, Catalog, Detail, Engine, LogLine, Metrics, Plan, Revealed, Rotation, ServicesApi, apiMessage } from './services.api';\n\ntype Tab = 'overview' | 'users' | 'backups' | 'metrics' | 'logs' | 'console' | 'settings';\ntype Dialog =\n | { kind: 'delete'; typed: string; finalBackup: boolean }\n | { kind: 'restore'; name: string; point: string; backup: string }\n | { kind: 'rotate'; user: string; grace: number };\n\nconst TABS: { id: Tab; label: string }[] = [\n { id: 'overview', label: 'Overview' }, { id: 'users', label: 'Databases and users' }, { id: 'backups', label: 'Backups' }, { id: 'metrics', label: 'Metrics' },\n { id: 'logs', label: 'Logs' }, { id: 'console', label: 'Console' }, { id: 'settings', label: 'Settings' },\n];\n\n/** Engine parameters the prototype lists (validated subset, GA). */\nconst PARAMS: Record<string, [string, string, string][]> = {\n postgres: [['max_connections', '100', 'restart'], ['work_mem', '4MB', 'live'], ['log_min_duration_statement', '250ms', 'live']],\n mysql: [['max_connections', '151', 'restart'], ['long_query_time', '0.25', 'live'], ['innodb_buffer_pool_size', 'auto', 'restart']],\n valkey: [['maxmemory-policy', 'allkeys-lru', 'live'], ['timeout', '0', 'live'], ['slowlog-log-slower-than', '10000', 'live']],\n};\n\n// /{org}/{project}/services/:id (prototype \"services\"): one instance — its connection details and\n// reveal, attached apps, databases and users, backups and point-in-time restore, metrics and engine\n// logs read from the cell, and settings (resize, networking, maintenance, delete). Console, HA and\n// engine parameters are tagged GA, as the prototype tags them.\n@Component({\n selector: 'o-service',\n imports: [FormsModule, RouterLink, ServiceMetricsTab, ServiceLogsTab],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (d(); as d) {\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ d.engineName }} {{ d.version }} · {{ sizeLine(d) }} · {{ region() }} · {{ d.environment || 'shared' }}</span>\n <div class=\"o-flex\"><h1 class=\"o-t\">{{ d.name }}</h1><span [class]=\"chip(d.state)\" data-testid=\"svc-state\">{{ d.state }}</span></div>\n </div>\n <div class=\"o-acts\">\n @if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn\" (click)=\"askRotate(d)\" [disabled]=\"busy() || !d.users?.length\" data-testid=\"svc-rotate\">Rotate credentials</button>}\n @if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn\" (click)=\"setTab('settings')\">Resize</button>}\n <a class=\"o-btn\" [routerLink]=\"host.link('dashboards')\">Dashboard</a>\n </div>\n </div>\n\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-error\">{{ error() }}</div>}\n @if (notice()) {<div class=\"o-note o-grn\" role=\"status\" data-testid=\"svc-notice\">{{ notice() }}</div>}\n @if (d.message && d.state !== 'Running') {<div class=\"o-note\" [class.o-red]=\"d.state === 'Failed'\" role=\"status\">{{ d.message }}</div>}\n @if (d.deletedAt) {\n <div class=\"o-card o-cb o-flex o-wrap\" style=\"border-color:var(--o-bad-line)\" data-testid=\"svc-deleted\">\n <div class=\"o-col\" style=\"gap:2px;flex:1\"><b>{{ d.name }} is scheduled for deletion</b><span class=\"o-hint\">Purged {{ when(d.purgeAt) }}. Until then you can undo; attached apps were detached.@if (d.finalBackup) { A final backup is kept for 7 days.}</span></div>\n @if (d.canManage) {<button type=\"button\" class=\"o-btn\" (click)=\"undelete(d)\" [disabled]=\"busy()\" data-testid=\"svc-undelete\">Undo delete</button>}\n </div>\n }\n @if (d.restoreOf; as src) {\n <div class=\"o-card o-cb o-flex o-wrap\" data-testid=\"svc-restored\">\n <div class=\"o-col\" style=\"gap:2px;flex:1\"><b>Restored from <a [routerLink]=\"host.link('services/' + src.name)\">{{ src.name }}</a></b><span class=\"o-hint\">@if (d.restorePoint) {To {{ when(d.restorePoint) }}.} @else if (d.restoreBackup) {From backup {{ d.restoreBackup }}.} {{ src.name }} is untouched.@if (src.attached.length) { Its apps: {{ src.attached.join(', ') }}.}</span></div>\n @if (d.canManage && src.attached.length && d.state === 'Running') {<button type=\"button\" class=\"o-btn\" (click)=\"swap(d, src.name)\" [disabled]=\"busy()\" data-testid=\"svc-swap\">Move {{ src.name }}'s apps here</button>}\n </div>\n }\n\n <div class=\"o-tabs\" role=\"tablist\">\n @for (t of tabs; track t.id) {<button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"tab() === t.id\" [attr.aria-selected]=\"tab() === t.id\" (click)=\"setTab(t.id)\" [attr.data-testid]=\"'svc-tab-' + t.id\">{{ t.label }}</button>}\n </div>\n\n @switch (tab()) {\n @case ('overview') {\n <div class=\"o-g4\">\n @for (s of stats(); track s.label) {<div class=\"o-stat\"><span class=\"o-k\">{{ s.label }}</span><span class=\"o-v\">{{ s.value }}</span><span class=\"o-s\">{{ s.sub }}</span></div>}\n </div>\n <div class=\"o-g2\" style=\"align-items:start;gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Connection details</b><span class=\"o-r\">Private network · TLS required</span></div>\n @if (conn(); as c) {\n <div class=\"o-kv o-cb\" style=\"grid-template-columns:100px 1fr;row-gap:9px\">\n <span class=\"o-k\">Host</span><span class=\"o-mono o-sm\" style=\"word-break:break-all\">{{ c.host }}</span>\n <span class=\"o-k\">Port</span><span class=\"o-mono o-sm\">{{ c.port }}</span>\n @if (c.database) {<span class=\"o-k\">Database</span><span class=\"o-mono o-sm\">{{ c.database }}</span>}\n <span class=\"o-k\">User</span><span class=\"o-mono o-sm\">{{ c.user }}</span>\n <span class=\"o-k\">Password</span>\n <span class=\"o-flex\"><span class=\"o-mono o-sm\" data-testid=\"svc-password\">{{ revealed()?.password ?? '••••••••••••••••' }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk\" (click)=\"toggleReveal(d)\" [disabled]=\"busy()\" data-testid=\"svc-reveal\">{{ revealed() ? 'Hide' : 'Reveal' }}</button>}\n @else {<span class=\"o-faint o-xs\">Maintainers can reveal</span>}\n </span>\n <span class=\"o-k\">SSL mode</span><span class=\"o-mono o-sm\">{{ c.sslMode }}</span>\n </div>\n <div style=\"padding:0 14px 8px\"><div class=\"o-seg\">\n @for (k of snippetKeys(); track k) {<button type=\"button\" [class.o-on]=\"snip() === k\" (click)=\"snip.set(k)\">{{ snippetLabel(k) }}</button>}\n </div></div>\n <div class=\"o-mono\" style=\"margin:0 14px 14px;background:var(--o-bg);border-radius:6px;padding:10px 12px;font-size:12px;color:var(--o-tx-2);overflow-x:auto;white-space:pre\" data-testid=\"svc-snippet\">{{ c.snippets[snip()] ?? '' }}</div>\n } @else {<div class=\"o-empty\">Connection details appear once {{ d.name }} is running.</div>}\n </div>\n <div class=\"o-col\" style=\"gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Attached apps</b>@if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"attachOpen.set(!attachOpen())\" data-testid=\"svc-attach-open\">Attach to app</button>}</div>\n @for (a of d.attachments; track a.id) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-att-' + a.app\">\n <span class=\"o-b5\">{{ a.app }}</span><span class=\"o-faint\">{{ a.environment }}</span><span class=\"o-chip o-mono\">{{ a.prefix }}{{ envVar() }}</span>\n <span class=\"o-r o-sm\" [style.color]=\"attColour(a)\" [attr.title]=\"a.message || null\">{{ attState(a) }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"detach(d, a)\" [attr.aria-label]=\"'Detach ' + a.app\" [disabled]=\"busy()\">×</button>}\n </div>\n } @empty {<div class=\"o-empty\">Not attached. Attach it and the app gets {{ envVar() }} on its next release.</div>}\n @if (attachOpen()) {\n <div class=\"o-flex o-wrap\" style=\"padding:12px 14px;background:var(--o-bg)\">\n @if (apps().length) {\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"App\" [ngModel]=\"attApp()\" (ngModelChange)=\"attApp.set($event)\" data-testid=\"svc-att-app\">@for (a of apps(); track a.name) {<option [value]=\"a.name\">{{ a.name }}</option>}</select>\n } @else {<input class=\"o-in o-sm o-mono\" style=\"width:120px\" placeholder=\"app\" aria-label=\"App\" [ngModel]=\"attApp()\" (ngModelChange)=\"attApp.set($event)\" data-testid=\"svc-att-app\" />}\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Environment\" [ngModel]=\"attEnv()\" (ngModelChange)=\"attEnv.set($event)\" data-testid=\"svc-att-env\">@for (e of attEnvs(); track e) {<option [value]=\"e\">{{ e }}</option>}</select>\n <input class=\"o-in o-sm o-mono\" style=\"width:110px\" placeholder=\"prefix (opt.)\" aria-label=\"Prefix\" [ngModel]=\"attPrefix()\" (ngModelChange)=\"attPrefix.set($event)\" />\n <span class=\"o-mut o-sm\">Injects {{ attPrefix() }}{{ envVar() }} and redeploys</span>\n <button type=\"button\" class=\"o-btn o-sm o-pri o-r\" (click)=\"attach(d)\" [disabled]=\"busy() || !attApp()\" data-testid=\"svc-att-go\">Attach</button>\n </div>\n }\n <div class=\"o-cf\">{{ rotateNote() }}@if (openRotation(); as r) {@if (d.canManage) { · <button type=\"button\" class=\"o-lnk\" (click)=\"retire(d, r)\" [disabled]=\"busy()\">Retire the old password now</button>}}</div>\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Backups</b><span class=\"o-r\">Daily · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>\n @for (b of backups().slice(0, 3); track b.name) {\n <div class=\"o-row\"><span>{{ when(b.startedAt) || 'Pending' }}</span><span class=\"o-faint\">{{ backupNote(b) }}</span><span class=\"o-chip\">{{ kind(b) }}</span>@if (b.phase === 'completed' && d.canManage) {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"askRestore(d, b)\">Restore to new instance</button>}</div>\n } @empty {<div class=\"o-empty\">The first backup is taken once {{ d.name }} is running.</div>}\n <div class=\"o-cf\">{{ windowLine() }}</div>\n </div>\n </div>\n </div>\n }\n @case ('users') {\n <div class=\"o-g2\" style=\"align-items:start;gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Databases</b>@if (d.canManage && engine()?.databases) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-db-add\">+ Database</button>}</div>\n @if (addingDb()) {\n <div class=\"o-row\" style=\"background:var(--o-bg)\"><input class=\"o-in o-sm o-mono\" placeholder=\"name\" aria-label=\"Database name\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" (keydown.enter)=\"addDb(d)\" data-testid=\"svc-db-name\" /><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addDb(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-db-create\">Create</button></div>\n }\n @for (db of d.databases; track db.name; let first = $first) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ db.name }}</span><span class=\"o-faint o-sm\">{{ first ? 'default' : '' }}</span><span class=\"o-r o-faint o-sm\">{{ when(db.createdAt) }}</span>\n @if (d.canManage && !first) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeDb(d, db.name)\" [attr.aria-label]=\"'Remove ' + db.name\" [disabled]=\"busy()\">×</button>}</div>\n } @empty {<div class=\"o-empty\">{{ engine()?.databases ? 'No databases yet.' : d.engineName + ' has no logical databases: keys live in database 0.' }}</div>}\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Users</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingUser.set(!addingUser())\" data-testid=\"svc-user-add\">+ User</button>}</div>\n @if (addingUser()) {\n <div class=\"o-row\" style=\"background:var(--o-bg)\">\n <input class=\"o-in o-sm o-mono\" placeholder=\"name\" aria-label=\"User name\" [ngModel]=\"userName()\" (ngModelChange)=\"userName.set($event)\" data-testid=\"svc-user-name\" />\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Role\" [ngModel]=\"userPreset()\" (ngModelChange)=\"userPreset.set($event)\" data-testid=\"svc-user-preset\">@for (p of presets; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addUser(d)\" [disabled]=\"busy() || !userName()\" data-testid=\"svc-user-create\">Create</button>\n </div>\n }\n @for (u of d.users ?? []; track u.name) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ u.name }}</span><span [class]=\"preset(u.preset)\">{{ u.preset }}</span>@if (u.rotating) {<span class=\"o-chip o-blu\">rotating</span>}\n <span class=\"o-r o-faint o-sm o-ell\">{{ u.attached.length ? 'used by ' + u.attached.join(', ') : 'generation ' + u.generation }}</span>\n @if (d.canManage && u.preset !== 'owner') {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeUser(d, u.name)\" [attr.aria-label]=\"'Remove ' + u.name\" [disabled]=\"busy()\">×</button>}</div>\n }\n <div class=\"o-cf\">Per-app users created on attach, each with least privilege<b class=\"o-ph-tag o-ga\">GA</b></div>\n </div>\n </div>\n @if (d.engine === 'postgres') {\n <div class=\"o-card o-cb o-flex o-wrap\"><div class=\"o-col\" style=\"gap:2px\"><b>Extensions</b><span class=\"o-hint\">From the allow-list: pg_stat_statements, pgcrypto, uuid-ossp, citext, pg_trgm, postgis</span></div><div class=\"o-flex o-r\"><b class=\"o-ph-tag o-ga\">GA</b><button type=\"button\" class=\"o-btn o-sm\" disabled>+ Enable</button></div></div>\n }\n }\n @case ('backups') {\n <div class=\"o-split o-w340\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Backups</b>@if (d.canManage && !d.deletedAt) {<span class=\"o-r\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"backupNow(d)\" [disabled]=\"busy() || d.state !== 'Running'\" data-testid=\"svc-backup-now\">Back up now</button></span>}</div>\n @for (b of backups(); track b.name) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-backup-' + b.name\">\n <span [class]=\"'o-dot ' + backupDot(b)\"></span><span style=\"width:150px\">{{ when(b.startedAt) || 'Pending' }}</span><span class=\"o-faint o-sm\" style=\"width:80px\">{{ backupNote(b) }}</span>\n <span class=\"o-chip\">{{ kind(b) }}</span><span class=\"o-faint o-sm\">{{ keepLine(b, d.retentionDays) }}</span>\n @if (b.phase === 'completed' && d.canManage) {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"askRestore(d, b)\">Restore</button>}\n @if (b.kind === 'on-demand' && d.canManage && b.phase !== 'running') {<button type=\"button\" class=\"o-lnk o-faint\" [class.o-r]=\"b.phase !== 'completed'\" (click)=\"deleteBackup(d, b)\" [attr.aria-label]=\"'Delete ' + b.name\" [disabled]=\"busy()\">×</button>}\n </div>\n } @empty {<div class=\"o-empty\">No backups yet. The first is taken once {{ d.name }} is running.</div>}\n <div class=\"o-cf\">Stored encrypted in a separate failure domain. Cross-region copies<b class=\"o-ph-tag o-later\">Later</b></div>\n </div>\n <div class=\"o-col\" style=\"gap:14px\">\n @if (d.pitr) {\n <div class=\"o-card o-cb o-col\" style=\"gap:10px\">\n <b>Restore to a point in time</b>\n <span class=\"o-hint\">{{ pitrHint(d) }} Restores always create a new instance; {{ d.name }} is untouched.</span>\n <input class=\"o-in o-mono\" type=\"datetime-local\" step=\"1\" aria-label=\"Point in time\" [ngModel]=\"pitr()\" (ngModelChange)=\"pitr.set($event)\" data-testid=\"svc-pitr\" />\n <button type=\"button\" class=\"o-btn o-dark\" (click)=\"askPitr(d)\" [disabled]=\"!d.canManage || !pitr() || !d.window?.from\" data-testid=\"svc-pitr-go\">Restore…</button>\n </div>\n } @else {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\"><b>Restore a snapshot</b><span class=\"o-hint\">{{ d.engineName }} restores from a daily RDB snapshot: pick one on the left. It always creates a new instance.</span></div>\n }\n <div class=\"o-card o-cb o-form\">\n <b>Schedule</b>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"svc-bh\">Daily at</label><select id=\"svc-bh\" class=\"o-in\" [disabled]=\"!d.canManage\" [ngModel]=\"d.backupHour\" (ngModelChange)=\"save(d, { backupHour: +$event }, 'Backups now run daily at ' + utc(+$event) + '.')\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ utc(h) }}</option>}</select></div>\n <div class=\"o-fld\"><label for=\"svc-rd\">Keep for</label><select id=\"svc-rd\" class=\"o-in\" [disabled]=\"!d.canManage\" [ngModel]=\"d.retentionDays\" (ngModelChange)=\"save(d, { retentionDays: +$event }, 'Backups are now kept ' + $event + ' days.')\">@for (k of keeps; track k) {<option [ngValue]=\"k\">{{ k }} days</option>}</select></div>\n </div>\n </div>\n <div class=\"o-card o-cb o-col\" style=\"gap:8px\"><div class=\"o-flex\"><b>Fork for staging</b><b class=\"o-ph-tag o-ga\">GA</b></div><span class=\"o-hint\">Copy from the latest backup into a new instance.</span><div class=\"o-flex\"><b>Export dump</b><b class=\"o-ph-tag o-ga\">GA</b><button type=\"button\" class=\"o-btn o-xs o-r\" disabled>{{ d.engine === 'mysql' ? 'mysqldump' : d.engine === 'valkey' ? 'RDB' : 'pg_dump' }}</button></div></div>\n </div>\n </div>\n }\n @case ('metrics') {\n <o-svc-metrics [readings]=\"readings()\" [slowLines]=\"slowLines()\" [engine]=\"d.engine\" [projectKey]=\"key()\" [service]=\"d.name\" [dashboard]=\"host.link('dashboards')\" />\n }\n @case ('logs') {\n <o-svc-logs [projectKey]=\"key()\" [id]=\"d.id\" [service]=\"d.name\" [environment]=\"d.environment\" [debugLogs]=\"host.link('logs')\" />\n }\n @case ('console') {\n <div class=\"o-flex o-wrap\"><span class=\"o-chip o-grn\">Read-only</span><span class=\"o-faint o-sm\">1,000-row limit · 5 s statement timeout · runs as console_ro · audited</span><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r\"></span>\n @if (d.databases.length) {<select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Database\" disabled>@for (db of d.databases; track db.name) {<option>{{ db.name }}</option>}</select>}</div>\n <div class=\"o-card\"><textarea class=\"o-in o-mono\" style=\"border:none;box-shadow:none;font-size:12.5px\" rows=\"4\" disabled aria-label=\"Query\">{{ d.engine === 'valkey' ? 'INFO keyspace' : 'SELECT * FROM … LIMIT 50' }}</textarea><div class=\"o-cf\"><span class=\"o-kbd\">⌘</span><span class=\"o-kbd\">↵</span> to run<button type=\"button\" class=\"o-btn o-sm o-dark o-r\" disabled>Run</button></div></div>\n <span class=\"o-faint o-sm\">The console arrives at GA. Until then, connect with the snippets on Overview from an attached app, or reveal the password.</span>\n }\n @case ('settings') {\n <div class=\"o-col\" style=\"gap:14px;max-width:820px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Resize</b><span class=\"o-r\">vCPU and RAM: brief failover · disk grows online</span></div>\n <div class=\"o-cb o-flex o-wrap\">\n <select class=\"o-in\" style=\"max-width:360px\" aria-label=\"Plan\" [disabled]=\"!d.canManage\" [ngModel]=\"newPlan()\" (ngModelChange)=\"newPlan.set($event)\" data-testid=\"svc-plan\">\n @for (p of plans(); track p.id) {<option [value]=\"p.id\">{{ p.id }} · {{ p.label }} · {{ price(p.priceCents) }}/mo</option>}\n </select>\n <label class=\"o-flex o-sm\" style=\"gap:6px\">Disk <input class=\"o-in o-sm o-mono\" style=\"width:80px\" type=\"number\" [min]=\"d.diskGb\" [max]=\"catalog()?.maxDiskGb ?? 2000\" [disabled]=\"!d.canManage\" [ngModel]=\"newDisk()\" (ngModelChange)=\"newDisk.set(+$event)\" data-testid=\"svc-disk\" /> GB</label>\n <button type=\"button\" class=\"o-btn o-dark\" (click)=\"resize(d)\" [disabled]=\"busy() || !d.canManage || (newPlan() === d.plan && newDisk() === d.diskGb)\" data-testid=\"svc-resize\">Resize</button>\n </div>\n <div class=\"o-cf\"><button type=\"button\" class=\"o-tog\" disabled aria-label=\"Grow storage automatically (GA)\"></button>Grow storage automatically at 85% full, up to 500 GB<b class=\"o-ph-tag o-ga\">GA</b></div>\n </div>\n <div class=\"o-card\"><div class=\"o-ch\"><b>High availability</b><b class=\"o-ph-tag o-ga\">GA</b></div><div class=\"o-row\"><span style=\"flex:1\">Standby node with automatic failover</span><button type=\"button\" class=\"o-tog\" disabled aria-label=\"Standby (GA)\"></button></div><div class=\"o-row\"><span style=\"flex:1\">Read replicas</span><span class=\"o-faint o-sm\">0</span><button type=\"button\" class=\"o-btn o-xs\" disabled>+ Replica</button></div></div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Networking</b></div>\n <div class=\"o-row\"><span style=\"flex:1\">Private network <span class=\"o-faint o-sm\">· always on, reachable only from attached apps</span></span><span class=\"o-chip o-grn\">On</span></div>\n <div class=\"o-row\"><span style=\"flex:1\">Public endpoint with trusted sources</span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.publicEnabled\" [disabled]=\"!d.canManage || busy()\" (click)=\"save(d, { publicEnabled: !d.publicEnabled }, d.publicEnabled ? 'The public endpoint is off.' : 'The public endpoint is on for the trusted sources below.')\" aria-label=\"Public endpoint\" data-testid=\"svc-public\"></button></div>\n @if (d.publicEnabled) {\n <div class=\"o-row o-wrap\" style=\"background:var(--o-bg)\">\n @for (c of d.allowedCidrs; track c) {<span class=\"o-chip o-mono\">{{ c }}@if (d.canManage) { <button type=\"button\" class=\"o-lnk o-faint\" (click)=\"dropCidr(d, c)\" [attr.aria-label]=\"'Remove ' + c\">×</button>}</span>}\n @if (d.canManage) {<input class=\"o-in o-sm o-mono\" style=\"width:180px\" placeholder=\"+ IP or CIDR\" aria-label=\"Add a trusted source\" [ngModel]=\"cidr()\" (ngModelChange)=\"cidr.set($event)\" (keydown.enter)=\"addCidr(d)\" data-testid=\"svc-cidr\" />}\n <span class=\"o-faint o-sm o-r\">TLS required</span>\n </div>\n }\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Maintenance window</b><span class=\"o-r\">patches with 7-day notice</span></div>\n <div class=\"o-cb o-flex o-wrap\">\n <select class=\"o-in\" style=\"width:auto\" aria-label=\"Day\" [disabled]=\"!d.canManage\" [ngModel]=\"d.maintenanceDay\" (ngModelChange)=\"save(d, { maintenanceDay: $event }, 'Maintenance window saved.')\">@for (x of days; track x.id) {<option [value]=\"x.id\">{{ x.label }}</option>}</select>\n <select class=\"o-in\" style=\"width:auto\" aria-label=\"Hours\" [disabled]=\"!d.canManage\" [ngModel]=\"d.maintenanceHour\" (ngModelChange)=\"save(d, { maintenanceHour: +$event }, 'Maintenance window saved.')\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ windowHours(h) }}</option>}</select>\n <span class=\"o-faint o-sm\">Minor versions of {{ d.engineName }} {{ d.version }} apply here.</span>\n </div>\n </div>\n <div class=\"o-card\"><div class=\"o-ch\"><b>Engine parameters</b><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r\">validated subset</span></div><div class=\"o-tbl\"><div class=\"o-tbody\">\n @for (p of params(); track p[0]) {<div class=\"o-tr\"><div class=\"o-td o-mono o-sm\">{{ p[0] }}</div><div class=\"o-td\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" [value]=\"p[1]\" disabled [attr.aria-label]=\"p[0]\" /></div><div class=\"o-td\"><span class=\"o-chip\" [class.o-amb]=\"p[2] === 'restart'\">{{ p[2] }}</span></div></div>}\n </div></div></div>\n @if (d.canManage && !d.deletedAt) {\n <div class=\"o-card\" style=\"border-color:var(--o-bad-line)\"><div class=\"o-row\" style=\"padding:14px\"><div class=\"o-col\" style=\"gap:2px;flex:1\"><b>Delete {{ d.name }}</b><span class=\"o-hint\">Typed confirmation. Undo within 24 hours; optional final backup kept 7 days. Attached apps lose {{ envVar() }}.</span></div><button type=\"button\" class=\"o-btn o-sm o-red\" (click)=\"dialog.set({ kind: 'delete', typed: '', finalBackup: true })\" data-testid=\"svc-delete\">Delete</button></div></div>\n }\n </div>\n }\n }\n </div>\n\n @if (dialog(); as dl) {\n <div class=\"o-overlay o-mid\" (click)=\"dialog.set(null)\">\n <div class=\"o-dlg\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"dialogTitle(dl, d)\" (click)=\"$event.stopPropagation()\" (keydown.escape)=\"dialog.set(null)\">\n <div class=\"o-dlg-h\"><b>{{ dialogTitle(dl, d) }}</b></div>\n <div class=\"o-dlg-b\">\n @switch (dl.kind) {\n @case ('delete') {\n <span>Attached apps lose {{ envVar() }} and redeploy. You can undo within 24 hours.</span>\n <label class=\"o-flex o-sm\"><input type=\"checkbox\" [(ngModel)]=\"dl.finalBackup\" /> Take a final backup and keep it 7 days</label>\n <label class=\"o-fld\"><span class=\"o-sm\">Type <b class=\"o-mono\">{{ d.name }}</b> to confirm</span><input class=\"o-in o-mono\" [(ngModel)]=\"dl.typed\" data-testid=\"svc-delete-typed\" autocomplete=\"off\" /></label>\n }\n @case ('restore') {\n <span>{{ dl.point ? 'Restores ' + d.name + ' as it was at ' + whenLocal(dl.point) : 'Restores backup ' + dl.backup }} into a new instance with the same users and passwords. {{ d.name }} keeps running untouched; move its apps over afterwards if you want.</span>\n <label class=\"o-fld\"><span class=\"o-sm\">New instance</span><input class=\"o-in o-mono\" [(ngModel)]=\"dl.name\" data-testid=\"svc-restore-name\" autocomplete=\"off\" /></label>\n }\n @case ('rotate') {\n <span>A new password for <b class=\"o-mono\">{{ dl.user }}</b> is created beside the current one. Every attached app redeploys with it; once all are healthy the old one stays valid for the grace period, then stops. If one fails, the old password stays.</span>\n <label class=\"o-fld\"><span class=\"o-sm\">Keep the old password after the apps are healthy</span>\n <select class=\"o-in\" [(ngModel)]=\"dl.grace\">@for (g of graces; track g.m) {<option [ngValue]=\"g.m\">{{ g.label }}</option>}</select></label>\n }\n }\n </div>\n <div class=\"o-dlg-f\">\n <button type=\"button\" class=\"o-btn\" (click)=\"dialog.set(null)\">Cancel</button>\n @switch (dl.kind) {\n @case ('delete') {<button type=\"button\" class=\"o-btn o-red\" [disabled]=\"busy() || dl.typed !== d.name\" (click)=\"remove(d, dl.finalBackup)\" data-testid=\"svc-delete-go\">Delete service</button>}\n @case ('restore') {<button type=\"button\" class=\"o-btn o-dark\" [disabled]=\"busy() || !dl.name\" (click)=\"restore(d, dl)\" data-testid=\"svc-restore-go\">Restore</button>}\n @case ('rotate') {<button type=\"button\" class=\"o-btn o-dark\" [disabled]=\"busy()\" (click)=\"rotate(d, dl.user, dl.grace)\" data-testid=\"svc-rotate-go\">Rotate</button>}\n }\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"o-page\">@if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>} @else {<div class=\"o-empty\">Loading…</div>}</div>\n }\n `,\n})\nexport class ServicePage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n protected readonly tabs = TABS;\n protected readonly presets = PRESETS;\n protected readonly days = DAYS;\n protected readonly hours = Array.from({ length: 24 }, (_, i) => i);\n protected readonly keeps = [7, 14, 35];\n protected readonly graces = [{ m: 0, label: 'No grace: stop it at once' }, { m: 15, label: '15 minutes' }, { m: 60, label: '1 hour' }, { m: 1440, label: '24 hours' }];\n protected readonly chip = stateChip;\n protected readonly preset = presetChip;\n protected readonly kind = backupKind;\n protected readonly price = money;\n protected readonly utc = utcHour;\n protected readonly when = (s?: string) => when(s);\n protected readonly whenLocal = (v: string) => when(fromLocalInput(v));\n\n protected readonly d = signal<Detail | null>(null);\n protected readonly catalog = signal<Catalog | null>(null);\n protected readonly apps = signal<ServicesApp[]>([]);\n protected readonly tab = signal<Tab>('overview');\n protected readonly readings = signal<Metrics[]>([]);\n protected readonly slowLines = signal<LogLine[]>([]);\n protected readonly revealed = signal<Revealed | null>(null);\n protected readonly snip = signal('uri');\n protected readonly error = signal('');\n protected readonly notice = signal('');\n protected readonly busy = signal(false);\n protected readonly dialog = signal<Dialog | null>(null);\n protected readonly attachOpen = signal(false);\n protected readonly attApp = signal('');\n protected readonly attEnv = signal('production');\n protected readonly attPrefix = signal('');\n protected readonly addingDb = signal(false);\n protected readonly dbName = signal('');\n protected readonly addingUser = signal(false);\n protected readonly userName = signal('');\n protected readonly userPreset = signal('read-only');\n protected readonly pitr = signal('');\n protected readonly newPlan = signal('');\n protected readonly newDisk = signal(0);\n protected readonly cidr = signal('');\n\n protected readonly key = computed(() => this.host.project()?.key ?? '');\n private readonly id = signal('');\n\n protected readonly engine = computed<Engine | null>(() => this.catalog()?.engines.find((e) => e.id === this.d()?.engine) ?? null);\n protected readonly envVar = computed(() => this.engine()?.envVar ?? 'DATABASE_URL');\n protected readonly plans = computed<Plan[]>(() => this.catalog()?.plans ?? []);\n protected readonly region = computed(() => this.host.project()?.region || 'your region');\n protected readonly params = computed(() => PARAMS[this.d()?.engine ?? ''] ?? []);\n protected readonly conn = computed(() => this.revealed()?.connection ?? this.d()?.connection ?? null);\n protected readonly snippetKeys = computed(() => {\n const s = this.conn()?.snippets ?? {};\n return ['uri', 'psql', 'mysql', 'valkey-cli', 'node'].filter((k) => k in s);\n });\n protected readonly backups = computed(() =>\n [...(this.d()?.backups ?? [])].sort((a, b) => (b.startedAt ?? '9').localeCompare(a.startedAt ?? '9')),\n );\n protected readonly attEnvs = computed(() => {\n const set = new Set<string>();\n const env = this.d()?.environment;\n if (env) set.add(env);\n this.apps().find((a) => a.name === this.attApp())?.environments.forEach((e) => set.add(e));\n ['production', 'staging'].forEach((e) => set.add(e));\n return [...set];\n });\n protected readonly openRotation = computed<Rotation | null>(() => this.d()?.rotations.find((r) => !r.finishedAt) ?? null);\n protected readonly rotateNote = computed(() => {\n const d = this.d();\n if (!d) return '';\n const open = this.openRotation();\n if (open) {\n const pending = (open.apps ?? []).filter((a) => a.state !== 'succeeded' && a.state !== 'live').map((a) => a.app);\n if (open.graceUntil) return `Rotated ${when(open.createdAt)} · the previous password stays valid until ${when(open.graceUntil)}`;\n return `Rotating since ${when(open.createdAt)} · ${pending.length ? 'redeploying ' + pending.join(', ') : 'applying the new password'}; the previous password stays valid until every app is healthy`;\n }\n const owner = d.users?.find((u) => u.preset === 'owner') ?? d.users?.[0];\n const last = d.rotations.find((r) => r.finishedAt);\n if (last && last.state === 'kept') return `The last rotation kept generation ${last.fromGeneration}: ${last.message || 'an app did not become healthy'}`;\n return `Credential generation ${owner?.generation ?? 1}${last ? ' · rotated ' + when(last.finishedAt) : ''} · rotation redeploys every attached app`;\n });\n protected readonly windowLine = computed(() => {\n const d = this.d();\n if (!d) return '';\n if (!d.pitr) return 'Restores from a daily RDB snapshot into a new instance.';\n if (!d.window?.from) return 'Point-in-time recovery starts with the first backup.';\n return `Point-in-time recovery to any second since ${when(d.window.from)}${d.window.to ? ' until ' + when(d.window.to) : ''}.`;\n });\n protected readonly stats = computed(() => {\n const m = this.readings().at(-1);\n const d = this.d();\n const off = !m?.available;\n const fig = (k: string) => m?.figures.find((f) => f.key === k);\n const disk = m?.disk;\n const out = [\n { label: 'Connections', value: off ? '–' : ratio(m?.connections), sub: off ? (m?.message ?? 'reading…') : `${this.d()?.engineName} limit` },\n { label: 'CPU', value: off ? '–' : pct(m?.cpu?.percent), sub: `${num(m?.cpu?.limit ?? Number(this.plans().find((p) => p.id === d?.plan)?.cpu ?? 0))} vCPU` },\n { label: 'Disk', value: disk?.percent != null ? pct(disk.percent) : '–', sub: disk?.used != null ? `${bytes(disk.used)} of ${bytes(disk.limit)}${disk.source === 'engine' ? ' (data)' : ''}` : `of ${d?.diskGb ?? 0} GB` },\n ];\n if (d?.engine === 'postgres') {\n const tx = fig('transactions');\n out.push({ label: 'Cache hit', value: fig('cache_hit') ? pct(fig('cache_hit')!.value) : '–', sub: tx?.rate != null ? `${num(tx.rate, 1)} tx/s` : 'transactions ' + num(tx?.value) });\n } else if (d?.engine === 'mysql') {\n const q = fig('queries');\n out.push({ label: 'Queries / s', value: q?.rate != null ? num(q.rate, 1) : '–', sub: `slow ${num(fig('slow_queries')?.value)} since start` });\n } else {\n out.push({ label: 'Hit ratio', value: fig('hit_ratio') ? pct(fig('hit_ratio')!.value) : '–', sub: `${num(fig('keys')?.value)} keys · ${bytes(fig('memory_used')?.value)}` });\n }\n return out;\n });\n\n private loadTimer: ReturnType<typeof setTimeout> | undefined;\n private metricsTimer: ReturnType<typeof setTimeout> | undefined;\n private loadedFor = '';\n\n constructor() {\n const params = this.route.paramMap.subscribe((pm) => this.id.set(pm.get('id') ?? ''));\n const query = this.route.queryParamMap.subscribe((q) => {\n const t = q.get('tab') as Tab | null;\n this.tab.set(t && TABS.some((x) => x.id === t) ? t : 'overview');\n });\n effect(() => {\n const [k, id] = [this.key(), this.id()];\n if (k && id && k + '/' + id !== this.loadedFor) {\n this.loadedFor = k + '/' + id;\n untracked(() => this.first(k, id));\n }\n });\n // Metrics while Overview or Metrics shows; the slow log for the Metrics tab.\n effect(() => {\n const [t, d] = [this.tab(), this.d()?.id];\n untracked(() => {\n clearTimeout(this.metricsTimer);\n if (d && (t === 'overview' || t === 'metrics')) this.pollMetrics();\n if (d && t === 'metrics') this.api.logs(this.key(), d, 'slow', 20).pipe(catchError(() => of(null))).subscribe((l) => this.slowLines.set(l?.lines ?? []));\n });\n });\n inject(DestroyRef).onDestroy(() => {\n params.unsubscribe();\n query.unsubscribe();\n clearTimeout(this.loadTimer);\n clearTimeout(this.metricsTimer);\n });\n }\n\n private first(k: string, id: string) {\n this.d.set(null);\n this.readings.set([]);\n this.revealed.set(null);\n forkJoin({\n catalog: this.catalog() ? of(this.catalog()!) : this.api.catalog().pipe(catchError(() => of(null))),\n apps: this.host.apps(k).pipe(catchError(() => of([] as ServicesApp[]))),\n }).subscribe(({ catalog, apps }) => {\n this.catalog.set(catalog);\n this.apps.set(apps);\n if (apps.length && !this.attApp()) this.attApp.set(apps[0].name);\n });\n this.load();\n }\n\n private load() {\n clearTimeout(this.loadTimer);\n const [k, id] = [this.key(), this.id()];\n this.api.get(k, id).subscribe({\n next: (d) => {\n if (k !== this.key() || id !== this.id()) return;\n const firstLoad = !this.d();\n this.d.set(d);\n this.error.set('');\n if (firstLoad) {\n this.newPlan.set(d.plan);\n this.newDisk.set(d.diskGb);\n if (d.environment) this.attEnv.set(d.environment);\n if (d.window?.from && !this.pitr()) this.pitr.set(toLocalInput(new Date().toISOString()));\n }\n const settling = moving(d.state) || !!this.openRotation() || d.attachments.some((a) => a.state === 'pending') || (d.backups ?? []).some((b) => b.phase === 'running' || b.phase === 'pending');\n this.loadTimer = setTimeout(() => this.load(), settling ? 4000 : 30_000);\n },\n error: (e) => {\n this.error.set(e?.status === 404 ? 'No such service in this project.' : apiMessage(e, 'The service could not be loaded.'));\n },\n });\n }\n\n private pollMetrics() {\n const d = this.d();\n if (!d) return;\n this.api.metrics(this.key(), d.id).subscribe({\n next: (m) => {\n this.readings.update((rs) => [...rs, m].slice(-90));\n this.metricsTimer = setTimeout(() => this.pollMetrics(), 10_000);\n },\n error: () => (this.metricsTimer = setTimeout(() => this.pollMetrics(), 30_000)),\n });\n }\n\n protected setTab(t: Tab) {\n this.router.navigate([], { relativeTo: this.route, queryParams: { tab: t === 'overview' ? null : t }, queryParamsHandling: 'merge', replaceUrl: true });\n }\n\n protected sizeLine(d: Detail): string {\n const [cpu, ram] = d.planLabel.split(' · ');\n return `${cpu} / ${ram} / ${d.diskGb} GB`;\n }\n protected snippetLabel(k: string): string {\n return ({ uri: 'URI', node: 'Node' } as Record<string, string>)[k] ?? k;\n }\n protected attState(a: Attachment): string {\n return a.state === 'live' ? 'Injected' : a.state === 'failed' ? 'Failed' : 'Redeploying…';\n }\n protected attColour(a: Attachment): string {\n return a.state === 'live' ? 'var(--o-ok-tx)' : a.state === 'failed' ? 'var(--o-bad-tx)' : 'var(--o-acc-tx)';\n }\n protected backupNote(b: Backup): string {\n if (b.phase === 'failed') return 'failed';\n if (b.phase !== 'completed') return b.phase;\n if (b.startedAt && b.stoppedAt) {\n const s = Math.max(1, Math.round((Date.parse(b.stoppedAt) - Date.parse(b.startedAt)) / 1000));\n return s < 60 ? `${s} s` : `${Math.round(s / 60)} min`;\n }\n return '';\n }\n protected pitrHint(d: Detail): string {\n const w = d.window;\n if (!w?.from) return 'Available after the first backup.';\n return `Any second since ${when(w.from)}${w.to ? ' until ' + when(w.to) : ''}.`;\n }\n protected keepLine(b: Backup, days: number): string {\n if (b.kind === 'on-demand') return 'until deleted';\n return b.startedAt ? 'until ' + shortDate(new Date(Date.parse(b.startedAt) + days * 86400000).toISOString()) : `${days} days`;\n }\n protected backupDot(b: Backup): string {\n return b.phase === 'failed' ? 'o-red' : b.phase !== 'completed' ? 'o-blu' : b.kind === 'on-demand' ? 'o-blu' : 'o-grn';\n }\n protected windowHours(h: number): string {\n const p = (n: number) => String(n % 24).padStart(2, '0');\n return `${p(h)}:00 – ${p(h + 4)}:00 UTC`;\n }\n protected dialogTitle(dl: Dialog, d: Detail): string {\n return dl.kind === 'delete' ? `Delete ${d.name}?` : dl.kind === 'restore' ? 'Restore to a new instance' : 'Rotate credentials?';\n }\n\n // ---- actions --------------------------------------------------------------\n\n private run<T>(obs: import('rxjs').Observable<T>, done: (v: T) => void, failure: string) {\n this.busy.set(true);\n this.error.set('');\n this.notice.set('');\n obs.subscribe({\n next: (v) => {\n this.busy.set(false);\n done(v);\n this.load();\n },\n error: (e) => {\n this.busy.set(false);\n this.error.set(apiMessage(e, failure));\n },\n });\n }\n\n protected toggleReveal(d: Detail) {\n if (this.revealed()) {\n this.revealed.set(null);\n return;\n }\n this.run(this.api.reveal(this.key(), d.id), (r) => {\n this.revealed.set(r);\n this.notice.set('Credential reveal recorded in the audit log.');\n }, 'The password could not be revealed.');\n }\n\n protected attach(d: Detail) {\n const app = this.attApp().trim();\n this.run(this.api.attach(this.key(), d.id, { app, environment: this.attEnv(), prefix: this.attPrefix().trim() }), () => {\n this.attachOpen.set(false);\n this.notice.set(`${d.name} attached to ${app} · ${this.attEnv()}: ${this.attPrefix()}${this.envVar()} is injected and ${app} redeploys.`);\n }, 'The service could not be attached.');\n }\n\n protected detach(d: Detail, a: Attachment) {\n this.run(this.api.detach(this.key(), d.id, a.id), () => this.notice.set(`${a.app} no longer gets ${a.prefix}${this.envVar()}; it redeploys without it.`), 'The app could not be detached.');\n }\n\n protected askRotate(d: Detail) {\n const owner = d.users?.find((u) => u.preset === 'owner') ?? d.users?.[0];\n if (owner) this.dialog.set({ kind: 'rotate', user: owner.name, grace: 60 });\n }\n\n protected rotate(d: Detail, user: string, grace: number) {\n this.run(this.api.rotate(this.key(), d.id, user, grace), () => {\n this.dialog.set(null);\n this.notice.set(`Rotating ${user}'s password: attached apps redeploy with the new one; the old one stays valid until they are healthy.`);\n }, 'The credentials could not be rotated.');\n }\n\n protected retire(d: Detail, r: Rotation) {\n this.run(this.api.retire(this.key(), d.id, r.id), () => this.notice.set(`Generation ${r.fromGeneration} of ${r.user} no longer logs in.`), 'The old password could not be retired.');\n }\n\n protected addDb(d: Detail) {\n const name = this.dbName().trim();\n if (!name) return;\n this.run(this.api.addDatabase(this.key(), d.id, name), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.notice.set(`Database ${name} created.`);\n }, 'The database could not be created.');\n }\n\n protected removeDb(d: Detail, name: string) {\n this.run(this.api.removeDatabase(this.key(), d.id, name), () => this.notice.set(`Database ${name} removed.`), 'The database could not be removed.');\n }\n\n protected addUser(d: Detail) {\n const name = this.userName().trim();\n if (!name) return;\n this.run(this.api.addUser(this.key(), d.id, name, this.userPreset()), () => {\n this.addingUser.set(false);\n this.userName.set('');\n this.notice.set(`${name} created with the ${this.userPreset()} preset. Reveal shows its password.`);\n }, 'The user could not be created.');\n }\n\n protected removeUser(d: Detail, name: string) {\n this.run(this.api.removeUser(this.key(), d.id, name), () => this.notice.set(`${name} can no longer log in.`), 'The user could not be removed.');\n }\n\n protected backupNow(d: Detail) {\n this.run(this.api.backupNow(this.key(), d.id), () => this.notice.set('On-demand backup started · kept until you delete it.'), 'The backup could not be started.');\n }\n\n protected deleteBackup(d: Detail, b: Backup) {\n this.run(this.api.deleteBackup(this.key(), d.id, b.name), () => this.notice.set('Backup deleted.'), 'The backup could not be deleted.');\n }\n\n private restoreName(d: Detail): string {\n return `${d.name}-restore-1`.slice(0, 40);\n }\n\n protected askRestore(d: Detail, b: Backup) {\n this.dialog.set({ kind: 'restore', name: this.restoreName(d), point: '', backup: b.name });\n }\n\n protected askPitr(d: Detail) {\n this.dialog.set({ kind: 'restore', name: this.restoreName(d), point: this.pitr(), backup: '' });\n }\n\n protected restore(d: Detail, dl: { name: string; point: string; backup: string }) {\n const body = dl.point ? { pointInTime: fromLocalInput(dl.point), name: dl.name } : { backup: dl.backup, name: dl.name };\n this.busy.set(true);\n this.error.set('');\n this.api.restore(this.key(), d.id, body).subscribe({\n next: (r) => {\n this.busy.set(false);\n this.dialog.set(null);\n this.router.navigate(this.host.link('services/' + r.name));\n },\n error: (e) => {\n this.busy.set(false);\n this.dialog.set(null);\n this.error.set(apiMessage(e, 'The restore could not be started.'));\n },\n });\n }\n\n protected swap(d: Detail, from: string) {\n this.run(this.api.swap(this.key(), d.id, from), () => this.notice.set(`${from}'s apps now use ${d.name}; they redeploy with its connection.`), 'The apps could not be moved.');\n }\n\n protected save(d: Detail, body: Parameters<ServicesApi['update']>[2], ok: string) {\n this.run(this.api.update(this.key(), d.id, body), () => this.notice.set(ok), 'The change could not be saved.');\n }\n\n protected resize(d: Detail) {\n const body: { plan?: string; diskGb?: number } = {};\n if (this.newPlan() !== d.plan) body.plan = this.newPlan();\n if (this.newDisk() !== d.diskGb) body.diskGb = this.newDisk();\n const plan = this.plans().find((p) => p.id === this.newPlan());\n this.save(d, body, `Resizing ${d.name} to ${this.newPlan()} · ${plan ? plan.cpu + ' vCPU · ' + plan.memory.replace('Gi', ' GB') + ' · ' : ''}${this.newDisk()} GB${body.plan ? ' · brief failover expected' : ''}.`);\n }\n\n protected addCidr(d: Detail) {\n const c = this.cidr().trim();\n if (!c) return;\n const cidr = c.includes('/') ? c : c.includes(':') ? c + '/128' : c + '/32';\n this.save(d, { allowedCidrs: [...d.allowedCidrs, cidr] }, `${cidr} can reach the public endpoint.`);\n this.cidr.set('');\n }\n\n protected dropCidr(d: Detail, c: string) {\n this.save(d, { allowedCidrs: d.allowedCidrs.filter((x) => x !== c) }, `${c} removed from the trusted sources.`);\n }\n\n protected remove(d: Detail, finalBackup: boolean) {\n this.run(this.api.remove(this.key(), d.id, d.name, finalBackup), () => {\n this.dialog.set(null);\n this.notice.set(`${d.name} is scheduled for deletion · undo within 24 hours.`);\n }, 'The service could not be deleted.');\n }\n\n protected undelete(d: Detail) {\n this.run(this.api.undelete(this.key(), d.id), () => this.notice.set(`${d.name} is back; reattach its apps if they need it.`), 'The delete could not be undone.');\n }\n}\n","/*\n * @chisquare-tech/origine-ngx-apps-services: the Services module's screens (TRD §6.8, §6.10). The\n * host app provides ServicesHost and mounts the pages at /{org}/{project}/services (the list),\n * /services/new (the wizard) and /services/:id (an instance, ?tab=users|backups|metrics|logs|console|settings).\n */\nexport * from './lib/host';\nexport * from './lib/services.api';\nexport * from './lib/look';\nexport * from './lib/list.page';\nexport * from './lib/new.page';\nexport * from './lib/service.page';\nexport * from './lib/metrics.tab';\nexport * from './lib/logs.tab';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chisquare-tech-origine-ngx-apps-services.mjs","sources":["../../../projects/services/src/lib/host.ts","../../../projects/services/src/lib/services.api.ts","../../../projects/services/src/lib/look.ts","../../../projects/services/src/lib/list.page.ts","../../../projects/services/src/lib/new.page.ts","../../../projects/services/src/lib/logs.tab.ts","../../../projects/services/src/lib/metrics.tab.ts","../../../projects/services/src/lib/service.page.ts","../../../projects/services/src/public-api.ts","../../../projects/services/src/chisquare-tech-origine-ngx-apps-services.ts"],"sourcesContent":["import { Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/** The project the screens are on. */\nexport interface ServicesProject {\n id: string;\n key: string;\n name: string;\n /** The caller's capabilities on the project: view, resources.manage (Maintainer+), … */\n capabilities: string[];\n /** The organization's region, as the wizard shows it (\"EU · Frankfurt\"). */\n region?: string;\n archivedAt?: string;\n}\n\n/** An app services can be attached to, with the environments it runs in. */\nexport interface ServicesApp {\n name: string;\n environments: string[];\n}\n\n/**\n * What the Services screens need from the app that mounts them (cloud/web provides it, as it\n * provides DesignHost, CodeHost, DeployHost and DebugHost): where the person is, links inside the\n * project, and the project's apps (deploy's, for \"Attach to app\"; the module never calls deploy).\n */\nexport abstract class ServicesHost {\n abstract readonly project: Signal<ServicesProject | null>;\n abstract readonly projectLoaded: Signal<boolean>;\n /** A router link to a path inside the current project ('' is its overview). */\n abstract link(path?: string): string[];\n /** The project's apps; empty when there are none (attaching then takes a typed name). */\n abstract apps(projectKey: string): Observable<ServicesApp[]>;\n /**\n * A stored series of one exporter metric for the service ([unix ms, value] points), as debug's\n * engine dashboard reads it; null when the cell keeps no telemetry (the Metrics tab then shows\n * live readings only). agg: sum, max, rate…; range: 1h, 6h, 24h, 7d.\n */\n abstract history(projectKey: string, service: string, metric: string, agg: string, range: string): Observable<[number, number][] | null>;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ApiService } from '@thescaffold/ngx-core';\nimport { Observable, map } from 'rxjs';\n\n// The services app's API (gox-apps/libs/services, mounted at /api/v1/services). Shapes mirror the Go JSON.\n\nexport type State = 'Provisioning' | 'Running' | 'Updating' | 'Maintenance' | 'Restoring' | 'Degraded' | 'Failed' | 'Suspended' | 'Deleting' | 'Deleted';\n\nexport interface EngineVersion {\n id: string;\n label: string;\n default?: boolean;\n}\n\nexport interface Engine {\n id: string;\n name: string;\n description: string;\n versions: EngineVersion[];\n envVar: string;\n pitr: boolean;\n port: number;\n available: boolean;\n tag?: string;\n databases: boolean;\n}\n\nexport interface Plan {\n id: string;\n cpu: string;\n memory: string;\n diskGb: number;\n priceCents: number;\n label: string;\n}\n\nexport interface Catalog {\n engines: Engine[];\n plans: Plan[];\n freePlan: string;\n maxDiskGb: number;\n}\n\nexport interface Quota {\n plan: string;\n used: number;\n limit: number;\n onlyPlan?: string;\n}\n\nexport interface Summary {\n id: string;\n name: string;\n engine: string;\n engineName: string;\n version: string;\n plan: string;\n planLabel: string;\n diskGb: number;\n environment: string;\n state: State;\n message?: string;\n attached: string[];\n lastBackup?: string;\n pitr: boolean;\n monthlyCents: number;\n createdAt: string;\n deletedAt?: string;\n purgeAt?: string;\n}\n\nexport interface ServiceList {\n items: Summary[];\n quota?: Quota;\n}\n\nexport interface Database {\n name: string;\n createdBy: string;\n createdAt: string;\n}\n\nexport interface UserView {\n name: string;\n preset: 'owner' | 'admin' | 'read-write' | 'read-only' | string;\n generation: number;\n rotating: boolean;\n attached: string[];\n createdAt: string;\n}\n\nexport interface Backup {\n name: string;\n kind: 'scheduled' | 'on-demand' | string;\n request?: string;\n phase: 'pending' | 'running' | 'completed' | 'failed' | string;\n startedAt?: string;\n stoppedAt?: string;\n error?: string;\n}\n\nexport interface Attachment {\n id: string;\n instanceId: string;\n environment: string;\n app: string;\n prefix: string;\n user: string;\n database: string;\n state: 'pending' | 'live' | 'failed' | string;\n message: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Rotation {\n id: string;\n user: string;\n fromGeneration: number;\n toGeneration: number;\n state: string;\n graceSeconds: number;\n graceUntil?: string;\n apps: { app: string; environment: string; state: string; message?: string }[] | null;\n message: string;\n createdAt: string;\n finishedAt?: string;\n}\n\nexport interface Connection {\n host: string;\n port: number;\n database?: string;\n user: string;\n sslMode: string;\n snippets: Record<string, string>;\n}\n\nexport interface Detail extends Summary {\n host: string;\n port: number;\n backupHour: number;\n retentionDays: number;\n maintenanceDay: string;\n maintenanceHour: number;\n publicEnabled: boolean;\n allowedCidrs: string[];\n databases: Database[];\n users: UserView[] | null;\n backups: Backup[] | null;\n window?: { from?: string; to?: string };\n attachments: Attachment[];\n connection?: Connection;\n rotations: Rotation[];\n restoreOf?: Summary;\n restorePoint?: string;\n restoreBackup?: string;\n provisionedAt?: string;\n finalBackup: boolean;\n canManage: boolean;\n}\n\nexport interface Revealed {\n user: string;\n login: string;\n generation: number;\n password: string;\n connection: Connection;\n}\n\nexport interface Gauge {\n used: number | null;\n limit: number;\n percent: number | null;\n unit: string;\n source?: 'volume' | 'engine';\n}\n\nexport interface Figure {\n key: string;\n label: string;\n value: number;\n unit: string;\n counter?: boolean;\n rate?: number;\n}\n\nexport interface PodView {\n name: string;\n role: string;\n ready: boolean;\n restarts: number;\n startedAt?: string;\n cpuCores: number;\n memoryBytes: number;\n}\n\nexport interface Metrics {\n at: string;\n state: State;\n available: boolean;\n message?: string;\n pods: PodView[];\n cpu?: Gauge;\n memory?: Gauge;\n disk?: Gauge;\n connections?: Gauge;\n figures: Figure[];\n}\n\nexport type LogKind = 'all' | 'errors' | 'slow' | 'connections';\n\nexport interface LogLine {\n time: string;\n pod: string;\n level: string;\n kind: 'error' | 'slow' | 'connection' | 'log';\n message: string;\n}\n\nexport interface Logs {\n kind: LogKind;\n available: boolean;\n message?: string;\n lines: LogLine[];\n}\n\nexport interface CreateInput {\n name: string;\n engine: string;\n version?: string;\n plan: string;\n environment?: string;\n database?: string;\n backupHour?: number;\n retentionDays?: number;\n attach?: { app: string; environment?: string; prefix?: string };\n}\n\nexport interface UpdateInput {\n plan?: string;\n diskGb?: number;\n backupHour?: number;\n retentionDays?: number;\n maintenanceDay?: string;\n maintenanceHour?: number;\n publicEnabled?: boolean;\n allowedCidrs?: string[];\n}\n\nconst S = 'v1/services';\nconst enc = encodeURIComponent;\nconst data = <T>(r: any): T => r?.data as T;\n\nexport function apiMessage(err: any, fallback = 'Something went wrong. Try again.'): string {\n return err?.error?.message || err?.body?.message || err?.message || fallback;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ServicesApi {\n private readonly api = inject(ApiService);\n\n private i(project: string, id = '', path = '') {\n return `${S}/project/${enc(project)}/instance${id ? '/' + enc(id) : ''}${path ? '/' + path : ''}`;\n }\n\n catalog(): Observable<Catalog> {\n return this.api.get(`${S}/catalog`).pipe(map((r) => data<Catalog>(r)));\n }\n list(project: string): Observable<ServiceList> {\n return this.api.get(this.i(project)).pipe(map((r) => data<ServiceList>(r) ?? { items: [] }));\n }\n get(project: string, id: string): Observable<Detail> {\n return this.api.get(this.i(project, id)).pipe(map((r) => data<Detail>(r)));\n }\n create(project: string, body: CreateInput): Observable<Detail> {\n return this.api.post(this.i(project), body).pipe(map((r) => data<Detail>(r)));\n }\n update(project: string, id: string, body: UpdateInput): Observable<Detail> {\n return this.api.patch(this.i(project, id), body).pipe(map((r) => data<Detail>(r)));\n }\n remove(project: string, id: string, confirm: string, finalBackup: boolean): Observable<Detail> {\n return this.api.post(this.i(project, id, 'delete'), { confirm, finalBackup }).pipe(map((r) => data<Detail>(r)));\n }\n undelete(project: string, id: string): Observable<Detail> {\n return this.api.post(this.i(project, id, 'undelete'), {}).pipe(map((r) => data<Detail>(r)));\n }\n reveal(project: string, id: string, user = ''): Observable<Revealed> {\n return this.api.post(this.i(project, id, 'reveal'), user ? { user } : {}).pipe(map((r) => data<Revealed>(r)));\n }\n addDatabase(project: string, id: string, name: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'database'), { name });\n }\n removeDatabase(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'database/' + enc(name)));\n }\n addUser(project: string, id: string, name: string, preset: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'user'), { name, preset });\n }\n removeUser(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'user/' + enc(name)));\n }\n rotate(project: string, id: string, user = '', graceMinutes?: number): Observable<Rotation> {\n return this.api.post(this.i(project, id, 'rotate'), { user, graceMinutes }).pipe(map((r) => data<Rotation>(r)));\n }\n retire(project: string, id: string, rotation: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'rotation/' + enc(rotation) + '/retire'), {});\n }\n backupNow(project: string, id: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'backup'), {});\n }\n deleteBackup(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'backup/' + enc(name)));\n }\n restore(project: string, id: string, body: { pointInTime?: string; backup?: string; name?: string }): Observable<Detail> {\n return this.api.post(this.i(project, id, 'restore'), body).pipe(map((r) => data<Detail>(r)));\n }\n attach(project: string, id: string, body: { app: string; environment?: string; prefix?: string }): Observable<Attachment> {\n return this.api.post(this.i(project, id, 'attachment'), body).pipe(map((r) => data<Attachment>(r)));\n }\n detach(project: string, id: string, attachment: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'attachment/' + enc(attachment)));\n }\n swap(project: string, id: string, from: string): Observable<unknown> {\n return this.api.post(this.i(project, id, 'swap'), { from });\n }\n metrics(project: string, id: string): Observable<Metrics> {\n return this.api.get(this.i(project, id, 'metrics')).pipe(map((r) => data<Metrics>(r)));\n }\n logs(project: string, id: string, kind: LogKind, limit = 200): Observable<Logs> {\n return this.api.get(this.i(project, id, 'logs'), { kind, limit }).pipe(map((r) => data<Logs>(r)));\n }\n}\n","import { Backup, Gauge, State, Summary } from './services.api';\n\n// Small helpers the Services screens share; colours and wording follow the prototype.\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** The prototype's engine squares: Postgres accent, MySQL amber, Valkey red. */\nexport const ENGINE_COLOUR: Record<string, string> = {\n postgres: 'var(--o-acc)', mysql: 'var(--o-run)', valkey: 'var(--o-bad-solid)', nats: 'var(--o-ok)', rabbitmq: 'var(--o-run)',\n};\n\n/** State chips (prototype stCls): green running, blue in motion, amber attention, red failing or going. */\nconst STATE_CLASS: Record<string, string> = {\n Running: 'o-grn', Provisioning: 'o-blu', Restoring: 'o-blu', Updating: 'o-blu', Maintenance: 'o-amb', Degraded: 'o-amb', Suspended: 'o-amb',\n Failed: 'o-red', Deleting: 'o-red', Deleted: 'o-red',\n};\nexport function stateChip(s: State | string): string {\n return 'o-chip ' + (STATE_CLASS[s] ?? '');\n}\nexport function stateDot(s: State | string): string {\n const c = STATE_CLASS[s];\n return 'o-dot ' + (c === 'o-grn' ? 'o-grn' : c === 'o-blu' ? 'o-blu' : c === 'o-red' ? 'o-red' : 'o-amb');\n}\n/** States that change by themselves: the screens poll while one shows. */\nexport function moving(s: State | string): boolean {\n return ['Provisioning', 'Updating', 'Restoring', 'Deleting', 'Maintenance'].includes(s);\n}\n\nexport const LIFECYCLE = 'Provisioning · Running · Updating · Maintenance · Restoring · Degraded · Failed · Deleting';\n\nexport function money(cents: number): string {\n const d = cents / 100;\n return '$' + (Number.isInteger(d) ? d.toFixed(0) : d.toFixed(2));\n}\n\nexport function bytes(v: number | null | undefined): string {\n if (v == null || Number.isNaN(v)) return '–';\n const u = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n let x = v;\n while (x >= 1024 && i < u.length - 1) {\n x /= 1024;\n i++;\n }\n return `${x >= 100 || i === 0 ? x.toFixed(0) : x.toFixed(1)} ${u[i]}`;\n}\n\nexport function num(v: number | null | undefined, digits = 0): string {\n if (v == null || Number.isNaN(v)) return '–';\n return v.toLocaleString('en-US', { maximumFractionDigits: digits, minimumFractionDigits: 0 });\n}\n\nexport function pct(v: number | null | undefined): string {\n if (v == null || Number.isNaN(v)) return '–';\n return `${v < 10 && v > 0 ? v.toFixed(1) : Math.round(v)}%`;\n}\n\n/** \"42 / 100\" for a count gauge. */\nexport function ratio(g?: Gauge): string {\n if (!g || g.used == null) return '–';\n return `${num(g.used)} / ${num(g.limit)}`;\n}\n\nfunction pad(n: number) {\n return String(n).padStart(2, '0');\n}\n\nexport function hhmm(iso: string | number): string {\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${pad(t.getHours())}:${pad(t.getMinutes())}`;\n}\n\nexport function hhmmss(iso: string | number): string {\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${hhmm(iso)}:${pad(t.getSeconds())}`;\n}\n\nexport function shortDate(iso?: string): string {\n if (!iso) return '';\n const t = new Date(iso);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}`;\n}\n\n/** \"Today 03:00\", \"Yesterday 03:00\", \"Oct 26, 03:00\". */\nexport function when(iso?: string, now = Date.now()): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const d = new Date(t);\n if (d.toDateString() === new Date(now).toDateString()) return `Today ${hhmm(iso)}`;\n if (d.toDateString() === new Date(now - 86400000).toDateString()) return `Yesterday ${hhmm(iso)}`;\n return `${shortDate(iso)}, ${hhmm(iso)}`;\n}\n\n/** The hour as the wizard and schedule show it: \"03:00 UTC\". */\nexport function utcHour(h: number): string {\n return `${pad(h)}:00 UTC`;\n}\n\n/** The list's Backups column: \"Today 03:00 · PITR\", or when the first one comes. */\nexport function backupsLine(s: Summary): string {\n if (!s.lastBackup) return s.state === 'Provisioning' ? 'first backup after provisioning' : 'none yet';\n return when(s.lastBackup) + (s.pitr ? ' · PITR' : ' · snapshot');\n}\n\nexport function backupKind(b: Backup): string {\n return b.kind === 'on-demand' ? 'on-demand' : 'scheduled';\n}\n\n/** <input type=\"datetime-local\"> value (local time) ↔ ISO. */\nexport function toLocalInput(iso?: string): string {\n if (!iso) return '';\n const t = new Date(iso);\n if (Number.isNaN(t.getTime())) return '';\n return `${t.getFullYear()}-${pad(t.getMonth() + 1)}-${pad(t.getDate())}T${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}`;\n}\nexport function fromLocalInput(v: string): string {\n const t = new Date(v);\n return Number.isNaN(t.getTime()) ? '' : t.toISOString();\n}\n\n/** A small SVG sparkline for values in a w×h box: the line, and the area under it. A flat series sits mid-height. */\nexport function sparkPath(values: number[], w = 200, h = 60): string {\n return spark(values, w, h).line;\n}\nexport function spark(values: number[], w = 200, h = 60): { line: string; area: string } {\n if (values.length < 2) return { line: '', area: '' };\n const min = Math.min(...values);\n const max = Math.max(...values);\n const span = max - min;\n const pts = values.map((v, i) => [(i / (values.length - 1)) * w, span ? h - 4 - ((v - min) / span) * (h - 12) : h / 2] as const);\n const line = pts.map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');\n return { line, area: `${line} L${w},${h} L0,${h} Z` };\n}\n\nexport const PRESETS: { id: string; label: string }[] = [\n { id: 'read-only', label: 'read-only' },\n { id: 'read-write', label: 'read-write' },\n { id: 'admin', label: 'admin' },\n];\nexport function presetChip(p: string): string {\n return 'o-chip ' + (p === 'admin' || p === 'owner' ? 'o-red' : p === 'read-write' ? 'o-blu' : '');\n}\n\nexport const DAYS = [\n { id: 'sun', label: 'Sunday' }, { id: 'mon', label: 'Monday' }, { id: 'tue', label: 'Tuesday' }, { id: 'wed', label: 'Wednesday' },\n { id: 'thu', label: 'Thursday' }, { id: 'fri', label: 'Friday' }, { id: 'sat', label: 'Saturday' },\n];\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { ServicesHost } from './host';\nimport { ENGINE_COLOUR, LIFECYCLE, backupsLine, money, moving, stateChip } from './look';\nimport { ServiceList, ServicesApi, Summary, apiMessage } from './services.api';\n\n// /{org}/{project}/services (prototype \"services_list\"): the project's instances with their state,\n// what they are attached to, their backups and price, and the organization's quota line (SVC-01, 26).\n@Component({\n selector: 'o-services-list',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · private network · TLS enforced</span><h1 class=\"o-t\">Services</h1></div>\n <div class=\"o-acts\">\n <span class=\"o-faint o-sm\" data-testid=\"svc-quota\">{{ quotaLine() }}</span>\n @if (canManage()) {<a class=\"o-btn o-dark\" [routerLink]=\"host.link('services/new')\" data-testid=\"svc-create\">+ Create service</a>}\n </div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (created(); as c) {<div class=\"o-note\" [class.o-grn]=\"c.running\" role=\"status\" data-testid=\"svc-created\">{{ c.text }}</div>}\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" style=\"min-width:860px\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\">Name</div><div class=\"o-th\">Engine</div><div class=\"o-th\">Plan</div><div class=\"o-th\">Environment</div><div class=\"o-th\">State</div><div class=\"o-th\">Attached to</div><div class=\"o-th\">Backups</div><div class=\"o-th o-num\">Monthly</div></div></div>\n <div class=\"o-tbody\">\n @for (v of rows(); track v.id) {\n <div class=\"o-tr o-click\" (click)=\"open(v)\" (keydown.enter)=\"open(v)\" tabindex=\"0\" role=\"link\" [attr.data-testid]=\"'svc-row-' + v.name\">\n <div class=\"o-td o-b5 o-mono\">{{ v.name }}</div>\n <div class=\"o-td\"><span class=\"o-flex\"><span class=\"o-sq\" [style.background]=\"colour(v.engine)\"></span>{{ v.engineName }} {{ v.version }}</span></div>\n <div class=\"o-td o-mut o-sm\">{{ v.plan }} · {{ v.planLabel.split(' · ').slice(0, 2).join(' · ') }} · {{ v.diskGb }} GB</div>\n <div class=\"o-td o-mut\">{{ v.environment || 'shared' }}</div>\n <div class=\"o-td\"><span [class]=\"chip(v.state)\" [attr.title]=\"v.message || null\">{{ v.state }}</span></div>\n <div class=\"o-td o-sm\">{{ v.attached.length ? v.attached.join(', ') : '—' }}</div>\n <div class=\"o-td o-faint o-sm\">{{ backups(v) }}</div>\n <div class=\"o-td o-num o-mono\">{{ price(v.monthlyCents) }}</div>\n </div>\n } @empty {\n <div class=\"o-empty\">\n @if (loaded()) {\n No services yet. @if (canManage()) {<a [routerLink]=\"host.link('services/new')\">Create a database or cache</a>, attach it to an app, and it is injected as <span class=\"o-mono\">DATABASE_URL</span>.}\n } @else {Loading…}\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"o-g2\">\n <div class=\"o-card o-cb o-flex\"><span class=\"o-sq\" style=\"background:var(--o-ok)\"></span><div class=\"o-col\" style=\"gap:2px\"><b>NATS with JetStream</b><span class=\"o-faint o-sm\">Streams, consumers, KV buckets · 3-node cluster</span></div><b class=\"o-ph-tag o-ga o-r\">GA</b></div>\n <div class=\"o-card o-cb o-flex\"><span class=\"o-sq\" style=\"background:var(--o-run)\"></span><div class=\"o-col\" style=\"gap:2px\"><b>RabbitMQ</b><span class=\"o-faint o-sm\">Quorum queues · management UI through Origine</span></div><b class=\"o-ph-tag o-ga o-r\">GA</b></div>\n </div>\n <span class=\"o-faint o-sm\">Lifecycle states: {{ lifecycle }}. Open-source engines only.</span>\n </div>\n `,\n})\nexport class ServicesListPage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly router = inject(Router);\n\n protected readonly list = signal<ServiceList>({ items: [] });\n protected readonly loaded = signal(false);\n protected readonly error = signal('');\n protected readonly lifecycle = LIFECYCLE;\n protected readonly chip = stateChip;\n protected readonly colour = (e: string) => ENGINE_COLOUR[e] ?? 'var(--o-line-mid)';\n protected readonly backups = backupsLine;\n protected readonly price = money;\n\n protected readonly rows = computed(() => this.list().items.filter((s) => !s.deletedAt || s.state === 'Deleting'));\n protected readonly canManage = computed(() => this.host.project()?.capabilities.includes('resources.manage') ?? false);\n protected readonly quotaLine = computed(() => {\n const q = this.list().quota;\n if (!q) return '';\n const n = q.limit ? `${q.used} of ${q.limit} instance${q.limit === 1 ? '' : 's'}` : `${q.used} instance${q.used === 1 ? '' : 's'}`;\n return `${n} · ${q.plan} plan${q.onlyPlan ? ' · ' + q.onlyPlan + ' only' : ''}`;\n });\n\n // After the wizard: provisioning, then running (with what was injected where).\n private readonly route = inject(ActivatedRoute);\n private readonly createdName = signal(this.route.snapshot.queryParamMap.get('created') ?? '');\n private readonly createdApp = this.route.snapshot.queryParamMap.get('attached') ?? '';\n private readonly createdVar = this.route.snapshot.queryParamMap.get('envVar') ?? '';\n protected readonly created = computed(() => {\n const n = this.createdName();\n const s = n ? this.list().items.find((i) => i.name === n) : undefined;\n if (!s) return null;\n if (s.state === 'Running') {\n const inj = this.createdApp ? ` · ${this.createdVar} injected into ${this.createdApp}` : '';\n return { running: true, text: `${n} is running${inj} · dashboard and default alert rules created` };\n }\n if (s.state === 'Failed') return { running: false, text: `${n} failed to provision: ${s.message || 'see the instance page'}` };\n return { running: false, text: `${n} provisioning · usually under 5 minutes` };\n });\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n private key = '';\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p && p.key !== this.key) {\n this.key = p.key;\n untracked(() => this.load());\n }\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n private load() {\n clearTimeout(this.timer);\n const key = this.key;\n this.api.list(key).subscribe({\n next: (l) => {\n if (key !== this.key) return;\n this.list.set(l);\n this.loaded.set(true);\n this.error.set('');\n // Provisioning, resizing, restoring: look again until they settle.\n if (l.items.some((s) => moving(s.state))) this.timer = setTimeout(() => this.load(), 5000);\n },\n error: (e) => {\n this.loaded.set(true);\n this.error.set(apiMessage(e, 'Services could not be loaded.'));\n },\n });\n }\n\n protected open(v: Summary) {\n this.router.navigate(this.host.link('services/' + v.name));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesApp, ServicesHost } from './host';\nimport { money, utcHour } from './look';\nimport { Catalog, Engine, Plan, Quota, ServicesApi, apiMessage } from './services.api';\n\nconst NAME = /^[a-z]([-a-z0-9]{0,28}[a-z0-9])?$/;\nconst DEFAULT_NAME: Record<string, string> = { postgres: 'orders-db', mysql: 'ledger-mysql', valkey: 'cache' };\n\n// /{org}/{project}/services/new (prototype \"services_new\"): engine and version, size and region,\n// name and environment, with the summary and price beside it (SVC-02…05). Creating returns to the\n// list, where the instance shows Provisioning until the cell reports it Running.\n@Component({\n selector: 'o-services-new',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · ready in under 5 minutes</span><h1 class=\"o-t\">Create a service</h1></div></div>\n <div class=\"o-flex\" style=\"gap:6px\">\n @for (s of steps; track s.n; let i = $index) {\n <button type=\"button\" class=\"o-flex\" style=\"border:none;background:none;cursor:pointer;gap:8px;padding:0\" (click)=\"go(s.n)\" [attr.aria-current]=\"step() === s.n ? 'step' : null\">\n <span class=\"o-av\" [style.background]=\"s.n <= step() ? 'var(--o-tx)' : 'var(--o-line-soft)'\" [style.color]=\"s.n <= step() ? 'var(--o-acc-fg)' : 'var(--o-mut)'\">{{ s.n < step() ? '✓' : s.n }}</span>\n <span class=\"o-sm\" [style.color]=\"s.n === step() ? 'var(--o-tx)' : 'var(--o-mut)'\">{{ s.label }}</span>\n </button>\n @if (i < steps.length - 1) {<span style=\"flex:1;border-top:1px solid var(--o-line);min-width:30px\"></span>}\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-new-error\">{{ error() }}</div>}\n <div class=\"o-split\" style=\"grid-template-columns:minmax(0,1fr) 250px\">\n <div class=\"o-col\" style=\"gap:14px\">\n @if (step() === 1) {\n <div class=\"o-g2\">\n @for (e of engines(); track e.id) {\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"engine()?.id === e.id\" [class.o-dis]=\"!e.available\" (click)=\"pickEngine(e)\" [attr.data-testid]=\"'svc-engine-' + e.id\">\n <span class=\"o-rad\" [class.o-on]=\"engine()?.id === e.id\"></span>\n <div class=\"o-col\" style=\"gap:3px;flex:1\"><span class=\"o-flex\"><b>{{ e.name }}</b>@if (e.tag) {<b class=\"o-ph-tag o-ga\">{{ e.tag }}</b>}</span><span class=\"o-faint o-sm o-lh\">{{ e.description }}</span></div>\n </button>\n }\n </div>\n <div class=\"o-fld\">\n <label>Version</label>\n <div class=\"o-seg\" style=\"align-self:flex-start\">\n @for (v of engine()?.versions ?? []; track v.id) {<button type=\"button\" [class.o-on]=\"version() === v.id\" (click)=\"version.set(v.id)\">{{ v.label }}</button>}\n </div>\n <span class=\"o-hint\">Minor patches apply in your maintenance window with 7 days' notice.</span>\n </div>\n }\n @if (step() === 2) {\n <div class=\"o-card\"><div class=\"o-tbl\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\"></div><div class=\"o-th\">Plan</div><div class=\"o-th\">vCPU</div><div class=\"o-th\">RAM</div><div class=\"o-th\">Disk</div><div class=\"o-th o-num\">Monthly</div></div></div>\n <div class=\"o-tbody\">\n @for (z of plans(); track z.id) {\n <div class=\"o-tr\" [class.o-click]=\"allowed(z)\" [style.opacity]=\"allowed(z) ? 1 : 0.5\" (click)=\"pickPlan(z)\" [attr.data-testid]=\"'svc-plan-' + z.id\" [attr.title]=\"allowed(z) ? null : quota()?.plan + ' includes ' + quota()?.onlyPlan + ' only'\">\n <div class=\"o-td\"><span class=\"o-rad\" [class.o-on]=\"plan()?.id === z.id\"></span></div>\n <div class=\"o-td o-mono o-b5\">{{ z.id }}</div><div class=\"o-td\">{{ z.cpu }} vCPU</div><div class=\"o-td\">{{ ram(z) }}</div><div class=\"o-td\">{{ z.diskGb }} GB</div>\n <div class=\"o-td o-num o-mono\">{{ price(z.priceCents) }}/mo</div>\n </div>\n }\n </div>\n </div></div>\n @if (quota()?.onlyPlan) {<span class=\"o-hint\">The {{ quota()?.plan }} plan includes one {{ quota()?.onlyPlan }}. Upgrade in Billing for larger plans.</span>}\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label>Region</label><input class=\"o-in\" [value]=\"region()\" readonly aria-label=\"Region\" /></div>\n <div class=\"o-fld\"><label>High availability <b class=\"o-ph-tag o-ga\">GA</b></label><div class=\"o-flex\"><button type=\"button\" class=\"o-tog\" disabled aria-label=\"High availability (GA)\"></button><span class=\"o-sm\">Standby node with automatic failover</span></div></div>\n </div>\n }\n @if (step() === 3) {\n <div class=\"o-card o-cb o-form\">\n <div class=\"o-fld\">\n <label for=\"svc-name\">Name</label>\n <input id=\"svc-name\" class=\"o-in o-mono\" [ngModel]=\"name()\" (ngModelChange)=\"name.set($event); nameTouched.set(true)\" data-testid=\"svc-name\" autocomplete=\"off\" />\n @if (nameError()) {<span class=\"o-hint\" style=\"color:var(--o-bad-tx)\">{{ nameError() }}</span>} @else {<span class=\"o-hint\">Internal host: <b class=\"o-mono\">{{ hostName() }}</b></span>}\n </div>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label>Project</label><select class=\"o-in\" disabled aria-label=\"Project\"><option>{{ host.project()?.key }} · {{ host.project()?.name }}</option></select></div>\n <div class=\"o-fld\"><label for=\"svc-env\">Environment</label>\n <select id=\"svc-env\" class=\"o-in\" [ngModel]=\"env()\" (ngModelChange)=\"env.set($event)\" data-testid=\"svc-env\">\n @for (e of envs(); track e) {<option [value]=\"e\">{{ e }}</option>}\n </select>\n </div>\n </div>\n <div class=\"o-fld\"><label for=\"svc-attach\">Attach after create</label>\n @if (apps().length) {\n <select id=\"svc-attach\" class=\"o-in\" [ngModel]=\"attach()\" (ngModelChange)=\"attach.set($event)\" data-testid=\"svc-attach\">\n <option value=\"\">Don't attach yet</option>\n @for (a of apps(); track a.name) {<option [value]=\"a.name\">{{ a.name }}</option>}\n </select>\n } @else {\n <input id=\"svc-attach\" class=\"o-in o-mono\" placeholder=\"app name (optional)\" [ngModel]=\"attach()\" (ngModelChange)=\"attach.set($event)\" data-testid=\"svc-attach\" />\n }\n <span class=\"o-hint\">Injects {{ engine()?.envVar }} into the app and redeploys it.</span>\n </div>\n <div class=\"o-g2\">\n @if (engine()?.id === 'mysql') {\n <div class=\"o-fld\"><label>Backups</label><input class=\"o-in\" value=\"Every hour\" readonly aria-label=\"Backups\" /></div>\n } @else {\n <div class=\"o-fld\"><label for=\"svc-hour\">Daily backup at</label>\n <select id=\"svc-hour\" class=\"o-in\" [ngModel]=\"hour()\" (ngModelChange)=\"hour.set(+$event)\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ utc(h) }}</option>}</select>\n </div>\n }\n <div class=\"o-fld\"><label for=\"svc-keep\">Retention</label>\n <select id=\"svc-keep\" class=\"o-in\" [ngModel]=\"keep()\" (ngModelChange)=\"keep.set(+$event)\">@for (d of keeps; track d) {<option [ngValue]=\"d\">{{ d }} days</option>}</select>\n </div>\n </div>\n </div>\n }\n <div class=\"o-flex\">\n @if (step() > 1) {<button type=\"button\" class=\"o-btn\" (click)=\"go(step() - 1)\">Back</button>}\n <button type=\"button\" class=\"o-btn o-dark o-r\" (click)=\"next()\" [disabled]=\"busy() || !canNext()\" data-testid=\"svc-next\">{{ step() < 3 ? 'Continue' : 'Create ' + name() }}</button>\n </div>\n </div>\n <div class=\"o-card o-cb o-col\" style=\"gap:10px;position:sticky;top:0;align-self:start\">\n <b>Summary</b>\n <div class=\"o-kv\" style=\"grid-template-columns:70px 1fr;font-size:12px;row-gap:6px\">\n <span class=\"o-k\">Engine</span><span>{{ engine()?.name }} {{ versionLabel() }}</span>\n <span class=\"o-k\">Plan</span><span class=\"o-mono\">{{ plan()?.id }}</span>\n <span class=\"o-k\">Size</span><span>{{ plan() ? plan()!.cpu + ' vCPU · ' + ram(plan()!) + ' · ' + plan()!.diskGb + ' GB' : '' }}</span>\n <span class=\"o-k\">Region</span><span>{{ region() }}</span>\n <span class=\"o-k\">Network</span><span>Private · TLS</span>\n <span class=\"o-k\">Backups</span><span>{{ engine()?.id === 'mysql' ? 'Hourly' : 'Daily' }}{{ engine()?.pitr ? ' + PITR' : ' RDB snapshot' }}</span>\n </div>\n <div class=\"o-flex\" style=\"border-top:1px solid var(--o-line-soft);padding-top:10px\"><span class=\"o-mut\">Monthly</span><b class=\"o-r o-mono o-md\">{{ plan() ? price(plan()!.priceCents) + '/mo' : '' }}</b></div>\n <span class=\"o-hint\">Billed by instance hour. Free plan: one {{ catalog()?.freePlan || 'db-s-1' }}, hard limit.</span>\n </div>\n </div>\n </div>\n `,\n})\nexport class ServicesNewPage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly router = inject(Router);\n\n protected readonly steps = [{ n: 1, label: 'Engine and version' }, { n: 2, label: 'Size and region' }, { n: 3, label: 'Name and environment' }];\n protected readonly hours = Array.from({ length: 24 }, (_, i) => (i + 3) % 24);\n protected readonly keeps = [7, 14, 35];\n protected readonly price = money;\n protected readonly utc = utcHour;\n\n protected readonly catalog = signal<Catalog | null>(null);\n protected readonly quota = signal<Quota | null>(null);\n protected readonly apps = signal<ServicesApp[]>([]);\n protected readonly step = signal(1);\n protected readonly engine = signal<Engine | null>(null);\n protected readonly version = signal('');\n protected readonly plan = signal<Plan | null>(null);\n protected readonly name = signal('orders-db');\n protected readonly nameTouched = signal(false);\n protected readonly env = signal('production');\n protected readonly attach = signal('');\n protected readonly hour = signal(3);\n protected readonly keep = signal(7);\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n\n protected readonly engines = computed(() => this.catalog()?.engines ?? []);\n protected readonly plans = computed(() => this.catalog()?.plans ?? []);\n protected readonly region = computed(() => this.host.project()?.region || \"Your organization's region\");\n protected readonly versionLabel = computed(() => this.engine()?.versions.find((v) => v.id === this.version())?.label ?? this.version());\n protected readonly envs = computed(() => {\n const set = new Set<string>(['production', 'staging']);\n for (const a of this.apps()) a.environments.forEach((e) => set.add(e));\n return [...set, 'shared'];\n });\n protected readonly hostName = computed(() => {\n const n = this.name() || 'name';\n const e = this.engine()?.id;\n const ns = 's-' + (this.host.project()?.id ?? 'project');\n return e === 'mysql' ? `moco-${n}-primary.${ns}.svc` : e === 'valkey' ? `${n}.${ns}.svc` : `${n}-rw.${ns}.svc`;\n });\n protected readonly nameError = computed(() => {\n const n = this.name();\n if (!n) return 'A name is required.';\n if (!NAME.test(n)) return 'Lowercase letters, digits and dashes; starts with a letter; at most 30 characters.';\n return '';\n });\n\n private key = '';\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p && p.key !== this.key) {\n this.key = p.key;\n untracked(() => this.load(p.key));\n }\n });\n }\n\n private load(key: string) {\n forkJoin({\n catalog: this.api.catalog(),\n list: this.api.list(key).pipe(catchError(() => of({ items: [], quota: undefined }))),\n apps: this.host.apps(key).pipe(catchError(() => of([] as ServicesApp[]))),\n }).subscribe({\n next: ({ catalog, list, apps }) => {\n this.catalog.set(catalog);\n this.quota.set(list.quota ?? null);\n this.apps.set(apps);\n const first = catalog.engines.find((e) => e.available) ?? null;\n if (first) this.pickEngine(first);\n this.plan.set(catalog.plans.find((p) => p.id === (list.quota?.onlyPlan || catalog.plans[0]?.id)) ?? catalog.plans[0] ?? null);\n },\n error: (e) => this.error.set(apiMessage(e, 'The catalogue could not be loaded.')),\n });\n }\n\n protected ram(p: Plan): string {\n const m = /^(\\d+)Gi$/.exec(p.memory);\n return m ? `${m[1]} GB` : p.memory;\n }\n\n protected allowed(p: Plan): boolean {\n const only = this.quota()?.onlyPlan;\n return !only || p.id === only;\n }\n\n protected pickEngine(e: Engine) {\n if (!e.available) {\n this.error.set(`${e.name} arrives at GA.`);\n return;\n }\n this.error.set('');\n const before = this.engine()?.id;\n this.engine.set(e);\n this.version.set((e.versions.find((v) => v.default) ?? e.versions[0])?.id ?? '');\n // Follow the engine with a fitting default name until the person types one.\n if (!this.nameTouched() || this.name() === DEFAULT_NAME[before ?? '']) this.name.set(DEFAULT_NAME[e.id] ?? e.id);\n }\n\n protected pickPlan(p: Plan) {\n if (this.allowed(p)) this.plan.set(p);\n }\n\n protected go(n: number) {\n if (n >= 1 && n <= 3) this.step.set(n);\n }\n\n protected canNext(): boolean {\n if (!this.engine() || !this.plan()) return false;\n return this.step() < 3 || !this.nameError();\n }\n\n protected next() {\n if (this.step() < 3) {\n this.go(this.step() + 1);\n return;\n }\n const e = this.engine();\n const p = this.plan();\n if (!e || !p || this.nameError()) return;\n this.busy.set(true);\n this.error.set('');\n const env = this.env() === 'shared' ? '' : this.env();\n const attach = this.attach().trim();\n this.api\n .create(this.key, {\n name: this.name(), engine: e.id, version: this.version(), plan: p.id, environment: env, backupHour: this.hour(), retentionDays: this.keep(),\n attach: attach ? { app: attach, environment: env || 'production' } : undefined,\n })\n .subscribe({\n next: (d) => {\n this.busy.set(false);\n this.router.navigate(this.host.link('services'), { queryParams: { created: d.name, attached: attach || null, envVar: attach ? e.envVar : null } });\n },\n error: (err) => {\n this.busy.set(false);\n this.error.set(apiMessage(err, 'The service could not be created.'));\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { hhmmss } from './look';\nimport { LogKind, LogLine, ServicesApi, apiMessage } from './services.api';\n\nconst COLOUR: Record<string, string> = { ERROR: 'var(--o-bad-solid)', FATAL: 'var(--o-bad-solid)', PANIC: 'var(--o-bad-solid)', WARNING: 'var(--o-run)' };\n\n// The instance page's Logs tab (prototype \"svc · logs\"): the engine's own log from its pods —\n// all, errors, the slow log, connections — newest first, refreshed every 10 s.\n@Component({\n selector: 'o-svc-logs',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"tablist\" aria-label=\"Log kind\">\n @for (k of kinds; track k.id) {<button type=\"button\" role=\"tab\" [class.o-on]=\"kind() === k.id\" [attr.aria-selected]=\"kind() === k.id\" (click)=\"pick(k.id)\" [attr.data-testid]=\"'svc-log-' + k.id\">{{ k.label }}</button>}\n </div>\n <a class=\"o-btn o-sm o-r\" [routerLink]=\"debugLogs()\" [queryParams]=\"{ service: service() }\">Open in Debug</a>\n </div>\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n <div class=\"o-term\" style=\"min-height:260px;max-height:520px;overflow:auto\" data-testid=\"svc-logs\">\n @for (l of lines(); track $index) {\n <div class=\"o-flex\" style=\"gap:12px;white-space:nowrap\"><span class=\"o-c\">{{ ts(l.time) }}</span><span style=\"width:60px\" [style.color]=\"colour(l.level)\">{{ l.level }}</span><span class=\"o-ell\" [attr.title]=\"l.message\">{{ l.message }}</span></div>\n } @empty {<div class=\"o-c\">{{ loaded() ? 'No lines of this kind in the engine log.' : 'Loading…' }}</div>}\n </div>\n <span class=\"o-faint o-sm\">Engine logs are kept 7 days and labelled service={{ service() }}, project={{ projectKey() }}, environment={{ environment() || 'shared' }}.</span>\n `,\n})\nexport class ServiceLogsTab {\n private readonly api = inject(ServicesApi);\n\n readonly projectKey = input('');\n readonly id = input('');\n readonly service = input('');\n readonly environment = input('');\n readonly debugLogs = input<string[]>([]);\n\n protected readonly kinds: { id: LogKind; label: string }[] = [\n { id: 'all', label: 'All' }, { id: 'errors', label: 'Errors' }, { id: 'slow', label: 'Slow log' }, { id: 'connections', label: 'Connections' },\n ];\n protected readonly kind = signal<LogKind>('all');\n protected readonly lines = signal<LogLine[]>([]);\n protected readonly note = signal('');\n protected readonly loaded = signal(false);\n protected readonly ts = hhmmss;\n protected readonly colour = (l: string) => COLOUR[l] ?? '#8fa3c0';\n\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n effect(() => {\n const [p, id, k] = [this.projectKey(), this.id(), this.kind()];\n if (p && id) untracked(() => this.load(p, id, k));\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n protected pick(k: LogKind) {\n this.loaded.set(false);\n this.kind.set(k);\n }\n\n private load(p: string, id: string, k: LogKind) {\n clearTimeout(this.timer);\n this.api.logs(p, id, k).subscribe({\n next: (l) => {\n if (k !== this.kind()) return;\n this.lines.set(l.lines ?? []);\n this.note.set(l.message ?? '');\n this.loaded.set(true);\n this.timer = setTimeout(() => this.load(p, id, k), 10_000);\n },\n error: (e) => {\n this.loaded.set(true);\n this.note.set(apiMessage(e, 'The engine log could not be read.'));\n },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesHost } from './host';\nimport { bytes, hhmmss, num, pct, ratio, spark, when } from './look';\nimport { Figure, Gauge, LogLine, Metrics } from './services.api';\n\n/** One chart card: a title, the latest value, and its points. */\ninterface Chart {\n key: string;\n title: string;\n value: string;\n points: number[];\n warn?: boolean;\n}\n\ntype Range = 'live' | '1h' | '6h' | '24h' | '7d';\nconst RANGES: { id: Range; label: string }[] = [{ id: '1h', label: '1 h' }, { id: '6h', label: '6 h' }, { id: '24h', label: '24 h' }, { id: '7d', label: '7 d' }];\n\n/**\n * The stored series behind each chart: the exporter metrics debug's engine dashboards read (PLAN,\n * \"Service metrics\"), and the Collector's pod memory. Charts without one draw the live readings.\n */\nconst HISTORY: Record<string, Record<string, [string, string]>> = {\n postgres: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['cnpg_backends_total', 'sum'], transactions: ['cnpg_pg_stat_database_xact_commit', 'rate'],\n rollbacks: ['cnpg_pg_stat_database_xact_rollback', 'rate'], database_size: ['cnpg_pg_database_size_bytes', 'sum'], replication_lag: ['cnpg_pg_replication_lag', 'max'],\n },\n mysql: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['mysql_global_status_threads_connected', 'sum'], queries: ['mysql_global_status_queries', 'rate'],\n slow_queries: ['mysql_global_status_slow_queries', 'rate'], replication_lag: ['mysql_slave_status_seconds_behind_master', 'max'],\n },\n valkey: {\n memory: ['k8s_pod_memory_working_set_bytes', 'max'], connections: ['redis_connected_clients', 'sum'], commands: ['redis_commands_processed_total', 'rate'],\n memory_used: ['redis_memory_used_bytes', 'max'], keys: ['redis_db_keys', 'sum'], evictions: ['redis_evicted_keys_total', 'rate'],\n },\n};\n\n// The instance page's Metrics tab (prototype \"svc · metrics\"): the figures the cell reports now,\n// drawn over 1 h to 7 d from the series the Collector stores (the auto-created dashboard's data);\n// a cell without telemetry stores shows the readings taken while the page is open.\n@Component({\n selector: 'o-svc-metrics',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-flex\">\n <div class=\"o-seg\">\n @if (stored() === false) {<button type=\"button\" class=\"o-on\">Live</button>}\n @else {@for (r of ranges; track r.id) {<button type=\"button\" [class.o-on]=\"range() === r.id\" (click)=\"range.set(r.id)\" [attr.data-testid]=\"'svc-range-' + r.id\">{{ r.label }}</button>}}\n </div>\n @if (stored() === false) {<span class=\"o-faint o-sm\">readings every 10 s since you opened the page · this cell keeps no telemetry history</span>}\n <a class=\"o-r o-faint o-sm\" [routerLink]=\"dashboard()\">Same data as the auto-created dashboard</a>\n </div>\n @if (latest(); as m) {\n @if (!m.available || m.message) {<div class=\"o-note\" role=\"status\">{{ m.message || 'Metrics are not available yet.' }}</div>}\n }\n <div class=\"o-g3\">\n @for (c of charts(); track c.key) {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\" [attr.data-testid]=\"'svc-chart-' + c.key\">\n <div class=\"o-flex\"><b class=\"o-b5\">{{ c.title }}</b><span class=\"o-r o-mono o-sm\">{{ c.value }}</span></div>\n <svg class=\"o-chart\" viewBox=\"0 0 200 60\" preserveAspectRatio=\"none\" style=\"height:70px;width:100%;display:block\" role=\"img\" [attr.aria-label]=\"c.title + ' ' + c.value\">\n @if (draw(c.points); as s) {\n <path [attr.d]=\"s.area\" [attr.fill]=\"c.warn ? 'var(--o-bad-solid)' : 'var(--o-vio)'\" fill-opacity=\"0.08\" stroke=\"none\" />\n <path [attr.d]=\"s.line\" fill=\"none\" [attr.stroke]=\"c.warn ? 'var(--o-bad-solid)' : 'var(--o-vio)'\" stroke-width=\"1.5\" vector-effect=\"non-scaling-stroke\" />\n } @else {<line x1=\"0\" y1=\"30\" x2=\"200\" y2=\"30\" stroke=\"var(--o-line-soft)\" stroke-dasharray=\"3 3\" vector-effect=\"non-scaling-stroke\" />}\n </svg>\n </div>\n }\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Slow queries</b><span class=\"o-faint o-sm\">the latest from the slow log · over 250 ms</span><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r o-faint o-sm\">normalised, top by total time at GA</span></div>\n <div class=\"o-tbl\">\n <div class=\"o-thead\"><div class=\"o-tr\"><div class=\"o-th\">Query</div><div class=\"o-th o-num\">Duration</div><div class=\"o-th o-num\">When</div></div></div>\n <div class=\"o-tbody\">\n @for (q of slow(); track $index) {\n <div class=\"o-tr\"><div class=\"o-td o-mono o-sm o-ell\" style=\"max-width:520px\" [attr.title]=\"q.statement\">{{ q.statement }}</div><div class=\"o-td o-num o-mono\">{{ q.duration }}</div><div class=\"o-td o-num o-mono o-faint\">{{ q.when }}</div></div>\n } @empty {<div class=\"o-empty\">{{ engine() === 'valkey' ? 'Valkey keeps its slow log in memory (SLOWLOG GET).' : 'No statement over 250 ms in the engine log.' }}</div>}\n </div>\n </div>\n </div>\n `,\n})\nexport class ServiceMetricsTab {\n private readonly host = inject(ServicesHost);\n\n readonly readings = input<Metrics[]>([]);\n readonly slowLines = input<LogLine[]>([]);\n readonly engine = input('');\n readonly projectKey = input('');\n readonly service = input('');\n readonly dashboard = input<string[]>([]);\n\n protected readonly ranges = RANGES;\n protected readonly range = signal<Range>('1h');\n /** null: not known yet; false: the cell keeps no telemetry. */\n protected readonly stored = signal<boolean | null>(null);\n private readonly series = signal<Record<string, number[]>>({});\n\n protected readonly latest = computed(() => this.readings().at(-1) ?? null);\n protected readonly draw = (v: number[]) => (v.length >= 2 ? spark(v) : null);\n\n constructor() {\n effect(() => {\n const [p, s, e, r] = [this.projectKey(), this.service(), this.engine(), this.range()];\n if (p && s && e && r !== 'live') untracked(() => this.load(p, s, e, r));\n });\n }\n\n private load(p: string, s: string, e: string, r: Range) {\n const wanted = HISTORY[e] ?? {};\n const keys = Object.keys(wanted);\n if (!keys.length) return;\n forkJoin(keys.map((k) => this.host.history(p, s, wanted[k][0], wanted[k][1], r).pipe(catchError(() => of(null))))).subscribe((all) => {\n if (r !== this.range()) return;\n if (all.every((x) => x === null)) {\n this.stored.set(false);\n this.range.set('live');\n return;\n }\n this.stored.set(true);\n const out: Record<string, number[]> = {};\n keys.forEach((k, i) => (out[k] = (all[i] ?? []).map(([, v]) => v).filter((v) => Number.isFinite(v))));\n this.series.set(out);\n });\n }\n\n protected readonly charts = computed<Chart[]>(() => {\n const rs = this.readings();\n const m = rs.at(-1);\n const stored = this.range() !== 'live' ? this.series() : {};\n const pick = (key: string, live: number[]) => (stored[key]?.length ? stored[key] : live);\n const gauge = (key: 'cpu' | 'memory' | 'disk' | 'connections', title: string, show: (g?: Gauge) => string, warnAt = 85): Chart => ({\n key, title, value: show(m?.[key]),\n points: pick(key, rs.map((r) => r[key]?.used ?? NaN).filter((x) => !Number.isNaN(x))),\n warn: (m?.[key]?.percent ?? 0) >= warnAt,\n });\n const out: Chart[] = [\n gauge('cpu', 'CPU', (g) => (g?.percent != null ? `${pct(g.percent)} of ${num(g.limit)} vCPU` : '–')),\n gauge('memory', 'Memory', (g) => (g?.used != null ? `${bytes(g.used)} · ${pct(g.percent)}` : '–')),\n gauge('disk', 'Disk used', (g) => (g?.used != null ? `${bytes(g.used)} of ${bytes(g.limit)}` : `– of ${bytes(g?.limit)}`)),\n gauge('connections', 'Connections', (g) => ratio(g)),\n ];\n for (const f of m?.figures ?? []) {\n const live = rs.map((r) => r.figures.find((x) => x.key === f.key)).filter((x): x is Figure => !!x).map((x) => (x.counter ? x.rate : x.value)).filter((x): x is number => x != null);\n out.push({ key: f.key, title: f.counter ? `${f.label} / s` : f.label, value: show(f), points: pick(f.key, live) });\n }\n return out;\n });\n\n protected readonly slow = computed(() =>\n this.slowLines()\n .slice(0, 8)\n .map((l) => {\n const m = /^duration: ([\\d.]+) ms\\s+statement:\\s*(.*)$/s.exec(l.message);\n return { statement: m ? m[2] : l.message, duration: m ? `${num(Number(m[1]), 1)} ms` : '', when: when(l.time) || hhmmss(l.time) };\n }),\n );\n}\n\nfunction show(f: Figure): string {\n if (f.counter) return f.rate != null ? `${num(f.rate, f.rate < 10 ? 1 : 0)}/s` : `${num(f.value)} total`;\n switch (f.unit) {\n case '%':\n return pct(f.value);\n case 'bytes':\n return bytes(f.value);\n case 's':\n return f.key === 'uptime' ? `${num(f.value / 3600, 1)} h` : `${num(f.value, 1)} s`;\n }\n return num(f.value);\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { ServicesApp, ServicesHost } from './host';\nimport { ServiceLogsTab } from './logs.tab';\nimport { DAYS, PRESETS, backupKind, bytes, shortDate, fromLocalInput, money, moving, num, pct, presetChip, ratio, stateChip, toLocalInput, utcHour, when } from './look';\nimport { ServiceMetricsTab } from './metrics.tab';\nimport { Attachment, Backup, Catalog, Detail, Engine, LogLine, Metrics, Plan, Revealed, Rotation, ServicesApi, apiMessage } from './services.api';\n\ntype Tab = 'overview' | 'users' | 'backups' | 'metrics' | 'logs' | 'console' | 'settings';\ntype Dialog =\n | { kind: 'delete'; typed: string; finalBackup: boolean }\n | { kind: 'restore'; name: string; point: string; backup: string }\n | { kind: 'rotate'; user: string; grace: number };\n\nconst TABS: { id: Tab; label: string }[] = [\n { id: 'overview', label: 'Overview' }, { id: 'users', label: 'Databases and users' }, { id: 'backups', label: 'Backups' }, { id: 'metrics', label: 'Metrics' },\n { id: 'logs', label: 'Logs' }, { id: 'console', label: 'Console' }, { id: 'settings', label: 'Settings' },\n];\n\n/** Engine parameters the prototype lists (validated subset, GA). */\nconst PARAMS: Record<string, [string, string, string][]> = {\n postgres: [['max_connections', '100', 'restart'], ['work_mem', '4MB', 'live'], ['log_min_duration_statement', '250ms', 'live']],\n mysql: [['max_connections', '151', 'restart'], ['long_query_time', '0.25', 'live'], ['innodb_buffer_pool_size', 'auto', 'restart']],\n valkey: [['maxmemory-policy', 'allkeys-lru', 'live'], ['timeout', '0', 'live'], ['slowlog-log-slower-than', '10000', 'live']],\n};\n\n// /{org}/{project}/services/:id (prototype \"services\"): one instance — its connection details and\n// reveal, attached apps, databases and users, backups and point-in-time restore, metrics and engine\n// logs read from the cell, and settings (resize, networking, maintenance, delete). Console, HA and\n// engine parameters are tagged GA, as the prototype tags them.\n@Component({\n selector: 'o-service',\n imports: [FormsModule, RouterLink, ServiceMetricsTab, ServiceLogsTab],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (d(); as d) {\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ d.engineName }} {{ d.version }} · {{ sizeLine(d) }} · {{ region() }} · {{ d.environment || 'shared' }}</span>\n <div class=\"o-flex\"><h1 class=\"o-t\">{{ d.name }}</h1><span [class]=\"chip(d.state)\" data-testid=\"svc-state\">{{ d.state }}</span></div>\n </div>\n <div class=\"o-acts\">\n @if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn\" (click)=\"askRotate(d)\" [disabled]=\"busy() || !d.users?.length\" data-testid=\"svc-rotate\">Rotate credentials</button>}\n @if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn\" (click)=\"setTab('settings')\">Resize</button>}\n <a class=\"o-btn\" [routerLink]=\"host.link('dashboards')\">Dashboard</a>\n </div>\n </div>\n\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-error\">{{ error() }}</div>}\n @if (notice()) {<div class=\"o-note o-grn\" role=\"status\" data-testid=\"svc-notice\">{{ notice() }}</div>}\n @if (d.message && d.state !== 'Running') {<div class=\"o-note\" [class.o-red]=\"d.state === 'Failed'\" role=\"status\">{{ d.message }}</div>}\n @if (d.deletedAt) {\n <div class=\"o-card o-cb o-flex o-wrap\" style=\"border-color:var(--o-bad-line)\" data-testid=\"svc-deleted\">\n <div class=\"o-col\" style=\"gap:2px;flex:1\"><b>{{ d.name }} is scheduled for deletion</b><span class=\"o-hint\">Purged {{ when(d.purgeAt) }}. Until then you can undo; attached apps were detached.@if (d.finalBackup) { A final backup is kept for 7 days.}</span></div>\n @if (d.canManage) {<button type=\"button\" class=\"o-btn\" (click)=\"undelete(d)\" [disabled]=\"busy()\" data-testid=\"svc-undelete\">Undo delete</button>}\n </div>\n }\n @if (d.restoreOf; as src) {\n <div class=\"o-card o-cb o-flex o-wrap\" data-testid=\"svc-restored\">\n <div class=\"o-col\" style=\"gap:2px;flex:1\"><b>Restored from <a [routerLink]=\"host.link('services/' + src.name)\">{{ src.name }}</a></b><span class=\"o-hint\">@if (d.restorePoint) {To {{ when(d.restorePoint) }}.} @else if (d.restoreBackup) {From backup {{ d.restoreBackup }}.} {{ src.name }} is untouched.@if (src.attached.length) { Its apps: {{ src.attached.join(', ') }}.}</span></div>\n @if (d.canManage && src.attached.length && d.state === 'Running') {<button type=\"button\" class=\"o-btn\" (click)=\"swap(d, src.name)\" [disabled]=\"busy()\" data-testid=\"svc-swap\">Move {{ src.name }}'s apps here</button>}\n </div>\n }\n\n <div class=\"o-tabs\" role=\"tablist\">\n @for (t of tabs; track t.id) {<button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"tab() === t.id\" [attr.aria-selected]=\"tab() === t.id\" (click)=\"setTab(t.id)\" [attr.data-testid]=\"'svc-tab-' + t.id\">{{ t.label }}</button>}\n </div>\n\n @switch (tab()) {\n @case ('overview') {\n <div class=\"o-g4\">\n @for (s of stats(); track s.label) {<div class=\"o-stat\"><span class=\"o-k\">{{ s.label }}</span><span class=\"o-v\">{{ s.value }}</span><span class=\"o-s\">{{ s.sub }}</span></div>}\n </div>\n <div class=\"o-g2\" style=\"align-items:start;gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Connection details</b><span class=\"o-r\">Private network · TLS required</span></div>\n @if (conn(); as c) {\n <div class=\"o-kv o-cb\" style=\"grid-template-columns:100px 1fr;row-gap:9px\">\n <span class=\"o-k\">Host</span><span class=\"o-mono o-sm\" style=\"word-break:break-all\">{{ c.host }}</span>\n <span class=\"o-k\">Port</span><span class=\"o-mono o-sm\">{{ c.port }}</span>\n @if (c.database) {<span class=\"o-k\">Database</span><span class=\"o-mono o-sm\">{{ c.database }}</span>}\n <span class=\"o-k\">User</span><span class=\"o-mono o-sm\">{{ c.user }}</span>\n <span class=\"o-k\">Password</span>\n <span class=\"o-flex\"><span class=\"o-mono o-sm\" data-testid=\"svc-password\">{{ revealed()?.password ?? '••••••••••••••••' }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk\" (click)=\"toggleReveal(d)\" [disabled]=\"busy()\" data-testid=\"svc-reveal\">{{ revealed() ? 'Hide' : 'Reveal' }}</button>}\n @else {<span class=\"o-faint o-xs\">Maintainers can reveal</span>}\n </span>\n <span class=\"o-k\">SSL mode</span><span class=\"o-mono o-sm\">{{ c.sslMode }}</span>\n </div>\n <div style=\"padding:0 14px 8px\"><div class=\"o-seg\">\n @for (k of snippetKeys(); track k) {<button type=\"button\" [class.o-on]=\"snip() === k\" (click)=\"snip.set(k)\">{{ snippetLabel(k) }}</button>}\n </div></div>\n <div class=\"o-mono\" style=\"margin:0 14px 14px;background:var(--o-bg);border-radius:6px;padding:10px 12px;font-size:12px;color:var(--o-tx-2);overflow-x:auto;white-space:pre\" data-testid=\"svc-snippet\">{{ c.snippets[snip()] ?? '' }}</div>\n } @else {<div class=\"o-empty\">Connection details appear once {{ d.name }} is running.</div>}\n </div>\n <div class=\"o-col\" style=\"gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Attached apps</b>@if (d.canManage && !d.deletedAt) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"attachOpen.set(!attachOpen())\" data-testid=\"svc-attach-open\">Attach to app</button>}</div>\n @for (a of d.attachments; track a.id) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-att-' + a.app\">\n <span class=\"o-b5\">{{ a.app }}</span><span class=\"o-faint\">{{ a.environment }}</span><span class=\"o-chip o-mono\">{{ a.prefix }}{{ envVar() }}</span>\n <span class=\"o-r o-sm\" [style.color]=\"attColour(a)\" [attr.title]=\"a.message || null\">{{ attState(a) }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"detach(d, a)\" [attr.aria-label]=\"'Detach ' + a.app\" [disabled]=\"busy()\">×</button>}\n </div>\n } @empty {<div class=\"o-empty\">Not attached. Attach it and the app gets {{ envVar() }} on its next release.</div>}\n @if (attachOpen()) {\n <div class=\"o-flex o-wrap\" style=\"padding:12px 14px;background:var(--o-bg)\">\n @if (apps().length) {\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"App\" [ngModel]=\"attApp()\" (ngModelChange)=\"attApp.set($event)\" data-testid=\"svc-att-app\">@for (a of apps(); track a.name) {<option [value]=\"a.name\">{{ a.name }}</option>}</select>\n } @else {<input class=\"o-in o-sm o-mono\" style=\"width:120px\" placeholder=\"app\" aria-label=\"App\" [ngModel]=\"attApp()\" (ngModelChange)=\"attApp.set($event)\" data-testid=\"svc-att-app\" />}\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Environment\" [ngModel]=\"attEnv()\" (ngModelChange)=\"attEnv.set($event)\" data-testid=\"svc-att-env\">@for (e of attEnvs(); track e) {<option [value]=\"e\">{{ e }}</option>}</select>\n <input class=\"o-in o-sm o-mono\" style=\"width:110px\" placeholder=\"prefix (opt.)\" aria-label=\"Prefix\" [ngModel]=\"attPrefix()\" (ngModelChange)=\"attPrefix.set($event)\" />\n <span class=\"o-mut o-sm\">Injects {{ attPrefix() }}{{ envVar() }} and redeploys</span>\n <button type=\"button\" class=\"o-btn o-sm o-pri o-r\" (click)=\"attach(d)\" [disabled]=\"busy() || !attApp()\" data-testid=\"svc-att-go\">Attach</button>\n </div>\n }\n <div class=\"o-cf\">{{ rotateNote() }}@if (openRotation(); as r) {@if (d.canManage) { · <button type=\"button\" class=\"o-lnk\" (click)=\"retire(d, r)\" [disabled]=\"busy()\">Retire the old password now</button>}}</div>\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Backups</b><span class=\"o-r\">{{ d.engine === 'mysql' ? 'Hourly' : 'Daily' }} · {{ d.retentionDays }}-day retention{{ d.pitr ? ' · PITR' : '' }}</span></div>\n @for (b of backups().slice(0, 3); track b.name) {\n <div class=\"o-row\"><span>{{ when(b.startedAt) || 'Pending' }}</span><span class=\"o-faint\">{{ backupNote(b) }}</span><span class=\"o-chip\">{{ kind(b) }}</span>@if (b.phase === 'completed' && d.canManage) {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"askRestore(d, b)\">Restore to new instance</button>}</div>\n } @empty {<div class=\"o-empty\">The first backup is taken once {{ d.name }} is running.</div>}\n <div class=\"o-cf\">{{ windowLine() }}</div>\n </div>\n </div>\n </div>\n }\n @case ('users') {\n <div class=\"o-g2\" style=\"align-items:start;gap:18px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Databases</b>@if (d.canManage && engine()?.databases) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-db-add\">+ Database</button>}</div>\n @if (addingDb()) {\n <div class=\"o-row\" style=\"background:var(--o-bg)\"><input class=\"o-in o-sm o-mono\" placeholder=\"name\" aria-label=\"Database name\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" (keydown.enter)=\"addDb(d)\" data-testid=\"svc-db-name\" /><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addDb(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-db-create\">Create</button></div>\n }\n @for (db of d.databases; track db.name; let first = $first) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ db.name }}</span><span class=\"o-faint o-sm\">{{ first ? 'default' : '' }}</span><span class=\"o-r o-faint o-sm\">{{ when(db.createdAt) }}</span>\n @if (d.canManage && !first) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeDb(d, db.name)\" [attr.aria-label]=\"'Remove ' + db.name\" [disabled]=\"busy()\">×</button>}</div>\n } @empty {<div class=\"o-empty\">{{ engine()?.databases ? 'No databases yet.' : d.engineName + ' has no logical databases: keys live in database 0.' }}</div>}\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Users</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingUser.set(!addingUser())\" data-testid=\"svc-user-add\">+ User</button>}</div>\n @if (addingUser()) {\n <div class=\"o-row\" style=\"background:var(--o-bg)\">\n <input class=\"o-in o-sm o-mono\" placeholder=\"name\" aria-label=\"User name\" [ngModel]=\"userName()\" (ngModelChange)=\"userName.set($event)\" data-testid=\"svc-user-name\" />\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Role\" [ngModel]=\"userPreset()\" (ngModelChange)=\"userPreset.set($event)\" data-testid=\"svc-user-preset\">@for (p of presets; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addUser(d)\" [disabled]=\"busy() || !userName()\" data-testid=\"svc-user-create\">Create</button>\n </div>\n }\n @for (u of d.users ?? []; track u.name) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ u.name }}</span><span [class]=\"preset(u.preset)\">{{ u.preset }}</span>@if (u.rotating) {<span class=\"o-chip o-blu\">rotating</span>}\n <span class=\"o-r o-faint o-sm o-ell\">{{ u.attached.length ? 'used by ' + u.attached.join(', ') : 'generation ' + u.generation }}</span>\n @if (d.canManage && u.preset !== 'owner') {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeUser(d, u.name)\" [attr.aria-label]=\"'Remove ' + u.name\" [disabled]=\"busy()\">×</button>}</div>\n }\n <div class=\"o-cf\">Per-app users created on attach, each with least privilege<b class=\"o-ph-tag o-ga\">GA</b></div>\n </div>\n </div>\n @if (d.engine === 'postgres') {\n <div class=\"o-card o-cb o-flex o-wrap\"><div class=\"o-col\" style=\"gap:2px\"><b>Extensions</b><span class=\"o-hint\">From the allow-list: pg_stat_statements, pgcrypto, uuid-ossp, citext, pg_trgm, postgis</span></div><div class=\"o-flex o-r\"><b class=\"o-ph-tag o-ga\">GA</b><button type=\"button\" class=\"o-btn o-sm\" disabled>+ Enable</button></div></div>\n }\n }\n @case ('backups') {\n <div class=\"o-split o-w340\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Backups</b>@if (d.canManage && !d.deletedAt) {<span class=\"o-r\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"backupNow(d)\" [disabled]=\"busy() || d.state !== 'Running'\" data-testid=\"svc-backup-now\">Back up now</button></span>}</div>\n @for (b of backups(); track b.name) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-backup-' + b.name\">\n <span [class]=\"'o-dot ' + backupDot(b)\"></span><span style=\"width:150px\">{{ when(b.startedAt) || 'Pending' }}</span><span class=\"o-faint o-sm\" style=\"width:80px\">{{ backupNote(b) }}</span>\n <span class=\"o-chip\">{{ kind(b) }}</span><span class=\"o-faint o-sm\">{{ keepLine(b, d.retentionDays) }}</span>\n @if (b.phase === 'completed' && d.canManage) {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"askRestore(d, b)\">Restore</button>}\n @if (b.kind === 'on-demand' && d.canManage && b.phase !== 'running') {<button type=\"button\" class=\"o-lnk o-faint\" [class.o-r]=\"b.phase !== 'completed'\" (click)=\"deleteBackup(d, b)\" [attr.aria-label]=\"'Delete ' + b.name\" [disabled]=\"busy()\">×</button>}\n </div>\n } @empty {<div class=\"o-empty\">No backups yet. The first is taken once {{ d.name }} is running.</div>}\n <div class=\"o-cf\">Stored encrypted in a separate failure domain. Cross-region copies<b class=\"o-ph-tag o-later\">Later</b></div>\n </div>\n <div class=\"o-col\" style=\"gap:14px\">\n @if (d.pitr) {\n <div class=\"o-card o-cb o-col\" style=\"gap:10px\">\n <b>Restore to a point in time</b>\n <span class=\"o-hint\">{{ pitrHint(d) }} Restores always create a new instance; {{ d.name }} is untouched.</span>\n <input class=\"o-in o-mono\" type=\"datetime-local\" step=\"1\" aria-label=\"Point in time\" [ngModel]=\"pitr()\" (ngModelChange)=\"pitr.set($event)\" data-testid=\"svc-pitr\" />\n <button type=\"button\" class=\"o-btn o-dark\" (click)=\"askPitr(d)\" [disabled]=\"!d.canManage || !pitr() || !d.window?.from\" data-testid=\"svc-pitr-go\">Restore…</button>\n </div>\n } @else {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\"><b>Restore a snapshot</b><span class=\"o-hint\">{{ d.engineName }} restores from a daily RDB snapshot: pick one on the left. It always creates a new instance.</span></div>\n }\n <div class=\"o-card o-cb o-form\">\n <b>Schedule</b>\n <div class=\"o-g2\">\n @if (d.engine === 'mysql') {\n <div class=\"o-fld\"><label>Runs</label><input class=\"o-in\" value=\"Every hour, on the hour\" readonly aria-label=\"Runs\" /><span class=\"o-hint\">MySQL restores to any second up to the latest backup: at most an hour behind.</span></div>\n } @else {\n <div class=\"o-fld\"><label for=\"svc-bh\">Daily at</label><select id=\"svc-bh\" class=\"o-in\" [disabled]=\"!d.canManage\" [ngModel]=\"d.backupHour\" (ngModelChange)=\"save(d, { backupHour: +$event }, 'Backups now run daily at ' + utc(+$event) + '.')\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ utc(h) }}</option>}</select></div>\n }\n <div class=\"o-fld\"><label for=\"svc-rd\">Keep for</label><select id=\"svc-rd\" class=\"o-in\" [disabled]=\"!d.canManage\" [ngModel]=\"d.retentionDays\" (ngModelChange)=\"save(d, { retentionDays: +$event }, 'Backups are now kept ' + $event + ' days.')\">@for (k of keeps; track k) {<option [ngValue]=\"k\">{{ k }} days</option>}</select></div>\n </div>\n </div>\n <div class=\"o-card o-cb o-col\" style=\"gap:8px\"><div class=\"o-flex\"><b>Fork for staging</b><b class=\"o-ph-tag o-ga\">GA</b></div><span class=\"o-hint\">Copy from the latest backup into a new instance.</span><div class=\"o-flex\"><b>Export dump</b><b class=\"o-ph-tag o-ga\">GA</b><button type=\"button\" class=\"o-btn o-xs o-r\" disabled>{{ d.engine === 'mysql' ? 'mysqldump' : d.engine === 'valkey' ? 'RDB' : 'pg_dump' }}</button></div></div>\n </div>\n </div>\n }\n @case ('metrics') {\n <o-svc-metrics [readings]=\"readings()\" [slowLines]=\"slowLines()\" [engine]=\"d.engine\" [projectKey]=\"key()\" [service]=\"d.name\" [dashboard]=\"host.link('dashboards')\" />\n }\n @case ('logs') {\n <o-svc-logs [projectKey]=\"key()\" [id]=\"d.id\" [service]=\"d.name\" [environment]=\"d.environment\" [debugLogs]=\"host.link('logs')\" />\n }\n @case ('console') {\n <div class=\"o-flex o-wrap\"><span class=\"o-chip o-grn\">Read-only</span><span class=\"o-faint o-sm\">1,000-row limit · 5 s statement timeout · runs as console_ro · audited</span><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r\"></span>\n @if (d.databases.length) {<select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Database\" disabled>@for (db of d.databases; track db.name) {<option>{{ db.name }}</option>}</select>}</div>\n <div class=\"o-card\"><textarea class=\"o-in o-mono\" style=\"border:none;box-shadow:none;font-size:12.5px\" rows=\"4\" disabled aria-label=\"Query\">{{ d.engine === 'valkey' ? 'INFO keyspace' : 'SELECT * FROM … LIMIT 50' }}</textarea><div class=\"o-cf\"><span class=\"o-kbd\">⌘</span><span class=\"o-kbd\">↵</span> to run<button type=\"button\" class=\"o-btn o-sm o-dark o-r\" disabled>Run</button></div></div>\n <span class=\"o-faint o-sm\">The console arrives at GA. Until then, connect with the snippets on Overview from an attached app, or reveal the password.</span>\n }\n @case ('settings') {\n <div class=\"o-col\" style=\"gap:14px;max-width:820px\">\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Resize</b><span class=\"o-r\">vCPU and RAM: brief failover · disk grows online</span></div>\n <div class=\"o-cb o-flex o-wrap\">\n <select class=\"o-in\" style=\"max-width:360px\" aria-label=\"Plan\" [disabled]=\"!d.canManage\" [ngModel]=\"newPlan()\" (ngModelChange)=\"newPlan.set($event)\" data-testid=\"svc-plan\">\n @for (p of plans(); track p.id) {<option [value]=\"p.id\">{{ p.id }} · {{ p.label }} · {{ price(p.priceCents) }}/mo</option>}\n </select>\n <label class=\"o-flex o-sm\" style=\"gap:6px\">Disk <input class=\"o-in o-sm o-mono\" style=\"width:80px\" type=\"number\" [min]=\"d.diskGb\" [max]=\"catalog()?.maxDiskGb ?? 2000\" [disabled]=\"!d.canManage\" [ngModel]=\"newDisk()\" (ngModelChange)=\"newDisk.set(+$event)\" data-testid=\"svc-disk\" /> GB</label>\n <button type=\"button\" class=\"o-btn o-dark\" (click)=\"resize(d)\" [disabled]=\"busy() || !d.canManage || (newPlan() === d.plan && newDisk() === d.diskGb)\" data-testid=\"svc-resize\">Resize</button>\n </div>\n <div class=\"o-cf\"><button type=\"button\" class=\"o-tog\" disabled aria-label=\"Grow storage automatically (GA)\"></button>Grow storage automatically at 85% full, up to 500 GB<b class=\"o-ph-tag o-ga\">GA</b></div>\n </div>\n <div class=\"o-card\"><div class=\"o-ch\"><b>High availability</b><b class=\"o-ph-tag o-ga\">GA</b></div><div class=\"o-row\"><span style=\"flex:1\">Standby node with automatic failover</span><button type=\"button\" class=\"o-tog\" disabled aria-label=\"Standby (GA)\"></button></div><div class=\"o-row\"><span style=\"flex:1\">Read replicas</span><span class=\"o-faint o-sm\">0</span><button type=\"button\" class=\"o-btn o-xs\" disabled>+ Replica</button></div></div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Networking</b></div>\n <div class=\"o-row\"><span style=\"flex:1\">Private network <span class=\"o-faint o-sm\">· always on, reachable only from attached apps</span></span><span class=\"o-chip o-grn\">On</span></div>\n <div class=\"o-row\"><span style=\"flex:1\">Public endpoint with trusted sources</span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.publicEnabled\" [disabled]=\"!d.canManage || busy()\" (click)=\"save(d, { publicEnabled: !d.publicEnabled }, d.publicEnabled ? 'The public endpoint is off.' : 'The public endpoint is on for the trusted sources below.')\" aria-label=\"Public endpoint\" data-testid=\"svc-public\"></button></div>\n @if (d.publicEnabled) {\n <div class=\"o-row o-wrap\" style=\"background:var(--o-bg)\">\n @for (c of d.allowedCidrs; track c) {<span class=\"o-chip o-mono\">{{ c }}@if (d.canManage) { <button type=\"button\" class=\"o-lnk o-faint\" (click)=\"dropCidr(d, c)\" [attr.aria-label]=\"'Remove ' + c\">×</button>}</span>}\n @if (d.canManage) {<input class=\"o-in o-sm o-mono\" style=\"width:180px\" placeholder=\"+ IP or CIDR\" aria-label=\"Add a trusted source\" [ngModel]=\"cidr()\" (ngModelChange)=\"cidr.set($event)\" (keydown.enter)=\"addCidr(d)\" data-testid=\"svc-cidr\" />}\n <span class=\"o-faint o-sm o-r\">TLS required</span>\n </div>\n }\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>Maintenance window</b><span class=\"o-r\">patches with 7-day notice</span></div>\n <div class=\"o-cb o-flex o-wrap\">\n <select class=\"o-in\" style=\"width:auto\" aria-label=\"Day\" [disabled]=\"!d.canManage\" [ngModel]=\"d.maintenanceDay\" (ngModelChange)=\"save(d, { maintenanceDay: $event }, 'Maintenance window saved.')\">@for (x of days; track x.id) {<option [value]=\"x.id\">{{ x.label }}</option>}</select>\n <select class=\"o-in\" style=\"width:auto\" aria-label=\"Hours\" [disabled]=\"!d.canManage\" [ngModel]=\"d.maintenanceHour\" (ngModelChange)=\"save(d, { maintenanceHour: +$event }, 'Maintenance window saved.')\">@for (h of hours; track h) {<option [ngValue]=\"h\">{{ windowHours(h) }}</option>}</select>\n <span class=\"o-faint o-sm\">Minor versions of {{ d.engineName }} {{ d.version }} apply here.</span>\n </div>\n </div>\n <div class=\"o-card\"><div class=\"o-ch\"><b>Engine parameters</b><b class=\"o-ph-tag o-ga\">GA</b><span class=\"o-r\">validated subset</span></div><div class=\"o-tbl\"><div class=\"o-tbody\">\n @for (p of params(); track p[0]) {<div class=\"o-tr\"><div class=\"o-td o-mono o-sm\">{{ p[0] }}</div><div class=\"o-td\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" [value]=\"p[1]\" disabled [attr.aria-label]=\"p[0]\" /></div><div class=\"o-td\"><span class=\"o-chip\" [class.o-amb]=\"p[2] === 'restart'\">{{ p[2] }}</span></div></div>}\n </div></div></div>\n @if (d.canManage && !d.deletedAt) {\n <div class=\"o-card\" style=\"border-color:var(--o-bad-line)\"><div class=\"o-row\" style=\"padding:14px\"><div class=\"o-col\" style=\"gap:2px;flex:1\"><b>Delete {{ d.name }}</b><span class=\"o-hint\">Typed confirmation. Undo within 24 hours; optional final backup kept 7 days. Attached apps lose {{ envVar() }}.</span></div><button type=\"button\" class=\"o-btn o-sm o-red\" (click)=\"dialog.set({ kind: 'delete', typed: '', finalBackup: true })\" data-testid=\"svc-delete\">Delete</button></div></div>\n }\n </div>\n }\n }\n </div>\n\n @if (dialog(); as dl) {\n <div class=\"o-overlay o-mid\" (click)=\"dialog.set(null)\">\n <div class=\"o-dlg\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"dialogTitle(dl, d)\" (click)=\"$event.stopPropagation()\" (keydown.escape)=\"dialog.set(null)\">\n <div class=\"o-dlg-h\"><b>{{ dialogTitle(dl, d) }}</b></div>\n <div class=\"o-dlg-b\">\n @switch (dl.kind) {\n @case ('delete') {\n <span>Attached apps lose {{ envVar() }} and redeploy. You can undo within 24 hours.</span>\n <label class=\"o-flex o-sm\"><input type=\"checkbox\" [(ngModel)]=\"dl.finalBackup\" /> Take a final backup and keep it 7 days</label>\n <label class=\"o-fld\"><span class=\"o-sm\">Type <b class=\"o-mono\">{{ d.name }}</b> to confirm</span><input class=\"o-in o-mono\" [(ngModel)]=\"dl.typed\" data-testid=\"svc-delete-typed\" autocomplete=\"off\" /></label>\n }\n @case ('restore') {\n <span>{{ dl.point ? 'Restores ' + d.name + ' as it was at ' + whenLocal(dl.point) : 'Restores backup ' + dl.backup }} into a new instance with the same users and passwords. {{ d.name }} keeps running untouched; move its apps over afterwards if you want.</span>\n <label class=\"o-fld\"><span class=\"o-sm\">New instance</span><input class=\"o-in o-mono\" [(ngModel)]=\"dl.name\" data-testid=\"svc-restore-name\" autocomplete=\"off\" /></label>\n }\n @case ('rotate') {\n <span>A new password for <b class=\"o-mono\">{{ dl.user }}</b> is created beside the current one. Every attached app redeploys with it; once all are healthy the old one stays valid for the grace period, then stops. If one fails, the old password stays.</span>\n <label class=\"o-fld\"><span class=\"o-sm\">Keep the old password after the apps are healthy</span>\n <select class=\"o-in\" [(ngModel)]=\"dl.grace\">@for (g of graces; track g.m) {<option [ngValue]=\"g.m\">{{ g.label }}</option>}</select></label>\n }\n }\n </div>\n <div class=\"o-dlg-f\">\n <button type=\"button\" class=\"o-btn\" (click)=\"dialog.set(null)\">Cancel</button>\n @switch (dl.kind) {\n @case ('delete') {<button type=\"button\" class=\"o-btn o-red\" [disabled]=\"busy() || dl.typed !== d.name\" (click)=\"remove(d, dl.finalBackup)\" data-testid=\"svc-delete-go\">Delete service</button>}\n @case ('restore') {<button type=\"button\" class=\"o-btn o-dark\" [disabled]=\"busy() || !dl.name\" (click)=\"restore(d, dl)\" data-testid=\"svc-restore-go\">Restore</button>}\n @case ('rotate') {<button type=\"button\" class=\"o-btn o-dark\" [disabled]=\"busy()\" (click)=\"rotate(d, dl.user, dl.grace)\" data-testid=\"svc-rotate-go\">Rotate</button>}\n }\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"o-page\">@if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>} @else {<div class=\"o-empty\">Loading…</div>}</div>\n }\n `,\n})\nexport class ServicePage {\n protected readonly host = inject(ServicesHost);\n private readonly api = inject(ServicesApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n protected readonly tabs = TABS;\n protected readonly presets = PRESETS;\n protected readonly days = DAYS;\n protected readonly hours = Array.from({ length: 24 }, (_, i) => i);\n protected readonly keeps = [7, 14, 35];\n protected readonly graces = [{ m: 0, label: 'No grace: stop it at once' }, { m: 15, label: '15 minutes' }, { m: 60, label: '1 hour' }, { m: 1440, label: '24 hours' }];\n protected readonly chip = stateChip;\n protected readonly preset = presetChip;\n protected readonly kind = backupKind;\n protected readonly price = money;\n protected readonly utc = utcHour;\n protected readonly when = (s?: string) => when(s);\n protected readonly whenLocal = (v: string) => when(fromLocalInput(v));\n\n protected readonly d = signal<Detail | null>(null);\n protected readonly catalog = signal<Catalog | null>(null);\n protected readonly apps = signal<ServicesApp[]>([]);\n protected readonly tab = signal<Tab>('overview');\n protected readonly readings = signal<Metrics[]>([]);\n protected readonly slowLines = signal<LogLine[]>([]);\n protected readonly revealed = signal<Revealed | null>(null);\n protected readonly snip = signal('uri');\n protected readonly error = signal('');\n protected readonly notice = signal('');\n protected readonly busy = signal(false);\n protected readonly dialog = signal<Dialog | null>(null);\n protected readonly attachOpen = signal(false);\n protected readonly attApp = signal('');\n protected readonly attEnv = signal('production');\n protected readonly attPrefix = signal('');\n protected readonly addingDb = signal(false);\n protected readonly dbName = signal('');\n protected readonly addingUser = signal(false);\n protected readonly userName = signal('');\n protected readonly userPreset = signal('read-only');\n protected readonly pitr = signal('');\n protected readonly newPlan = signal('');\n protected readonly newDisk = signal(0);\n protected readonly cidr = signal('');\n\n protected readonly key = computed(() => this.host.project()?.key ?? '');\n private readonly id = signal('');\n\n protected readonly engine = computed<Engine | null>(() => this.catalog()?.engines.find((e) => e.id === this.d()?.engine) ?? null);\n protected readonly envVar = computed(() => this.engine()?.envVar ?? 'DATABASE_URL');\n protected readonly plans = computed<Plan[]>(() => this.catalog()?.plans ?? []);\n protected readonly region = computed(() => this.host.project()?.region || 'your region');\n protected readonly params = computed(() => PARAMS[this.d()?.engine ?? ''] ?? []);\n protected readonly conn = computed(() => this.revealed()?.connection ?? this.d()?.connection ?? null);\n protected readonly snippetKeys = computed(() => {\n const s = this.conn()?.snippets ?? {};\n return ['uri', 'psql', 'mysql', 'valkey-cli', 'node'].filter((k) => k in s);\n });\n protected readonly backups = computed(() =>\n [...(this.d()?.backups ?? [])].sort((a, b) => (b.startedAt ?? '9').localeCompare(a.startedAt ?? '9')),\n );\n protected readonly attEnvs = computed(() => {\n const set = new Set<string>();\n const env = this.d()?.environment;\n if (env) set.add(env);\n this.apps().find((a) => a.name === this.attApp())?.environments.forEach((e) => set.add(e));\n ['production', 'staging'].forEach((e) => set.add(e));\n return [...set];\n });\n protected readonly openRotation = computed<Rotation | null>(() => this.d()?.rotations.find((r) => !r.finishedAt) ?? null);\n protected readonly rotateNote = computed(() => {\n const d = this.d();\n if (!d) return '';\n const open = this.openRotation();\n if (open) {\n const pending = (open.apps ?? []).filter((a) => a.state !== 'succeeded' && a.state !== 'live').map((a) => a.app);\n if (open.graceUntil) return `Rotated ${when(open.createdAt)} · the previous password stays valid until ${when(open.graceUntil)}`;\n return `Rotating since ${when(open.createdAt)} · ${pending.length ? 'redeploying ' + pending.join(', ') : 'applying the new password'}; the previous password stays valid until every app is healthy`;\n }\n const owner = d.users?.find((u) => u.preset === 'owner') ?? d.users?.[0];\n const last = d.rotations.find((r) => r.finishedAt);\n if (last && last.state === 'kept') return `The last rotation kept generation ${last.fromGeneration}: ${last.message || 'an app did not become healthy'}`;\n return `Credential generation ${owner?.generation ?? 1}${last ? ' · rotated ' + when(last.finishedAt) : ''} · rotation redeploys every attached app`;\n });\n protected readonly windowLine = computed(() => {\n const d = this.d();\n if (!d) return '';\n if (!d.pitr) return 'Restores from a daily RDB snapshot into a new instance.';\n if (!d.window?.from) return 'Point-in-time recovery starts with the first backup.';\n return `Point-in-time recovery to any second since ${when(d.window.from)}${d.window.to ? ' until ' + when(d.window.to) : ''}.`;\n });\n protected readonly stats = computed(() => {\n const m = this.readings().at(-1);\n const d = this.d();\n const off = !m?.available;\n const fig = (k: string) => m?.figures.find((f) => f.key === k);\n const disk = m?.disk;\n const out = [\n { label: 'Connections', value: off ? '–' : ratio(m?.connections), sub: off ? (m?.message ?? 'reading…') : `${this.d()?.engineName} limit` },\n { label: 'CPU', value: off ? '–' : pct(m?.cpu?.percent), sub: `${num(m?.cpu?.limit ?? Number(this.plans().find((p) => p.id === d?.plan)?.cpu ?? 0))} vCPU` },\n { label: 'Disk', value: disk?.percent != null ? pct(disk.percent) : '–', sub: disk?.used != null ? `${bytes(disk.used)} of ${bytes(disk.limit)}${disk.source === 'engine' ? ' (data)' : ''}` : `of ${d?.diskGb ?? 0} GB` },\n ];\n if (d?.engine === 'postgres') {\n const tx = fig('transactions');\n out.push({ label: 'Cache hit', value: fig('cache_hit') ? pct(fig('cache_hit')!.value) : '–', sub: tx?.rate != null ? `${num(tx.rate, 1)} tx/s` : 'transactions ' + num(tx?.value) });\n } else if (d?.engine === 'mysql') {\n const q = fig('queries');\n out.push({ label: 'Queries / s', value: q?.rate != null ? num(q.rate, 1) : '–', sub: `slow ${num(fig('slow_queries')?.value)} since start` });\n } else {\n out.push({ label: 'Hit ratio', value: fig('hit_ratio') ? pct(fig('hit_ratio')!.value) : '–', sub: `${num(fig('keys')?.value)} keys · ${bytes(fig('memory_used')?.value)}` });\n }\n return out;\n });\n\n private loadTimer: ReturnType<typeof setTimeout> | undefined;\n private metricsTimer: ReturnType<typeof setTimeout> | undefined;\n private loadedFor = '';\n\n constructor() {\n const params = this.route.paramMap.subscribe((pm) => this.id.set(pm.get('id') ?? ''));\n const query = this.route.queryParamMap.subscribe((q) => {\n const t = q.get('tab') as Tab | null;\n this.tab.set(t && TABS.some((x) => x.id === t) ? t : 'overview');\n });\n effect(() => {\n const [k, id] = [this.key(), this.id()];\n if (k && id && k + '/' + id !== this.loadedFor) {\n this.loadedFor = k + '/' + id;\n untracked(() => this.first(k, id));\n }\n });\n // Metrics while Overview or Metrics shows; the slow log for the Metrics tab.\n effect(() => {\n const [t, d] = [this.tab(), this.d()?.id];\n untracked(() => {\n clearTimeout(this.metricsTimer);\n if (d && (t === 'overview' || t === 'metrics')) this.pollMetrics();\n if (d && t === 'metrics') this.api.logs(this.key(), d, 'slow', 20).pipe(catchError(() => of(null))).subscribe((l) => this.slowLines.set(l?.lines ?? []));\n });\n });\n inject(DestroyRef).onDestroy(() => {\n params.unsubscribe();\n query.unsubscribe();\n clearTimeout(this.loadTimer);\n clearTimeout(this.metricsTimer);\n });\n }\n\n private first(k: string, id: string) {\n this.d.set(null);\n this.readings.set([]);\n this.revealed.set(null);\n forkJoin({\n catalog: this.catalog() ? of(this.catalog()!) : this.api.catalog().pipe(catchError(() => of(null))),\n apps: this.host.apps(k).pipe(catchError(() => of([] as ServicesApp[]))),\n }).subscribe(({ catalog, apps }) => {\n this.catalog.set(catalog);\n this.apps.set(apps);\n if (apps.length && !this.attApp()) this.attApp.set(apps[0].name);\n });\n this.load();\n }\n\n private load() {\n clearTimeout(this.loadTimer);\n const [k, id] = [this.key(), this.id()];\n this.api.get(k, id).subscribe({\n next: (d) => {\n if (k !== this.key() || id !== this.id()) return;\n const firstLoad = !this.d();\n this.d.set(d);\n this.error.set('');\n if (firstLoad) {\n this.newPlan.set(d.plan);\n this.newDisk.set(d.diskGb);\n if (d.environment) this.attEnv.set(d.environment);\n if (d.window?.from && !this.pitr()) this.pitr.set(toLocalInput(new Date().toISOString()));\n }\n const settling = moving(d.state) || !!this.openRotation() || d.attachments.some((a) => a.state === 'pending') || (d.backups ?? []).some((b) => b.phase === 'running' || b.phase === 'pending');\n this.loadTimer = setTimeout(() => this.load(), settling ? 4000 : 30_000);\n },\n error: (e) => {\n this.error.set(e?.status === 404 ? 'No such service in this project.' : apiMessage(e, 'The service could not be loaded.'));\n },\n });\n }\n\n private pollMetrics() {\n const d = this.d();\n if (!d) return;\n this.api.metrics(this.key(), d.id).subscribe({\n next: (m) => {\n this.readings.update((rs) => [...rs, m].slice(-90));\n this.metricsTimer = setTimeout(() => this.pollMetrics(), 10_000);\n },\n error: () => (this.metricsTimer = setTimeout(() => this.pollMetrics(), 30_000)),\n });\n }\n\n protected setTab(t: Tab) {\n this.router.navigate([], { relativeTo: this.route, queryParams: { tab: t === 'overview' ? null : t }, queryParamsHandling: 'merge', replaceUrl: true });\n }\n\n protected sizeLine(d: Detail): string {\n const [cpu, ram] = d.planLabel.split(' · ');\n return `${cpu} / ${ram} / ${d.diskGb} GB`;\n }\n protected snippetLabel(k: string): string {\n return ({ uri: 'URI', node: 'Node' } as Record<string, string>)[k] ?? k;\n }\n protected attState(a: Attachment): string {\n return a.state === 'live' ? 'Injected' : a.state === 'failed' ? 'Failed' : 'Redeploying…';\n }\n protected attColour(a: Attachment): string {\n return a.state === 'live' ? 'var(--o-ok-tx)' : a.state === 'failed' ? 'var(--o-bad-tx)' : 'var(--o-acc-tx)';\n }\n protected backupNote(b: Backup): string {\n if (b.phase === 'failed') return 'failed';\n if (b.phase !== 'completed') return b.phase;\n if (b.startedAt && b.stoppedAt) {\n const s = Math.max(1, Math.round((Date.parse(b.stoppedAt) - Date.parse(b.startedAt)) / 1000));\n return s < 60 ? `${s} s` : `${Math.round(s / 60)} min`;\n }\n return '';\n }\n protected pitrHint(d: Detail): string {\n const w = d.window;\n if (!w?.from) return 'Available after the first backup.';\n const span = `Any second since ${when(w.from)}${w.to ? ' until ' + when(w.to) : ''}.`;\n return d.engine === 'mysql' ? `${span} MySQL's window ends at the latest hourly backup.` : span;\n }\n protected keepLine(b: Backup, days: number): string {\n if (b.kind === 'on-demand') return 'until deleted';\n return b.startedAt ? 'until ' + shortDate(new Date(Date.parse(b.startedAt) + days * 86400000).toISOString()) : `${days} days`;\n }\n protected backupDot(b: Backup): string {\n return b.phase === 'failed' ? 'o-red' : b.phase !== 'completed' ? 'o-blu' : b.kind === 'on-demand' ? 'o-blu' : 'o-grn';\n }\n protected windowHours(h: number): string {\n const p = (n: number) => String(n % 24).padStart(2, '0');\n return `${p(h)}:00 – ${p(h + 4)}:00 UTC`;\n }\n protected dialogTitle(dl: Dialog, d: Detail): string {\n return dl.kind === 'delete' ? `Delete ${d.name}?` : dl.kind === 'restore' ? 'Restore to a new instance' : 'Rotate credentials?';\n }\n\n // ---- actions --------------------------------------------------------------\n\n private run<T>(obs: import('rxjs').Observable<T>, done: (v: T) => void, failure: string) {\n this.busy.set(true);\n this.error.set('');\n this.notice.set('');\n obs.subscribe({\n next: (v) => {\n this.busy.set(false);\n done(v);\n this.load();\n },\n error: (e) => {\n this.busy.set(false);\n this.error.set(apiMessage(e, failure));\n },\n });\n }\n\n protected toggleReveal(d: Detail) {\n if (this.revealed()) {\n this.revealed.set(null);\n return;\n }\n this.run(this.api.reveal(this.key(), d.id), (r) => {\n this.revealed.set(r);\n this.notice.set('Credential reveal recorded in the audit log.');\n }, 'The password could not be revealed.');\n }\n\n protected attach(d: Detail) {\n const app = this.attApp().trim();\n this.run(this.api.attach(this.key(), d.id, { app, environment: this.attEnv(), prefix: this.attPrefix().trim() }), () => {\n this.attachOpen.set(false);\n this.notice.set(`${d.name} attached to ${app} · ${this.attEnv()}: ${this.attPrefix()}${this.envVar()} is injected and ${app} redeploys.`);\n }, 'The service could not be attached.');\n }\n\n protected detach(d: Detail, a: Attachment) {\n this.run(this.api.detach(this.key(), d.id, a.id), () => this.notice.set(`${a.app} no longer gets ${a.prefix}${this.envVar()}; it redeploys without it.`), 'The app could not be detached.');\n }\n\n protected askRotate(d: Detail) {\n const owner = d.users?.find((u) => u.preset === 'owner') ?? d.users?.[0];\n if (owner) this.dialog.set({ kind: 'rotate', user: owner.name, grace: 60 });\n }\n\n protected rotate(d: Detail, user: string, grace: number) {\n this.run(this.api.rotate(this.key(), d.id, user, grace), () => {\n this.dialog.set(null);\n this.notice.set(`Rotating ${user}'s password: attached apps redeploy with the new one; the old one stays valid until they are healthy.`);\n }, 'The credentials could not be rotated.');\n }\n\n protected retire(d: Detail, r: Rotation) {\n this.run(this.api.retire(this.key(), d.id, r.id), () => this.notice.set(`Generation ${r.fromGeneration} of ${r.user} no longer logs in.`), 'The old password could not be retired.');\n }\n\n protected addDb(d: Detail) {\n const name = this.dbName().trim();\n if (!name) return;\n this.run(this.api.addDatabase(this.key(), d.id, name), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.notice.set(`Database ${name} created.`);\n }, 'The database could not be created.');\n }\n\n protected removeDb(d: Detail, name: string) {\n this.run(this.api.removeDatabase(this.key(), d.id, name), () => this.notice.set(`Database ${name} removed.`), 'The database could not be removed.');\n }\n\n protected addUser(d: Detail) {\n const name = this.userName().trim();\n if (!name) return;\n this.run(this.api.addUser(this.key(), d.id, name, this.userPreset()), () => {\n this.addingUser.set(false);\n this.userName.set('');\n this.notice.set(`${name} created with the ${this.userPreset()} preset. Reveal shows its password.`);\n }, 'The user could not be created.');\n }\n\n protected removeUser(d: Detail, name: string) {\n this.run(this.api.removeUser(this.key(), d.id, name), () => this.notice.set(`${name} can no longer log in.`), 'The user could not be removed.');\n }\n\n protected backupNow(d: Detail) {\n this.run(this.api.backupNow(this.key(), d.id), () => this.notice.set('On-demand backup started · kept until you delete it.'), 'The backup could not be started.');\n }\n\n protected deleteBackup(d: Detail, b: Backup) {\n this.run(this.api.deleteBackup(this.key(), d.id, b.name), () => this.notice.set('Backup deleted.'), 'The backup could not be deleted.');\n }\n\n private restoreName(d: Detail): string {\n return `${d.name}-restore-1`.slice(0, 40);\n }\n\n protected askRestore(d: Detail, b: Backup) {\n this.dialog.set({ kind: 'restore', name: this.restoreName(d), point: '', backup: b.name });\n }\n\n protected askPitr(d: Detail) {\n this.dialog.set({ kind: 'restore', name: this.restoreName(d), point: this.pitr(), backup: '' });\n }\n\n protected restore(d: Detail, dl: { name: string; point: string; backup: string }) {\n const body = dl.point ? { pointInTime: fromLocalInput(dl.point), name: dl.name } : { backup: dl.backup, name: dl.name };\n this.busy.set(true);\n this.error.set('');\n this.api.restore(this.key(), d.id, body).subscribe({\n next: (r) => {\n this.busy.set(false);\n this.dialog.set(null);\n this.router.navigate(this.host.link('services/' + r.name));\n },\n error: (e) => {\n this.busy.set(false);\n this.dialog.set(null);\n this.error.set(apiMessage(e, 'The restore could not be started.'));\n },\n });\n }\n\n protected swap(d: Detail, from: string) {\n this.run(this.api.swap(this.key(), d.id, from), () => this.notice.set(`${from}'s apps now use ${d.name}; they redeploy with its connection.`), 'The apps could not be moved.');\n }\n\n protected save(d: Detail, body: Parameters<ServicesApi['update']>[2], ok: string) {\n this.run(this.api.update(this.key(), d.id, body), () => this.notice.set(ok), 'The change could not be saved.');\n }\n\n protected resize(d: Detail) {\n const body: { plan?: string; diskGb?: number } = {};\n if (this.newPlan() !== d.plan) body.plan = this.newPlan();\n if (this.newDisk() !== d.diskGb) body.diskGb = this.newDisk();\n const plan = this.plans().find((p) => p.id === this.newPlan());\n this.save(d, body, `Resizing ${d.name} to ${this.newPlan()} · ${plan ? plan.cpu + ' vCPU · ' + plan.memory.replace('Gi', ' GB') + ' · ' : ''}${this.newDisk()} GB${body.plan ? ' · brief failover expected' : ''}.`);\n }\n\n protected addCidr(d: Detail) {\n const c = this.cidr().trim();\n if (!c) return;\n const cidr = c.includes('/') ? c : c.includes(':') ? c + '/128' : c + '/32';\n this.save(d, { allowedCidrs: [...d.allowedCidrs, cidr] }, `${cidr} can reach the public endpoint.`);\n this.cidr.set('');\n }\n\n protected dropCidr(d: Detail, c: string) {\n this.save(d, { allowedCidrs: d.allowedCidrs.filter((x) => x !== c) }, `${c} removed from the trusted sources.`);\n }\n\n protected remove(d: Detail, finalBackup: boolean) {\n this.run(this.api.remove(this.key(), d.id, d.name, finalBackup), () => {\n this.dialog.set(null);\n this.notice.set(`${d.name} is scheduled for deletion · undo within 24 hours.`);\n }, 'The service could not be deleted.');\n }\n\n protected undelete(d: Detail) {\n this.run(this.api.undelete(this.key(), d.id), () => this.notice.set(`${d.name} is back; reattach its apps if they need it.`), 'The delete could not be undone.');\n }\n}\n","/*\n * @chisquare-tech/origine-ngx-apps-services: the Services module's screens (TRD §6.8, §6.10). The\n * host app provides ServicesHost and mounts the pages at /{org}/{project}/services (the list),\n * /services/new (the wizard) and /services/:id (an instance, ?tab=users|backups|metrics|logs|console|settings).\n */\nexport * from './lib/host';\nexport * from './lib/services.api';\nexport * from './lib/look';\nexport * from './lib/list.page';\nexport * from './lib/new.page';\nexport * from './lib/service.page';\nexport * from './lib/metrics.tab';\nexport * from './lib/logs.tab';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chisquare-tech/origine-ngx-apps-services",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Origine's Services module screens: managed Postgres, MySQL and Valkey — the list with quota, the create wizard, and the instance page (connection details, attachments, databases and users, backups and PITR, metrics, logs, settings).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|