@stacksjs/ts-cloud 0.7.55 → 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.
Files changed (467) hide show
  1. package/dist/alerts/alerts.test.d.ts +1 -0
  2. package/dist/alerts/delivery.d.ts +45 -0
  3. package/dist/alerts/evaluator.d.ts +12 -0
  4. package/dist/alerts/health.d.ts +34 -0
  5. package/dist/alerts/index.d.ts +6 -0
  6. package/dist/alerts/model.d.ts +170 -0
  7. package/dist/alerts/store.d.ts +90 -0
  8. package/dist/alerts/telemetry.d.ts +3 -0
  9. package/dist/api/client.d.ts +197 -0
  10. package/dist/api/handler.d.ts +18 -0
  11. package/dist/api/handler.test.d.ts +1 -0
  12. package/dist/api/index.d.ts +6 -0
  13. package/dist/api/openapi.d.ts +2 -0
  14. package/dist/api/service.d.ts +28 -0
  15. package/dist/api/types.d.ts +119 -0
  16. package/dist/auth/encryption.d.ts +3 -0
  17. package/dist/auth/index.d.ts +8 -0
  18. package/dist/auth/mailer.d.ts +9 -0
  19. package/dist/auth/oidc.d.ts +36 -0
  20. package/dist/auth/oidc.test.d.ts +1 -0
  21. package/dist/auth/store.d.ts +121 -0
  22. package/dist/auth/store.test.d.ts +1 -0
  23. package/dist/auth/totp.d.ts +11 -0
  24. package/dist/auth/totp.test.d.ts +1 -0
  25. package/dist/auth/types.d.ts +138 -0
  26. package/dist/automation/index.d.ts +2 -0
  27. package/dist/automation/store.d.ts +46 -0
  28. package/dist/automation/store.test.d.ts +1 -0
  29. package/dist/automation/types.d.ts +66 -0
  30. package/dist/aws/acm.d.ts +0 -4
  31. package/dist/aws/application-autoscaling.d.ts +0 -5
  32. package/dist/aws/backup.d.ts +42 -0
  33. package/dist/aws/bedrock.d.ts +0 -5
  34. package/dist/aws/client.d.ts +3 -6
  35. package/dist/aws/cloudformation.d.ts +0 -4
  36. package/dist/aws/cloudfront-media.test.d.ts +1 -0
  37. package/dist/aws/cloudfront-origin.test.d.ts +1 -0
  38. package/dist/aws/cloudfront.d.ts +87 -3
  39. package/dist/aws/cloudwatch-logs.d.ts +2 -4
  40. package/dist/aws/cloudwatch.d.ts +1 -1
  41. package/dist/aws/comprehend.d.ts +0 -5
  42. package/dist/aws/connect.d.ts +0 -4
  43. package/dist/aws/cost-explorer-cache.d.ts +1 -15
  44. package/dist/aws/cost-explorer.d.ts +18 -9
  45. package/dist/aws/cost-explorer.test.d.ts +1 -0
  46. package/dist/aws/dynamodb.d.ts +0 -4
  47. package/dist/aws/ec2.d.ts +0 -4
  48. package/dist/aws/ecr.d.ts +0 -4
  49. package/dist/aws/ecs.d.ts +17 -7
  50. package/dist/aws/efs.d.ts +0 -4
  51. package/dist/aws/elasticache.d.ts +0 -4
  52. package/dist/aws/elbv2.d.ts +0 -7
  53. package/dist/aws/email.d.ts +0 -10
  54. package/dist/aws/eventbridge.d.ts +0 -4
  55. package/dist/aws/iam.d.ts +1 -5
  56. package/dist/aws/imap-server.d.ts +0 -7
  57. package/dist/aws/index.d.ts +4 -3
  58. package/dist/aws/index.js +31 -31
  59. package/dist/aws/kendra.d.ts +0 -5
  60. package/dist/aws/lambda.d.ts +3 -5
  61. package/dist/aws/opensearch.d.ts +0 -4
  62. package/dist/aws/personalize.d.ts +0 -5
  63. package/dist/aws/polly.d.ts +0 -5
  64. package/dist/aws/rds.d.ts +59 -4
  65. package/dist/aws/rekognition.d.ts +0 -5
  66. package/dist/aws/route53-domains.d.ts +0 -4
  67. package/dist/aws/route53.d.ts +0 -4
  68. package/dist/aws/s3.d.ts +10 -6
  69. package/dist/aws/scheduler.d.ts +0 -4
  70. package/dist/aws/secrets-manager.d.ts +0 -4
  71. package/dist/aws/setup-sms.d.ts +0 -14
  72. package/dist/aws/sms.d.ts +0 -10
  73. package/dist/aws/smtp-server.d.ts +0 -11
  74. package/dist/aws/sns.d.ts +0 -4
  75. package/dist/aws/sqs.d.ts +0 -4
  76. package/dist/aws/ssm.d.ts +0 -4
  77. package/dist/aws/sts.d.ts +0 -4
  78. package/dist/aws/support.d.ts +0 -4
  79. package/dist/aws/textract.d.ts +0 -5
  80. package/dist/aws/transcribe.d.ts +0 -4
  81. package/dist/aws/translate.d.ts +0 -5
  82. package/dist/aws/voice.d.ts +0 -11
  83. package/dist/aws/xray.d.ts +1 -0
  84. package/dist/backups/aws-database-source.d.ts +19 -0
  85. package/dist/backups/aws-database-source.test.d.ts +1 -0
  86. package/dist/backups/aws-infrastructure-source.d.ts +43 -0
  87. package/dist/backups/aws-infrastructure-source.test.d.ts +1 -0
  88. package/dist/backups/control-plane-source.d.ts +16 -0
  89. package/dist/backups/control-plane-source.test.d.ts +1 -0
  90. package/dist/backups/docker-volume-source.d.ts +31 -0
  91. package/dist/backups/docker-volume-source.test.d.ts +1 -0
  92. package/dist/backups/filesystem-source.d.ts +34 -0
  93. package/dist/backups/filesystem-source.test.d.ts +1 -0
  94. package/dist/backups/index.d.ts +10 -0
  95. package/dist/backups/logical-database-source.d.ts +16 -0
  96. package/dist/backups/logical-database-source.test.d.ts +1 -0
  97. package/dist/backups/model.d.ts +121 -0
  98. package/dist/backups/s3-destination.d.ts +85 -0
  99. package/dist/backups/s3-destination.test.d.ts +1 -0
  100. package/dist/backups/service.d.ts +80 -0
  101. package/dist/backups/service.test.d.ts +1 -0
  102. package/dist/backups/store.d.ts +30 -0
  103. package/dist/backups/store.test.d.ts +1 -0
  104. package/dist/bin/cli.js +3360 -1802
  105. package/dist/{chunk-tjjgajbh.js → chunk-01d86gt1.js} +301 -9
  106. package/dist/{chunk-73vcqg6z.js → chunk-0z43x8re.js} +7 -7
  107. package/dist/{chunk-tnztxpcb.js → chunk-32e7ya18.js} +61 -49
  108. package/dist/{chunk-qpj3edwz.js → chunk-4cjrg98a.js} +3 -7
  109. package/dist/{chunk-hsk6fe6x.js → chunk-50jpda9q.js} +2 -2
  110. package/dist/{chunk-93hjhs78.js → chunk-703nkybg.js} +1 -1
  111. package/dist/{chunk-d5vqwj8s.js → chunk-9m6b4m74.js} +755 -720
  112. package/dist/chunk-e05phx5f.js +10 -0
  113. package/dist/{chunk-f29w04w5.js → chunk-exbcsab2.js} +10 -4
  114. package/dist/{chunk-eq08r166.js → chunk-f55nkpvb.js} +2 -2
  115. package/dist/{chunk-3bfv1z4v.js → chunk-fv1bj3yt.js} +63 -56
  116. package/dist/chunk-fw3q88wk.js +48641 -0
  117. package/dist/{chunk-3knnr7wh.js → chunk-he9a874b.js} +170 -2
  118. package/dist/{chunk-zn0nxxa8.js → chunk-hpv68b4a.js} +1070 -1070
  119. package/dist/chunk-k114qwg9.js +12 -0
  120. package/dist/{chunk-r16e02bc.js → chunk-vdk53yyq.js} +3900 -4101
  121. package/dist/{chunk-jp2a8yad.js → chunk-vvkd46k1.js} +15 -13
  122. package/dist/{chunk-vd87cpvn.js → chunk-wj3s95p9.js} +62 -46
  123. package/dist/{chunk-mj1tmhte.js → chunk-x9s0cqfx.js} +1 -1
  124. package/dist/{chunk-3rsfns7x.js → chunk-ybcz6sxc.js} +2048 -387
  125. package/dist/{chunk-arsh1g5h.js → chunk-zqtpg06c.js} +14 -11
  126. package/dist/compose/index.d.ts +6 -0
  127. package/dist/compose/parser.d.ts +13 -0
  128. package/dist/compose/parser.test.d.ts +1 -0
  129. package/dist/compose/runtime.d.ts +10 -0
  130. package/dist/compose/service.d.ts +18 -0
  131. package/dist/compose/store.d.ts +59 -0
  132. package/dist/compose/store.test.d.ts +1 -0
  133. package/dist/compose/templates.d.ts +17 -0
  134. package/dist/compose/types.d.ts +164 -0
  135. package/dist/configuration/backends.d.ts +66 -0
  136. package/dist/configuration/backends.test.d.ts +1 -0
  137. package/dist/configuration/dotenv.d.ts +14 -0
  138. package/dist/configuration/dotenv.test.d.ts +1 -0
  139. package/dist/configuration/index.d.ts +6 -0
  140. package/dist/configuration/migrate.d.ts +10 -0
  141. package/dist/configuration/migrate.test.d.ts +1 -0
  142. package/dist/configuration/model.d.ts +50 -0
  143. package/dist/configuration/service.d.ts +144 -0
  144. package/dist/configuration/service.test.d.ts +1 -0
  145. package/dist/configuration/store.d.ts +33 -0
  146. package/dist/configuration/store.test.d.ts +1 -0
  147. package/dist/control-plane/authorization.d.ts +24 -0
  148. package/dist/control-plane/authorization.test.d.ts +1 -0
  149. package/dist/control-plane/index.d.ts +8 -0
  150. package/dist/control-plane/migrations.d.ts +7 -0
  151. package/dist/control-plane/search.d.ts +25 -0
  152. package/dist/control-plane/store.d.ts +117 -0
  153. package/dist/control-plane/store.test.d.ts +1 -0
  154. package/dist/control-plane/types.d.ts +381 -0
  155. package/dist/cost/reporting.d.ts +24 -0
  156. package/dist/cost/reporting.test.d.ts +1 -0
  157. package/dist/cost/resource-inventory.d.ts +32 -0
  158. package/dist/cost/resource-inventory.test.d.ts +1 -0
  159. package/dist/cost/resource-optimization.d.ts +59 -0
  160. package/dist/cost/resource-optimization.test.d.ts +1 -0
  161. package/dist/data-services/adapters.d.ts +39 -0
  162. package/dist/data-services/aws-transports.d.ts +29 -0
  163. package/dist/data-services/aws-transports.test.d.ts +1 -0
  164. package/dist/data-services/capabilities.d.ts +2 -0
  165. package/dist/data-services/data-services.test.d.ts +1 -0
  166. package/dist/data-services/docker-transport.d.ts +55 -0
  167. package/dist/data-services/docker-transport.test.d.ts +1 -0
  168. package/dist/data-services/index.d.ts +8 -0
  169. package/dist/data-services/model.d.ts +79 -0
  170. package/dist/data-services/secrets.d.ts +13 -0
  171. package/dist/data-services/secrets.test.d.ts +1 -0
  172. package/dist/data-services/service.d.ts +51 -0
  173. package/dist/data-services/store.d.ts +17 -0
  174. package/dist/deploy/container-image.d.ts +28 -0
  175. package/dist/deploy/container-image.test.d.ts +1 -0
  176. package/dist/deploy/dashboard-audit.test.d.ts +1 -0
  177. package/dist/deploy/dashboard-auth.d.ts +4 -23
  178. package/dist/deploy/dashboard-backups.integration.test.d.ts +1 -0
  179. package/dist/deploy/dashboard-configuration.integration.test.d.ts +1 -0
  180. package/dist/deploy/dashboard-control-plane.d.ts +37 -0
  181. package/dist/deploy/dashboard-control-plane.test.d.ts +1 -0
  182. package/dist/deploy/dashboard-data-services.integration.test.d.ts +1 -0
  183. package/dist/deploy/dashboard-environment-scope.test.d.ts +1 -0
  184. package/dist/deploy/dashboard-guard.d.ts +12 -0
  185. package/dist/deploy/dashboard-guard.test.d.ts +1 -0
  186. package/dist/deploy/dashboard-identities.d.ts +15 -0
  187. package/dist/deploy/dashboard-identities.test.d.ts +1 -0
  188. package/dist/deploy/dashboard-jobs.integration.test.d.ts +1 -0
  189. package/dist/deploy/dashboard-login-page.d.ts +5 -5
  190. package/dist/deploy/dashboard-login-page.test.d.ts +1 -0
  191. package/dist/deploy/dashboard-oidc.integration.test.d.ts +1 -0
  192. package/dist/deploy/dashboard-onboarding.integration.test.d.ts +1 -0
  193. package/dist/deploy/dashboard-policy.d.ts +4 -2
  194. package/dist/deploy/dashboard-queue-worker.integration.test.d.ts +1 -0
  195. package/dist/deploy/dashboard-release.integration.test.d.ts +1 -0
  196. package/dist/deploy/dashboard-route-manifest.d.ts +14 -0
  197. package/dist/deploy/dashboard-route-manifest.test.d.ts +1 -0
  198. package/dist/deploy/dashboard-security.integration.test.d.ts +1 -0
  199. package/dist/deploy/dashboard-session.d.ts +3 -14
  200. package/dist/deploy/dashboard-source.integration.test.d.ts +1 -0
  201. package/dist/deploy/dashboard-users.d.ts +3 -0
  202. package/dist/deploy/fullstack-container.d.ts +87 -0
  203. package/dist/deploy/fullstack-container.test.d.ts +1 -0
  204. package/dist/deploy/index.d.ts +7 -2
  205. package/dist/deploy/index.js +65 -25
  206. package/dist/deploy/local-dashboard-server.d.ts +30 -0
  207. package/dist/deploy/quick-deploy.d.ts +1 -1
  208. package/dist/deploy/serverless-operations.d.ts +1 -0
  209. package/dist/deploy/site-target.d.ts +16 -0
  210. package/dist/deploy/static-api-origin.d.ts +107 -0
  211. package/dist/deploy/static-api-origin.test.d.ts +1 -0
  212. package/dist/deploy/static-site-helper.d.ts +0 -16
  213. package/dist/deploy/telemetry-access.d.ts +5 -0
  214. package/dist/deploy/telemetry-access.test.d.ts +1 -0
  215. package/dist/deploy/telemetry-collection.d.ts +44 -0
  216. package/dist/deploy/telemetry-collection.test.d.ts +1 -0
  217. package/dist/dns/index.js +3 -3
  218. package/dist/dns/route53-adapter.d.ts +1 -1
  219. package/dist/drivers/hetzner/cloud-init.d.ts +1 -1
  220. package/dist/drivers/index.d.ts +2 -2
  221. package/dist/drivers/index.js +6 -6
  222. package/dist/drivers/shared/notifications.d.ts +1 -1
  223. package/dist/drivers/shared/rpx-gateway.d.ts +1 -0
  224. package/dist/fleet/fleet.test.d.ts +1 -0
  225. package/dist/fleet/index.d.ts +144 -0
  226. package/dist/fleet/queue.d.ts +3 -0
  227. package/dist/fleet/ssh-driver.d.ts +34 -0
  228. package/dist/index.d.ts +28 -4
  229. package/dist/index.js +1132 -424
  230. package/dist/jobs/adapters.d.ts +23 -0
  231. package/dist/jobs/index.d.ts +7 -0
  232. package/dist/jobs/jobs.test.d.ts +1 -0
  233. package/dist/jobs/model.d.ts +100 -0
  234. package/dist/jobs/provider-adapters.d.ts +49 -0
  235. package/dist/jobs/reconcile.d.ts +19 -0
  236. package/dist/jobs/schedule.d.ts +9 -0
  237. package/dist/jobs/service.d.ts +30 -0
  238. package/dist/jobs/store.d.ts +48 -0
  239. package/dist/maintenance/drivers.d.ts +117 -0
  240. package/dist/maintenance/index.d.ts +6 -0
  241. package/dist/maintenance/maintenance.test.d.ts +1 -0
  242. package/dist/maintenance/manifest.d.ts +15 -0
  243. package/dist/maintenance/queue.d.ts +9 -0
  244. package/dist/maintenance/service.d.ts +31 -0
  245. package/dist/maintenance/store.d.ts +84 -0
  246. package/dist/maintenance/types.d.ts +192 -0
  247. package/dist/media.d.ts +62 -0
  248. package/dist/media.test.d.ts +1 -0
  249. package/dist/object-storage/index.d.ts +0 -24
  250. package/dist/onboarding/archive.d.ts +12 -0
  251. package/dist/onboarding/artifact-store.d.ts +22 -0
  252. package/dist/onboarding/detection.d.ts +8 -0
  253. package/dist/onboarding/index.d.ts +9 -0
  254. package/dist/onboarding/migrations.d.ts +3 -0
  255. package/dist/onboarding/onboarding.test.d.ts +1 -0
  256. package/dist/onboarding/plan.d.ts +3 -0
  257. package/dist/onboarding/registry.d.ts +41 -0
  258. package/dist/onboarding/service.d.ts +16 -0
  259. package/dist/onboarding/store.d.ts +30 -0
  260. package/dist/onboarding/types.d.ts +204 -0
  261. package/dist/placement/builds.d.ts +20 -0
  262. package/dist/placement/drivers.d.ts +54 -0
  263. package/dist/placement/index.d.ts +6 -0
  264. package/dist/placement/placement.test.d.ts +1 -0
  265. package/dist/placement/queue.d.ts +4 -0
  266. package/dist/placement/service.d.ts +34 -0
  267. package/dist/placement/store.d.ts +49 -0
  268. package/dist/placement/types.d.ts +109 -0
  269. package/dist/preview/index.d.ts +3 -0
  270. package/dist/preview/service.d.ts +45 -0
  271. package/dist/preview/service.test.d.ts +1 -0
  272. package/dist/preview/store.d.ts +47 -0
  273. package/dist/preview/store.test.d.ts +1 -0
  274. package/dist/preview/types.d.ts +99 -0
  275. package/dist/push/apns.d.ts +0 -26
  276. package/dist/push/fcm.d.ts +0 -23
  277. package/dist/push/index.d.ts +2 -2
  278. package/dist/push/index.js +1 -1
  279. package/dist/queue/deployment-handlers.d.ts +27 -0
  280. package/dist/queue/deployment-handlers.test.d.ts +1 -0
  281. package/dist/queue/index.d.ts +4 -0
  282. package/dist/queue/queue.d.ts +57 -0
  283. package/dist/queue/queue.test.d.ts +1 -0
  284. package/dist/queue/types.d.ts +93 -0
  285. package/dist/queue/worker.d.ts +32 -0
  286. package/dist/queue/worker.test.d.ts +1 -0
  287. package/dist/regions/drivers.d.ts +139 -0
  288. package/dist/regions/index.d.ts +5 -0
  289. package/dist/regions/queue.d.ts +4 -0
  290. package/dist/regions/regions.test.d.ts +1 -0
  291. package/dist/regions/service.d.ts +23 -0
  292. package/dist/regions/store.d.ts +41 -0
  293. package/dist/regions/types.d.ts +132 -0
  294. package/dist/release/index.d.ts +6 -0
  295. package/dist/release/queue.d.ts +15 -0
  296. package/dist/release/queue.test.d.ts +1 -0
  297. package/dist/release/runtime.d.ts +35 -0
  298. package/dist/release/runtime.test.d.ts +1 -0
  299. package/dist/release/service.d.ts +28 -0
  300. package/dist/release/store.d.ts +88 -0
  301. package/dist/release/store.test.d.ts +1 -0
  302. package/dist/release/strategy.d.ts +8 -0
  303. package/dist/release/types.d.ts +103 -0
  304. package/dist/runtime/adapters/aws.d.ts +5 -0
  305. package/dist/runtime/adapters/docker.d.ts +53 -0
  306. package/dist/runtime/adapters/systemd.d.ts +26 -0
  307. package/dist/runtime/index.d.ts +9 -0
  308. package/dist/runtime/inventory.d.ts +6 -0
  309. package/dist/runtime/model.d.ts +130 -0
  310. package/dist/runtime/normalize.d.ts +5 -0
  311. package/dist/runtime/operations.d.ts +113 -0
  312. package/dist/runtime/service.d.ts +32 -0
  313. package/dist/runtime/streams.d.ts +49 -0
  314. package/dist/security/artifacts.d.ts +105 -0
  315. package/dist/security/artifacts.test.d.ts +1 -0
  316. package/dist/security/container-release.d.ts +35 -0
  317. package/dist/security/container-release.test.d.ts +1 -0
  318. package/dist/security/index.d.ts +8 -0
  319. package/dist/security/integration.d.ts +41 -0
  320. package/dist/security/integration.test.d.ts +1 -0
  321. package/dist/security/posture-store.d.ts +80 -0
  322. package/dist/security/posture-store.test.d.ts +1 -0
  323. package/dist/security/pre-deploy-scanner.d.ts +0 -4
  324. package/dist/security/scanners.d.ts +81 -0
  325. package/dist/security/scanners.test.d.ts +1 -0
  326. package/dist/security/types.d.ts +150 -0
  327. package/dist/source/git-workspace.d.ts +26 -0
  328. package/dist/source/git-workspace.test.d.ts +1 -0
  329. package/dist/source/index.d.ts +6 -0
  330. package/dist/source/providers.d.ts +199 -0
  331. package/dist/source/providers.test.d.ts +1 -0
  332. package/dist/source/service.d.ts +18 -0
  333. package/dist/source/store.d.ts +149 -0
  334. package/dist/source/store.test.d.ts +1 -0
  335. package/dist/source/types.d.ts +191 -0
  336. package/dist/source/webhooks.d.ts +33 -0
  337. package/dist/source/webhooks.test.d.ts +1 -0
  338. package/dist/ssl/acme-client.d.ts +0 -6
  339. package/dist/storage/compose.d.ts +4 -0
  340. package/dist/storage/compose.test.d.ts +1 -0
  341. package/dist/storage/drivers.d.ts +107 -0
  342. package/dist/storage/drivers.test.d.ts +1 -0
  343. package/dist/storage/index.d.ts +5 -0
  344. package/dist/storage/model.d.ts +112 -0
  345. package/dist/storage/service.d.ts +95 -0
  346. package/dist/storage/storage.test.d.ts +1 -0
  347. package/dist/storage/store.d.ts +40 -0
  348. package/dist/telemetry/correlation.test.d.ts +1 -0
  349. package/dist/telemetry/index.d.ts +4 -0
  350. package/dist/telemetry/model.d.ts +145 -0
  351. package/dist/telemetry/policy.d.ts +8 -0
  352. package/dist/telemetry/policy.test.d.ts +1 -0
  353. package/dist/telemetry/redaction.d.ts +9 -0
  354. package/dist/telemetry/store.d.ts +34 -0
  355. package/dist/telemetry/store.test.d.ts +1 -0
  356. package/dist/ui/404.html +1506 -17
  357. package/dist/ui/accept-invitation.html +1163 -0
  358. package/dist/ui/{server/backups.html → access-denied.html} +344 -55
  359. package/dist/ui/account/automation.html +1669 -0
  360. package/dist/ui/account/security.html +1646 -0
  361. package/dist/ui/applications/compose.html +1590 -0
  362. package/dist/ui/applications/new.html +1868 -0
  363. package/dist/ui/data/backups.html +1757 -0
  364. package/dist/ui/data/services.html +1723 -0
  365. package/dist/ui/data/volumes.html +1639 -0
  366. package/dist/ui/index.html +392 -29
  367. package/dist/ui/integrations.html +1865 -0
  368. package/dist/ui/operations/alerts.html +1610 -0
  369. package/dist/ui/operations/configuration.html +1746 -0
  370. package/dist/ui/operations/jobs.html +1709 -0
  371. package/dist/ui/operations/maintenance.html +1540 -0
  372. package/dist/ui/operations/observability.html +1742 -0
  373. package/dist/ui/{serverless/scheduler.html → operations/previews.html} +447 -46
  374. package/dist/ui/operations/queue.html +1615 -0
  375. package/dist/ui/{server/workers.html → operations/regions.html} +413 -49
  376. package/dist/ui/operations/releases.html +1596 -0
  377. package/dist/ui/operations/workloads.html +1775 -0
  378. package/dist/ui/security.html +1767 -0
  379. package/dist/ui/server/actions.html +446 -57
  380. package/dist/ui/server/activity.html +346 -1
  381. package/dist/ui/server/capacity.html +1542 -0
  382. package/dist/ui/server/database.html +443 -36
  383. package/dist/ui/server/deployments.html +439 -53
  384. package/dist/ui/server/diagnostics.html +346 -1
  385. package/dist/ui/server/firewall.html +476 -50
  386. package/dist/ui/server/fleet.html +1577 -0
  387. package/dist/ui/server/logs.html +389 -25
  388. package/dist/ui/server/metrics.html +346 -1
  389. package/dist/ui/server/security.html +346 -1
  390. package/dist/ui/server/services.html +421 -46
  391. package/dist/ui/server/sites.html +476 -95
  392. package/dist/ui/server/ssh-keys.html +476 -46
  393. package/dist/ui/server/team.html +700 -77
  394. package/dist/ui/server/terminal.html +444 -54
  395. package/dist/ui/serverless/alarms.html +430 -42
  396. package/dist/ui/serverless/assets.html +421 -46
  397. package/dist/ui/serverless/cost.html +346 -1
  398. package/dist/ui/serverless/data.html +422 -47
  399. package/dist/ui/serverless/deployments.html +421 -46
  400. package/dist/ui/serverless/firewall.html +346 -1
  401. package/dist/ui/serverless/functions.html +423 -48
  402. package/dist/ui/serverless/logs.html +389 -25
  403. package/dist/ui/serverless/metrics.html +346 -1
  404. package/dist/ui/serverless/queues.html +448 -62
  405. package/dist/ui/serverless/secrets.html +448 -42
  406. package/dist/ui/serverless/traces.html +350 -5
  407. package/dist/ui/serverless.html +434 -58
  408. package/dist/ui-src/pages/404.stx +18 -0
  409. package/dist/ui-src/pages/accept-invitation.stx +50 -0
  410. package/dist/ui-src/pages/access-denied.stx +18 -0
  411. package/dist/ui-src/pages/account/automation.stx +187 -0
  412. package/dist/ui-src/pages/account/security.stx +249 -0
  413. package/dist/ui-src/pages/applications/compose.stx +38 -0
  414. package/dist/ui-src/pages/applications/new.stx +76 -0
  415. package/dist/ui-src/pages/data/backups.stx +214 -0
  416. package/dist/ui-src/pages/data/services.stx +257 -0
  417. package/dist/ui-src/pages/data/volumes.stx +40 -0
  418. package/dist/ui-src/pages/index.stx +24 -10
  419. package/dist/ui-src/pages/integrations.stx +186 -0
  420. package/dist/ui-src/pages/operations/alerts.stx +40 -0
  421. package/dist/ui-src/pages/operations/configuration.stx +164 -0
  422. package/dist/ui-src/pages/operations/jobs.stx +238 -0
  423. package/dist/ui-src/pages/operations/maintenance.stx +15 -0
  424. package/dist/ui-src/pages/operations/observability.stx +76 -0
  425. package/dist/ui-src/pages/operations/previews.stx +62 -0
  426. package/dist/ui-src/pages/operations/queue.stx +158 -0
  427. package/dist/ui-src/pages/operations/regions.stx +12 -0
  428. package/dist/ui-src/pages/operations/releases.stx +39 -0
  429. package/dist/ui-src/pages/operations/workloads.stx +151 -0
  430. package/dist/ui-src/pages/partials/head.stx +148 -15
  431. package/dist/ui-src/pages/partials/nav.stx +491 -74
  432. package/dist/ui-src/pages/partials/op-confirm.stx +6 -6
  433. package/dist/ui-src/pages/security.stx +264 -0
  434. package/dist/ui-src/pages/server/actions.stx +17 -26
  435. package/dist/ui-src/pages/server/capacity.stx +16 -0
  436. package/dist/ui-src/pages/server/database.stx +31 -16
  437. package/dist/ui-src/pages/server/deployments.stx +28 -30
  438. package/dist/ui-src/pages/server/firewall.stx +25 -30
  439. package/dist/ui-src/pages/server/fleet.stx +10 -0
  440. package/dist/ui-src/pages/server/logs.stx +11 -9
  441. package/dist/ui-src/pages/server/metrics.stx +8 -16
  442. package/dist/ui-src/pages/server/services.stx +19 -28
  443. package/dist/ui-src/pages/server/sites.stx +75 -72
  444. package/dist/ui-src/pages/server/ssh-keys.stx +24 -30
  445. package/dist/ui-src/pages/server/team.stx +286 -149
  446. package/dist/ui-src/pages/server/terminal.stx +6 -28
  447. package/dist/ui-src/pages/serverless/alarms.stx +17 -31
  448. package/dist/ui-src/pages/serverless/assets.stx +13 -22
  449. package/dist/ui-src/pages/serverless/cost.stx +15 -3
  450. package/dist/ui-src/pages/serverless/data.stx +12 -25
  451. package/dist/ui-src/pages/serverless/deployments.stx +14 -23
  452. package/dist/ui-src/pages/serverless/firewall.stx +5 -1
  453. package/dist/ui-src/pages/serverless/functions.stx +20 -26
  454. package/dist/ui-src/pages/serverless/logs.stx +11 -10
  455. package/dist/ui-src/pages/serverless/metrics.stx +18 -17
  456. package/dist/ui-src/pages/serverless/queues.stx +34 -42
  457. package/dist/ui-src/pages/serverless/secrets.stx +31 -34
  458. package/dist/ui-src/pages/serverless/traces.stx +2 -6
  459. package/dist/ui-src/pages/serverless.stx +40 -74
  460. package/package.json +11 -11
  461. package/dist/chunk-b17vf1g1.js +0 -13787
  462. package/dist/chunk-b82pbxyp.js +0 -1572
  463. package/dist/chunk-pqfzdg68.js +0 -12
  464. package/dist/chunk-z58fqnjm.js +0 -10
  465. package/dist/ui-src/pages/server/backups.stx +0 -91
  466. package/dist/ui-src/pages/server/workers.stx +0 -99
  467. package/dist/ui-src/pages/serverless/scheduler.stx +0 -89
@@ -19,6 +19,8 @@ const initialPresets = presetsList
19
19
  function tone(s) { return s === 'ALARM' ? 'bad' : (s === 'OK' ? 'ok' : 'warn') }
20
20
  </script>
21
21
  <script client>
22
+ import { useOpConfirm } from '../../functions/useOpConfirm.ts'
23
+
22
24
  // Alarms manager: list/create/delete CloudWatch alarms via /api/serverless/alarms.
23
25
  const rows = state(initialAlarms)
24
26
  const presets = state(initialPresets)
@@ -26,12 +28,14 @@ const preset = state(initialPresets[0] ? initialPresets[0].key : '')
26
28
  const threshold = state('')
27
29
  const msg = state('')
28
30
  const msgOk = state(false)
29
- const busy = state(false)
30
31
 
31
- // Delete flow uses a typed-confirm (the alarm name) before firing.
32
- const pendingDelete = state(null)
33
- const typedDelete = state('')
34
- const canDelete = derived(() => { const p = pendingDelete(); return !!p && typedDelete() === p })
32
+ const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
33
+ const res = await fetch('/api/serverless/alarms', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name: p.name, confirm: p.apiConfirm }) })
34
+ const body = await res.json()
35
+ msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
36
+ if (body.ok) refresh()
37
+ return msg()
38
+ })
35
39
 
36
40
  function toneOf(s) { return s === 'ALARM' ? 'bad' : (s === 'OK' ? 'ok' : 'warn') }
37
41
 
@@ -60,20 +64,7 @@ async function createAlarm() {
60
64
  finally { busy.set(false) }
61
65
  }
62
66
 
63
- function askDelete(name) { pendingDelete.set(name); typedDelete.set('') }
64
- function cancelDelete() { pendingDelete.set(null); typedDelete.set('') }
65
- async function confirmDelete() {
66
- const name = pendingDelete()
67
- if (!name || typedDelete() !== name) return
68
- pendingDelete.set(null); typedDelete.set('')
69
- msg.set('Deleting ' + name + '...'); msgOk.set(false)
70
- try {
71
- const res = await fetch('/api/serverless/alarms', { method: 'DELETE', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ name, confirm: name }) })
72
- const body = await res.json()
73
- msg.set(body.ok ? (body.stdout || 'Deleted.') : (body.error || 'Failed to delete.')); msgOk.set(!!body.ok)
74
- if (body.ok) refresh()
75
- } catch (e) { msg.set('Failed: ' + ((e && e.message) || e)); msgOk.set(false) }
76
- }
67
+ function askDelete(name) { askOp('alarm:delete:' + name, name, 'delete alarm ' + name, null, name, { name, danger: true, label: 'Delete alarm' }) }
77
68
  </script>
78
69
  <!DOCTYPE html>
79
70
  <html lang="en" data-theme="dark">
@@ -94,7 +85,7 @@ async function confirmDelete() {
94
85
  <div class="section">
95
86
  <div class="panel">
96
87
  <table>
97
- <thead><tr><th>Alarm</th><th>Metric</th><th>Condition</th><th>State</th><th class="table-actions">Actions</th></tr></thead>
88
+ <thead><tr><th scope="col">Alarm</th><th scope="col">Metric</th><th scope="col">Condition</th><th scope="col">State</th><th scope="col" class="table-actions">Actions</th></tr></thead>
98
89
  <tbody>
99
90
  <template :for="a in rows()">
100
91
  <tr>
@@ -104,7 +95,7 @@ async function confirmDelete() {
104
95
  <td><span class="pill {{ toneOf(a.StateValue) }}">{{ a.StateValue }}</span></td>
105
96
  <td class="table-actions">
106
97
  <div class="row-actions" style="justify-content:flex-end">
107
- <button class="btn danger sm" type="button" @click="askDelete(a.AlarmName)">Delete</button>
98
+ <button class="btn danger sm" type="button" :aria-label="'Delete alarm ' + a.AlarmName" @click="askDelete(a.AlarmName)">Delete</button>
108
99
  </div>
109
100
  </td>
110
101
  </tr>
@@ -115,12 +106,7 @@ async function confirmDelete() {
115
106
  </tbody>
116
107
  </table>
117
108
 
118
- <div class="op-confirm" @show="pendingDelete() !== null" style="margin-top:14px">
119
- <span>Type <b class="mono">{{ pendingDelete() }}</b> to delete this alarm:</span>
120
- <input class="op-confirm-input" :value="typedDelete()" @input="typedDelete.set($event.target.value)" @keydown.enter="confirmDelete()" placeholder="confirm" autocomplete="off">
121
- <button class="btn danger sm" :disabled="!canDelete()" @click="confirmDelete()">Delete</button>
122
- <button class="btn ghost sm" @click="cancelDelete()">Cancel</button>
123
- </div>
109
+ @include('../partials/op-confirm')
124
110
  </div>
125
111
  </div>
126
112
 
@@ -129,16 +115,16 @@ async function confirmDelete() {
129
115
  <div class="panel">
130
116
  <div class="form-grid">
131
117
  <div class="field-block">
132
- <label>Metric preset</label>
133
- <select :value="preset()" @change="preset.set($event.target.value)">
118
+ <label for="alarm-preset">Metric preset</label>
119
+ <select id="alarm-preset" :value="preset()" @change="preset.set($event.target.value)">
134
120
  <template :for="p in presets()">
135
121
  <option value="{{ p.key }}">{{ p.label }}</option>
136
122
  </template>
137
123
  </select>
138
124
  </div>
139
125
  <div class="field-block">
140
- <label>Threshold</label>
141
- <input type="number" :value="threshold()" @input="threshold.set($event.target.value)" placeholder="5" autocomplete="off">
126
+ <label for="alarm-threshold">Threshold</label>
127
+ <input id="alarm-threshold" type="number" :value="threshold()" @input="threshold.set($event.target.value)" placeholder="5" autocomplete="off">
142
128
  </div>
143
129
  <div class="form-actions">
144
130
  <button class="btn" type="button" :disabled="busy()" @click="createAlarm()">Create</button>
@@ -13,27 +13,14 @@ const recent = __d?.assetsRecent ?? [
13
13
  ]
14
14
  </script>
15
15
  <script client>
16
+ import { useOpConfirm } from '../../functions/useOpConfirm.ts'
17
+
16
18
  // assets:invalidate runs live against AWS through /api/serverless/operations/run.
17
- const opOutput = state('')
18
- const opShown = state(false)
19
- const pending = state(null)
20
- const typed = state('')
21
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
22
- const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
23
- const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
24
- function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
25
- function cancelOp() { pending.set(null) }
26
- async function runOp() {
27
- const p = pending()
28
- if (!p || typed() !== p.confirm) return
29
- pending.set(null); typed.set('')
30
- opShown.set(true); opOutput.set('Running ' + p.operation + '...')
31
- try {
32
- const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm }) })
33
- const body = await res.json()
34
- opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
35
- } catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
36
- }
19
+ const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
20
+ const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm }) })
21
+ const body = await res.json()
22
+ return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
23
+ })
37
24
  </script>
38
25
  <!DOCTYPE html>
39
26
  <html lang="en" data-theme="dark">
@@ -50,7 +37,7 @@ async function runOp() {
50
37
  <p>Versioned static assets uploaded to S3 and served via CloudFront; <span class="mono">ASSET_URL</span> is injected into the app.</p>
51
38
  </div>
52
39
  <div class="header-actions">
53
- <button class="btn sm" type="button" @click="askOp('assets:invalidate', 'invalidate', 'invalidate the CDN cache')">Invalidate CDN cache</button>
40
+ <button class="btn sm" type="button" @click="askOp('assets:invalidate', '{{ assets.bucket }}', 'invalidate the CDN cache for {{ assets.bucket }}', 'invalidate')">Invalidate CDN cache</button>
54
41
  </div>
55
42
  </header>
56
43
 
@@ -77,14 +64,18 @@ async function runOp() {
77
64
  <div class="section">
78
65
  <h2>Recent assets</h2>
79
66
  <div class="panel">
67
+ @if (recent.length)
80
68
  <table>
81
- <thead><tr><th>Path</th><th>Type</th><th>Size</th></tr></thead>
69
+ <thead><tr><th scope="col">Path</th><th scope="col">Type</th><th scope="col">Size</th></tr></thead>
82
70
  <tbody>
83
71
  @foreach (recent as a)
84
72
  <tr><td class="mono">{{ a.path }}</td><td style="color:var(--txt2)">{{ a.type }}</td><td>{{ a.size }}</td></tr>
85
73
  @endforeach
86
74
  </tbody>
87
75
  </table>
76
+ @else
77
+ <div class="empty"><strong>No assets deployed</strong><span>Publish an asset build to populate this bucket and CDN history.</span></div>
78
+ @endif
88
79
  <p class="note">Sync with <span class="mono">cloud assets:deploy</span> · invalidate with <span class="mono">cloud assets:invalidate</span></p>
89
80
  </div>
90
81
  </div>
@@ -40,8 +40,8 @@ const trend = __d?.costTrend ?? [5.9, 6.2, 7.1, 6.8, 7.4, 8.0, 7.6, 9.1, 8.4, 7.
40
40
 
41
41
  const totalServices = services.reduce((s, x) => s + x.usd, 0)
42
42
  function pct(v, max) { return Math.round((v / max) * 100) }
43
- const maxService = Math.max(...services.map(s => s.usd))
44
- const maxTrend = Math.max(...trend)
43
+ const maxService = Math.max(1, ...services.map(s => s.usd))
44
+ const maxTrend = Math.max(1, ...trend)
45
45
  </script>
46
46
  <!DOCTYPE html>
47
47
  <html lang="en" data-theme="dark">
@@ -103,6 +103,7 @@ const maxTrend = Math.max(...trend)
103
103
  <div>
104
104
  <h2>By service</h2>
105
105
  <div class="panel">
106
+ @if (services.length)
106
107
  @foreach (services as s)
107
108
  <div style="padding:11px 0; border-top:1px solid rgba(255,255,255,0.05);">
108
109
  <div style="display:flex; align-items:center; gap:12px;">
@@ -114,13 +115,17 @@ const maxTrend = Math.max(...trend)
114
115
  </div>
115
116
  @endforeach
116
117
  <div class="kv" style="margin-top:6px; border-top:1px solid var(--panel-br); padding-top:12px;"><span>total</span> <b>${{ totalServices.toFixed(2) }}</b></div>
118
+ @else
119
+ <div class="empty"><strong>No cost data</strong><span>Cost allocation appears after provider billing data is available for this environment.</span></div>
120
+ @endif
117
121
  </div>
118
122
  </div>
119
123
  <div>
120
124
  <h2>Lambda by function</h2>
121
125
  <div class="panel">
126
+ @if (perFn.length)
122
127
  <table>
123
- <thead><tr><th>Fn</th><th>Requests</th><th>GB-sec</th><th>Cost</th></tr></thead>
128
+ <thead><tr><th scope="col">Fn</th><th scope="col">Requests</th><th scope="col">GB-sec</th><th scope="col">Cost</th></tr></thead>
124
129
  <tbody>
125
130
  @foreach (perFn as f)
126
131
  <tr>
@@ -132,15 +137,22 @@ const maxTrend = Math.max(...trend)
132
137
  @endforeach
133
138
  </tbody>
134
139
  </table>
140
+ @else
141
+ <div class="empty"><strong>No function cost data</strong><span>Function-level estimates appear after the first metered invocations.</span></div>
142
+ @endif
135
143
  </div>
136
144
  <div style="height:16px"></div>
137
145
  <h2>Optimize</h2>
138
146
  <div class="panel">
147
+ @if (services.length)
139
148
  <p class="note" style="margin-top:0">Biggest lever: <b style="color:var(--txt)">{{ services[0].name }}</b> at ${{ services[0].usd.toFixed(2) }}.</p>
140
149
  <p class="note">• Right-size memory - over-provisioned MB inflates GB-seconds.</p>
141
150
  <p class="note">• Drop unused <span class="mono">provisionedConcurrency</span> for ping-based <span class="mono">warm</span> if cold starts are tolerable.</p>
142
151
  <p class="note">• Tighten Aurora <span class="mono">db-scale</span> min ACU off-peak.</p>
143
152
  <p class="note">Full breakdown: <span class="mono">cloud cost --env {{ app.env }}</span></p>
153
+ @else
154
+ <p class="note" style="margin-top:0">Optimization guidance becomes available with the first service-level cost breakdown.</p>
155
+ @endif
144
156
  </div>
145
157
  </div>
146
158
  </div>
@@ -12,29 +12,16 @@ const seedMin = aurora?.minAcu ?? 0.5
12
12
  const seedMax = aurora?.maxAcu ?? 4
13
13
  </script>
14
14
  <script client>
15
+ import { useOpConfirm } from '../../functions/useOpConfirm.ts'
16
+
15
17
  // db:scale runs live against AWS through /api/serverless/operations/run.
16
- const opOutput = state('')
17
- const opShown = state(false)
18
- const pending = state(null)
19
- const typed = state('')
20
18
  const scaleMin = state(String(seedMin ?? ''))
21
19
  const scaleMax = state(String(seedMax ?? ''))
22
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
23
- const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
24
- const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
25
- function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
26
- function cancelOp() { pending.set(null) }
27
- async function runOp() {
28
- const p = pending()
29
- if (!p || typed() !== p.confirm) return
30
- pending.set(null); typed.set('')
31
- opShown.set(true); opOutput.set('Running ' + p.operation + '...')
32
- try {
33
- const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm, min: Number(scaleMin()), max: Number(scaleMax()) }) })
34
- const body = await res.json()
35
- opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
36
- } catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
37
- }
20
+ const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
21
+ const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm, min: Number(scaleMin()), max: Number(scaleMax()) }) })
22
+ const body = await res.json()
23
+ return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
24
+ })
38
25
  </script>
39
26
  <!DOCTYPE html>
40
27
  <html lang="en" data-theme="dark">
@@ -76,16 +63,16 @@ async function runOp() {
76
63
  <div class="panel">
77
64
  <div class="form-grid">
78
65
  <div class="field-block">
79
- <label>Min ACUs</label>
80
- <input type="number" step="0.5" min="0.5" :value="scaleMin()" @input="scaleMin.set($event.target.value)" placeholder="{{ seedMin }}" autocomplete="off">
66
+ <label for="aurora-min">Min ACUs</label>
67
+ <input id="aurora-min" type="number" step="0.5" min="0.5" :value="scaleMin()" @input="scaleMin.set($event.target.value)" placeholder="{{ seedMin }}" autocomplete="off">
81
68
  </div>
82
69
  <div class="field-block">
83
- <label>Max ACUs</label>
84
- <input type="number" step="0.5" min="0.5" :value="scaleMax()" @input="scaleMax.set($event.target.value)" placeholder="{{ seedMax }}" autocomplete="off">
70
+ <label for="aurora-max">Max ACUs</label>
71
+ <input id="aurora-max" type="number" step="0.5" min="0.5" :value="scaleMax()" @input="scaleMax.set($event.target.value)" placeholder="{{ seedMax }}" autocomplete="off">
85
72
  </div>
86
73
  </div>
87
74
  <div class="form-actions">
88
- <button class="btn sm" type="button" @click="askOp('db:scale', 'scale', 'scale the Aurora cluster')">Scale</button>
75
+ <button class="btn sm" type="button" @click="askOp('db:scale', '{{ aurora.id }}', 'scale the Aurora cluster {{ aurora.id }}', 'scale')">Scale</button>
89
76
  </div>
90
77
  @include('../partials/op-confirm')
91
78
  <p class="note">Adjusts the Aurora Serverless v2 capacity range. New writes settle into the range within a few seconds.</p>
@@ -11,27 +11,14 @@ const deployments = __d?.deploymentsDetail ?? [
11
11
  function tone(s) { return s === 'success' ? 'ok' : (s === 'rolled-back' ? 'warn' : 'bad') }
12
12
  </script>
13
13
  <script client>
14
+ import { useOpConfirm } from '../../functions/useOpConfirm.ts'
15
+
14
16
  // Rollback + redeploy run live against AWS through /api/serverless/operations/run.
15
- const opOutput = state('')
16
- const opShown = state(false)
17
- const pending = state(null)
18
- const typed = state('')
19
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
20
- const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
21
- const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
22
- function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
23
- function cancelOp() { pending.set(null) }
24
- async function runOp() {
25
- const p = pending()
26
- if (!p || typed() !== p.confirm) return
27
- pending.set(null); typed.set('')
28
- opShown.set(true); opOutput.set('Running ' + p.operation + '...')
29
- try {
30
- const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.confirm }) })
31
- const body = await res.json()
32
- opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
33
- } catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
34
- }
17
+ const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
18
+ const res = await fetch('/api/serverless/operations/run', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ operation: p.operation, confirm: p.apiConfirm }) })
19
+ const body = await res.json()
20
+ return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
21
+ })
35
22
  </script>
36
23
  <!DOCTYPE html>
37
24
  <html lang="en" data-theme="dark">
@@ -48,15 +35,16 @@ async function runOp() {
48
35
  <p>Every deploy publishes an immutable artifact; activation is atomic and rollback flips back instantly.</p>
49
36
  </div>
50
37
  <div class="header-actions">
51
- <button class="btn danger sm" type="button" @click="askOp('rollback', 'rollback', 'roll back to the previous build')">Roll back</button>
52
- <button class="btn sm" type="button" @click="askOp('redeploy', 'redeploy', 'redeploy the current build')">Redeploy</button>
38
+ <button class="btn danger sm" type="button" @click="askOp('rollback', '{{ app.name }}', 'roll back {{ app.name }} to the previous build', 'rollback')">Roll back</button>
39
+ <button class="btn sm" type="button" @click="askOp('redeploy', '{{ app.name }}', 'redeploy {{ app.name }}', 'redeploy')">Redeploy</button>
53
40
  </div>
54
41
  </header>
55
42
 
56
43
  <div class="section">
57
44
  <div class="panel">
45
+ @if (deployments.length)
58
46
  <table>
59
- <thead><tr><th>Build</th><th>Status</th><th>Version</th><th>Deploy hooks</th><th>By</th><th>Took</th><th>When</th></tr></thead>
47
+ <thead><tr><th scope="col">Build</th><th scope="col">Status</th><th scope="col">Version</th><th scope="col">Deploy hooks</th><th scope="col">By</th><th scope="col">Took</th><th scope="col">When</th></tr></thead>
60
48
  <tbody>
61
49
  @foreach (deployments as d)
62
50
  <tr>
@@ -71,6 +59,9 @@ async function runOp() {
71
59
  @endforeach
72
60
  </tbody>
73
61
  </table>
62
+ @else
63
+ <div class="empty"><strong>No deployments yet</strong><span>Deploy the application once to create immutable release history.</span></div>
64
+ @endif
74
65
  @include('../partials/op-confirm')
75
66
  <p class="note">Rollback restores the previous build's code and env and flips the live alias back instantly. Redeploy re-activates the current build without rebuilding.</p>
76
67
  </div>
@@ -37,8 +37,9 @@ function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k
37
37
  <div class="section">
38
38
  <h2>Rules</h2>
39
39
  <div class="panel">
40
+ @if (rules.length)
40
41
  <table>
41
- <thead><tr><th>Rule</th><th>Detail</th><th>Action</th><th>Blocked (24h)</th></tr></thead>
42
+ <thead><tr><th scope="col">Rule</th><th scope="col">Detail</th><th scope="col">Action</th><th scope="col">Blocked (24h)</th></tr></thead>
42
43
  <tbody>
43
44
  @foreach (rules as r)
44
45
  <tr>
@@ -50,6 +51,9 @@ function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k
50
51
  @endforeach
51
52
  </tbody>
52
53
  </table>
54
+ @else
55
+ <div class="empty"><strong>No WAF rules configured</strong><span>Add managed or rate-limit rules to the application firewall configuration.</span></div>
56
+ @endif
53
57
  <p class="note">Configured via <span class="mono">app.firewall</span> in cloud.config.</p>
54
58
  </div>
55
59
  </div>
@@ -45,31 +45,18 @@ const modes = (__d?.functionsDetail ?? functions).map(f => f.key)
45
45
  const initialMode = modes[0] ?? 'http'
46
46
  </script>
47
47
  <script client>
48
+ import { useOpConfirm } from '../../functions/useOpConfirm.ts'
49
+
48
50
  // Per-function config runs live against AWS through /api/serverless/functions/config.
49
51
  const mode = state(initialMode)
50
52
  const mem = state('1024')
51
53
  const to = state('28')
52
- const opOutput = state('')
53
- const opShown = state(false)
54
- const pending = state(null)
55
- const typed = state('')
56
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
57
- const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
58
- const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
59
- function askOp(operation, confirm, verb) { pending.set({ operation, confirm, verb }); typed.set('') }
60
- function cancelOp() { pending.set(null) }
61
54
  function applyConfig() { const m = mode(); askOp(m, m, 'update the ' + m + ' function') }
62
- async function runOp() {
63
- const p = pending()
64
- if (!p || typed() !== p.confirm) return
65
- pending.set(null); typed.set('')
66
- opShown.set(true); opOutput.set('Updating ' + p.operation + '...')
67
- try {
68
- const res = await fetch('/api/serverless/functions/config', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ mode: p.operation, memory: Number(mem()), timeout: Number(to()), confirm: p.confirm }) })
69
- const body = await res.json()
70
- opOutput.set((body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : ''))
71
- } catch (e) { opOutput.set('FAILED ' + p.operation + '\n\n' + ((e && e.message) || e)) }
72
- }
55
+ const { opOutput, opShown, pending, typed, busy, confirmTok, confirmVerb, confirmDanger, confirmLabel, canRun, askOp, cancelOp, runOp } = useOpConfirm(async p => {
56
+ const res = await fetch('/api/serverless/functions/config', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ mode: p.operation, memory: Number(mem()), timeout: Number(to()), confirm: p.apiConfirm }) })
57
+ const body = await res.json()
58
+ return (body.ok ? 'OK ' : 'FAILED ') + (body.command || p.operation) + '\n\n' + (body.stdout || '') + (body.error ? '\n' + body.error : '')
59
+ })
73
60
  </script>
74
61
  <!DOCTYPE html>
75
62
  <html lang="en" data-theme="dark">
@@ -88,9 +75,11 @@ async function runOp() {
88
75
  </div>
89
76
  </header>
90
77
 
78
+ @if (functions.length)
91
79
  @foreach (functions as fn)
92
80
  <div class="section">
93
81
  <h2><span class="tag">{{ fn.key }}</span> <span class="mono">{{ fn.name }}</span></h2>
82
+ <p class="note"><a href="/operations/workloads?search={{ encodeURIComponent(fn.name) }}">Open normalized workload and release context</a></p>
94
83
  <div class="cols">
95
84
  <div class="panel">
96
85
  <h3>Invocations (24h)</h3>
@@ -142,26 +131,30 @@ async function runOp() {
142
131
  </div>
143
132
  </div>
144
133
  @endforeach
134
+ @else
135
+ <div class="section"><div class="empty"><strong>No functions deployed</strong><span>Deploy the serverless application to create its HTTP, queue, and CLI functions.</span></div></div>
136
+ @endif
145
137
 
138
+ @if (functions.length)
146
139
  <div class="section">
147
140
  <h2>Configure function</h2>
148
141
  <div class="panel">
149
142
  <div class="form-grid">
150
143
  <div class="field-block">
151
- <label>Function</label>
152
- <select :value="mode()" @change="mode.set($event.target.value)">
144
+ <label for="function-mode">Function</label>
145
+ <select id="function-mode" :value="mode()" @change="mode.set($event.target.value)">
153
146
  @foreach (modes as m)
154
147
  <option value="{{ m }}">{{ m }}</option>
155
148
  @endforeach
156
149
  </select>
157
150
  </div>
158
151
  <div class="field-block">
159
- <label>Memory (MB)</label>
160
- <input type="number" min="128" max="10240" :value="mem()" @input="mem.set($event.target.value)" placeholder="1024" autocomplete="off">
152
+ <label for="function-memory">Memory (MB)</label>
153
+ <input id="function-memory" type="number" min="128" max="10240" :value="mem()" @input="mem.set($event.target.value)" placeholder="1024" autocomplete="off">
161
154
  </div>
162
155
  <div class="field-block">
163
- <label>Timeout (s)</label>
164
- <input type="number" min="1" max="900" :value="to()" @input="to.set($event.target.value)" placeholder="28" autocomplete="off">
156
+ <label for="function-timeout">Timeout (s)</label>
157
+ <input id="function-timeout" type="number" min="1" max="900" :value="to()" @input="to.set($event.target.value)" placeholder="28" autocomplete="off">
165
158
  </div>
166
159
  <div class="form-actions">
167
160
  <button class="btn" type="button" @click="applyConfig()">Apply</button>
@@ -171,6 +164,7 @@ async function runOp() {
171
164
  <p class="note">Memory is 128 to 10240 MB, timeout is 1 to 900 s. Changes are applied to the live function immediately via <span class="mono">cloud functions:config</span>.</p>
172
165
  </div>
173
166
  </div>
167
+ @endif
174
168
  </div>
175
169
  </body>
176
170
  </html>
@@ -6,6 +6,8 @@ const initialLogs = __d?.serverlessLogs ?? []
6
6
  const emptyReason = __d?.serverlessLogsEmptyReason ?? 'No function logs are available yet.'
7
7
  </script>
8
8
  <script client>
9
+ import { usePolling } from '../../functions/usePolling.ts'
10
+
9
11
  // Reactive aggregated CloudWatch logs across the functions, with level + function
10
12
  // filtering and auto-refresh - seeded from build-time data (stx server→client
11
13
  // bridge), then live-refreshed. Signals + directives only (no manual DOM).
@@ -16,15 +18,13 @@ const sources = derived(() => [...new Set(logs().map(l => l.source).filter(Boole
16
18
  const filtered = derived(() => logs().filter(l =>
17
19
  (level() === 'all' || l.level === level()) && (source() === 'all' || l.source === source())))
18
20
  function tone(l) { return l === 'error' ? 'bad' : (l === 'warn' ? 'warn' : 'ok') }
19
- async function refresh() {
20
- try {
21
- const res = await fetch('/api/dashboard-data')
22
- if (!res.ok) return
23
- const data = await res.json()
24
- if (Array.isArray(data.serverlessLogs)) logs.set(data.serverlessLogs)
25
- } catch {}
26
- }
27
- onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => clearInterval(id) })
21
+ const { pollingState, pollingError, pollingLabel } = usePolling(async () => {
22
+ const res = await fetch('/api/dashboard-data')
23
+ if (!res.ok) throw new Error('Log refresh failed with HTTP ' + res.status + '.')
24
+ const data = await res.json()
25
+ if (!Array.isArray(data.serverlessLogs)) throw new Error('Log refresh returned an invalid payload.')
26
+ logs.set(data.serverlessLogs)
27
+ }, 8000)
28
28
  </script>
29
29
  <!DOCTYPE html>
30
30
  <html lang="en" data-theme="dark">
@@ -38,7 +38,7 @@ onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => c
38
38
  <h1>Function logs</h1>
39
39
  <p>Aggregated CloudWatch logs across the {{ app.name }} functions ({{ app.env }}).</p>
40
40
  </div>
41
- <div class="cmds header-actions"><span class="accent cmd">cloud logs --env {{ app.env }}</span></div>
41
+ <div class="cmds header-actions"><span class="pill" :class="{ ok: pollingState() === 'live', warn: pollingState() !== 'live' }">{{ pollingLabel() }}</span><span class="accent cmd">cloud logs --env {{ app.env }}</span></div>
42
42
  </header>
43
43
 
44
44
  <div class="section">
@@ -75,6 +75,7 @@ onMount(() => { refresh(); const id = setInterval(refresh, 8000); return () => c
75
75
  </div>
76
76
  <div class="compact empty" @show="logs().length > 0 && filtered().length === 0"><strong>No matching logs</strong><span>Try a different level or function filter.</span></div>
77
77
  <div class="empty" @show="logs().length === 0"><strong>No logs available</strong><span>{{ emptyReason }}</span></div>
78
+ <p class="bad note" role="status" @show="pollingState() === 'stale'">Showing the last successful snapshot. {{ pollingError() }}</p>
78
79
 
79
80
  <p class="note">Live CloudWatch logs (REPORT/START/END boilerplate stripped) across <span class="mono">http</span>, <span class="mono">queue</span>, <span class="mono">cli</span> and scheduler functions. Auto-refreshes every 8s.</p>
80
81
  </div>
@@ -3,13 +3,10 @@ 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
5
  const window = '24h'
6
- const totals = __d?.metricsTotals ?? { invocations: 184320, errors: 24, errorRatePct: 0.13, p95Ms: 92, throttles: 0, coldStartPct: 1.8, estCostUsd: 7.4, concurrency: 42 }
7
- const perFn = __d?.metricsPerFn ?? [
8
- { key: 'http', invocations: 171200, errors: 21, throttles: 0, avgMs: 41, maxMs: 282, costUsd: 6.1 },
9
- { key: 'queue', invocations: 12840, errors: 3, throttles: 0, avgMs: 168, maxMs: 410, costUsd: 1.0 },
10
- { key: 'cli', invocations: 1440, errors: 0, throttles: 0, avgMs: 760, maxMs: 1400, costUsd: 0.3 },
11
- ]
12
- const invSpark = __d?.invSpark ?? [60, 72, 68, 81, 95, 88, 102, 94, 120, 110, 90, 84, 78, 96, 130, 122, 100, 92, 88, 104, 140, 132, 108, 100]
6
+ const live = !!__d
7
+ const totals = __d?.metricsTotals ?? { invocations: 0, errors: 0, errorRatePct: 0, p95Ms: 0, throttles: 0, coldStartPct: undefined, estCostUsd: undefined, concurrency: 0 }
8
+ const perFn = __d?.metricsPerFn ?? []
9
+ const invSpark = __d?.invSpark ?? []
13
10
  function fmt(n) { return n >= 1000 ? `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k` : String(n) }
14
11
  function pct(v, max) { return Math.round((v / max) * 100) }
15
12
  </script>
@@ -34,20 +31,20 @@ function pct(v, max) { return Math.round((v / max) * 100) }
34
31
  </header>
35
32
 
36
33
  <div class="grid cards">
37
- <div class="panel"><h3>Invocations</h3><div class="stat">{{ fmt(totals.invocations) }}</div><p class="note">{{ totals.concurrency }} concurrent now</p></div>
38
- <div class="panel"><h3>Error rate</h3><div class="stat">{{ totals.errorRatePct }}%</div><div class="bar"><i style="width: {{ Math.min(100, totals.errorRatePct * 10) }}%"></i></div></div>
39
- <div class="panel"><h3>p95 latency</h3><div class="stat">{{ totals.p95Ms }} <small>ms</small></div><p class="note">{{ totals.coldStartPct }}% cold starts</p></div>
40
- <div class="panel"><h3>Est. cost</h3><div class="stat">${{ totals.estCostUsd }}</div><p class="note">{{ totals.throttles }} throttles</p></div>
34
+ <div class="panel"><h3>Invocations</h3><div class="stat">{{ live ? fmt(totals.invocations) : 'Unavailable' }}</div><p class="note">{{ live ? totals.concurrency + ' concurrent now' : 'CloudWatch collection unavailable' }}</p></div>
35
+ <div class="panel"><h3>Error rate</h3><div class="stat">{{ live ? totals.errorRatePct + '%' : 'Unavailable' }}</div><div class="bar"><i style="width: {{ live ? Math.min(100, totals.errorRatePct * 10) : 0 }}%"></i></div></div>
36
+ <div class="panel"><h3>p95 latency</h3><div class="stat">{{ live ? totals.p95Ms + ' ms' : 'Unavailable' }}</div><p class="note">{{ live && totals.coldStartPct != null ? totals.coldStartPct + '% cold starts' : 'Cold-start signal unavailable' }}</p></div>
37
+ <div class="panel"><h3>Est. cost</h3><div class="stat">{{ live && totals.estCostUsd != null ? '$' + totals.estCostUsd : 'Unavailable' }}</div><p class="note">{{ live ? totals.throttles + ' throttles' : 'Open Observability for collection status' }}</p></div>
41
38
  </div>
42
39
 
43
40
  <div class="section">
44
41
  <h2>Invocations over time</h2>
45
42
  <div class="panel">
46
- <div class="spark" style="height:96px">
43
+ @if (invSpark.length)<div class="spark" style="height:96px">
47
44
  @foreach (invSpark as h)
48
45
  <i style="height: {{ pct(h, 140) }}%"></i>
49
46
  @endforeach
50
- </div>
47
+ </div>@else<div class="compact empty"><strong>No historical buckets</strong><span>Open <a href="/operations/observability">Observability</a> for persisted metrics and explicit gaps.</span></div>@endif
51
48
  <p class="note">hourly buckets · last {{ window }}</p>
52
49
  </div>
53
50
  </div>
@@ -55,24 +52,28 @@ function pct(v, max) { return Math.round((v / max) * 100) }
55
52
  <div class="section">
56
53
  <h2>Per function</h2>
57
54
  <div class="panel">
55
+ @if (perFn.length)
58
56
  <table>
59
- <thead><tr><th>Function</th><th>Invocations</th><th>Errors</th><th>Error rate</th><th>Throttles</th><th>Avg</th><th>Max</th><th>Est. cost</th></tr></thead>
57
+ <thead><tr><th scope="col">Function</th><th scope="col">Invocations</th><th scope="col">Errors</th><th scope="col">Error rate</th><th scope="col">Throttles</th><th scope="col">Avg</th><th scope="col">Max</th><th scope="col">Est. cost</th></tr></thead>
60
58
  <tbody>
61
59
  @foreach (perFn as f)
62
60
  <tr>
63
61
  <td><span class="tag">{{ f.key }}</span></td>
64
62
  <td>{{ fmt(f.invocations) }}</td>
65
63
  <td>@if (f.errors > 0)<span class="bad pill">{{ f.errors }}</span>@else<span style="color:var(--txt3)">0</span>@endif</td>
66
- <td class="mono">{{ (f.errors / f.invocations * 100).toFixed(2) }}%</td>
64
+ <td class="mono">{{ f.invocations ? (f.errors / f.invocations * 100).toFixed(2) + '%' : '—' }}</td>
67
65
  <td>{{ f.throttles }}</td>
68
66
  <td class="mono">{{ f.avgMs }}ms</td>
69
67
  <td class="mono">{{ f.maxMs }}ms</td>
70
- <td style="color:var(--txt2)">${{ f.costUsd }}</td>
68
+ <td style="color:var(--txt2)">{{ f.costUsd == null ? 'Unavailable' : '$' + f.costUsd }}</td>
71
69
  </tr>
72
70
  @endforeach
73
71
  </tbody>
74
72
  </table>
75
- <p class="note">Live: <span class="mono">cloud metrics --since {{ window }}</span> · open in console with <span class="mono">cloud metrics:dashboard</span></p>
73
+ @else
74
+ <div class="empty"><strong>No function metrics</strong><span>Metrics appear after a deployed function receives traffic.</span></div>
75
+ @endif
76
+ <p class="note">Source: CloudWatch · {{ window }} aggregation · <a href="/operations/observability">correlate with logs, traces, requests, and releases</a></p>
76
77
  </div>
77
78
  </div>
78
79
  </div>