@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.
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
@@ -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
- const busy = state(false)
23
+ function fmtQueue(n) { n = Number(n || 0); return n >= 1000 ? (n / 1000).toFixed(n >= 10000 ? 0 : 1) + 'k' : String(n) }
22
24
 
23
- // Op runner (redrive / purge / per-queue purge) - typed-confirm bar.
24
- const opOutput = state('')
25
- const opShown = state(false)
26
- const pending = state(null)
27
- const typed = state('')
28
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
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
- async function runOp() {
46
- const p = pending()
47
- if (!p || typed() !== p.confirm) return
48
- pending.set(null); typed.set('')
49
- opShown.set(true); opOutput.set('Running...')
50
- busy.set(true)
51
- try {
52
- let res
53
- if (p.kind === 'redrive')
54
- res = await fetch('/api/serverless/dlq/redrive', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ confirm: 'redrive', targetQueue: target(), max: 25 }) })
55
- else if (p.kind === 'purge-dlq')
56
- res = await fetch('/api/serverless/dlq/purge', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ confirm: 'purge' }) })
57
- else
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
- @foreach (queues as q)
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)">{{ fmt(q.processed) }}</td>
97
- <td>@if (q.dlq > 0)<span class="bad pill">{{ q.dlq }}</span>@else<span style="color:var(--txt3)">0</span>@endif</td>
98
- <td class="table-actions"><button class="btn danger sm" type="button" @click="askOp('purge-queue:{{ q.short }}', '{{ q.short }}', 'purge the {{ q.short }} queue')">Purge</button></td>
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
- @endforeach
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', 'redrive', 'move DLQ messages back onto the source queue')">Redrive</button>
121
- <button class="btn danger sm" type="button" :disabled="busy()" @click="askOp('purge-dlq', 'purge', 'permanently purge the dead-letter queue')">Purge DLQ</button>
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 = state(false)
23
-
24
- // Delete flow uses a typed-confirm (the secret id) before firing.
25
- const pendingDelete = state(null)
26
- const typedDelete = state('')
27
- const canDelete = derived(() => { const p = pendingDelete(); return !!p && typedDelete() === p })
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 pickSource(src) { secretId.set(src) }
48
- function askDelete(src) { pendingDelete.set(src); typedDelete.set('') }
49
- function cancelDelete() { pendingDelete.set(null); typedDelete.set('') }
50
- async function confirmDelete() {
51
- const id = pendingDelete()
52
- if (!id || typedDelete() !== id) return
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
- <div class="op-confirm" @show="pendingDelete() !== null" style="margin-top:14px">
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="setSecret()">Save secret</button>
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`); the sample
4
- // values below render the design when nothing is injected. Sections drill into
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 app = __d?.app ?? {
12
- name: 'acme', env: 'production', region: 'us-east-1', runtime: 'php-8.3 (fpm)',
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: 184320, errorRatePct: 0.12, p95Ms: 86, coldStartPct: 1.8, concurrency: 42, estCostUsd: 7.4 }
17
- const functions = __d?.functions ?? [
18
- { key: 'http', name: 'acme-production-http', memory: 1024, timeout: 28, runtime: 'provided.al2023', invocations: 171200, errors: 21, p95: 86, status: 'active' },
19
- { key: 'queue', name: 'acme-production-queue', memory: 1024, timeout: 120, runtime: 'provided.al2023', invocations: 12840, errors: 3, p95: 240, status: 'active' },
20
- { key: 'cli', name: 'acme-production-cli', memory: 1024, timeout: 900, runtime: 'provided.al2023', invocations: 1440, errors: 0, p95: 1100, status: 'active' },
21
- ]
22
- const queues = __d?.queues ?? [
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
- { sha: 'a4d63d2', status: 'success', when: '12m ago', took: '41s', by: 'chris' },
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 = state('')
63
- const opShown = state(false)
64
- const pending = state(null)
65
- const typed = state('')
66
- const confirmTok = derived(() => { const p = pending(); return p ? p.confirm : '' })
67
- const confirmVerb = derived(() => { const p = pending(); return p ? p.verb : '' })
68
- const canRun = derived(() => { const p = pending(); return !!p && typed() === p.confirm })
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', 'maintenance', 'enable maintenance mode')">Maintenance</button>
141
- <button class="btn ghost sm" type="button" @show="maint()" @click="askOp('maintenance:off', 'live', 'bring the app back live')">Go live</button>
142
- <button class="btn ghost sm" type="button" @click="askOp('rollback', 'rollback', 'roll back to the previous build')">Roll back</button>
143
- <button class="btn sm" type="button" @click="askOp('redeploy', 'redeploy', 'redeploy the current build')">Redeploy</button>
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 }} concurrent now</p>
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 }}%</div>
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 }} <small>ms</small></div>
165
- <p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">{{ metrics.coldStartPct }}% cold starts</p>
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">${{ metrics.estCostUsd }}</div>
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', 'rollback', 'roll back to the previous build')">Roll back to previous</button>
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
- <input :value="appCmd()" @input="appCmd.set($event.target.value)" @keydown.enter="askAppCmd()" placeholder="e.g. migrate --force, cache:clear, queue:retry all" autocomplete="off" aria-label="App command to run">
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.56",
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-cloud/aws-types": "0.7.56",
93
- "@ts-cloud/core": "0.7.56",
94
- "@stacksjs/ts-xml": "^0.1.0"
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
- "bunfig": "^0.15.6",
98
- "better-dx": "^0.2.16"
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
  }