@stacksjs/ts-cloud 0.7.56 → 0.7.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alerts/alerts.test.d.ts +1 -0
- package/dist/alerts/delivery.d.ts +45 -0
- package/dist/alerts/evaluator.d.ts +12 -0
- package/dist/alerts/health.d.ts +34 -0
- package/dist/alerts/index.d.ts +6 -0
- package/dist/alerts/model.d.ts +170 -0
- package/dist/alerts/store.d.ts +90 -0
- package/dist/alerts/telemetry.d.ts +3 -0
- package/dist/api/client.d.ts +197 -0
- package/dist/api/handler.d.ts +18 -0
- package/dist/api/handler.test.d.ts +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/openapi.d.ts +2 -0
- package/dist/api/service.d.ts +28 -0
- package/dist/api/types.d.ts +119 -0
- package/dist/auth/encryption.d.ts +3 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/mailer.d.ts +9 -0
- package/dist/auth/oidc.d.ts +36 -0
- package/dist/auth/oidc.test.d.ts +1 -0
- package/dist/auth/store.d.ts +121 -0
- package/dist/auth/store.test.d.ts +1 -0
- package/dist/auth/totp.d.ts +11 -0
- package/dist/auth/totp.test.d.ts +1 -0
- package/dist/auth/types.d.ts +138 -0
- package/dist/automation/index.d.ts +2 -0
- package/dist/automation/store.d.ts +46 -0
- package/dist/automation/store.test.d.ts +1 -0
- package/dist/automation/types.d.ts +66 -0
- package/dist/aws/acm.d.ts +0 -4
- package/dist/aws/application-autoscaling.d.ts +0 -5
- package/dist/aws/backup.d.ts +42 -0
- package/dist/aws/bedrock.d.ts +0 -5
- package/dist/aws/client.d.ts +3 -6
- package/dist/aws/cloudformation.d.ts +0 -4
- package/dist/aws/cloudfront-media.test.d.ts +1 -0
- package/dist/aws/cloudfront-origin.test.d.ts +1 -0
- package/dist/aws/cloudfront.d.ts +87 -3
- package/dist/aws/cloudwatch-logs.d.ts +2 -4
- package/dist/aws/cloudwatch.d.ts +1 -1
- package/dist/aws/comprehend.d.ts +0 -5
- package/dist/aws/connect.d.ts +0 -4
- package/dist/aws/cost-explorer-cache.d.ts +1 -15
- package/dist/aws/cost-explorer.d.ts +18 -9
- package/dist/aws/cost-explorer.test.d.ts +1 -0
- package/dist/aws/dynamodb.d.ts +0 -4
- package/dist/aws/ec2.d.ts +0 -4
- package/dist/aws/ecr.d.ts +0 -4
- package/dist/aws/ecs.d.ts +17 -7
- package/dist/aws/efs.d.ts +0 -4
- package/dist/aws/elasticache.d.ts +0 -4
- package/dist/aws/elbv2.d.ts +0 -7
- package/dist/aws/email.d.ts +0 -10
- package/dist/aws/eventbridge.d.ts +0 -4
- package/dist/aws/iam.d.ts +1 -5
- package/dist/aws/imap-server.d.ts +0 -7
- package/dist/aws/index.d.ts +4 -3
- package/dist/aws/index.js +31 -31
- package/dist/aws/kendra.d.ts +0 -5
- package/dist/aws/lambda.d.ts +3 -5
- package/dist/aws/opensearch.d.ts +0 -4
- package/dist/aws/personalize.d.ts +0 -5
- package/dist/aws/polly.d.ts +0 -5
- package/dist/aws/rds.d.ts +59 -4
- package/dist/aws/rekognition.d.ts +0 -5
- package/dist/aws/route53-domains.d.ts +0 -4
- package/dist/aws/route53.d.ts +0 -4
- package/dist/aws/s3.d.ts +10 -6
- package/dist/aws/scheduler.d.ts +0 -4
- package/dist/aws/secrets-manager.d.ts +0 -4
- package/dist/aws/setup-sms.d.ts +0 -14
- package/dist/aws/sms.d.ts +0 -10
- package/dist/aws/smtp-server.d.ts +0 -11
- package/dist/aws/sns.d.ts +0 -4
- package/dist/aws/sqs.d.ts +0 -4
- package/dist/aws/ssm.d.ts +0 -4
- package/dist/aws/sts.d.ts +0 -4
- package/dist/aws/support.d.ts +0 -4
- package/dist/aws/textract.d.ts +0 -5
- package/dist/aws/transcribe.d.ts +0 -4
- package/dist/aws/translate.d.ts +0 -5
- package/dist/aws/voice.d.ts +0 -11
- package/dist/aws/xray.d.ts +1 -0
- package/dist/backups/aws-database-source.d.ts +19 -0
- package/dist/backups/aws-database-source.test.d.ts +1 -0
- package/dist/backups/aws-infrastructure-source.d.ts +43 -0
- package/dist/backups/aws-infrastructure-source.test.d.ts +1 -0
- package/dist/backups/control-plane-source.d.ts +16 -0
- package/dist/backups/control-plane-source.test.d.ts +1 -0
- package/dist/backups/docker-volume-source.d.ts +31 -0
- package/dist/backups/docker-volume-source.test.d.ts +1 -0
- package/dist/backups/filesystem-source.d.ts +34 -0
- package/dist/backups/filesystem-source.test.d.ts +1 -0
- package/dist/backups/index.d.ts +10 -0
- package/dist/backups/logical-database-source.d.ts +16 -0
- package/dist/backups/logical-database-source.test.d.ts +1 -0
- package/dist/backups/model.d.ts +121 -0
- package/dist/backups/s3-destination.d.ts +85 -0
- package/dist/backups/s3-destination.test.d.ts +1 -0
- package/dist/backups/service.d.ts +80 -0
- package/dist/backups/service.test.d.ts +1 -0
- package/dist/backups/store.d.ts +30 -0
- package/dist/backups/store.test.d.ts +1 -0
- package/dist/bin/cli.js +3360 -1802
- package/dist/{chunk-tjjgajbh.js → chunk-01d86gt1.js} +301 -9
- package/dist/{chunk-73vcqg6z.js → chunk-0z43x8re.js} +7 -7
- package/dist/{chunk-tnztxpcb.js → chunk-32e7ya18.js} +61 -49
- package/dist/{chunk-qpj3edwz.js → chunk-4cjrg98a.js} +3 -7
- package/dist/{chunk-hsk6fe6x.js → chunk-50jpda9q.js} +2 -2
- package/dist/{chunk-93hjhs78.js → chunk-703nkybg.js} +1 -1
- package/dist/{chunk-d5vqwj8s.js → chunk-9m6b4m74.js} +755 -720
- package/dist/chunk-e05phx5f.js +10 -0
- package/dist/{chunk-f29w04w5.js → chunk-exbcsab2.js} +10 -4
- package/dist/{chunk-eq08r166.js → chunk-f55nkpvb.js} +2 -2
- package/dist/{chunk-3bfv1z4v.js → chunk-fv1bj3yt.js} +63 -56
- package/dist/chunk-fw3q88wk.js +48641 -0
- package/dist/{chunk-3knnr7wh.js → chunk-he9a874b.js} +170 -2
- package/dist/{chunk-zn0nxxa8.js → chunk-hpv68b4a.js} +1070 -1070
- package/dist/chunk-k114qwg9.js +12 -0
- package/dist/{chunk-r16e02bc.js → chunk-vdk53yyq.js} +3900 -4101
- package/dist/{chunk-jp2a8yad.js → chunk-vvkd46k1.js} +15 -13
- package/dist/{chunk-vd87cpvn.js → chunk-wj3s95p9.js} +62 -46
- package/dist/{chunk-mj1tmhte.js → chunk-x9s0cqfx.js} +1 -1
- package/dist/{chunk-3rsfns7x.js → chunk-ybcz6sxc.js} +2048 -387
- package/dist/{chunk-arsh1g5h.js → chunk-zqtpg06c.js} +14 -11
- package/dist/compose/index.d.ts +6 -0
- package/dist/compose/parser.d.ts +13 -0
- package/dist/compose/parser.test.d.ts +1 -0
- package/dist/compose/runtime.d.ts +10 -0
- package/dist/compose/service.d.ts +18 -0
- package/dist/compose/store.d.ts +59 -0
- package/dist/compose/store.test.d.ts +1 -0
- package/dist/compose/templates.d.ts +17 -0
- package/dist/compose/types.d.ts +164 -0
- package/dist/configuration/backends.d.ts +66 -0
- package/dist/configuration/backends.test.d.ts +1 -0
- package/dist/configuration/dotenv.d.ts +14 -0
- package/dist/configuration/dotenv.test.d.ts +1 -0
- package/dist/configuration/index.d.ts +6 -0
- package/dist/configuration/migrate.d.ts +10 -0
- package/dist/configuration/migrate.test.d.ts +1 -0
- package/dist/configuration/model.d.ts +50 -0
- package/dist/configuration/service.d.ts +144 -0
- package/dist/configuration/service.test.d.ts +1 -0
- package/dist/configuration/store.d.ts +33 -0
- package/dist/configuration/store.test.d.ts +1 -0
- package/dist/control-plane/authorization.d.ts +24 -0
- package/dist/control-plane/authorization.test.d.ts +1 -0
- package/dist/control-plane/index.d.ts +8 -0
- package/dist/control-plane/migrations.d.ts +7 -0
- package/dist/control-plane/search.d.ts +25 -0
- package/dist/control-plane/store.d.ts +117 -0
- package/dist/control-plane/store.test.d.ts +1 -0
- package/dist/control-plane/types.d.ts +381 -0
- package/dist/cost/reporting.d.ts +24 -0
- package/dist/cost/reporting.test.d.ts +1 -0
- package/dist/cost/resource-inventory.d.ts +32 -0
- package/dist/cost/resource-inventory.test.d.ts +1 -0
- package/dist/cost/resource-optimization.d.ts +59 -0
- package/dist/cost/resource-optimization.test.d.ts +1 -0
- package/dist/data-services/adapters.d.ts +39 -0
- package/dist/data-services/aws-transports.d.ts +29 -0
- package/dist/data-services/aws-transports.test.d.ts +1 -0
- package/dist/data-services/capabilities.d.ts +2 -0
- package/dist/data-services/data-services.test.d.ts +1 -0
- package/dist/data-services/docker-transport.d.ts +55 -0
- package/dist/data-services/docker-transport.test.d.ts +1 -0
- package/dist/data-services/index.d.ts +8 -0
- package/dist/data-services/model.d.ts +79 -0
- package/dist/data-services/secrets.d.ts +13 -0
- package/dist/data-services/secrets.test.d.ts +1 -0
- package/dist/data-services/service.d.ts +51 -0
- package/dist/data-services/store.d.ts +17 -0
- package/dist/deploy/container-image.d.ts +28 -0
- package/dist/deploy/container-image.test.d.ts +1 -0
- package/dist/deploy/dashboard-audit.test.d.ts +1 -0
- package/dist/deploy/dashboard-auth.d.ts +4 -23
- package/dist/deploy/dashboard-backups.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-configuration.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-control-plane.d.ts +37 -0
- package/dist/deploy/dashboard-control-plane.test.d.ts +1 -0
- package/dist/deploy/dashboard-data-services.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-environment-scope.test.d.ts +1 -0
- package/dist/deploy/dashboard-guard.d.ts +12 -0
- package/dist/deploy/dashboard-guard.test.d.ts +1 -0
- package/dist/deploy/dashboard-identities.d.ts +15 -0
- package/dist/deploy/dashboard-identities.test.d.ts +1 -0
- package/dist/deploy/dashboard-jobs.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-login-page.d.ts +5 -5
- package/dist/deploy/dashboard-login-page.test.d.ts +1 -0
- package/dist/deploy/dashboard-oidc.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-onboarding.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-policy.d.ts +4 -2
- package/dist/deploy/dashboard-queue-worker.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-release.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-route-manifest.d.ts +14 -0
- package/dist/deploy/dashboard-route-manifest.test.d.ts +1 -0
- package/dist/deploy/dashboard-security.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-session.d.ts +3 -14
- package/dist/deploy/dashboard-source.integration.test.d.ts +1 -0
- package/dist/deploy/dashboard-users.d.ts +3 -0
- package/dist/deploy/fullstack-container.d.ts +87 -0
- package/dist/deploy/fullstack-container.test.d.ts +1 -0
- package/dist/deploy/index.d.ts +7 -2
- package/dist/deploy/index.js +65 -25
- package/dist/deploy/local-dashboard-server.d.ts +30 -0
- package/dist/deploy/quick-deploy.d.ts +1 -1
- package/dist/deploy/serverless-operations.d.ts +1 -0
- package/dist/deploy/site-target.d.ts +16 -0
- package/dist/deploy/static-api-origin.d.ts +107 -0
- package/dist/deploy/static-api-origin.test.d.ts +1 -0
- package/dist/deploy/static-site-helper.d.ts +0 -16
- package/dist/deploy/telemetry-access.d.ts +5 -0
- package/dist/deploy/telemetry-access.test.d.ts +1 -0
- package/dist/deploy/telemetry-collection.d.ts +44 -0
- package/dist/deploy/telemetry-collection.test.d.ts +1 -0
- package/dist/dns/index.js +3 -3
- package/dist/dns/route53-adapter.d.ts +1 -1
- package/dist/drivers/hetzner/cloud-init.d.ts +1 -1
- package/dist/drivers/index.d.ts +2 -2
- package/dist/drivers/index.js +6 -6
- package/dist/drivers/shared/notifications.d.ts +1 -1
- package/dist/drivers/shared/rpx-gateway.d.ts +1 -0
- package/dist/fleet/fleet.test.d.ts +1 -0
- package/dist/fleet/index.d.ts +144 -0
- package/dist/fleet/queue.d.ts +3 -0
- package/dist/fleet/ssh-driver.d.ts +34 -0
- package/dist/index.d.ts +28 -4
- package/dist/index.js +1132 -424
- package/dist/jobs/adapters.d.ts +23 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/jobs.test.d.ts +1 -0
- package/dist/jobs/model.d.ts +100 -0
- package/dist/jobs/provider-adapters.d.ts +49 -0
- package/dist/jobs/reconcile.d.ts +19 -0
- package/dist/jobs/schedule.d.ts +9 -0
- package/dist/jobs/service.d.ts +30 -0
- package/dist/jobs/store.d.ts +48 -0
- package/dist/maintenance/drivers.d.ts +117 -0
- package/dist/maintenance/index.d.ts +6 -0
- package/dist/maintenance/maintenance.test.d.ts +1 -0
- package/dist/maintenance/manifest.d.ts +15 -0
- package/dist/maintenance/queue.d.ts +9 -0
- package/dist/maintenance/service.d.ts +31 -0
- package/dist/maintenance/store.d.ts +84 -0
- package/dist/maintenance/types.d.ts +192 -0
- package/dist/media.d.ts +62 -0
- package/dist/media.test.d.ts +1 -0
- package/dist/object-storage/index.d.ts +0 -24
- package/dist/onboarding/archive.d.ts +12 -0
- package/dist/onboarding/artifact-store.d.ts +22 -0
- package/dist/onboarding/detection.d.ts +8 -0
- package/dist/onboarding/index.d.ts +9 -0
- package/dist/onboarding/migrations.d.ts +3 -0
- package/dist/onboarding/onboarding.test.d.ts +1 -0
- package/dist/onboarding/plan.d.ts +3 -0
- package/dist/onboarding/registry.d.ts +41 -0
- package/dist/onboarding/service.d.ts +16 -0
- package/dist/onboarding/store.d.ts +30 -0
- package/dist/onboarding/types.d.ts +204 -0
- package/dist/placement/builds.d.ts +20 -0
- package/dist/placement/drivers.d.ts +54 -0
- package/dist/placement/index.d.ts +6 -0
- package/dist/placement/placement.test.d.ts +1 -0
- package/dist/placement/queue.d.ts +4 -0
- package/dist/placement/service.d.ts +34 -0
- package/dist/placement/store.d.ts +49 -0
- package/dist/placement/types.d.ts +109 -0
- package/dist/preview/index.d.ts +3 -0
- package/dist/preview/service.d.ts +45 -0
- package/dist/preview/service.test.d.ts +1 -0
- package/dist/preview/store.d.ts +47 -0
- package/dist/preview/store.test.d.ts +1 -0
- package/dist/preview/types.d.ts +99 -0
- package/dist/push/apns.d.ts +0 -26
- package/dist/push/fcm.d.ts +0 -23
- package/dist/push/index.d.ts +2 -2
- package/dist/push/index.js +1 -1
- package/dist/queue/deployment-handlers.d.ts +27 -0
- package/dist/queue/deployment-handlers.test.d.ts +1 -0
- package/dist/queue/index.d.ts +4 -0
- package/dist/queue/queue.d.ts +57 -0
- package/dist/queue/queue.test.d.ts +1 -0
- package/dist/queue/types.d.ts +93 -0
- package/dist/queue/worker.d.ts +32 -0
- package/dist/queue/worker.test.d.ts +1 -0
- package/dist/regions/drivers.d.ts +139 -0
- package/dist/regions/index.d.ts +5 -0
- package/dist/regions/queue.d.ts +4 -0
- package/dist/regions/regions.test.d.ts +1 -0
- package/dist/regions/service.d.ts +23 -0
- package/dist/regions/store.d.ts +41 -0
- package/dist/regions/types.d.ts +132 -0
- package/dist/release/index.d.ts +6 -0
- package/dist/release/queue.d.ts +15 -0
- package/dist/release/queue.test.d.ts +1 -0
- package/dist/release/runtime.d.ts +35 -0
- package/dist/release/runtime.test.d.ts +1 -0
- package/dist/release/service.d.ts +28 -0
- package/dist/release/store.d.ts +88 -0
- package/dist/release/store.test.d.ts +1 -0
- package/dist/release/strategy.d.ts +8 -0
- package/dist/release/types.d.ts +103 -0
- package/dist/runtime/adapters/aws.d.ts +5 -0
- package/dist/runtime/adapters/docker.d.ts +53 -0
- package/dist/runtime/adapters/systemd.d.ts +26 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/inventory.d.ts +6 -0
- package/dist/runtime/model.d.ts +130 -0
- package/dist/runtime/normalize.d.ts +5 -0
- package/dist/runtime/operations.d.ts +113 -0
- package/dist/runtime/service.d.ts +32 -0
- package/dist/runtime/streams.d.ts +49 -0
- package/dist/security/artifacts.d.ts +105 -0
- package/dist/security/artifacts.test.d.ts +1 -0
- package/dist/security/container-release.d.ts +35 -0
- package/dist/security/container-release.test.d.ts +1 -0
- package/dist/security/index.d.ts +8 -0
- package/dist/security/integration.d.ts +41 -0
- package/dist/security/integration.test.d.ts +1 -0
- package/dist/security/posture-store.d.ts +80 -0
- package/dist/security/posture-store.test.d.ts +1 -0
- package/dist/security/pre-deploy-scanner.d.ts +0 -4
- package/dist/security/scanners.d.ts +81 -0
- package/dist/security/scanners.test.d.ts +1 -0
- package/dist/security/types.d.ts +150 -0
- package/dist/source/git-workspace.d.ts +26 -0
- package/dist/source/git-workspace.test.d.ts +1 -0
- package/dist/source/index.d.ts +6 -0
- package/dist/source/providers.d.ts +199 -0
- package/dist/source/providers.test.d.ts +1 -0
- package/dist/source/service.d.ts +18 -0
- package/dist/source/store.d.ts +149 -0
- package/dist/source/store.test.d.ts +1 -0
- package/dist/source/types.d.ts +191 -0
- package/dist/source/webhooks.d.ts +33 -0
- package/dist/source/webhooks.test.d.ts +1 -0
- package/dist/ssl/acme-client.d.ts +0 -6
- package/dist/storage/compose.d.ts +4 -0
- package/dist/storage/compose.test.d.ts +1 -0
- package/dist/storage/drivers.d.ts +107 -0
- package/dist/storage/drivers.test.d.ts +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/model.d.ts +112 -0
- package/dist/storage/service.d.ts +95 -0
- package/dist/storage/storage.test.d.ts +1 -0
- package/dist/storage/store.d.ts +40 -0
- package/dist/telemetry/correlation.test.d.ts +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/model.d.ts +145 -0
- package/dist/telemetry/policy.d.ts +8 -0
- package/dist/telemetry/policy.test.d.ts +1 -0
- package/dist/telemetry/redaction.d.ts +9 -0
- package/dist/telemetry/store.d.ts +34 -0
- package/dist/telemetry/store.test.d.ts +1 -0
- package/dist/ui/404.html +1506 -17
- package/dist/ui/accept-invitation.html +1163 -0
- package/dist/ui/{server/backups.html → access-denied.html} +344 -55
- package/dist/ui/account/automation.html +1669 -0
- package/dist/ui/account/security.html +1646 -0
- package/dist/ui/applications/compose.html +1590 -0
- package/dist/ui/applications/new.html +1868 -0
- package/dist/ui/data/backups.html +1757 -0
- package/dist/ui/data/services.html +1723 -0
- package/dist/ui/data/volumes.html +1639 -0
- package/dist/ui/index.html +392 -29
- package/dist/ui/integrations.html +1865 -0
- package/dist/ui/operations/alerts.html +1610 -0
- package/dist/ui/operations/configuration.html +1746 -0
- package/dist/ui/operations/jobs.html +1709 -0
- package/dist/ui/operations/maintenance.html +1540 -0
- package/dist/ui/operations/observability.html +1742 -0
- package/dist/ui/{serverless/scheduler.html → operations/previews.html} +447 -46
- package/dist/ui/operations/queue.html +1615 -0
- package/dist/ui/{server/workers.html → operations/regions.html} +413 -49
- package/dist/ui/operations/releases.html +1596 -0
- package/dist/ui/operations/workloads.html +1775 -0
- package/dist/ui/security.html +1767 -0
- package/dist/ui/server/actions.html +446 -57
- package/dist/ui/server/activity.html +346 -1
- package/dist/ui/server/capacity.html +1542 -0
- package/dist/ui/server/database.html +443 -36
- package/dist/ui/server/deployments.html +439 -53
- package/dist/ui/server/diagnostics.html +346 -1
- package/dist/ui/server/firewall.html +476 -50
- package/dist/ui/server/fleet.html +1577 -0
- package/dist/ui/server/logs.html +389 -25
- package/dist/ui/server/metrics.html +346 -1
- package/dist/ui/server/security.html +346 -1
- package/dist/ui/server/services.html +421 -46
- package/dist/ui/server/sites.html +476 -95
- package/dist/ui/server/ssh-keys.html +476 -46
- package/dist/ui/server/team.html +700 -77
- package/dist/ui/server/terminal.html +444 -54
- package/dist/ui/serverless/alarms.html +430 -42
- package/dist/ui/serverless/assets.html +421 -46
- package/dist/ui/serverless/cost.html +346 -1
- package/dist/ui/serverless/data.html +422 -47
- package/dist/ui/serverless/deployments.html +421 -46
- package/dist/ui/serverless/firewall.html +346 -1
- package/dist/ui/serverless/functions.html +423 -48
- package/dist/ui/serverless/logs.html +389 -25
- package/dist/ui/serverless/metrics.html +346 -1
- package/dist/ui/serverless/queues.html +448 -62
- package/dist/ui/serverless/secrets.html +448 -42
- package/dist/ui/serverless/traces.html +350 -5
- package/dist/ui/serverless.html +434 -58
- package/dist/ui-src/pages/404.stx +18 -0
- package/dist/ui-src/pages/accept-invitation.stx +50 -0
- package/dist/ui-src/pages/access-denied.stx +18 -0
- package/dist/ui-src/pages/account/automation.stx +187 -0
- package/dist/ui-src/pages/account/security.stx +249 -0
- package/dist/ui-src/pages/applications/compose.stx +38 -0
- package/dist/ui-src/pages/applications/new.stx +76 -0
- package/dist/ui-src/pages/data/backups.stx +214 -0
- package/dist/ui-src/pages/data/services.stx +257 -0
- package/dist/ui-src/pages/data/volumes.stx +40 -0
- package/dist/ui-src/pages/index.stx +24 -10
- package/dist/ui-src/pages/integrations.stx +186 -0
- package/dist/ui-src/pages/operations/alerts.stx +40 -0
- package/dist/ui-src/pages/operations/configuration.stx +164 -0
- package/dist/ui-src/pages/operations/jobs.stx +238 -0
- package/dist/ui-src/pages/operations/maintenance.stx +15 -0
- package/dist/ui-src/pages/operations/observability.stx +76 -0
- package/dist/ui-src/pages/operations/previews.stx +62 -0
- package/dist/ui-src/pages/operations/queue.stx +158 -0
- package/dist/ui-src/pages/operations/regions.stx +12 -0
- package/dist/ui-src/pages/operations/releases.stx +39 -0
- package/dist/ui-src/pages/operations/workloads.stx +151 -0
- package/dist/ui-src/pages/partials/head.stx +148 -15
- package/dist/ui-src/pages/partials/nav.stx +491 -74
- package/dist/ui-src/pages/partials/op-confirm.stx +6 -6
- package/dist/ui-src/pages/security.stx +264 -0
- package/dist/ui-src/pages/server/actions.stx +17 -26
- package/dist/ui-src/pages/server/capacity.stx +16 -0
- package/dist/ui-src/pages/server/database.stx +31 -16
- package/dist/ui-src/pages/server/deployments.stx +28 -30
- package/dist/ui-src/pages/server/firewall.stx +25 -30
- package/dist/ui-src/pages/server/fleet.stx +10 -0
- package/dist/ui-src/pages/server/logs.stx +11 -9
- package/dist/ui-src/pages/server/metrics.stx +8 -16
- package/dist/ui-src/pages/server/services.stx +19 -28
- package/dist/ui-src/pages/server/sites.stx +75 -72
- package/dist/ui-src/pages/server/ssh-keys.stx +24 -30
- package/dist/ui-src/pages/server/team.stx +286 -149
- package/dist/ui-src/pages/server/terminal.stx +6 -28
- package/dist/ui-src/pages/serverless/alarms.stx +17 -31
- package/dist/ui-src/pages/serverless/assets.stx +13 -22
- package/dist/ui-src/pages/serverless/cost.stx +15 -3
- package/dist/ui-src/pages/serverless/data.stx +12 -25
- package/dist/ui-src/pages/serverless/deployments.stx +14 -23
- package/dist/ui-src/pages/serverless/firewall.stx +5 -1
- package/dist/ui-src/pages/serverless/functions.stx +20 -26
- package/dist/ui-src/pages/serverless/logs.stx +11 -10
- package/dist/ui-src/pages/serverless/metrics.stx +18 -17
- package/dist/ui-src/pages/serverless/queues.stx +34 -42
- package/dist/ui-src/pages/serverless/secrets.stx +31 -34
- package/dist/ui-src/pages/serverless/traces.stx +2 -6
- package/dist/ui-src/pages/serverless.stx +40 -74
- package/package.json +11 -11
- package/dist/chunk-b17vf1g1.js +0 -13787
- package/dist/chunk-b82pbxyp.js +0 -1572
- package/dist/chunk-pqfzdg68.js +0 -12
- package/dist/chunk-z58fqnjm.js +0 -10
- package/dist/ui-src/pages/server/backups.stx +0 -91
- package/dist/ui-src/pages/server/workers.stx +0 -99
- package/dist/ui-src/pages/serverless/scheduler.stx +0 -89
|
@@ -11,6 +11,8 @@ const initialQueues = queues
|
|
|
11
11
|
const queueNames = queues.map(q => q.short)
|
|
12
12
|
</script>
|
|
13
13
|
<script client>
|
|
14
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
15
|
+
|
|
14
16
|
// Live dead-letter queue: peek at messages, redrive them back onto a source
|
|
15
17
|
// queue, or purge the DLQ. Per-queue purge runs the queue:purge:<name> op.
|
|
16
18
|
const rows = state(initialQueues)
|
|
@@ -18,18 +20,14 @@ const dlq = state([])
|
|
|
18
20
|
const dlqLoaded = state(false)
|
|
19
21
|
const dlqMsg = state('')
|
|
20
22
|
const target = state(queueNames[0] || '')
|
|
21
|
-
|
|
23
|
+
function fmtQueue(n) { n = Number(n || 0); return n >= 1000 ? (n / 1000).toFixed(n >= 10000 ? 0 : 1) + 'k' : String(n) }
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
|
|
30
|
-
const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
|
|
31
|
-
function askOp(kind, confirm, verb) { pending.set({ kind, confirm, verb }); typed.set('') }
|
|
32
|
-
function cancelOp() { pending.set(null) }
|
|
25
|
+
async function loadQueues() {
|
|
26
|
+
const response = await fetch('/api/dashboard-data')
|
|
27
|
+
if (!response.ok) throw new Error('Queue refresh failed with HTTP ' + response.status + '.')
|
|
28
|
+
const data = await response.json()
|
|
29
|
+
if (Array.isArray(data.queuesDetail)) rows.set(data.queuesDetail)
|
|
30
|
+
}
|
|
33
31
|
|
|
34
32
|
async function loadDlq() {
|
|
35
33
|
dlqMsg.set('Loading dead-letter queue...')
|
|
@@ -40,28 +38,21 @@ async function loadDlq() {
|
|
|
40
38
|
} catch (e) { dlqMsg.set('Failed to load DLQ: ' + ((e && e.message) || e)) }
|
|
41
39
|
finally { dlqLoaded.set(true) }
|
|
42
40
|
}
|
|
43
|
-
onMount(() => { loadDlq() })
|
|
41
|
+
onMount(() => { loadDlq(); loadQueues().catch(error => dlqMsg.set(error?.message || 'Queue refresh failed.')) })
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: 'queue:purge:' + p.kind.replace('purge-queue:', ''), confirm: p.confirm }) })
|
|
59
|
-
const body = await res.json()
|
|
60
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || '') + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
61
|
-
if (body.ok) loadDlq()
|
|
62
|
-
} catch (e) { opOutput.set('FAILED\n\n' + ((e && e.message) || e)) }
|
|
63
|
-
finally { busy.set(false) }
|
|
64
|
-
}
|
|
43
|
+
// Op runner (redrive / purge / per-queue purge) - typed-confirm bar.
|
|
44
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
45
|
+
let res
|
|
46
|
+
if (p.operation === 'redrive')
|
|
47
|
+
res = await fetch('/api/serverless/dlq/redrive', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ confirm: p.apiConfirm, targetQueue: target(), max: 25 }) })
|
|
48
|
+
else if (p.operation === 'purge-dlq')
|
|
49
|
+
res = await fetch('/api/serverless/dlq/purge', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ confirm: p.apiConfirm }) })
|
|
50
|
+
else
|
|
51
|
+
res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: 'queue:purge:' + p.operation.replace('purge-queue:', ''), confirm: p.apiConfirm }) })
|
|
52
|
+
const body = await res.json()
|
|
53
|
+
if (body.ok) { loadDlq(); loadQueues().catch(error => dlqMsg.set(error?.message || 'Queue refresh failed.')) }
|
|
54
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || '') + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
55
|
+
})
|
|
65
56
|
</script>
|
|
66
57
|
<!DOCTYPE html>
|
|
67
58
|
<html lang="en" data-theme="dark">
|
|
@@ -81,10 +72,10 @@ async function runOp() {
|
|
|
81
72
|
|
|
82
73
|
<div class="section">
|
|
83
74
|
<div class="panel">
|
|
84
|
-
<table>
|
|
85
|
-
<thead><tr><th>Queue</th><th>Visible</th><th>In-flight</th><th>Oldest</th><th>Concurrency</th><th>Tries</th><th>Vis. timeout</th><th>Processed</th><th>DLQ</th><th class="table-actions">Action</th></tr></thead>
|
|
75
|
+
<table @show="rows().length > 0">
|
|
76
|
+
<thead><tr><th scope="col">Queue</th><th scope="col">Visible</th><th scope="col">In-flight</th><th scope="col">Oldest</th><th scope="col">Concurrency</th><th scope="col">Tries</th><th scope="col">Vis. timeout</th><th scope="col">Processed</th><th scope="col">DLQ</th><th scope="col" class="table-actions">Action</th></tr></thead>
|
|
86
77
|
<tbody>
|
|
87
|
-
|
|
78
|
+
<template :for="q in rows()">
|
|
88
79
|
<tr>
|
|
89
80
|
<td><b>{{ q.short }}</b><div class="mono" style="font-size:11px;color:var(--txt3)">{{ q.name }}</div></td>
|
|
90
81
|
<td>{{ q.visible }}</td>
|
|
@@ -93,13 +84,14 @@ async function runOp() {
|
|
|
93
84
|
<td>{{ q.concurrency }}</td>
|
|
94
85
|
<td>{{ q.tries }}</td>
|
|
95
86
|
<td class="mono">{{ q.visTimeout }}s</td>
|
|
96
|
-
<td style="color:var(--txt2)">{{
|
|
97
|
-
<td
|
|
98
|
-
<td class="table-actions"><button class="btn danger sm" type="button" @click="askOp('purge-queue:
|
|
87
|
+
<td style="color:var(--txt2)">{{ fmtQueue(q.processed) }}</td>
|
|
88
|
+
<td><span class="bad pill" @show="q.dlq > 0">{{ q.dlq }}</span><span style="color:var(--txt3)" @show="!q.dlq">0</span></td>
|
|
89
|
+
<td class="table-actions"><button class="btn danger sm" type="button" :aria-label="'Purge queue ' + q.short" @click="askOp('purge-queue:' + q.short, q.short, 'purge the ' + q.short + ' queue')">Purge</button></td>
|
|
99
90
|
</tr>
|
|
100
|
-
|
|
91
|
+
</template>
|
|
101
92
|
</tbody>
|
|
102
93
|
</table>
|
|
94
|
+
<div class="empty" @show="rows().length === 0"><strong>No queues configured</strong><span>Add a queue definition to the serverless application to process background jobs.</span></div>
|
|
103
95
|
</div>
|
|
104
96
|
</div>
|
|
105
97
|
|
|
@@ -117,13 +109,13 @@ async function runOp() {
|
|
|
117
109
|
</div>
|
|
118
110
|
<div class="row-actions">
|
|
119
111
|
<button class="btn ghost sm" type="button" :disabled="busy()" @click="loadDlq()">Refresh</button>
|
|
120
|
-
<button class="btn ghost sm" type="button" :disabled="busy()" @click="askOp('redrive',
|
|
121
|
-
<button class="btn danger sm" type="button" :disabled="busy()" @click="askOp('purge-dlq', '
|
|
112
|
+
<button class="btn ghost sm" type="button" :disabled="busy()" @click="askOp('redrive', target(), 'move DLQ messages into ' + target(), 'redrive')">Redrive</button>
|
|
113
|
+
<button class="btn danger sm" type="button" :disabled="busy()" @click="askOp('purge-dlq', 'dead-letter queue', 'permanently purge the dead-letter queue', 'purge')">Purge DLQ</button>
|
|
122
114
|
</div>
|
|
123
115
|
</div>
|
|
124
116
|
|
|
125
117
|
<table @show="dlq().length > 0">
|
|
126
|
-
<thead><tr><th>Message ID</th><th>Body</th></tr></thead>
|
|
118
|
+
<thead><tr><th scope="col">Message ID</th><th scope="col">Body</th></tr></thead>
|
|
127
119
|
<tbody>
|
|
128
120
|
<template :for="m in dlq()">
|
|
129
121
|
<tr>
|
|
@@ -12,6 +12,8 @@ const secrets = __d?.secretsList ?? [
|
|
|
12
12
|
const initialSecrets = secrets
|
|
13
13
|
</script>
|
|
14
14
|
<script client>
|
|
15
|
+
import { useOpConfirm } from '../../functions/useOpConfirm.ts'
|
|
16
|
+
|
|
15
17
|
// Secrets editor: set (create/update) a value in Secrets Manager, or delete one.
|
|
16
18
|
// The value is write-only - it is sent to the server and never read back.
|
|
17
19
|
const rows = state(initialSecrets)
|
|
@@ -19,12 +21,18 @@ const secretId = state('')
|
|
|
19
21
|
const value = state('')
|
|
20
22
|
const msg = state('')
|
|
21
23
|
const msgOk = state(false)
|
|
22
|
-
const busy =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
24
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
25
|
+
if (p.operation.startsWith('secret:overwrite:')) {
|
|
26
|
+
await setSecret()
|
|
27
|
+
return msg()
|
|
28
|
+
}
|
|
29
|
+
const id = String(p.secretId)
|
|
30
|
+
const res = await fetch('/api/serverless/secrets', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ secretId: id, confirm: p.apiConfirm }) })
|
|
31
|
+
const body = await res.json()
|
|
32
|
+
msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
|
|
33
|
+
if (body.ok) refresh()
|
|
34
|
+
return msg()
|
|
35
|
+
})
|
|
28
36
|
|
|
29
37
|
async function refresh() {
|
|
30
38
|
try { const r = await fetch('/api/serverless/secrets'); if (!r.ok) return; const x = await r.json(); if (Array.isArray(x.secrets)) rows.set(x.secrets) } catch {}
|
|
@@ -44,21 +52,15 @@ async function setSecret() {
|
|
|
44
52
|
} catch (e) { msg.set('Failed: ' + ((e && e.message) || e)); msgOk.set(false) }
|
|
45
53
|
finally { busy.set(false) }
|
|
46
54
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
pendingDelete.set(null); typedDelete.set('')
|
|
54
|
-
msg.set('Deleting ' + id + '...'); msgOk.set(false)
|
|
55
|
-
try {
|
|
56
|
-
const res = await fetch('/api/serverless/secrets', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ secretId: id, confirm: id }) })
|
|
57
|
-
const body = await res.json()
|
|
58
|
-
msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
|
|
59
|
-
if (body.ok) refresh()
|
|
60
|
-
} catch (e) { msg.set('Failed: ' + ((e && e.message) || e)); msgOk.set(false) }
|
|
55
|
+
function requestSetSecret() {
|
|
56
|
+
const id = secretId().trim()
|
|
57
|
+
if (!id || !value()) { setSecret(); return }
|
|
58
|
+
const exists = rows().some(s => (s.source ?? s.secretId) === id)
|
|
59
|
+
if (!exists) { setSecret(); return }
|
|
60
|
+
askOp('secret:overwrite:' + id, id, 'overwrite secret ' + id, null, id, { secretId: id, danger: true, label: 'Overwrite secret' })
|
|
61
61
|
}
|
|
62
|
+
function pickSource(src) { secretId.set(src) }
|
|
63
|
+
function askDelete(id) { askOp('secret:delete:' + id, id, 'delete secret ' + id, null, id, { secretId: id, danger: true, label: 'Delete secret' }) }
|
|
62
64
|
</script>
|
|
63
65
|
<!DOCTYPE html>
|
|
64
66
|
<html lang="en" data-theme="dark">
|
|
@@ -79,7 +81,7 @@ async function confirmDelete() {
|
|
|
79
81
|
<div class="section">
|
|
80
82
|
<div class="panel">
|
|
81
83
|
<table>
|
|
82
|
-
<thead><tr><th>Key</th><th>Secret source</th><th>Value</th><th>Updated</th><th class="table-actions">Actions</th></tr></thead>
|
|
84
|
+
<thead><tr><th scope="col">Key</th><th scope="col">Secret source</th><th scope="col">Value</th><th scope="col">Updated</th><th scope="col" class="table-actions">Actions</th></tr></thead>
|
|
83
85
|
<tbody>
|
|
84
86
|
<template :for="s in rows()">
|
|
85
87
|
<tr>
|
|
@@ -89,8 +91,8 @@ async function confirmDelete() {
|
|
|
89
91
|
<td style="color:var(--txt3)">{{ s.updated ?? '-' }}</td>
|
|
90
92
|
<td class="table-actions">
|
|
91
93
|
<div class="row-actions" style="justify-content:flex-end">
|
|
92
|
-
<button class="btn ghost sm" type="button" @click="pickSource(s.source ?? s.secretId)">Set value</button>
|
|
93
|
-
<button class="btn danger sm" type="button" @click="askDelete(s.source ?? s.secretId)">Delete</button>
|
|
94
|
+
<button class="btn ghost sm" type="button" :aria-label="'Set value for ' + (s.source ?? s.secretId)" @click="pickSource(s.source ?? s.secretId)">Set value</button>
|
|
95
|
+
<button class="btn danger sm" type="button" :aria-label="'Delete ' + (s.source ?? s.secretId)" @click="askDelete(s.source ?? s.secretId)">Delete</button>
|
|
94
96
|
</div>
|
|
95
97
|
</td>
|
|
96
98
|
</tr>
|
|
@@ -101,12 +103,7 @@ async function confirmDelete() {
|
|
|
101
103
|
</tbody>
|
|
102
104
|
</table>
|
|
103
105
|
|
|
104
|
-
|
|
105
|
-
<span>Type <b class="mono">{{ pendingDelete() }}</b> to delete this secret:</span>
|
|
106
|
-
<input class="op-confirm-input" :value="typedDelete()" @input="typedDelete.set($event.target.value)" @keydown.enter="confirmDelete()" placeholder="confirm" autocomplete="off">
|
|
107
|
-
<button class="btn danger sm" :disabled="!canDelete()" @click="confirmDelete()">Delete</button>
|
|
108
|
-
<button class="btn ghost sm" @click="cancelDelete()">Cancel</button>
|
|
109
|
-
</div>
|
|
106
|
+
@include('../partials/op-confirm')
|
|
110
107
|
</div>
|
|
111
108
|
</div>
|
|
112
109
|
|
|
@@ -115,15 +112,15 @@ async function confirmDelete() {
|
|
|
115
112
|
<div class="panel">
|
|
116
113
|
<div class="form-grid">
|
|
117
114
|
<div class="field-block">
|
|
118
|
-
<label>Secret id (source path)</label>
|
|
119
|
-
<input :value="secretId()" @input="secretId.set($event.target.value)" placeholder="acme/production/stripe" autocomplete="off">
|
|
115
|
+
<label for="secret-id">Secret id (source path)</label>
|
|
116
|
+
<input id="secret-id" :value="secretId()" @input="secretId.set($event.target.value)" placeholder="acme/production/stripe" autocomplete="off">
|
|
120
117
|
</div>
|
|
121
118
|
<div class="field-block">
|
|
122
|
-
<label>Value (write-only)</label>
|
|
123
|
-
<input type="password" :value="value()" @input="value.set($event.target.value)" placeholder="new secret value" autocomplete="off">
|
|
119
|
+
<label for="secret-value">Value (write-only)</label>
|
|
120
|
+
<input id="secret-value" type="password" :value="value()" @input="value.set($event.target.value)" placeholder="new secret value" autocomplete="off">
|
|
124
121
|
</div>
|
|
125
122
|
<div class="form-actions">
|
|
126
|
-
<button class="btn" type="button" :disabled="busy()" @click="
|
|
123
|
+
<button class="btn" type="button" :disabled="busy()" @click="requestSetSecret()">Save secret</button>
|
|
127
124
|
<span class="msg" :class="{ ok: msgOk(), bad: msg() && !msgOk() }">{{ msg() }}</span>
|
|
128
125
|
</div>
|
|
129
126
|
</div>
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
let __d = null
|
|
3
3
|
try { __d = JSON.parse(process.env.TSCLOUD_DASHBOARD_DATA || '') } catch { __d = null }
|
|
4
4
|
const app = __d?.app ?? { name: 'acme', env: 'production' }
|
|
5
|
-
const initialTraces = __d?.traces ?? [
|
|
6
|
-
{ id: '1-6630a1b2-abc123', method: 'GET', url: 'https://acme.com/', httpStatus: 200, responseMs: 84, durationMs: 86, status: 'ok' },
|
|
7
|
-
{ id: '1-6630a1c4-def456', method: 'POST', url: 'https://acme.com/checkout', httpStatus: 500, responseMs: 240, durationMs: 512, status: 'fault' },
|
|
8
|
-
{ id: '1-6630a1d9-9a0f21', method: 'GET', url: 'https://acme.com/api/orders', httpStatus: 429, responseMs: 12, durationMs: 12, status: 'throttle' },
|
|
9
|
-
]
|
|
5
|
+
const initialTraces = __d?.traces ?? []
|
|
10
6
|
</script>
|
|
11
7
|
<script client>
|
|
12
8
|
// X-Ray traces for the HTTP function, refreshed over /api/serverless/traces.
|
|
@@ -63,7 +59,7 @@ onMount(() => { load() })
|
|
|
63
59
|
</div>
|
|
64
60
|
|
|
65
61
|
<table @show="shown().length > 0">
|
|
66
|
-
<thead><tr><th>Trace</th><th>Method</th><th>URL</th><th>HTTP</th><th>Response</th><th>Duration</th><th>Status</th></tr></thead>
|
|
62
|
+
<thead><tr><th scope="col">Trace</th><th scope="col">Method</th><th scope="col">URL</th><th scope="col">HTTP</th><th scope="col">Response</th><th scope="col">Duration</th><th scope="col">Status</th></tr></thead>
|
|
67
63
|
<tbody>
|
|
68
64
|
<template :for="t in shown()">
|
|
69
65
|
<tr>
|
|
@@ -1,48 +1,26 @@
|
|
|
1
1
|
<script server>
|
|
2
2
|
// ts-cloud serverless (Vapor-style) dashboard. Real data is injected at build
|
|
3
|
-
// time via TSCLOUD_DASHBOARD_DATA (run `cloud dashboard:build`)
|
|
4
|
-
//
|
|
3
|
+
// time via TSCLOUD_DASHBOARD_DATA (run `cloud dashboard:build`). Missing data
|
|
4
|
+
// remains explicit and is never replaced by samples. Sections drill into
|
|
5
5
|
// dedicated pages under /serverless/*, and the header operations run live
|
|
6
6
|
// against AWS via /api/serverless/*.
|
|
7
7
|
let __d = null
|
|
8
8
|
try { __d = JSON.parse(process.env.TSCLOUD_DASHBOARD_DATA || '') }
|
|
9
9
|
catch { __d = null }
|
|
10
10
|
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
url: 'https://acme.com', build: 'a4d63d2', deployedAt: '12m ago',
|
|
14
|
-
}
|
|
11
|
+
const dataLive = !!__d
|
|
12
|
+
const app = __d?.app ?? { name: 'Project', env: 'production', region: 'unavailable', runtime: 'unavailable', url: '#', build: 'unavailable', deployedAt: 'unavailable' }
|
|
15
13
|
const maintenance = __d?.maintenance ?? { enabled: false }
|
|
16
|
-
const metrics = __d?.metrics ?? { invocations:
|
|
17
|
-
const functions = __d?.functions ?? [
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
{ name: 'default', visible: 0, inFlight: 2, processed: 12830, dlq: 0 },
|
|
24
|
-
{ name: 'emails', visible: 4, inFlight: 1, processed: 9210, dlq: 1 },
|
|
25
|
-
]
|
|
26
|
-
const scheduler = __d?.scheduler ?? { enabled: true, expression: 'rate(1 minute)', lastRun: '36s ago' }
|
|
27
|
-
const dataServices = __d?.dataServices ?? [
|
|
28
|
-
{ name: 'Aurora Serverless v2', detail: 'acme-production-db · 0.5-4 ACU', status: 'available' },
|
|
29
|
-
{ name: 'RDS Proxy', detail: 'acme-production-proxy', status: 'available' },
|
|
30
|
-
{ name: 'ElastiCache (redis)', detail: 'cache.t4g.micro', status: 'available' },
|
|
31
|
-
]
|
|
32
|
-
const assets = __d?.assetsInfo ?? { bucket: 'acme-production-assets', cdn: 'd2x1.cloudfront.net', assetUrl: 'https://d2x1.cloudfront.net/a4d63d2' }
|
|
33
|
-
const waf = __d?.waf ?? { enabled: true, rules: ['rate-limit', 'common', 'sqlInjection'], blocked24h: 318 }
|
|
14
|
+
const metrics = __d?.metrics ?? { invocations: 0, errorRatePct: 0, p95Ms: 0, coldStartPct: undefined, concurrency: 0, estCostUsd: undefined }
|
|
15
|
+
const functions = __d?.functions ?? []
|
|
16
|
+
const queues = __d?.queues ?? []
|
|
17
|
+
const scheduler = __d?.scheduler ?? { enabled: false, expression: 'unavailable', lastRun: 'unavailable' }
|
|
18
|
+
const dataServices = __d?.dataServices ?? []
|
|
19
|
+
const assets = __d?.assetsInfo ?? { bucket: 'unavailable', cdn: 'unavailable', assetUrl: '#' }
|
|
20
|
+
const waf = __d?.waf ?? { enabled: false, rules: [], blocked24h: 0 }
|
|
34
21
|
const wafRules = __d?.wafRules ?? []
|
|
35
|
-
const deployments = __d?.deploymentsDetail ?? [
|
|
36
|
-
|
|
37
|
-
{ sha: '9557430', status: 'success', when: '2h ago', took: '38s', by: 'ci' },
|
|
38
|
-
{ sha: 'c38fc09', status: 'success', when: '1d ago', took: '44s', by: 'ci' },
|
|
39
|
-
{ sha: '5a2b284', status: 'rolled-back', when: '1d ago', took: '12s', by: 'chris' },
|
|
40
|
-
]
|
|
41
|
-
const secrets = (__d?.secretsList ?? [
|
|
42
|
-
{ key: 'APP_KEY', updated: '14d ago' },
|
|
43
|
-
{ key: 'DB_PASSWORD', updated: '14d ago' },
|
|
44
|
-
{ key: 'STRIPE_SECRET', updated: '3d ago' },
|
|
45
|
-
])
|
|
22
|
+
const deployments = __d?.deploymentsDetail ?? []
|
|
23
|
+
const secrets = __d?.secretsList ?? []
|
|
46
24
|
const wafRuleText = waf.rules ? waf.rules.join(', ') : (wafRules.length ? wafRules.map(r => r.name).join(', ') : '-')
|
|
47
25
|
function statusTone(status) {
|
|
48
26
|
if (status === 'active' || status === 'available' || status === 'success' || status === 'on') return 'ok'
|
|
@@ -55,32 +33,19 @@ function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k
|
|
|
55
33
|
const initialMaintenance = !!maintenance.enabled
|
|
56
34
|
</script>
|
|
57
35
|
<script client>
|
|
36
|
+
import { useOpConfirm } from '../functions/useOpConfirm.ts'
|
|
37
|
+
|
|
58
38
|
// Live serverless operations: maintenance toggle, redeploy, and rollback run
|
|
59
39
|
// against AWS through /api/serverless/operations/run. Mutating ops stage a
|
|
60
40
|
// typed-confirm via the shared op-confirm bar, then stream their output.
|
|
61
41
|
const maint = state(initialMaintenance)
|
|
62
|
-
const opOutput =
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
|
|
70
|
-
function cancelOp() { pending.set(null) }
|
|
71
|
-
async function runOp() {
|
|
72
|
-
const p = pending()
|
|
73
|
-
if (!p || typed() !== p.confirm) return
|
|
74
|
-
pending.set(null); typed.set('')
|
|
75
|
-
opShown.set(true); opOutput.set('Running ' + p.operation + '...')
|
|
76
|
-
try {
|
|
77
|
-
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm }) })
|
|
78
|
-
const body = await res.json()
|
|
79
|
-
opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
|
|
80
|
-
if (body.ok && p.operation === 'maintenance:on') maint.set(true)
|
|
81
|
-
if (body.ok && p.operation === 'maintenance:off') maint.set(false)
|
|
82
|
-
} catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
|
|
83
|
-
}
|
|
42
|
+
const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
|
|
43
|
+
const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm }) })
|
|
44
|
+
const body = await res.json()
|
|
45
|
+
if (body.ok && p.operation === 'maintenance:on') maint.set(true)
|
|
46
|
+
if (body.ok && p.operation === 'maintenance:off') maint.set(false)
|
|
47
|
+
return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
|
|
48
|
+
})
|
|
84
49
|
|
|
85
50
|
// Command console (Vapor-style): invoke an app command through the CLI function.
|
|
86
51
|
const appCmd = state('')
|
|
@@ -136,11 +101,11 @@ async function runAppCmd() {
|
|
|
136
101
|
</div>
|
|
137
102
|
</div>
|
|
138
103
|
<div class="header-actions">
|
|
139
|
-
<span class="pill" :class="maint() ? 'warn' : 'ok'">{{ maint() ? 'maintenance' : 'live' }}</span>
|
|
140
|
-
<button class="btn ghost sm" type="button" @show="!maint()" @click="askOp('maintenance:on', '
|
|
141
|
-
<button class="btn ghost sm" type="button" @show="maint()" @click="askOp('maintenance:off', '
|
|
142
|
-
<button class="btn ghost sm" type="button" @click="askOp('rollback', '
|
|
143
|
-
<button class="btn sm" type="button" @click="askOp('redeploy', '
|
|
104
|
+
@if (dataLive)<span class="pill" :class="maint() ? 'warn' : 'ok'">{{ maint() ? 'maintenance' : 'live' }}</span>@else<span class="pill warn">data unavailable</span>@endif
|
|
105
|
+
<button class="btn ghost sm" type="button" @show="!maint()" @click="askOp('maintenance:on', '{{ app.name }}', 'enable maintenance mode for {{ app.name }}', 'maintenance')">Maintenance</button>
|
|
106
|
+
<button class="btn ghost sm" type="button" @show="maint()" @click="askOp('maintenance:off', '{{ app.name }}', 'bring {{ app.name }} back live', 'live')">Go live</button>
|
|
107
|
+
<button class="btn ghost sm" type="button" @click="askOp('rollback', '{{ app.name }}', 'roll back {{ app.name }} to the previous build', 'rollback')">Roll back</button>
|
|
108
|
+
<button class="btn sm" type="button" @click="askOp('redeploy', '{{ app.name }}', 'redeploy {{ app.name }}', 'redeploy')">Redeploy</button>
|
|
144
109
|
</div>
|
|
145
110
|
</header>
|
|
146
111
|
|
|
@@ -151,22 +116,22 @@ async function runAppCmd() {
|
|
|
151
116
|
<div class="grid cards">
|
|
152
117
|
<a class="panel" href="/serverless/metrics">
|
|
153
118
|
<h3>Invocations (24h)</h3>
|
|
154
|
-
<div class="stat">{{ fmt(metrics.invocations) }}</div>
|
|
155
|
-
<p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">{{ metrics.concurrency
|
|
119
|
+
<div class="stat">{{ dataLive ? fmt(metrics.invocations) : 'Unavailable' }}</div>
|
|
120
|
+
<p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">{{ dataLive ? metrics.concurrency + ' concurrent now' : 'No sample data shown' }}</p>
|
|
156
121
|
</a>
|
|
157
122
|
<a class="panel" href="/serverless/metrics">
|
|
158
123
|
<h3>Error Rate</h3>
|
|
159
|
-
<div class="stat">{{ metrics.errorRatePct }}
|
|
160
|
-
<div class="bar"><i style="width: {{ Math.min(100, metrics.errorRatePct * 10) }}%"></i></div>
|
|
124
|
+
<div class="stat">{{ dataLive ? metrics.errorRatePct + '%' : 'Unavailable' }}</div>
|
|
125
|
+
<div class="bar"><i style="width: {{ dataLive ? Math.min(100, metrics.errorRatePct * 10) : 0 }}%"></i></div>
|
|
161
126
|
</a>
|
|
162
127
|
<a class="panel" href="/serverless/metrics">
|
|
163
128
|
<h3>p95 Latency</h3>
|
|
164
|
-
<div class="stat">{{ metrics.p95Ms }}
|
|
165
|
-
<p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">{{ metrics.coldStartPct
|
|
129
|
+
<div class="stat">{{ dataLive ? metrics.p95Ms + ' ms' : 'Unavailable' }}</div>
|
|
130
|
+
<p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">{{ dataLive && metrics.coldStartPct != null ? metrics.coldStartPct + '% cold starts' : 'Cold-start signal unavailable' }}</p>
|
|
166
131
|
</a>
|
|
167
132
|
<a class="panel" href="/serverless/cost">
|
|
168
133
|
<h3>Est. Cost (24h)</h3>
|
|
169
|
-
<div class="stat"
|
|
134
|
+
<div class="stat">{{ dataLive && metrics.estCostUsd != null ? '$' + metrics.estCostUsd : 'Unavailable' }}</div>
|
|
170
135
|
<p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">cost analysis →</p>
|
|
171
136
|
</a>
|
|
172
137
|
</div>
|
|
@@ -176,7 +141,7 @@ async function runAppCmd() {
|
|
|
176
141
|
<div class="panel">
|
|
177
142
|
<table>
|
|
178
143
|
<thead>
|
|
179
|
-
<tr><th>Function</th><th>Name</th><th>Memory</th><th>Timeout</th><th>Invocations</th><th>Errors</th><th>p95</th><th>Status</th></tr>
|
|
144
|
+
<tr><th scope="col">Function</th><th scope="col">Name</th><th scope="col">Memory</th><th scope="col">Timeout</th><th scope="col">Invocations</th><th scope="col">Errors</th><th scope="col">p95</th><th scope="col">Status</th></tr>
|
|
180
145
|
</thead>
|
|
181
146
|
<tbody>
|
|
182
147
|
@foreach (functions as fn)
|
|
@@ -202,7 +167,7 @@ async function runAppCmd() {
|
|
|
202
167
|
<div class="panel">
|
|
203
168
|
<table>
|
|
204
169
|
<thead>
|
|
205
|
-
<tr><th>Queue</th><th>Visible</th><th>In-flight</th><th>Processed</th><th>DLQ</th></tr>
|
|
170
|
+
<tr><th scope="col">Queue</th><th scope="col">Visible</th><th scope="col">In-flight</th><th scope="col">Processed</th><th scope="col">DLQ</th></tr>
|
|
206
171
|
</thead>
|
|
207
172
|
<tbody>
|
|
208
173
|
@foreach (queues as q)
|
|
@@ -261,7 +226,7 @@ async function runAppCmd() {
|
|
|
261
226
|
</div>
|
|
262
227
|
@endforeach
|
|
263
228
|
<div style="margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--panel-br);">
|
|
264
|
-
<button class="btn danger sm" type="button" @click="askOp('rollback', '
|
|
229
|
+
<button class="btn danger sm" type="button" @click="askOp('rollback', '{{ app.name }}', 'roll back {{ app.name }} to the previous build', 'rollback')">Roll back to previous</button>
|
|
265
230
|
</div>
|
|
266
231
|
</div>
|
|
267
232
|
</div>
|
|
@@ -290,7 +255,8 @@ async function runAppCmd() {
|
|
|
290
255
|
<h2>Run a command</h2>
|
|
291
256
|
<div class="panel">
|
|
292
257
|
<div class="field">
|
|
293
|
-
<
|
|
258
|
+
<label class="sr-only" for="app-command">Application command to run</label>
|
|
259
|
+
<input id="app-command" :value="appCmd()" @input="appCmd.set($event.target.value)" @keydown.enter="askAppCmd()" placeholder="e.g. migrate --force, cache:clear, queue:retry all" autocomplete="off">
|
|
294
260
|
<button class="btn" type="button" :disabled="cmdBusy()" @click="askAppCmd()">Run</button>
|
|
295
261
|
</div>
|
|
296
262
|
<div class="op-confirm" @show="cmdPending() !== null" style="margin-top:14px">
|
|
@@ -299,7 +265,7 @@ async function runAppCmd() {
|
|
|
299
265
|
<button type="button" class="btn danger sm" :disabled="!cmdCanRun()" @click="runAppCmd()">Run command</button>
|
|
300
266
|
<button type="button" class="btn ghost sm" @click="cancelAppCmd()">Cancel</button>
|
|
301
267
|
</div>
|
|
302
|
-
<pre class="action-output" @show="cmdShown()">{{ cmdOut() }}</pre>
|
|
268
|
+
<pre class="action-output" @show="cmdShown()" aria-live="polite">{{ cmdOut() }}</pre>
|
|
303
269
|
<p class="note">Invokes the app command through the CLI Lambda function (RequestResponse), the same path as <span class="mono">cloud command "..."</span>. Output is clamped.</p>
|
|
304
270
|
</div>
|
|
305
271
|
</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/ts-cloud",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.57",
|
|
5
5
|
"description": "A lightweight, performant infrastructure-as-code library and CLI for deploying both server-based (EC2) and serverless applications.",
|
|
6
6
|
"author": "Chris Breuer <chris@stacksjs.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -80,24 +80,24 @@
|
|
|
80
80
|
"zip:windows-x64": "zip -j bin/cloud-windows-x64.zip bin/cloud-windows-x64.exe",
|
|
81
81
|
"zip:darwin-x64": "zip -j bin/cloud-darwin-x64.zip bin/cloud-darwin-x64",
|
|
82
82
|
"zip:darwin-arm64": "zip -j bin/cloud-darwin-arm64.zip bin/cloud-darwin-arm64",
|
|
83
|
-
"lint": "bun x --bun pickier lint .",
|
|
84
|
-
"lint:fix": "bun x --bun pickier lint . --fix",
|
|
85
|
-
"format": "bun x --bun pickier format .",
|
|
86
|
-
"format:fix": "bun x --bun pickier format . --write",
|
|
83
|
+
"lint": "bun x --bun --package github:pickier/pickier#95de532 pickier run . --mode lint --config ../../pickier.config.ts --max-warnings 0",
|
|
84
|
+
"lint:fix": "bun x --bun --package github:pickier/pickier#95de532 pickier run . --mode lint --config ../../pickier.config.ts --fix --max-warnings 0",
|
|
85
|
+
"format": "bun x --bun --package github:pickier/pickier#95de532 pickier run . --mode format --config ../../pickier.config.ts --check",
|
|
86
|
+
"format:fix": "bun x --bun --package github:pickier/pickier#95de532 pickier run . --mode format --config ../../pickier.config.ts --write",
|
|
87
87
|
"fresh": "bun x rimraf node_modules/ bun.lock && bun i",
|
|
88
88
|
"prepublishOnly": "bun --bun run build",
|
|
89
89
|
"test": "bun test"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@ts-
|
|
93
|
-
"@ts-cloud/
|
|
94
|
-
"@
|
|
92
|
+
"@stacksjs/ts-xml": "^0.1.0",
|
|
93
|
+
"@ts-cloud/aws-types": "0.7.57",
|
|
94
|
+
"@ts-cloud/core": "0.7.57"
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|
|
97
|
-
"
|
|
98
|
-
"
|
|
97
|
+
"better-dx": "^0.2.16",
|
|
98
|
+
"bunfig": "^0.15.6"
|
|
99
99
|
},
|
|
100
100
|
"lint-staged": {
|
|
101
|
-
"*.{js,ts,json,yaml,yml,md}": "bun x --bun pickier lint --fix"
|
|
101
|
+
"*.{js,ts,json,yaml,yml,md}": "bun x --bun --package github:pickier/pickier#95de532 pickier run --mode lint --config ../../pickier.config.ts --fix --max-warnings 0"
|
|
102
102
|
}
|
|
103
103
|
}
|