@chisquare-tech/origine-ngx-apps-services 0.2.1 → 0.2.3
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.
|
@@ -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/console.tab.ts","../../../projects/services/src/lib/dumps.card.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 { HttpClient } from '@angular/common/http';\nimport { 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 ha?: 'standby' | 'cluster' | '';\n maxReplicas?: number;\n dumps?: boolean;\n console: 'sql' | 'keys' | 'streams' | 'queues';\n parameters: Param[];\n}\n\nexport interface Param {\n engine: string;\n name: string;\n kind: 'int' | 'float' | 'size' | 'duration' | 'bool' | 'enum';\n min: number;\n max: number;\n enum?: string[];\n restart: boolean;\n default: string;\n description: string;\n value?: string;\n}\n\nexport interface Stream {\n name: string;\n subjects: string[];\n maxAgeHours?: number;\n maxMb?: number;\n}\n\nexport interface Dump {\n id: string;\n kind: 'export' | 'import';\n source?: 'upload' | 'remote';\n remote?: string;\n database: string;\n fileName?: string;\n phase: 'uploading' | 'pending' | 'running' | 'completed' | 'failed';\n bytes?: number;\n error?: string;\n createdBy: string;\n createdAt: string;\n stoppedAt?: string;\n}\n\nexport interface QueryResult {\n columns: string[];\n rows: string[][];\n truncated: boolean;\n command?: string;\n rowsAffected?: number;\n ms: number;\n readOnly: boolean;\n runsAs: string;\n}\n\nexport interface Inspection {\n kind: 'keys' | 'streams' | 'queues';\n items: Record<string, any>[];\n cursor?: string;\n detail?: Record<string, any>;\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 nodes: number;\n fork: boolean;\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 ownUser?: boolean;\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 standby: boolean;\n replicas: number;\n readyNodes: number;\n readHost?: string;\n parameters: Param[];\n streams: Stream[];\n vhosts: string[] | null;\n dumps: Dump[];\n declaredBy?: string;\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; ownUser?: boolean };\n standby?: boolean;\n replicas?: number;\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 standby?: boolean;\n replicas?: number;\n parameters?: Record<string, 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 private readonly http = inject(HttpClient);\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; ownUser?: boolean; database?: 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 // ---- v1 ----\n addStream(project: string, id: string, s: Stream): Observable<Detail> {\n return this.api.post(this.i(project, id, 'stream'), s).pipe(map((r) => data<Detail>(r)));\n }\n removeStream(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'stream/' + enc(name)));\n }\n addVhost(project: string, id: string, name: string): Observable<Detail> {\n return this.api.post(this.i(project, id, 'vhost'), { name }).pipe(map((r) => data<Detail>(r)));\n }\n removeVhost(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'vhost/' + enc(name)));\n }\n fork(project: string, id: string, body: { name?: string; environment?: string; plan?: string }): Observable<Detail> {\n return this.api.post(this.i(project, id, 'fork'), body).pipe(map((r) => data<Detail>(r)));\n }\n exportDump(project: string, id: string, database = ''): Observable<Dump> {\n return this.api.post(this.i(project, id, 'dump'), { database }).pipe(map((r) => data<Dump>(r)));\n }\n importRemote(project: string, id: string, database: string, remote: string): Observable<Dump> {\n return this.api.post(this.i(project, id, 'dump/import'), { database, remote }).pipe(map((r) => data<Dump>(r)));\n }\n deleteDump(project: string, id: string, dump: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'dump/' + enc(dump)));\n }\n /** Streams an uploaded dump to the cell (outside the JSON API: /x/services/…). */\n importUpload(project: string, id: string, database: string, file: File): Observable<Dump> {\n return this.http.put(`/x/services/${enc(project)}/${enc(id)}/dump`, file, { params: { database, file: file.name }, headers: { 'content-type': 'application/octet-stream' } })\n .pipe(map((r) => data<Dump>(r)));\n }\n downloadDump(project: string, id: string, dump: string): Observable<Blob> {\n return this.http.get(`/x/services/${enc(project)}/${enc(id)}/dump/${enc(dump)}`, { responseType: 'blob' });\n }\n query(project: string, id: string, body: { database?: string; statement: string; write?: boolean }): Observable<QueryResult> {\n return this.api.post(this.i(project, id, 'query'), body).pipe(map((r) => data<QueryResult>(r)));\n }\n inspect(project: string, id: string, body: { pattern?: string; cursor?: string; item?: string }): Observable<Inspection> {\n return this.api.post(this.i(project, id, 'inspect'), body).pipe(map((r) => data<Inspection>(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 <a class=\"o-card o-cb o-flex\" [routerLink]=\"host.link('services/new')\" [queryParams]=\"{ engine: 'nats' }\" data-testid=\"svc-new-nats\"><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><span class=\"o-r o-faint o-sm\">Create →</span></a>\n <a class=\"o-card o-cb o-flex\" [routerLink]=\"host.link('services/new')\" [queryParams]=\"{ engine: 'rabbitmq' }\" data-testid=\"svc-new-rabbitmq\"><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 · inspected in the console</span></div><span class=\"o-r o-faint o-sm\">Create →</span></a>\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 { ActivatedRoute, 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', nats: 'events', rabbitmq: 'jobs-mq' };\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</label><div class=\"o-flex\">\n @if (engine()?.ha) {<button type=\"button\" class=\"o-tog\" [class.o-on]=\"ha()\" (click)=\"ha.set(!ha())\" [disabled]=\"!!quota()?.onlyPlan\" aria-label=\"High availability\" data-testid=\"svc-ha\"></button>}\n @else {<button type=\"button\" class=\"o-tog\" disabled aria-label=\"High availability\"></button>}\n <span class=\"o-sm\">{{ haLabel() }}</span></div>\n @if (quota()?.onlyPlan && engine()?.ha) {<span class=\"o-hint\">{{ quota()!.plan }} includes one node.</span>}</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 @if (nodes() > 1) {<span class=\"o-k\">Nodes</span><span data-testid=\"svc-nodes\">{{ nodes() }} · {{ engine()?.ha === 'cluster' ? 'cluster' : 'automatic failover' }}</span>}\n <span class=\"o-k\">Backups</span><span>{{ engine()?.id === 'mysql' ? 'Hourly' : 'Daily' }}{{ engine()?.pitr ? ' + PITR' : engine()?.id === 'nats' ? ' stream snapshot' : engine()?.id === 'rabbitmq' ? ' definitions' : ' 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\" data-testid=\"svc-monthly\">{{ plan() ? price(plan()!.priceCents * nodes()) + '/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 route = inject(ActivatedRoute);\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 ha = signal(false);\n protected readonly nodes = computed(() => (!this.ha() ? 1 : this.engine()?.ha === 'cluster' ? 3 : this.engine()?.id === 'mysql' ? 3 : 2));\n protected readonly haLabel = computed(() => {\n const e = this.engine();\n if (e?.ha === 'cluster') return '3-node cluster';\n if (e?.ha === 'standby') return e.id === 'mysql' ? 'Standby with automatic failover (3 nodes: MOCO runs 1, 3 or 5)' : 'Standby node with automatic failover';\n return `${e?.name ?? 'This engine'} runs one node for now`;\n });\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 want = this.route.snapshot.queryParamMap.get('engine');\n const first = catalog.engines.find((e) => e.id === want && e.available) ?? 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 if (!e.ha) this.ha.set(false);\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, standby: this.ha() && !!e.ha,\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, computed, inject, input, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Detail, Inspection, QueryResult, ServicesApi, apiMessage } from './services.api';\n\n// The browser console (SVC-17; prototype \"services\" › Console): SQL for Postgres and MySQL, run\n// as the owner in a read-only transaction unless \"Allow writes\" is on, with the 1,000-row limit\n// and 5 s statement timeout; an inspector for Valkey keys, NATS streams and RabbitMQ queues.\n// Everything run here is in the audit log.\n@Component({\n selector: 'o-svc-console',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (sql()) {\n <div class=\"o-flex o-wrap\">\n <span class=\"o-chip\" [class.o-grn]=\"!write()\" [class.o-amb]=\"write()\" data-testid=\"svc-console-mode\">{{ write() ? 'Read-write' : 'Read-only' }}</span>\n <span class=\"o-faint o-sm\">1,000-row limit · 5 s statement timeout · runs as {{ runsAs() }} · audited</span>\n <span class=\"o-r\"></span>\n @if (d().canManage) {<label class=\"o-flex o-sm\" style=\"gap:6px\"><input type=\"checkbox\" [ngModel]=\"write()\" (ngModelChange)=\"write.set($event)\" data-testid=\"svc-console-write\" /> Allow writes</label>}\n @if (d().databases.length) {\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Database\" [ngModel]=\"db() || d().databases[0]?.name\" (ngModelChange)=\"db.set($event)\" data-testid=\"svc-console-db\">\n @for (x of d().databases; track x.name) {<option [value]=\"x.name\">{{ x.name }}</option>}\n </select>\n }\n </div>\n <div class=\"o-card\">\n <textarea class=\"o-in o-mono\" style=\"border:none;box-shadow:none;font-size:12.5px\" rows=\"4\" aria-label=\"Query\" [ngModel]=\"stmt()\" (ngModelChange)=\"stmt.set($event)\" (keydown.meta.enter)=\"runSql()\" (keydown.control.enter)=\"runSql()\" data-testid=\"svc-console-sql\"></textarea>\n <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\" (click)=\"runSql()\" [disabled]=\"busy() || !stmt().trim() || !running()\" data-testid=\"svc-console-run\">Run</button></div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-console-error\">{{ error() }}</div>}\n @if (result(); as r) {\n <div class=\"o-card\" style=\"overflow-x:auto\" data-testid=\"svc-console-result\">\n @if (r.columns.length) {\n <div class=\"o-tbl\"><div class=\"o-thead\"><div class=\"o-tr\">@for (c of r.columns; track $index) {<div class=\"o-th\">{{ c }}</div>}</div></div><div class=\"o-tbody\">\n @for (row of r.rows; track $index) {<div class=\"o-tr\">@for (v of row; track $index) {<div class=\"o-td o-mono o-sm\" [class.o-faint]=\"v === 'NULL'\">{{ v }}</div>}</div>}\n </div></div>\n }\n <div class=\"o-cf\">{{ resultLine(r) }}</div>\n </div>\n }\n } @else {\n <div class=\"o-flex o-wrap\">\n <span class=\"o-chip o-grn\">Read-only</span>\n <span class=\"o-faint o-sm\">{{ inspectorLine() }} · audited</span>\n <span class=\"o-r\"></span>\n @if (kind() !== 'streams') {<input class=\"o-in o-sm o-mono\" style=\"width:200px\" [placeholder]=\"kind() === 'keys' ? 'pattern, e.g. session:*' : 'filter by name'\" aria-label=\"Filter\" [ngModel]=\"pattern()\" (ngModelChange)=\"pattern.set($event)\" (keydown.enter)=\"inspect()\" data-testid=\"svc-inspect-pattern\" />}\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"inspect()\" [disabled]=\"busy() || !running()\" data-testid=\"svc-inspect-run\">{{ list() ? 'Refresh' : 'Inspect' }}</button>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-console-error\">{{ error() }}</div>}\n @if (list(); as l) {\n <div class=\"o-split o-w340\">\n <div class=\"o-card\" data-testid=\"svc-inspect-list\">\n @for (it of l.items; track $index) {\n <button type=\"button\" class=\"o-row o-click\" style=\"width:100%;text-align:left;border:none;background:none\" (click)=\"open(it)\">\n <span class=\"o-mono o-b5 o-ell\">{{ label(it) }}</span><span class=\"o-r o-faint o-sm\">{{ note(it) }}</span>\n </button>\n } @empty {<div class=\"o-empty\">{{ kind() === 'keys' ? 'No keys match.' : kind() === 'streams' ? 'No streams yet.' : 'No queues yet.' }}</div>}\n @if (l.cursor) {<div class=\"o-cf\"><button type=\"button\" class=\"o-lnk\" (click)=\"inspect(l.cursor)\">More</button></div>}\n </div>\n <div class=\"o-card o-cb\" data-testid=\"svc-inspect-detail\">\n @if (l.detail; as det) {<pre class=\"o-mono o-sm\" style=\"margin:0;white-space:pre-wrap;word-break:break-all\">{{ pretty(det) }}</pre>}\n @else {<span class=\"o-faint o-sm\">Pick {{ kind() === 'keys' ? 'a key' : kind() === 'streams' ? 'a stream' : 'a queue' }} to see {{ kind() === 'streams' ? 'its consumers and recent messages' : 'its contents' }}.</span>}\n </div>\n </div>\n }\n }\n @if (!running()) {<span class=\"o-faint o-sm\">The console opens once {{ d().name }} is running.</span>}\n `,\n})\nexport class ServiceConsoleTab {\n private readonly api = inject(ServicesApi);\n readonly d = input.required<Detail>();\n readonly projectKey = input.required<string>();\n readonly kind = input<'sql' | 'keys' | 'streams' | 'queues'>('sql');\n\n protected readonly sql = computed(() => this.kind() === 'sql');\n protected readonly running = computed(() => ['Running', 'Updating', 'Degraded'].includes(this.d().state));\n protected readonly runsAs = computed(() => this.result()?.runsAs || this.d().connection?.user || 'the owner');\n protected readonly stmt = signal('SELECT now();');\n protected readonly db = signal('');\n protected readonly write = signal(false);\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n protected readonly result = signal<QueryResult | null>(null);\n protected readonly pattern = signal('');\n protected readonly list = signal<Inspection | null>(null);\n private last = '';\n\n protected inspectorLine(): string {\n return this.kind() === 'keys' ? 'Keys by SCAN, values up to 100 items' : this.kind() === 'streams' ? 'Streams, consumers and the last 20 messages' : 'Queues with depth, unacknowledged and consumers';\n }\n\n protected runSql() {\n const statement = this.stmt().trim();\n if (!statement || this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n this.api.query(this.projectKey(), this.d().id, { database: this.db() || this.d().databases[0]?.name, statement, write: this.write() }).subscribe({\n next: (r) => {\n this.busy.set(false);\n this.result.set(r);\n },\n error: (e) => {\n this.busy.set(false);\n this.result.set(null);\n this.error.set(apiMessage(e, 'The statement could not run.'));\n },\n });\n }\n\n protected resultLine(r: QueryResult): string {\n const n = r.rows.length;\n const rows = r.columns.length ? `${n.toLocaleString()} row${n === 1 ? '' : 's'}${r.truncated ? ' (limit reached)' : ''}` : `${r.command || 'OK'}${r.rowsAffected ? ' · ' + r.rowsAffected + ' rows' : ''}`;\n return `${rows} · ${r.ms} ms · ${r.readOnly ? 'read-only' : 'committed'}`;\n }\n\n protected inspect(cursor = '', item = '') {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n this.api.inspect(this.projectKey(), this.d().id, { pattern: this.pattern(), cursor, item }).subscribe({\n next: (r) => {\n this.busy.set(false);\n if (item) {\n this.list.update((l) => (l ? { ...l, detail: r.detail } : r));\n } else if (cursor) {\n this.list.update((l) => ({ ...r, items: [...(l?.items ?? []), ...r.items] }));\n } else {\n this.list.set(r);\n }\n },\n error: (e) => {\n this.busy.set(false);\n this.error.set(apiMessage(e, 'The inspector could not read the service.'));\n },\n });\n }\n\n protected open(it: Record<string, any>) {\n const k = this.kind();\n this.last = k === 'keys' ? it['key'] : k === 'streams' ? it['name'] : `${it['vhost'] ?? '/'}/${it['name']}`;\n this.inspect('', this.last);\n }\n\n protected label(it: Record<string, any>): string {\n return String(this.kind() === 'keys' ? it['key'] : it['name']);\n }\n\n protected note(it: Record<string, any>): string {\n switch (this.kind()) {\n case 'keys':\n return `${it['type']}${it['ttl'] > 0 ? ' · ttl ' + it['ttl'] + ' s' : ''}`;\n case 'streams':\n return `${Number(it['messages'] ?? 0).toLocaleString()} msgs · ${it['consumers'] ?? 0} consumers${it['kv'] ? ' · KV' : ''}`;\n }\n return `${it['vhost'] ?? '/'} · ${Number(it['messages'] ?? 0).toLocaleString()} msgs · ${it['messages_unacknowledged'] ?? 0} unacked`;\n }\n\n protected pretty(v: unknown): string {\n return JSON.stringify(v, null, 2);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { ServicesHost } from './host';\nimport { bytes, when } from './look';\nimport { Detail, Dump, ServicesApi, apiMessage } from './services.api';\n\n// Backups › Fork and dumps (SVC-23, SVC-25): fork from the latest backup into another\n// environment; export a logical dump (pg_dump custom format, mysqldump SQL) and download it;\n// import a dump file or another server's database by connection string.\n@Component({\n selector: 'o-svc-dumps',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'display:flex;flex-direction:column;gap:14px' },\n template: `\n <div class=\"o-card o-cb o-col\" style=\"gap:8px\" data-testid=\"svc-fork-card\">\n <b>Fork for staging</b>\n <span class=\"o-hint\">Copy from the latest backup into a new instance. {{ d().name }} keeps running untouched.</span>\n @if (d().canManage) {\n <div class=\"o-flex o-wrap\">\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Environment\" [ngModel]=\"env()\" (ngModelChange)=\"env.set($event)\" data-testid=\"svc-fork-env\">\n @for (e of envs; track e) {<option [value]=\"e\">{{ e }}</option>}\n </select>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"fork()\" [disabled]=\"busy() || !hasBackup()\" data-testid=\"svc-fork\">Fork</button>\n </div>\n @if (!hasBackup()) {<span class=\"o-faint o-xs\">Available after the first completed backup.</span>}\n }\n </div>\n @if (dumps()) {\n <div class=\"o-card\" data-testid=\"svc-dumps\">\n <div class=\"o-ch\"><b>Dumps</b>@if (d().canManage) {<button type=\"button\" class=\"o-btn o-xs o-r\" (click)=\"exportDump()\" [disabled]=\"busy() || d().state !== 'Running'\" data-testid=\"svc-export\">{{ tool() }}</button>}</div>\n @for (x of d().dumps; track x.id) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-dump-' + x.id\">\n <span [class]=\"'o-dot ' + dot(x)\"></span>\n <span class=\"o-sm o-ell\" style=\"flex:1\">{{ x.kind === 'export' ? 'Export of ' + x.database : 'Import into ' + x.database + (x.remote ? ' from ' + x.remote : x.fileName ? ' from ' + x.fileName : '') }}</span>\n <span class=\"o-faint o-xs\">{{ x.phase === 'completed' ? (x.bytes ? size(x.bytes) + ' · ' : '') + when(x.stoppedAt || x.createdAt) : x.phase }}</span>\n @if (x.kind === 'export' && x.phase === 'completed') {<button type=\"button\" class=\"o-lnk\" (click)=\"download(x)\" [disabled]=\"busy()\" data-testid=\"svc-dump-download\">Download</button>}\n @if (d().canManage && x.phase !== 'running') {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"remove(x)\" [attr.aria-label]=\"'Delete dump ' + x.id\" [disabled]=\"busy()\">×</button>}\n </div>\n @if (x.error) {<div class=\"o-row o-sm\" style=\"color:var(--o-bad-tx)\">{{ x.error }}</div>}\n } @empty {<div class=\"o-empty\">No dumps yet. Export one to download it, or import a dump into {{ d().name }}.</div>}\n @if (d().canManage) {\n <div class=\"o-cb o-col\" style=\"gap:8px;border-top:1px solid var(--o-line-2)\">\n <b class=\"o-sm\">Import</b>\n <div class=\"o-flex o-wrap\">\n <label class=\"o-btn o-sm\" style=\"cursor:pointer\">Upload a dump…<input type=\"file\" style=\"display:none\" (change)=\"upload($event)\" data-testid=\"svc-import-file\" /></label>\n <span class=\"o-faint o-xs\">{{ d().engine === 'mysql' ? 'SQL' : 'pg_dump custom format or SQL' }}, gzipped or not, up to 5 GB</span>\n </div>\n <div class=\"o-flex o-wrap\">\n <input class=\"o-in o-sm o-mono\" style=\"flex:1;min-width:220px\" [placeholder]=\"d().engine === 'mysql' ? 'mysql://user:password@host:3306/db' : 'postgresql://user:password@host:5432/db'\" aria-label=\"Connection string\" [ngModel]=\"remote()\" (ngModelChange)=\"remote.set($event)\" data-testid=\"svc-import-remote\" />\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"importRemote()\" [disabled]=\"busy() || !remote().trim() || d().state !== 'Running'\" data-testid=\"svc-import-go\">Import</button>\n </div>\n <span class=\"o-faint o-xs\">Loads into {{ d().databases[0]?.name }} as its owner. The connection string is sealed and only reaches the cell while the import runs.</span>\n </div>\n }\n </div>\n }\n `,\n})\nexport class ServiceDumpsCard {\n private readonly api = inject(ServicesApi);\n private readonly host = inject(ServicesHost);\n private readonly router = inject(Router);\n readonly d = input.required<Detail>();\n readonly projectKey = input.required<string>();\n readonly dumps = input(false);\n readonly done = output<string>();\n readonly failed = output<string>();\n\n protected readonly envs = ['staging', 'development', 'production'];\n protected readonly env = signal('staging');\n protected readonly remote = signal('');\n protected readonly busy = signal(false);\n protected readonly size = bytes;\n protected readonly when = (s?: string) => when(s);\n\n protected hasBackup(): boolean {\n return (this.d().backups ?? []).some((b) => b.phase === 'completed');\n }\n protected tool(): string {\n return this.d().engine === 'mysql' ? 'mysqldump' : 'pg_dump';\n }\n protected dot(x: Dump): string {\n return x.phase === 'failed' ? 'o-red' : x.phase === 'completed' ? 'o-grn' : 'o-blu';\n }\n\n private go<T>(obs: import('rxjs').Observable<T>, ok: (v: T) => void, fail: string) {\n this.busy.set(true);\n obs.subscribe({\n next: (v) => {\n this.busy.set(false);\n ok(v);\n },\n error: (e) => {\n this.busy.set(false);\n this.failed.emit(apiMessage(e, fail));\n },\n });\n }\n\n protected fork() {\n this.go(this.api.fork(this.projectKey(), this.d().id, { environment: this.env() }), (f) => this.router.navigate(this.host.link('services/' + f.name)), 'The fork could not be started.');\n }\n protected exportDump() {\n this.go(this.api.exportDump(this.projectKey(), this.d().id), () => this.done.emit(`Exporting ${this.d().databases[0]?.name} with ${this.tool()}; it appears here to download when done.`), 'The export could not be started.');\n }\n protected importRemote() {\n this.go(this.api.importRemote(this.projectKey(), this.d().id, '', this.remote().trim()), (x) => {\n this.remote.set('');\n this.done.emit(`Importing ${x.database} from ${x.remote}.`);\n }, 'The import could not be started.');\n }\n protected upload(ev: Event) {\n const el = ev.target as HTMLInputElement;\n const file = el.files?.[0];\n el.value = '';\n if (!file) return;\n this.go(this.api.importUpload(this.projectKey(), this.d().id, '', file), (x) => this.done.emit(`${file.name} uploaded; importing into ${x.database}.`), 'The dump could not be uploaded.');\n }\n protected download(x: Dump) {\n this.go(this.api.downloadDump(this.projectKey(), this.d().id, x.id), (blob) => {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${this.d().name}-${x.database}-${x.id}${this.d().engine === 'mysql' ? '.sql' : '.dump'}`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 5000);\n this.done.emit('Download recorded in the audit log.');\n }, 'The dump could not be downloaded.');\n }\n protected remove(x: Dump) {\n this.go(this.api.deleteDump(this.projectKey(), this.d().id, x.id), () => this.done.emit('Dump deleted.'), 'The dump could not be deleted.');\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 { ServiceConsoleTab } from './console.tab';\nimport { ServiceDumpsCard } from './dumps.card';\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, Param, 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// /{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, the console (SQL, or the key, stream and queue inspector), and settings\n// (resize, high availability, networking, maintenance, engine parameters, delete). Services v1\n// (P5-41): NATS streams and RabbitMQ vhosts, per-app users, fork and dumps.\n@Component({\n selector: 'o-service',\n imports: [FormsModule, RouterLink, ServiceMetricsTab, ServiceLogsTab, ServiceConsoleTab, ServiceDumpsCard],\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>@if (a.ownUser) {<span class=\"o-faint o-xs o-mono\" title=\"The app's own user\">{{ a.user }}</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 @if (d.engine === 'rabbitmq' && (d.vhosts ?? []).length) {<select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Virtual host\" [ngModel]=\"attVhost()\" (ngModelChange)=\"attVhost.set($event)\" data-testid=\"svc-att-vhost\"><option value=\"/\">/</option>@for (v of d.vhosts ?? []; track v) {<option [value]=\"v\">{{ v }}</option>}</select>}\n <label class=\"o-flex o-sm\" style=\"gap:4px\" title=\"A user of its own for this app, read-write, removed when it is detached\"><input type=\"checkbox\" [ngModel]=\"attOwn()\" (ngModelChange)=\"attOwn.set($event)\" data-testid=\"svc-att-own\" /> Own user</label>\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 @if (d.engine === 'nats') {\n <div class=\"o-card\" data-testid=\"svc-streams\">\n <div class=\"o-ch\"><b>Streams</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-stream-add\">+ Stream</button>}</div>\n @if (addingDb()) {\n <div class=\"o-row o-wrap\" style=\"background:var(--o-bg)\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" placeholder=\"ORDERS\" aria-label=\"Stream name\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" data-testid=\"svc-stream-name\" /><input class=\"o-in o-sm o-mono\" style=\"width:140px\" placeholder=\"orders.>\" aria-label=\"Subjects\" [ngModel]=\"subjects()\" (ngModelChange)=\"subjects.set($event)\" data-testid=\"svc-stream-subjects\" /><select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Keep for\" [ngModel]=\"maxAge()\" (ngModelChange)=\"maxAge.set(+$event)\">@for (k of streamAges; track k.h) {<option [ngValue]=\"k.h\">{{ k.label }}</option>}</select><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addStream(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-stream-create\">Create</button></div>\n }\n @for (st of d.streams; track st.name) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ st.name }}</span><span class=\"o-faint o-sm o-mono\">{{ st.subjects.join(', ') }}</span><span class=\"o-r o-faint o-sm\">{{ st.maxAgeHours ? 'kept ' + st.maxAgeHours + ' h' : 'kept until limits' }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeStream(d, st.name)\" [attr.aria-label]=\"'Remove ' + st.name\" [disabled]=\"busy()\">×</button>}</div>\n } @empty {<div class=\"o-empty\">No streams declared. Apps can make their own; the console lists every stream and KV bucket.</div>}\n <div class=\"o-cf\">JetStream on the volume · {{ d.nodes > 1 ? 'replicated on 3 servers' : 'one server' }}</div>\n </div>\n } @else if (d.engine === 'rabbitmq') {\n <div class=\"o-card\" data-testid=\"svc-vhosts\">\n <div class=\"o-ch\"><b>Virtual hosts</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-vhost-add\">+ Virtual host</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=\"Virtual host\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" (keydown.enter)=\"addVhost(d)\" data-testid=\"svc-vhost-name\" /><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addVhost(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-vhost-create\">Create</button></div>\n }\n <div class=\"o-row\"><span class=\"o-mono o-b5\">/</span><span class=\"o-faint o-sm\">default</span></div>\n @for (v of d.vhosts ?? []; track v) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ v }}</span><span class=\"o-r o-faint o-sm\">quorum queues</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeVhost(d, v)\" [attr.aria-label]=\"'Remove ' + v\" [disabled]=\"busy()\">×</button>}</div>\n }\n <div class=\"o-cf\">Queues default to quorum queues · every user gets its preset on each virtual host</div>\n </div>\n } @else {\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 }\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: attach with “Own user” and each app gets its own least-privilege login, removed when it is detached</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 {{ snapshotName(d) }}: 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 <o-svc-dumps [d]=\"d\" [projectKey]=\"key()\" [dumps]=\"!!engine()?.dumps\" (done)=\"notice.set($event); refresh()\" (failed)=\"error.set($event)\" />\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 <o-svc-console [d]=\"d\" [projectKey]=\"key()\" [kind]=\"engine()?.console ?? 'sql'\" />\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\" data-testid=\"svc-ha\">\n <div class=\"o-ch\"><b>High availability</b><span class=\"o-r\">{{ d.readyNodes }} of {{ d.nodes }} node{{ d.nodes === 1 ? '' : 's' }} ready</span></div>\n @switch (engine()?.ha) {\n @case ('standby') {\n <div class=\"o-row\"><span style=\"flex:1\">Standby node with automatic failover@if (d.engine === 'mysql') {<span class=\"o-faint o-sm\"> · two semi-synchronous replicas (MOCO runs 1, 3 or 5)</span>}</span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.standby\" [disabled]=\"!d.canManage || busy()\" (click)=\"topology(d, !d.standby, d.standby ? 0 : d.replicas)\" aria-label=\"Standby\" data-testid=\"svc-standby\"></button></div>\n <div class=\"o-row\"><span style=\"flex:1\">Read replicas@if (d.readHost) {<span class=\"o-faint o-sm o-mono\"> · {{ d.readHost }}</span>}</span><span class=\"o-faint o-sm\" data-testid=\"svc-replicas\">{{ d.replicas }}</span>\n @if (d.canManage) {\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, d.standby, d.replicas - step(d))\" [disabled]=\"busy() || d.replicas === 0\">−</button>\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, d.standby || d.engine === 'mysql', d.replicas + step(d))\" [disabled]=\"busy() || d.replicas + step(d) > (engine()?.maxReplicas ?? 0)\" data-testid=\"svc-replica-add\">+ Replica</button>\n }</div>\n <div class=\"o-cf\">Each node is billed at the plan's price · {{ nodesPrice(d) }}/mo now</div>\n }\n @case ('cluster') {\n <div class=\"o-row\"><span style=\"flex:1\">3-node cluster<span class=\"o-faint o-sm\"> · {{ d.engine === 'nats' ? 'streams replicated on three servers' : 'quorum queues on three nodes' }}</span></span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.standby\" [disabled]=\"!d.canManage || busy()\" (click)=\"topology(d, !d.standby, 0)\" aria-label=\"3-node cluster\" data-testid=\"svc-standby\"></button></div>\n <div class=\"o-cf\">Each node is billed at the plan's price · {{ nodesPrice(d) }}/mo now</div>\n }\n @default {\n <div class=\"o-row\"><span style=\"flex:1\">Replica with failover</span><b class=\"o-ph-tag o-later\">Later</b></div>\n <div class=\"o-cf\">{{ d.engineName }} runs one node for now; daily snapshots keep its data.</div>\n }\n }\n </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\" data-testid=\"svc-params\"><div class=\"o-ch\"><b>Engine parameters</b><span class=\"o-r\">validated subset</span></div><div class=\"o-tbl\"><div class=\"o-tbody\">\n @for (p of d.parameters; track p.name) {<div class=\"o-tr\">\n <div class=\"o-td o-mono o-sm\" [title]=\"p.description\">{{ p.name }}</div>\n <div class=\"o-td\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" [placeholder]=\"p.default\" [disabled]=\"!d.canManage\" [attr.aria-label]=\"p.name\" [ngModel]=\"paramDraft()[p.name] ?? p.value ?? ''\" (ngModelChange)=\"setParam(p, $event)\" [attr.data-testid]=\"'svc-param-' + p.name\" /></div>\n <div class=\"o-td\"><span class=\"o-chip\" [class.o-amb]=\"p.restart\">{{ p.restart ? 'restart' : 'live' }}</span></div>\n <div class=\"o-td o-faint o-xs o-ell\" style=\"max-width:260px\">{{ p.description }}</div>\n </div>}\n </div></div>\n @if (d.canManage) {<div class=\"o-cf\"><span class=\"o-faint o-sm\">{{ paramNote(d) }}</span><button type=\"button\" class=\"o-btn o-sm o-dark o-r\" (click)=\"saveParams(d)\" [disabled]=\"busy() || !paramsChanged()\" data-testid=\"svc-params-save\">Save parameters</button></div>}\n </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 attOwn = signal(false);\n protected readonly attVhost = signal('/');\n protected readonly subjects = signal('');\n protected readonly maxAge = signal(168);\n protected readonly streamAges = [{ h: 24, label: 'keep 1 day' }, { h: 168, label: 'keep 7 days' }, { h: 720, label: 'keep 30 days' }, { h: 0, label: 'until limits' }];\n protected readonly paramDraft = signal<Record<string, string>>({});\n protected readonly paramsChanged = computed(() => Object.keys(this.paramDraft()).length > 0);\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 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', 'nats', 'node', 'cli'].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 if (d?.engine === 'nats' || d?.engine === 'rabbitmq') {\n const pub = fig('published');\n const depth = fig(d.engine === 'nats' ? 'stream_depth' : 'queue_depth');\n out.push({ label: 'Published / s', value: pub?.rate != null ? num(pub.rate, 1) : '–', sub: `${num(depth?.value)} ${d.engine === 'nats' ? 'in streams' : 'ready'} · ${num(fig('unacked')?.value)} unacked` });\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) || d.readyNodes < d.nodes || (d.dumps ?? []).some((x) => x.phase !== 'completed' && x.phase !== 'failed') || !!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', cli: 'origine CLI', nats: 'nats' } 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 const body = { app, environment: this.attEnv(), prefix: this.attPrefix().trim(), ownUser: this.attOwn(), database: d.engine === 'rabbitmq' ? this.attVhost() : undefined };\n this.run(this.api.attach(this.key(), d.id, body), (a) => {\n this.attachOpen.set(false);\n this.notice.set(`${d.name} attached to ${app} · ${this.attEnv()}: ${this.attPrefix()}${this.envVar()} is injected${a?.ownUser ? ' with its own user ' + a.user : ''} 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 // ---- v1 -------------------------------------------------------------------\n\n protected nodesPrice(d: Detail): string {\n return money((this.plans().find((p) => p.id === d.plan)?.priceCents ?? 0) * d.nodes);\n }\n protected refresh() {\n this.load();\n }\n protected snapshotName(d: Detail): string {\n return d.engine === 'nats' ? 'stream snapshot' : d.engine === 'rabbitmq' ? 'definitions export' : 'RDB snapshot';\n }\n /** MySQL replicas come in pairs. */\n protected step(d: Detail): number {\n return d.engine === 'mysql' ? 2 : 1;\n }\n protected topology(d: Detail, standby: boolean, replicas: number) {\n const nodes = d.engine === 'nats' || d.engine === 'rabbitmq' ? (standby ? 3 : 1) : 1 + replicas + (standby ? (d.engine === 'mysql' ? 2 : 1) : 0);\n this.save(d, { standby, replicas: Math.max(0, replicas) }, `${d.name} now runs ${nodes} node${nodes === 1 ? '' : 's'}${standby ? ' with automatic failover' : ''}.`);\n }\n protected setParam(p: Param, v: string) {\n this.paramDraft.update((m) => ({ ...m, [p.name]: v }));\n }\n protected paramNote(d: Detail): string {\n const changed = Object.keys(this.paramDraft());\n const restarts = d.parameters.filter((p) => p.restart && changed.includes(p.name)).map((p) => p.name);\n if (!changed.length) return 'Empty fields keep the default (shown greyed).';\n return restarts.length ? `${restarts.join(', ')} restart${restarts.length === 1 ? 's' : ''} ${d.engineName}${d.nodes > 1 ? ' one node at a time' : ''}.` : 'Applied live.';\n }\n protected saveParams(d: Detail) {\n const all: Record<string, string> = {};\n for (const p of d.parameters) {\n const v = this.paramDraft()[p.name] ?? p.value ?? '';\n if (v.trim()) all[p.name] = v.trim();\n }\n this.run(this.api.update(this.key(), d.id, { parameters: all }), () => {\n this.paramDraft.set({});\n this.notice.set('Parameters saved; the cell applies them now.');\n }, 'The parameters could not be saved.');\n }\n protected addStream(d: Detail) {\n const name = this.dbName().trim();\n const subjects = this.subjects().split(',').map((x) => x.trim()).filter(Boolean);\n this.run(this.api.addStream(this.key(), d.id, { name, subjects, maxAgeHours: this.maxAge() }), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.subjects.set('');\n this.notice.set(`Stream ${name} created.`);\n }, 'The stream could not be created.');\n }\n protected removeStream(d: Detail, name: string) {\n this.run(this.api.removeStream(this.key(), d.id, name), () => this.notice.set(`Stream ${name} and its messages removed.`), 'The stream could not be removed.');\n }\n protected addVhost(d: Detail) {\n const name = this.dbName().trim();\n this.run(this.api.addVhost(this.key(), d.id, name), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.notice.set(`Virtual host ${name} created.`);\n }, 'The virtual host could not be created.');\n }\n protected removeVhost(d: Detail, name: string) {\n this.run(this.api.removeVhost(this.key(), d.id, name), () => this.notice.set(`Virtual host ${name} removed.`), 'The virtual host could not be removed.');\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';\nexport * from './lib/console.tab';\nexport * from './lib/dumps.card';\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/console.tab.ts","../../../projects/services/src/lib/dumps.card.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 { HttpClient } from '@angular/common/http';\nimport { 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 ha?: 'standby' | 'replica' | 'cluster' | '';\n maxReplicas?: number;\n dumps?: boolean;\n console: 'sql' | 'keys' | 'streams' | 'queues';\n parameters: Param[];\n}\n\nexport interface Param {\n engine: string;\n name: string;\n kind: 'int' | 'float' | 'size' | 'duration' | 'bool' | 'enum';\n min: number;\n max: number;\n enum?: string[];\n restart: boolean;\n default: string;\n description: string;\n value?: string;\n}\n\nexport interface Stream {\n name: string;\n subjects: string[];\n maxAgeHours?: number;\n maxMb?: number;\n}\n\nexport interface Dump {\n id: string;\n kind: 'export' | 'import';\n source?: 'upload' | 'remote';\n remote?: string;\n database: string;\n fileName?: string;\n phase: 'uploading' | 'pending' | 'running' | 'completed' | 'failed';\n bytes?: number;\n error?: string;\n createdBy: string;\n createdAt: string;\n stoppedAt?: string;\n}\n\nexport interface QueryResult {\n columns: string[];\n rows: string[][];\n truncated: boolean;\n command?: string;\n rowsAffected?: number;\n ms: number;\n readOnly: boolean;\n runsAs: string;\n}\n\nexport interface Inspection {\n kind: 'keys' | 'streams' | 'queues';\n items: Record<string, any>[];\n cursor?: string;\n detail?: Record<string, any>;\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 nodes: number;\n fork: boolean;\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 /** The backup's volume snapshots (RabbitMQ's queue data), one per node. */\n volumes?: { phase: string; snapshots: number; error?: string };\n}\n\nexport interface ManagementLink {\n url: string;\n mode: 'admin' | 'read';\n expiresAt: 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 ownUser?: boolean;\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 standby: boolean;\n replicas: number;\n readyNodes: number;\n readHost?: string;\n parameters: Param[];\n streams: Stream[];\n vhosts: string[] | null;\n dumps: Dump[];\n declaredBy?: string;\n /** Valkey with replicas: where Sentinel-aware clients find the primary. */\n sentinel?: { hosts: string[]; port: number; master: string };\n /** RabbitMQ: the cell's snapshot class for the queue data, or why there is none. */\n volumeSnapshots?: { class?: string; message?: string };\n /** RabbitMQ: what the caller's role opens of the management UI. */\n management?: 'admin' | 'read' | '';\n restoreVolumes?: 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; ownUser?: boolean };\n standby?: boolean;\n replicas?: number;\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 standby?: boolean;\n replicas?: number;\n parameters?: Record<string, 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 private readonly http = inject(HttpClient);\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 /** A link to a RabbitMQ instance's management UI, for the caller only (read-only for Developers). */\n management(project: string, id: string): Observable<ManagementLink> {\n return this.api.post(this.i(project, id, 'management'), {}).pipe(map((r) => data<ManagementLink>(r)));\n }\n restore(project: string, id: string, body: { pointInTime?: string; backup?: string; name?: string; volumes?: boolean }): 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; ownUser?: boolean; database?: 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 // ---- v1 ----\n addStream(project: string, id: string, s: Stream): Observable<Detail> {\n return this.api.post(this.i(project, id, 'stream'), s).pipe(map((r) => data<Detail>(r)));\n }\n removeStream(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'stream/' + enc(name)));\n }\n addVhost(project: string, id: string, name: string): Observable<Detail> {\n return this.api.post(this.i(project, id, 'vhost'), { name }).pipe(map((r) => data<Detail>(r)));\n }\n removeVhost(project: string, id: string, name: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'vhost/' + enc(name)));\n }\n fork(project: string, id: string, body: { name?: string; environment?: string; plan?: string }): Observable<Detail> {\n return this.api.post(this.i(project, id, 'fork'), body).pipe(map((r) => data<Detail>(r)));\n }\n exportDump(project: string, id: string, database = ''): Observable<Dump> {\n return this.api.post(this.i(project, id, 'dump'), { database }).pipe(map((r) => data<Dump>(r)));\n }\n importRemote(project: string, id: string, database: string, remote: string): Observable<Dump> {\n return this.api.post(this.i(project, id, 'dump/import'), { database, remote }).pipe(map((r) => data<Dump>(r)));\n }\n deleteDump(project: string, id: string, dump: string): Observable<unknown> {\n return this.api.delete(this.i(project, id, 'dump/' + enc(dump)));\n }\n /** Streams an uploaded dump to the cell (outside the JSON API: /x/services/…). */\n importUpload(project: string, id: string, database: string, file: File): Observable<Dump> {\n return this.http.put(`/x/services/${enc(project)}/${enc(id)}/dump`, file, { params: { database, file: file.name }, headers: { 'content-type': 'application/octet-stream' } })\n .pipe(map((r) => data<Dump>(r)));\n }\n downloadDump(project: string, id: string, dump: string): Observable<Blob> {\n return this.http.get(`/x/services/${enc(project)}/${enc(id)}/dump/${enc(dump)}`, { responseType: 'blob' });\n }\n query(project: string, id: string, body: { database?: string; statement: string; write?: boolean }): Observable<QueryResult> {\n return this.api.post(this.i(project, id, 'query'), body).pipe(map((r) => data<QueryResult>(r)));\n }\n inspect(project: string, id: string, body: { pattern?: string; cursor?: string; item?: string }): Observable<Inspection> {\n return this.api.post(this.i(project, id, 'inspect'), body).pipe(map((r) => data<Inspection>(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\n/** While the browser tab is hidden, the page's polls slow to once a minute (the cell is read for each). */\nexport const HIDDEN_POLL_MS = 60_000;\n\n/** The delay before the next poll: `visibleMs` while the page is seen, once a minute while it is hidden. */\nexport function pollDelay(visibleMs: number): number {\n return typeof document !== 'undefined' && document.visibilityState === 'hidden' ? Math.max(visibleMs, HIDDEN_POLL_MS) : visibleMs;\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 <a class=\"o-card o-cb o-flex\" [routerLink]=\"host.link('services/new')\" [queryParams]=\"{ engine: 'nats' }\" data-testid=\"svc-new-nats\"><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><span class=\"o-r o-faint o-sm\">Create →</span></a>\n <a class=\"o-card o-cb o-flex\" [routerLink]=\"host.link('services/new')\" [queryParams]=\"{ engine: 'rabbitmq' }\" data-testid=\"svc-new-rabbitmq\"><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 the platform</span></div><span class=\"o-r o-faint o-sm\">Create →</span></a>\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 { ActivatedRoute, 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', nats: 'events', rabbitmq: 'jobs-mq' };\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</label><div class=\"o-flex\">\n @if (engine()?.ha) {<button type=\"button\" class=\"o-tog\" [class.o-on]=\"ha()\" (click)=\"ha.set(!ha())\" [disabled]=\"!!quota()?.onlyPlan\" aria-label=\"High availability\" data-testid=\"svc-ha\"></button>}\n @else {<button type=\"button\" class=\"o-tog\" disabled aria-label=\"High availability\"></button>}\n <span class=\"o-sm\">{{ haLabel() }}</span></div>\n @if (quota()?.onlyPlan && engine()?.ha) {<span class=\"o-hint\">{{ quota()!.plan }} includes one node.</span>}</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 @if (nodes() > 1) {<span class=\"o-k\">Nodes</span><span data-testid=\"svc-nodes\">{{ nodes() }} · {{ engine()?.ha === 'cluster' ? 'cluster' : 'automatic failover' }}</span>}\n <span class=\"o-k\">Backups</span><span>{{ engine()?.id === 'mysql' ? 'Hourly' : 'Daily' }}{{ engine()?.pitr ? ' + PITR' : engine()?.id === 'nats' ? ' stream snapshot' : engine()?.id === 'rabbitmq' ? ' definitions' : ' 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\" data-testid=\"svc-monthly\">{{ plan() ? price(plan()!.priceCents * nodes()) + '/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 route = inject(ActivatedRoute);\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 ha = signal(false);\n protected readonly nodes = computed(() => (!this.ha() ? 1 : this.engine()?.ha === 'cluster' ? 3 : this.engine()?.id === 'mysql' ? 3 : 2));\n protected readonly haLabel = computed(() => {\n const e = this.engine();\n if (e?.ha === 'cluster') return '3-node cluster';\n if (e?.ha === 'standby') return e.id === 'mysql' ? 'Standby with automatic failover (3 nodes: MOCO runs 1, 3 or 5)' : 'Standby node with automatic failover';\n if (e?.ha === 'replica') return 'Replica with automatic failover (three Sentinels watch the primary)';\n return `${e?.name ?? 'This engine'} runs one node`;\n });\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 want = this.route.snapshot.queryParamMap.get('engine');\n const first = catalog.engines.find((e) => e.id === want && e.available) ?? 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 if (!e.ha) this.ha.set(false);\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, standby: this.ha() && !!e.ha,\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, computed, inject, input, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Detail, Inspection, QueryResult, ServicesApi, apiMessage } from './services.api';\n\n// The browser console (SVC-17; prototype \"services\" › Console): SQL for Postgres and MySQL, run\n// as the owner in a read-only transaction unless \"Allow writes\" is on, with the 1,000-row limit\n// and 5 s statement timeout; an inspector for Valkey keys, NATS streams and RabbitMQ queues.\n// Everything run here is in the audit log.\n@Component({\n selector: 'o-svc-console',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (sql()) {\n <div class=\"o-flex o-wrap\">\n <span class=\"o-chip\" [class.o-grn]=\"!write()\" [class.o-amb]=\"write()\" data-testid=\"svc-console-mode\">{{ write() ? 'Read-write' : 'Read-only' }}</span>\n <span class=\"o-faint o-sm\">1,000-row limit · 5 s statement timeout · runs as {{ runsAs() }} · audited</span>\n <span class=\"o-r\"></span>\n @if (d().canManage) {<label class=\"o-flex o-sm\" style=\"gap:6px\"><input type=\"checkbox\" [ngModel]=\"write()\" (ngModelChange)=\"write.set($event)\" data-testid=\"svc-console-write\" /> Allow writes</label>}\n @if (d().databases.length) {\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Database\" [ngModel]=\"db() || d().databases[0]?.name\" (ngModelChange)=\"db.set($event)\" data-testid=\"svc-console-db\">\n @for (x of d().databases; track x.name) {<option [value]=\"x.name\">{{ x.name }}</option>}\n </select>\n }\n </div>\n <div class=\"o-card\">\n <textarea class=\"o-in o-mono\" style=\"border:none;box-shadow:none;font-size:12.5px\" rows=\"4\" aria-label=\"Query\" [ngModel]=\"stmt()\" (ngModelChange)=\"stmt.set($event)\" (keydown.meta.enter)=\"runSql()\" (keydown.control.enter)=\"runSql()\" data-testid=\"svc-console-sql\"></textarea>\n <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\" (click)=\"runSql()\" [disabled]=\"busy() || !stmt().trim() || !running()\" data-testid=\"svc-console-run\">Run</button></div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-console-error\">{{ error() }}</div>}\n @if (result(); as r) {\n <div class=\"o-card\" style=\"overflow-x:auto\" data-testid=\"svc-console-result\">\n @if (r.columns.length) {\n <div class=\"o-tbl\"><div class=\"o-thead\"><div class=\"o-tr\">@for (c of r.columns; track $index) {<div class=\"o-th\">{{ c }}</div>}</div></div><div class=\"o-tbody\">\n @for (row of r.rows; track $index) {<div class=\"o-tr\">@for (v of row; track $index) {<div class=\"o-td o-mono o-sm\" [class.o-faint]=\"v === 'NULL'\">{{ v }}</div>}</div>}\n </div></div>\n }\n <div class=\"o-cf\">{{ resultLine(r) }}</div>\n </div>\n }\n } @else {\n <div class=\"o-flex o-wrap\">\n <span class=\"o-chip o-grn\">Read-only</span>\n <span class=\"o-faint o-sm\">{{ inspectorLine() }} · audited</span>\n <span class=\"o-r\"></span>\n @if (kind() !== 'streams') {<input class=\"o-in o-sm o-mono\" style=\"width:200px\" [placeholder]=\"kind() === 'keys' ? 'pattern, e.g. session:*' : 'filter by name'\" aria-label=\"Filter\" [ngModel]=\"pattern()\" (ngModelChange)=\"pattern.set($event)\" (keydown.enter)=\"inspect()\" data-testid=\"svc-inspect-pattern\" />}\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"inspect()\" [disabled]=\"busy() || !running()\" data-testid=\"svc-inspect-run\">{{ list() ? 'Refresh' : 'Inspect' }}</button>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\" data-testid=\"svc-console-error\">{{ error() }}</div>}\n @if (list(); as l) {\n <div class=\"o-split o-w340\">\n <div class=\"o-card\" data-testid=\"svc-inspect-list\">\n @for (it of l.items; track $index) {\n <button type=\"button\" class=\"o-row o-click\" style=\"width:100%;text-align:left;border:none;background:none\" (click)=\"open(it)\">\n <span class=\"o-mono o-b5 o-ell\">{{ label(it) }}</span><span class=\"o-r o-faint o-sm\">{{ note(it) }}</span>\n </button>\n } @empty {<div class=\"o-empty\">{{ kind() === 'keys' ? 'No keys match.' : kind() === 'streams' ? 'No streams yet.' : 'No queues yet.' }}</div>}\n @if (l.cursor) {<div class=\"o-cf\"><button type=\"button\" class=\"o-lnk\" (click)=\"inspect(l.cursor)\">More</button></div>}\n </div>\n <div class=\"o-card o-cb\" data-testid=\"svc-inspect-detail\">\n @if (l.detail; as det) {<pre class=\"o-mono o-sm\" style=\"margin:0;white-space:pre-wrap;word-break:break-all\">{{ pretty(det) }}</pre>}\n @else {<span class=\"o-faint o-sm\">Pick {{ kind() === 'keys' ? 'a key' : kind() === 'streams' ? 'a stream' : 'a queue' }} to see {{ kind() === 'streams' ? 'its consumers and recent messages' : 'its contents' }}.</span>}\n </div>\n </div>\n }\n }\n @if (!running()) {<span class=\"o-faint o-sm\">The console opens once {{ d().name }} is running.</span>}\n `,\n})\nexport class ServiceConsoleTab {\n private readonly api = inject(ServicesApi);\n readonly d = input.required<Detail>();\n readonly projectKey = input.required<string>();\n readonly kind = input<'sql' | 'keys' | 'streams' | 'queues'>('sql');\n\n protected readonly sql = computed(() => this.kind() === 'sql');\n protected readonly running = computed(() => ['Running', 'Updating', 'Degraded'].includes(this.d().state));\n protected readonly runsAs = computed(() => this.result()?.runsAs || this.d().connection?.user || 'the owner');\n protected readonly stmt = signal('SELECT now();');\n protected readonly db = signal('');\n protected readonly write = signal(false);\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n protected readonly result = signal<QueryResult | null>(null);\n protected readonly pattern = signal('');\n protected readonly list = signal<Inspection | null>(null);\n private last = '';\n\n protected inspectorLine(): string {\n return this.kind() === 'keys' ? 'Keys by SCAN, values up to 100 items' : this.kind() === 'streams' ? 'Streams, consumers and the last 20 messages' : 'Queues with depth, unacknowledged and consumers';\n }\n\n protected runSql() {\n const statement = this.stmt().trim();\n if (!statement || this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n this.api.query(this.projectKey(), this.d().id, { database: this.db() || this.d().databases[0]?.name, statement, write: this.write() }).subscribe({\n next: (r) => {\n this.busy.set(false);\n this.result.set(r);\n },\n error: (e) => {\n this.busy.set(false);\n this.result.set(null);\n this.error.set(apiMessage(e, 'The statement could not run.'));\n },\n });\n }\n\n protected resultLine(r: QueryResult): string {\n const n = r.rows.length;\n const rows = r.columns.length ? `${n.toLocaleString()} row${n === 1 ? '' : 's'}${r.truncated ? ' (limit reached)' : ''}` : `${r.command || 'OK'}${r.rowsAffected ? ' · ' + r.rowsAffected + ' rows' : ''}`;\n return `${rows} · ${r.ms} ms · ${r.readOnly ? 'read-only' : 'committed'}`;\n }\n\n protected inspect(cursor = '', item = '') {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n this.api.inspect(this.projectKey(), this.d().id, { pattern: this.pattern(), cursor, item }).subscribe({\n next: (r) => {\n this.busy.set(false);\n if (item) {\n this.list.update((l) => (l ? { ...l, detail: r.detail } : r));\n } else if (cursor) {\n this.list.update((l) => ({ ...r, items: [...(l?.items ?? []), ...r.items] }));\n } else {\n this.list.set(r);\n }\n },\n error: (e) => {\n this.busy.set(false);\n this.error.set(apiMessage(e, 'The inspector could not read the service.'));\n },\n });\n }\n\n protected open(it: Record<string, any>) {\n const k = this.kind();\n this.last = k === 'keys' ? it['key'] : k === 'streams' ? it['name'] : `${it['vhost'] ?? '/'}/${it['name']}`;\n this.inspect('', this.last);\n }\n\n protected label(it: Record<string, any>): string {\n return String(this.kind() === 'keys' ? it['key'] : it['name']);\n }\n\n protected note(it: Record<string, any>): string {\n switch (this.kind()) {\n case 'keys':\n return `${it['type']}${it['ttl'] > 0 ? ' · ttl ' + it['ttl'] + ' s' : ''}`;\n case 'streams':\n return `${Number(it['messages'] ?? 0).toLocaleString()} msgs · ${it['consumers'] ?? 0} consumers${it['kv'] ? ' · KV' : ''}`;\n }\n return `${it['vhost'] ?? '/'} · ${Number(it['messages'] ?? 0).toLocaleString()} msgs · ${it['messages_unacknowledged'] ?? 0} unacked`;\n }\n\n protected pretty(v: unknown): string {\n return JSON.stringify(v, null, 2);\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { ServicesHost } from './host';\nimport { bytes, when } from './look';\nimport { Detail, Dump, ServicesApi, apiMessage } from './services.api';\n\n// Backups › Fork and dumps (SVC-23, SVC-25): fork from the latest backup into another\n// environment; export a logical dump (pg_dump custom format, mysqldump SQL) and download it;\n// import a dump file or another server's database by connection string.\n@Component({\n selector: 'o-svc-dumps',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'display:flex;flex-direction:column;gap:14px' },\n template: `\n <div class=\"o-card o-cb o-col\" style=\"gap:8px\" data-testid=\"svc-fork-card\">\n <b>Fork for staging</b>\n <span class=\"o-hint\">Copy from the latest backup into a new instance. {{ d().name }} keeps running untouched.</span>\n @if (d().canManage) {\n <div class=\"o-flex o-wrap\">\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Environment\" [ngModel]=\"env()\" (ngModelChange)=\"env.set($event)\" data-testid=\"svc-fork-env\">\n @for (e of envs; track e) {<option [value]=\"e\">{{ e }}</option>}\n </select>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"fork()\" [disabled]=\"busy() || !hasBackup()\" data-testid=\"svc-fork\">Fork</button>\n </div>\n @if (!hasBackup()) {<span class=\"o-faint o-xs\">Available after the first completed backup.</span>}\n }\n </div>\n @if (dumps()) {\n <div class=\"o-card\" data-testid=\"svc-dumps\">\n <div class=\"o-ch\"><b>Dumps</b>@if (d().canManage) {<button type=\"button\" class=\"o-btn o-xs o-r\" (click)=\"exportDump()\" [disabled]=\"busy() || d().state !== 'Running'\" data-testid=\"svc-export\">{{ tool() }}</button>}</div>\n @for (x of d().dumps; track x.id) {\n <div class=\"o-row\" [attr.data-testid]=\"'svc-dump-' + x.id\">\n <span [class]=\"'o-dot ' + dot(x)\"></span>\n <span class=\"o-sm o-ell\" style=\"flex:1\">{{ x.kind === 'export' ? 'Export of ' + x.database : 'Import into ' + x.database + (x.remote ? ' from ' + x.remote : x.fileName ? ' from ' + x.fileName : '') }}</span>\n <span class=\"o-faint o-xs\">{{ x.phase === 'completed' ? (x.bytes ? size(x.bytes) + ' · ' : '') + when(x.stoppedAt || x.createdAt) : x.phase }}</span>\n @if (x.kind === 'export' && x.phase === 'completed') {<button type=\"button\" class=\"o-lnk\" (click)=\"download(x)\" [disabled]=\"busy()\" data-testid=\"svc-dump-download\">Download</button>}\n @if (d().canManage && x.phase !== 'running') {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"remove(x)\" [attr.aria-label]=\"'Delete dump ' + x.id\" [disabled]=\"busy()\">×</button>}\n </div>\n @if (x.error) {<div class=\"o-row o-sm\" style=\"color:var(--o-bad-tx)\">{{ x.error }}</div>}\n } @empty {<div class=\"o-empty\">No dumps yet. Export one to download it, or import a dump into {{ d().name }}.</div>}\n @if (d().canManage) {\n <div class=\"o-cb o-col\" style=\"gap:8px;border-top:1px solid var(--o-line-2)\">\n <b class=\"o-sm\">Import</b>\n <div class=\"o-flex o-wrap\">\n <label class=\"o-btn o-sm\" style=\"cursor:pointer\">Upload a dump…<input type=\"file\" style=\"display:none\" (change)=\"upload($event)\" data-testid=\"svc-import-file\" /></label>\n <span class=\"o-faint o-xs\">{{ d().engine === 'mysql' ? 'SQL' : 'pg_dump custom format or SQL' }}, gzipped or not, up to 5 GB</span>\n </div>\n <div class=\"o-flex o-wrap\">\n <input class=\"o-in o-sm o-mono\" style=\"flex:1;min-width:220px\" [placeholder]=\"d().engine === 'mysql' ? 'mysql://user:password@host:3306/db' : 'postgresql://user:password@host:5432/db'\" aria-label=\"Connection string\" [ngModel]=\"remote()\" (ngModelChange)=\"remote.set($event)\" data-testid=\"svc-import-remote\" />\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"importRemote()\" [disabled]=\"busy() || !remote().trim() || d().state !== 'Running'\" data-testid=\"svc-import-go\">Import</button>\n </div>\n <span class=\"o-faint o-xs\">Loads into {{ d().databases[0]?.name }} as its owner. The connection string is sealed and only reaches the cell while the import runs.</span>\n </div>\n }\n </div>\n }\n `,\n})\nexport class ServiceDumpsCard {\n private readonly api = inject(ServicesApi);\n private readonly host = inject(ServicesHost);\n private readonly router = inject(Router);\n readonly d = input.required<Detail>();\n readonly projectKey = input.required<string>();\n readonly dumps = input(false);\n readonly done = output<string>();\n readonly failed = output<string>();\n\n protected readonly envs = ['staging', 'development', 'production'];\n protected readonly env = signal('staging');\n protected readonly remote = signal('');\n protected readonly busy = signal(false);\n protected readonly size = bytes;\n protected readonly when = (s?: string) => when(s);\n\n protected hasBackup(): boolean {\n return (this.d().backups ?? []).some((b) => b.phase === 'completed');\n }\n protected tool(): string {\n return this.d().engine === 'mysql' ? 'mysqldump' : 'pg_dump';\n }\n protected dot(x: Dump): string {\n return x.phase === 'failed' ? 'o-red' : x.phase === 'completed' ? 'o-grn' : 'o-blu';\n }\n\n private go<T>(obs: import('rxjs').Observable<T>, ok: (v: T) => void, fail: string) {\n this.busy.set(true);\n obs.subscribe({\n next: (v) => {\n this.busy.set(false);\n ok(v);\n },\n error: (e) => {\n this.busy.set(false);\n this.failed.emit(apiMessage(e, fail));\n },\n });\n }\n\n protected fork() {\n this.go(this.api.fork(this.projectKey(), this.d().id, { environment: this.env() }), (f) => this.router.navigate(this.host.link('services/' + f.name)), 'The fork could not be started.');\n }\n protected exportDump() {\n this.go(this.api.exportDump(this.projectKey(), this.d().id), () => this.done.emit(`Exporting ${this.d().databases[0]?.name} with ${this.tool()}; it appears here to download when done.`), 'The export could not be started.');\n }\n protected importRemote() {\n this.go(this.api.importRemote(this.projectKey(), this.d().id, '', this.remote().trim()), (x) => {\n this.remote.set('');\n this.done.emit(`Importing ${x.database} from ${x.remote}.`);\n }, 'The import could not be started.');\n }\n protected upload(ev: Event) {\n const el = ev.target as HTMLInputElement;\n const file = el.files?.[0];\n el.value = '';\n if (!file) return;\n this.go(this.api.importUpload(this.projectKey(), this.d().id, '', file), (x) => this.done.emit(`${file.name} uploaded; importing into ${x.database}.`), 'The dump could not be uploaded.');\n }\n protected download(x: Dump) {\n this.go(this.api.downloadDump(this.projectKey(), this.d().id, x.id), (blob) => {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${this.d().name}-${x.database}-${x.id}${this.d().engine === 'mysql' ? '.sql' : '.dump'}`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 5000);\n this.done.emit('Download recorded in the audit log.');\n }, 'The dump could not be downloaded.');\n }\n protected remove(x: Dump) {\n this.go(this.api.deleteDump(this.projectKey(), this.d().id, x.id), () => this.done.emit('Dump deleted.'), 'The dump could not be deleted.');\n }\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { hhmmss, pollDelay } 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), pollDelay(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 { ServiceConsoleTab } from './console.tab';\nimport { ServiceDumpsCard } from './dumps.card';\nimport { ServiceLogsTab } from './logs.tab';\nimport { DAYS, PRESETS, backupKind, bytes, shortDate, fromLocalInput, money, moving, num, pct, pollDelay, presetChip, ratio, stateChip, toLocalInput, utcHour, when } from './look';\nimport { ServiceMetricsTab } from './metrics.tab';\nimport { Attachment, Backup, Catalog, Detail, Engine, LogLine, Metrics, Param, 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; volumes?: boolean; hasVolumes?: boolean }\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// /{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, the console (SQL, or the key, stream and queue inspector), and settings\n// (resize, high availability, networking, maintenance, engine parameters, delete). Services v1\n// (P5-41): NATS streams and RabbitMQ vhosts, per-app users, fork and dumps.\n@Component({\n selector: 'o-service',\n imports: [FormsModule, RouterLink, ServiceMetricsTab, ServiceLogsTab, ServiceConsoleTab, ServiceDumpsCard],\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.management && !d.deletedAt) {<button type=\"button\" class=\"o-btn\" (click)=\"openManagement(d)\" [disabled]=\"busy() || d.state !== 'Running' && d.state !== 'Updating' && d.state !== 'Degraded'\" [title]=\"d.management === 'read' ? 'Read-only for your role' : 'As the instance administrator'\" data-testid=\"svc-management\">Open management UI@if (d.management === 'read') {<span class=\"o-faint o-xs\"> · read-only</span>}</button>}\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>@if (a.ownUser) {<span class=\"o-faint o-xs o-mono\" title=\"The app's own user\">{{ a.user }}</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 @if (d.engine === 'rabbitmq' && (d.vhosts ?? []).length) {<select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Virtual host\" [ngModel]=\"attVhost()\" (ngModelChange)=\"attVhost.set($event)\" data-testid=\"svc-att-vhost\"><option value=\"/\">/</option>@for (v of d.vhosts ?? []; track v) {<option [value]=\"v\">{{ v }}</option>}</select>}\n <label class=\"o-flex o-sm\" style=\"gap:4px\" title=\"A user of its own for this app, read-write, removed when it is detached\"><input type=\"checkbox\" [ngModel]=\"attOwn()\" (ngModelChange)=\"attOwn.set($event)\" data-testid=\"svc-att-own\" /> Own user</label>\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 @if (d.engine === 'nats') {\n <div class=\"o-card\" data-testid=\"svc-streams\">\n <div class=\"o-ch\"><b>Streams</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-stream-add\">+ Stream</button>}</div>\n @if (addingDb()) {\n <div class=\"o-row o-wrap\" style=\"background:var(--o-bg)\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" placeholder=\"ORDERS\" aria-label=\"Stream name\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" data-testid=\"svc-stream-name\" /><input class=\"o-in o-sm o-mono\" style=\"width:140px\" placeholder=\"orders.>\" aria-label=\"Subjects\" [ngModel]=\"subjects()\" (ngModelChange)=\"subjects.set($event)\" data-testid=\"svc-stream-subjects\" /><select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Keep for\" [ngModel]=\"maxAge()\" (ngModelChange)=\"maxAge.set(+$event)\">@for (k of streamAges; track k.h) {<option [ngValue]=\"k.h\">{{ k.label }}</option>}</select><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addStream(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-stream-create\">Create</button></div>\n }\n @for (st of d.streams; track st.name) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ st.name }}</span><span class=\"o-faint o-sm o-mono\">{{ st.subjects.join(', ') }}</span><span class=\"o-r o-faint o-sm\">{{ st.maxAgeHours ? 'kept ' + st.maxAgeHours + ' h' : 'kept until limits' }}</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeStream(d, st.name)\" [attr.aria-label]=\"'Remove ' + st.name\" [disabled]=\"busy()\">×</button>}</div>\n } @empty {<div class=\"o-empty\">No streams declared. Apps can make their own; the console lists every stream and KV bucket.</div>}\n <div class=\"o-cf\">JetStream on the volume · {{ d.nodes > 1 ? 'replicated on 3 servers' : 'one server' }}</div>\n </div>\n } @else if (d.engine === 'rabbitmq') {\n <div class=\"o-card\" data-testid=\"svc-vhosts\">\n <div class=\"o-ch\"><b>Virtual hosts</b>@if (d.canManage) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"addingDb.set(!addingDb())\" data-testid=\"svc-vhost-add\">+ Virtual host</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=\"Virtual host\" [ngModel]=\"dbName()\" (ngModelChange)=\"dbName.set($event)\" (keydown.enter)=\"addVhost(d)\" data-testid=\"svc-vhost-name\" /><button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"addVhost(d)\" [disabled]=\"busy() || !dbName()\" data-testid=\"svc-vhost-create\">Create</button></div>\n }\n <div class=\"o-row\"><span class=\"o-mono o-b5\">/</span><span class=\"o-faint o-sm\">default</span></div>\n @for (v of d.vhosts ?? []; track v) {\n <div class=\"o-row\"><span class=\"o-mono o-b5\">{{ v }}</span><span class=\"o-r o-faint o-sm\">quorum queues</span>\n @if (d.canManage) {<button type=\"button\" class=\"o-lnk o-faint\" (click)=\"removeVhost(d, v)\" [attr.aria-label]=\"'Remove ' + v\" [disabled]=\"busy()\">×</button>}</div>\n }\n <div class=\"o-cf\">Queues default to quorum queues · every user gets its preset on each virtual host</div>\n </div>\n } @else {\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 }\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: attach with “Own user” and each app gets its own least-privilege login, removed when it is detached</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>@if (b.volumes) {<span [class]=\"'o-chip ' + (b.volumes.phase === 'completed' ? 'o-grn' : b.volumes.phase === 'failed' ? 'o-red' : 'o-blu')\" [title]=\"b.volumes.error || b.volumes.snapshots + ' volume snapshot(s)'\" data-testid=\"svc-backup-volumes\">{{ b.volumes.phase === 'completed' ? '+ queue data' : b.volumes.phase === 'failed' ? 'queue data failed' : 'snapshotting' }}</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 {{ snapshotName(d) }}: pick one on the left. It always creates a new instance.</span>\n @if (d.engine === 'rabbitmq') {<span class=\"o-hint\" data-testid=\"svc-snapshot-support\"><span [class]=\"'o-chip ' + (d.volumeSnapshots?.class ? 'o-grn' : '')\">{{ d.volumeSnapshots?.class ? 'Queue data snapshots' : 'Definitions only' }}</span> {{ snapshotLine(d) }}</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 <o-svc-dumps [d]=\"d\" [projectKey]=\"key()\" [dumps]=\"!!engine()?.dumps\" (done)=\"notice.set($event); refresh()\" (failed)=\"error.set($event)\" />\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 <o-svc-console [d]=\"d\" [projectKey]=\"key()\" [kind]=\"engine()?.console ?? 'sql'\" />\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\" data-testid=\"svc-ha\">\n <div class=\"o-ch\"><b>High availability</b><span class=\"o-r\">{{ d.readyNodes }} of {{ d.nodes }} node{{ d.nodes === 1 ? '' : 's' }} ready</span></div>\n @switch (engine()?.ha) {\n @case ('standby') {\n <div class=\"o-row\"><span style=\"flex:1\">Standby node with automatic failover@if (d.engine === 'mysql') {<span class=\"o-faint o-sm\"> · two semi-synchronous replicas (MOCO runs 1, 3 or 5)</span>}</span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.standby\" [disabled]=\"!d.canManage || busy()\" (click)=\"topology(d, !d.standby, d.standby ? 0 : d.replicas)\" aria-label=\"Standby\" data-testid=\"svc-standby\"></button></div>\n <div class=\"o-row\"><span style=\"flex:1\">Read replicas@if (d.readHost) {<span class=\"o-faint o-sm o-mono\"> · {{ d.readHost }}</span>}</span><span class=\"o-faint o-sm\" data-testid=\"svc-replicas\">{{ d.replicas }}</span>\n @if (d.canManage) {\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, d.standby, d.replicas - step(d))\" [disabled]=\"busy() || d.replicas === 0\">−</button>\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, d.standby || d.engine === 'mysql', d.replicas + step(d))\" [disabled]=\"busy() || d.replicas + step(d) > (engine()?.maxReplicas ?? 0)\" data-testid=\"svc-replica-add\">+ Replica</button>\n }</div>\n <div class=\"o-cf\">Each node is billed at the plan's price · {{ nodesPrice(d) }}/mo now</div>\n }\n @case ('cluster') {\n <div class=\"o-row\"><span style=\"flex:1\">3-node cluster<span class=\"o-faint o-sm\"> · {{ d.engine === 'nats' ? 'streams replicated on three servers' : 'quorum queues on three nodes' }}</span></span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.standby\" [disabled]=\"!d.canManage || busy()\" (click)=\"topology(d, !d.standby, 0)\" aria-label=\"3-node cluster\" data-testid=\"svc-standby\"></button></div>\n <div class=\"o-cf\">Each node is billed at the plan's price · {{ nodesPrice(d) }}/mo now</div>\n }\n @case ('replica') {\n <div class=\"o-row\"><span style=\"flex:1\">Replica with automatic failover<span class=\"o-faint o-sm\"> · three Sentinels promote it if the primary fails</span></span><button type=\"button\" class=\"o-tog\" [class.o-on]=\"d.standby\" [disabled]=\"!d.canManage || busy()\" (click)=\"topology(d, !d.standby, 0)\" aria-label=\"Replica with failover\" data-testid=\"svc-standby\"></button></div>\n <div class=\"o-row\"><span style=\"flex:1\">Second replica@if (d.sentinel; as sn) {<span class=\"o-faint o-sm o-mono\"> · Sentinels {{ sn.hosts.length }} × :{{ sn.port }}, master {{ sn.master }}</span>}</span><span class=\"o-faint o-sm\" data-testid=\"svc-replicas\">{{ d.replicas }}</span>\n @if (d.canManage) {\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, d.standby, d.replicas - 1)\" [disabled]=\"busy() || d.replicas === 0\">−</button>\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"topology(d, true, d.replicas + 1)\" [disabled]=\"busy() || d.replicas + 1 > (engine()?.maxReplicas ?? 0)\" data-testid=\"svc-replica-add\">+ Replica</button>\n }</div>\n <div class=\"o-cf\">Each node is billed at the plan's price · {{ nodesPrice(d) }}/mo now · apps get REDIS_SENTINEL_URL beside REDIS_URL</div>\n }\n @default {\n <div class=\"o-row\"><span style=\"flex:1\">One node</span></div>\n <div class=\"o-cf\">{{ d.engineName }} runs one node; daily snapshots keep its data.</div>\n }\n }\n </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\" data-testid=\"svc-params\"><div class=\"o-ch\"><b>Engine parameters</b><span class=\"o-r\">validated subset</span></div><div class=\"o-tbl\"><div class=\"o-tbody\">\n @for (p of d.parameters; track p.name) {<div class=\"o-tr\">\n <div class=\"o-td o-mono o-sm\" [title]=\"p.description\">{{ p.name }}</div>\n <div class=\"o-td\"><input class=\"o-in o-sm o-mono\" style=\"width:120px\" [placeholder]=\"p.default\" [disabled]=\"!d.canManage\" [attr.aria-label]=\"p.name\" [ngModel]=\"paramDraft()[p.name] ?? p.value ?? ''\" (ngModelChange)=\"setParam(p, $event)\" [attr.data-testid]=\"'svc-param-' + p.name\" /></div>\n <div class=\"o-td\"><span class=\"o-chip\" [class.o-amb]=\"p.restart\">{{ p.restart ? 'restart' : 'live' }}</span></div>\n <div class=\"o-td o-faint o-xs o-ell\" style=\"max-width:260px\">{{ p.description }}</div>\n </div>}\n </div></div>\n @if (d.canManage) {<div class=\"o-cf\"><span class=\"o-faint o-sm\">{{ paramNote(d) }}</span><button type=\"button\" class=\"o-btn o-sm o-dark o-r\" (click)=\"saveParams(d)\" [disabled]=\"busy() || !paramsChanged()\" data-testid=\"svc-params-save\">Save parameters</button></div>}\n </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 @if (dl.hasVolumes) {<label class=\"o-flex o-sm\"><input type=\"checkbox\" [(ngModel)]=\"dl.volumes\" data-testid=\"svc-restore-volumes\" /> With the queue data (the backup's volume snapshots): messages, not only the definitions</label>}\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 attOwn = signal(false);\n protected readonly attVhost = signal('/');\n protected readonly subjects = signal('');\n protected readonly maxAge = signal(168);\n protected readonly streamAges = [{ h: 24, label: 'keep 1 day' }, { h: 168, label: 'keep 7 days' }, { h: 720, label: 'keep 30 days' }, { h: 0, label: 'until limits' }];\n protected readonly paramDraft = signal<Record<string, string>>({});\n protected readonly paramsChanged = computed(() => Object.keys(this.paramDraft()).length > 0);\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 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', 'sentinel', 'nats', 'node', 'cli'].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 if (d?.engine === 'nats' || d?.engine === 'rabbitmq') {\n const pub = fig('published');\n const depth = fig(d.engine === 'nats' ? 'stream_depth' : 'queue_depth');\n out.push({ label: 'Published / s', value: pub?.rate != null ? num(pub.rate, 1) : '–', sub: `${num(depth?.value)} ${d.engine === 'nats' ? 'in streams' : 'ready'} · ${num(fig('unacked')?.value)} unacked` });\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 // Hidden, the polls slow to once a minute; seen again, the figures are read at once.\n const seen = () => {\n if (document.visibilityState !== 'visible' || !this.d()) return;\n this.load();\n if (this.tab() !== 'overview' && this.tab() !== 'metrics') return;\n clearTimeout(this.metricsTimer);\n this.pollMetrics();\n };\n document.addEventListener('visibilitychange', seen);\n inject(DestroyRef).onDestroy(() => {\n document.removeEventListener('visibilitychange', seen);\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) || d.readyNodes < d.nodes || (d.dumps ?? []).some((x) => x.phase !== 'completed' && x.phase !== 'failed') || !!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(), pollDelay(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(), pollDelay(10_000));\n },\n error: () => (this.metricsTimer = setTimeout(() => this.pollMetrics(), pollDelay(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', cli: 'origine CLI', nats: 'nats', sentinel: 'Sentinel' } 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 const body = { app, environment: this.attEnv(), prefix: this.attPrefix().trim(), ownUser: this.attOwn(), database: d.engine === 'rabbitmq' ? this.attVhost() : undefined };\n this.run(this.api.attach(this.key(), d.id, body), (a) => {\n this.attachOpen.set(false);\n this.notice.set(`${d.name} attached to ${app} · ${this.attEnv()}: ${this.attPrefix()}${this.envVar()} is injected${a?.ownUser ? ' with its own user ' + a.user : ''} 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 const vols = d.engine === 'rabbitmq' && b.volumes?.phase === 'completed';\n this.dialog.set({ kind: 'restore', name: this.restoreName(d), point: '', backup: b.name, volumes: vols, hasVolumes: vols });\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; volumes?: boolean }) {\n const body = dl.point ? { pointInTime: fromLocalInput(dl.point), name: dl.name } : { backup: dl.backup, name: dl.name, volumes: !!dl.volumes };\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 // ---- v1 -------------------------------------------------------------------\n\n protected nodesPrice(d: Detail): string {\n return money((this.plans().find((p) => p.id === d.plan)?.priceCents ?? 0) * d.nodes);\n }\n protected refresh() {\n this.load();\n }\n /** Opens the instance's management UI in a new tab: a link for this person that expires. */\n protected openManagement(d: Detail) {\n const tab = window.open('', '_blank');\n this.busy.set(true);\n this.error.set('');\n this.api.management(this.key(), d.id).subscribe({\n next: (l) => {\n this.busy.set(false);\n if (tab) {\n tab.opener = null;\n tab.location.href = l.url;\n } else window.open(l.url, '_blank', 'noopener');\n this.notice.set(`The management UI of ${d.name} opened in a new tab${l.mode === 'read' ? ', read-only for your role' : ''}. Its link works for you for 30 minutes.`);\n },\n error: (e) => {\n this.busy.set(false);\n tab?.close();\n this.error.set(apiMessage(e, 'The management UI could not be opened.'));\n },\n });\n }\n protected snapshotLine(d: Detail): string {\n const v = d.volumeSnapshots;\n if (v?.class) return `Each backup also snapshots every node's volume (${v.class}): restores can bring the messages back.`;\n return `Backups hold the definitions only: ${v?.message || 'this cell has no CSI snapshot class'}.`;\n }\n protected snapshotName(d: Detail): string {\n return d.engine === 'nats' ? 'stream snapshot' : d.engine === 'rabbitmq' ? 'definitions export' : 'RDB snapshot';\n }\n /** MySQL replicas come in pairs. */\n protected step(d: Detail): number {\n return d.engine === 'mysql' ? 2 : 1;\n }\n protected topology(d: Detail, standby: boolean, replicas: number) {\n const nodes = d.engine === 'nats' || d.engine === 'rabbitmq' ? (standby ? 3 : 1) : 1 + replicas + (standby ? (d.engine === 'mysql' ? 2 : 1) : 0);\n this.save(d, { standby, replicas: Math.max(0, replicas) }, `${d.name} now runs ${nodes} node${nodes === 1 ? '' : 's'}${standby ? ' with automatic failover' : ''}.`);\n }\n protected setParam(p: Param, v: string) {\n this.paramDraft.update((m) => ({ ...m, [p.name]: v }));\n }\n protected paramNote(d: Detail): string {\n const changed = Object.keys(this.paramDraft());\n const restarts = d.parameters.filter((p) => p.restart && changed.includes(p.name)).map((p) => p.name);\n if (!changed.length) return 'Empty fields keep the default (shown greyed).';\n return restarts.length ? `${restarts.join(', ')} restart${restarts.length === 1 ? 's' : ''} ${d.engineName}${d.nodes > 1 ? ' one node at a time' : ''}.` : 'Applied live.';\n }\n protected saveParams(d: Detail) {\n const all: Record<string, string> = {};\n for (const p of d.parameters) {\n const v = this.paramDraft()[p.name] ?? p.value ?? '';\n if (v.trim()) all[p.name] = v.trim();\n }\n this.run(this.api.update(this.key(), d.id, { parameters: all }), () => {\n this.paramDraft.set({});\n this.notice.set('Parameters saved; the cell applies them now.');\n }, 'The parameters could not be saved.');\n }\n protected addStream(d: Detail) {\n const name = this.dbName().trim();\n const subjects = this.subjects().split(',').map((x) => x.trim()).filter(Boolean);\n this.run(this.api.addStream(this.key(), d.id, { name, subjects, maxAgeHours: this.maxAge() }), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.subjects.set('');\n this.notice.set(`Stream ${name} created.`);\n }, 'The stream could not be created.');\n }\n protected removeStream(d: Detail, name: string) {\n this.run(this.api.removeStream(this.key(), d.id, name), () => this.notice.set(`Stream ${name} and its messages removed.`), 'The stream could not be removed.');\n }\n protected addVhost(d: Detail) {\n const name = this.dbName().trim();\n this.run(this.api.addVhost(this.key(), d.id, name), () => {\n this.addingDb.set(false);\n this.dbName.set('');\n this.notice.set(`Virtual host ${name} created.`);\n }, 'The virtual host could not be created.');\n }\n protected removeVhost(d: Detail, name: string) {\n this.run(this.api.removeVhost(this.key(), d.id, name), () => this.notice.set(`Virtual host ${name} removed.`), 'The virtual host could not be removed.');\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';\nexport * from './lib/console.tab';\nexport * from './lib/dumps.card';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|