@samyx/preview-stacks-ui-hearth 0.0.0-stage → 0.43.0

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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -2
  3. package/dist/assets/ConfigView-DdEhTo0d.css +1 -0
  4. package/dist/assets/ConfigView-nQLAHdV-.js +4 -0
  5. package/dist/assets/ConfigView-nQLAHdV-.js.map +1 -0
  6. package/dist/assets/ControlView-Cg4SUV8Q.js +2 -0
  7. package/dist/assets/ControlView-Cg4SUV8Q.js.map +1 -0
  8. package/dist/assets/ControlView-gcpfs_0z.css +1 -0
  9. package/dist/assets/DeploymentView-C4h3spUV.css +32 -0
  10. package/dist/assets/DeploymentView-D_wV0QNw.js +4 -0
  11. package/dist/assets/DeploymentView-D_wV0QNw.js.map +1 -0
  12. package/dist/assets/DeploymentsView-Be8tO0RI.js +2 -0
  13. package/dist/assets/DeploymentsView-Be8tO0RI.js.map +1 -0
  14. package/dist/assets/JobView-DL9KQcjx.js +2 -0
  15. package/dist/assets/JobView-DL9KQcjx.js.map +1 -0
  16. package/dist/assets/JobsView-Bq4PtEaW.js +2 -0
  17. package/dist/assets/JobsView-Bq4PtEaW.js.map +1 -0
  18. package/dist/assets/NotFoundView-BKHjS8HU.js +2 -0
  19. package/dist/assets/NotFoundView-BKHjS8HU.js.map +1 -0
  20. package/dist/assets/NotifiersView-D5vKpsLv.js +2 -0
  21. package/dist/assets/NotifiersView-D5vKpsLv.js.map +1 -0
  22. package/dist/assets/OverviewView-B1-3hrnt.js +2 -0
  23. package/dist/assets/OverviewView-B1-3hrnt.js.map +1 -0
  24. package/dist/assets/PublicLogsView-DiaM3Lue.js +2 -0
  25. package/dist/assets/PublicLogsView-DiaM3Lue.js.map +1 -0
  26. package/dist/assets/RegistriesView-B4_mlmfk.js +2 -0
  27. package/dist/assets/RegistriesView-B4_mlmfk.js.map +1 -0
  28. package/dist/assets/RoutingView-BdDmKEyt.js +8 -0
  29. package/dist/assets/RoutingView-BdDmKEyt.js.map +1 -0
  30. package/dist/assets/SettingsView-DGCUHaEa.js +2 -0
  31. package/dist/assets/SettingsView-DGCUHaEa.js.map +1 -0
  32. package/dist/assets/SpecView-DLJmZfcg.js +2 -0
  33. package/dist/assets/SpecView-DLJmZfcg.js.map +1 -0
  34. package/dist/assets/SpecsView-C5pGVmTz.js +2 -0
  35. package/dist/assets/SpecsView-C5pGVmTz.js.map +1 -0
  36. package/dist/assets/SsoView-BipGP6-f.css +1 -0
  37. package/dist/assets/SsoView-bu6hnfgi.js +2 -0
  38. package/dist/assets/SsoView-bu6hnfgi.js.map +1 -0
  39. package/dist/assets/SubmitView-Pn5RI-pQ.js +5 -0
  40. package/dist/assets/SubmitView-Pn5RI-pQ.js.map +1 -0
  41. package/dist/assets/SubmitView-vnNiLimF.css +1 -0
  42. package/dist/assets/SwarmView-BW36b2OW.js +2 -0
  43. package/dist/assets/SwarmView-BW36b2OW.js.map +1 -0
  44. package/dist/assets/UsersView-C9v4aLDt.js +2 -0
  45. package/dist/assets/UsersView-C9v4aLDt.js.map +1 -0
  46. package/dist/assets/VarEditor-CrEUwpXW.css +1 -0
  47. package/dist/assets/VarEditor-DYmuml3i.js +4 -0
  48. package/dist/assets/VarEditor-DYmuml3i.js.map +1 -0
  49. package/dist/assets/VariablesView-D92ymqfM.css +1 -0
  50. package/dist/assets/VariablesView-tY-jjPvM.js +3 -0
  51. package/dist/assets/VariablesView-tY-jjPvM.js.map +1 -0
  52. package/dist/assets/_commonjsHelpers-CqkleIqs.js +2 -0
  53. package/dist/assets/_commonjsHelpers-CqkleIqs.js.map +1 -0
  54. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +2 -0
  55. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js.map +1 -0
  56. package/dist/assets/addon-fit-CevVMrUA.js +2 -0
  57. package/dist/assets/addon-fit-CevVMrUA.js.map +1 -0
  58. package/dist/assets/api-control-rHTQCPsG.js +2 -0
  59. package/dist/assets/api-control-rHTQCPsG.js.map +1 -0
  60. package/dist/assets/api-core-DUb3ejZ0.js +2 -0
  61. package/dist/assets/api-core-DUb3ejZ0.js.map +1 -0
  62. package/dist/assets/api-deployment-HPEzQSZD.js +2 -0
  63. package/dist/assets/api-deployment-HPEzQSZD.js.map +1 -0
  64. package/dist/assets/deployments-CDLMPXV3.js +2 -0
  65. package/dist/assets/deployments-CDLMPXV3.js.map +1 -0
  66. package/dist/assets/format-Dr8IZDXn.js +2 -0
  67. package/dist/assets/format-Dr8IZDXn.js.map +1 -0
  68. package/dist/assets/hostcfg-Dub2pvbc.js +2 -0
  69. package/dist/assets/hostcfg-Dub2pvbc.js.map +1 -0
  70. package/dist/assets/index-B0aG0aPW.css +1 -0
  71. package/dist/assets/index-Cthapg0Q.js +32 -0
  72. package/dist/assets/index-Cthapg0Q.js.map +1 -0
  73. package/dist/assets/jobs-Bz_YeOAs.js +2 -0
  74. package/dist/assets/jobs-Bz_YeOAs.js.map +1 -0
  75. package/dist/assets/labels-wffzJI2t.js +2 -0
  76. package/dist/assets/labels-wffzJI2t.js.map +1 -0
  77. package/dist/assets/now-C-iOYv8-.js +2 -0
  78. package/dist/assets/now-C-iOYv8-.js.map +1 -0
  79. package/dist/assets/problem-Cs7tz86T.js +2 -0
  80. package/dist/assets/problem-Cs7tz86T.js.map +1 -0
  81. package/dist/assets/settings-problem-FNvf54oZ.js +2 -0
  82. package/dist/assets/settings-problem-FNvf54oZ.js.map +1 -0
  83. package/dist/assets/specs-BeT22mvD.css +1 -0
  84. package/dist/assets/specs-C68KO8RX.js +41 -0
  85. package/dist/assets/specs-C68KO8RX.js.map +1 -0
  86. package/dist/assets/use-logs-BD6ml1rA.js +4 -0
  87. package/dist/assets/use-logs-BD6ml1rA.js.map +1 -0
  88. package/dist/assets/use-slash-focus-BeKibFvm.js +2 -0
  89. package/dist/assets/use-slash-focus-BeKibFvm.js.map +1 -0
  90. package/dist/assets/varformats-DSwvKZLe.js +12 -0
  91. package/dist/assets/varformats-DSwvKZLe.js.map +1 -0
  92. package/dist/assets/vars-C8sghQal.js +2 -0
  93. package/dist/assets/vars-C8sghQal.js.map +1 -0
  94. package/dist/assets/xterm-D6Mng-DB.js +10 -0
  95. package/dist/assets/xterm-D6Mng-DB.js.map +1 -0
  96. package/dist/index.html +15 -0
  97. package/nginx.conf +68 -0
  98. package/package.json +34 -4
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["useDeploymentActions","id","dep","router","useRouter","pending","ref","error","conflict","conflictJobId","busy","computed","_a","why","a","forceArmed","can","auth","whyDisabled","reset","onConflict","b","classifyConflict","stack","_b","data","j","act","action","opts","forget","label","ACTION_LABEL","r","deploymentApi","job","toast","refresh","problemText","forgetRecord","props","__props","watch","openDetail","HOOKS","columns","rows","detail","_createBlock","_unref","HCard","_createVNode","HButton","reloadDetail","HSkeleton","HAlert","HStack","HDataTable","row","column","value","_createElementBlock","_Fragment","_renderList","h","HBadge","unverifiableAxes","stored","storedItems","k","v","clashes","conflictingVars","count","e","VarEditor","_cache","$event","persistVars","applyVars","HText","HDescriptionList","_createTextVNode","_toDisplayString","_openBlock","_hoisted_2","hint","c","open","text","curlFor","HDialog","HCodeBlock","shared","sleepWhy","shareDetails","shareLogs","ttl","link","shareError","sharing","views","shareViews","createLink","verify","typed","armed","downWhy","interrupted","stopping","stopEverything","n","ask","reactive","COPY","kind","confirmed","force","EquivalentCommand","sharePath","HCheckbox","HSelect","SHARE_TTLS","HCopyField","HInput","ConflictNote","_createElementVNode","HAlertDialog","route","useRoute","selected","tail","since","timestamps","query","containers","containersWithServices","current","service","tailN","logs","useLogs","containerOptions","TAILS","SINCES","hasCompose","swarm","select","name","list","wanted","entries","only","names","out","line","p","parseLogLine","logLevel","download","filterLines","url","logFileName","HSwitch","HLogViewer","MAX_FOLLOW_LINES","q","HEmptyState","stamp","at","items","d","sentence","s","parts","_c","wakeOn","on","rd","rdError","rdLoading","checkReadiness","rdColumns","rdRows","rdTone","f","emit","__emit","go","tab","container","running","hasNode","findings","sortFindings","worst","showFindings","routeColumns","routeRows","routeTarget","containerColumns","named","byLabel","containerRows","rid","containerState","byId","actionsFor","locked","urlFor","VERB","onRowAction","u","runVerb","findingLabel","_withCtx","_hoisted_1","taskOf","i","findingTone","SHELLS","shell","phase","closeReason","host","term","shallowRef","socket","observer","gen","reachable","options","live","connect","mine","Terminal","FitAddon","__vitePreload","t","fit","ws","terminalUrl","disconnect","teardown","onBeforeUnmount","runtime","missing","loading","refreshing","detailError","runtimeError","actions","load","poll","reload","appliedVars","varsQuery","readVars","varsDetail","allTabs","tabs","state","runState","fields","ago","_d","primary","blocked","timeline","took","jobTone","HErrorPage","HResourceDetail","DeploymentOverview","ConfigTab","RuntimeTab","AxesTab","RequiresTab","TerminalTab","DeploymentLogs","HTimeline","DeploymentDanger"],"ignoreList":[],"sources":["../../src/lib/use-deployment-actions.ts","../../src/views/deployment/AxesTab.vue","../../src/views/deployment/ConfigTab.vue","../../src/views/deployment/ConflictNote.vue","../../src/views/deployment/EquivalentCommand.vue","../../src/views/deployment/DeploymentDanger.vue","../../src/views/deployment/DeploymentLogs.vue","../../src/views/deployment/DeploymentOverview.vue","../../src/views/deployment/RequiresTab.vue","../../src/views/deployment/RuntimeTab.vue","../../src/views/deployment/TerminalTab.vue","../../src/views/DeploymentView.vue"],"sourcesContent":["/**\n * Lifecycle actions for the open deployment. One instance is shared by the page header (Deploy,\n * Verify, Wake) and the Danger section (Sleep, Tear down, Forget), so both see the same pending\n * state: two copies is how a button stays enabled while the other knows a job is running.\n */\nimport { computed, ref, type Ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { ACTION_LABEL } from '../format';\nimport { auth, data, refresh, toast } from '../state';\nimport { can } from './users';\nimport { deploymentApi, type DeploymentDetail } from '../api-deployment';\nimport type { Lifecycle } from '../api';\nimport { classifyConflict, problemText, whyDisabled, type Conflict, type ConflictBody } from './deployment';\n\nexport type Pending = '' | Lifecycle | 'down-forget' | 'forget';\n\nexport function useDeploymentActions(id: () => string, dep: Ref<DeploymentDetail | null>) {\n const router = useRouter();\n const pending = ref<Pending>('');\n const error = ref('');\n const conflict = ref<Conflict | null>(null);\n const conflictJobId = ref('');\n const busy = computed(() => dep.value?.busy === true);\n\n // Below developer every one of these is a 403: say so up front. The server still decides.\n const why = (a: Lifecycle, forceArmed = false): string => (can('developer', auth) ? whyDisabled(a, dep.value, forceArmed) : 'Needs the developer role.');\n\n function reset(): void {\n pending.value = '';\n error.value = '';\n conflict.value = null;\n conflictJobId.value = '';\n }\n\n function onConflict(b: ConflictBody): void {\n const c = classifyConflict(b);\n conflict.value = c;\n // A running job is only offered as a link; \"a job is in flight\" and \"docker did not answer\" look alike.\n const stack = c.stack || dep.value?.stack;\n conflictJobId.value = c.kind === 'other' && stack ? (data.jobs.find((j) => j.state === 'running' && j.stack === stack)?.id ?? '') : '';\n }\n\n async function act(action: Lifecycle, opts: { verify?: boolean; force?: boolean; forget?: boolean } = {}): Promise<void> {\n if (!dep.value) return;\n const forget = action === 'down' && !!opts.forget;\n const label = forget ? 'Tear down and forget' : ACTION_LABEL[action]!;\n pending.value = forget ? 'down-forget' : action;\n error.value = '';\n conflict.value = null;\n const r = await deploymentApi.act(id(), action, opts);\n pending.value = '';\n if (r.status === 202) {\n const job = r.body.job;\n if (!job?.id) {\n error.value = 'Started, but there is no job to follow. Check Jobs.';\n return;\n }\n toast(`${label} ${job.state === 'queued' ? 'queued' : 'started'}`, 'success', job.stack);\n void refresh();\n void router.push(`/jobs/${encodeURIComponent(job.id)}`);\n return;\n }\n if (r.status === 409) return onConflict(r.body);\n error.value = problemText(r.status, r.body.error, label);\n toast(`${label} refused`, 'danger', error.value);\n }\n\n /** Removes the record only. The server refuses with 409 while any container exists. */\n async function forgetRecord(): Promise<void> {\n pending.value = 'forget';\n error.value = '';\n conflict.value = null;\n const r = await deploymentApi.forget(id());\n pending.value = '';\n if (r.ok) {\n toast('Forgotten', 'success', id());\n void refresh();\n void router.push('/deployments');\n return;\n }\n if (r.status === 409) return onConflict(r.body);\n error.value = problemText(r.status, r.body.error, 'Forget');\n }\n\n return { pending, error, conflict, conflictJobId, busy, why, reset, act, forgetRecord };\n}\n\nexport type DeploymentActions = ReturnType<typeof useDeploymentActions>;\n","<script setup lang=\"ts\">\n/**\n * Axes and their hooks. An axis with no `assert_gone` cannot be proven torn down: a third state,\n * neither pass nor fail, never shown as success.\n */\nimport { computed, watch } from 'vue';\nimport { HAlert, HBadge, HButton, HCard, HDataTable, HSkeleton, HStack, type TableColumn } from '@hearth-ui/vue';\nimport type { DeploymentRow, Runtime } from '@samyx/preview-stacks-client';\nimport type { HookName } from '../../api-vars';\nimport { detail, openDetail, reloadDetail, unverifiableAxes } from '../../vars/useDetail';\n\nconst props = defineProps<{ id: string; dep: DeploymentRow | null; runtime: Runtime | null }>();\nwatch(() => props.id, openDetail, { immediate: true });\n\nconst HOOKS: HookName[] = ['up', 'assert_live', 'down', 'assert_gone'];\nconst columns: TableColumn[] = [\n { key: 'name', label: 'Axis', sortable: true },\n { key: 'hooks', label: 'Hooks' },\n { key: 'verifiable', label: 'Teardown provable' },\n];\nconst rows = computed(() => (detail.data?.axes ?? []).map((a) => ({ id: a.name, name: a.name, hooks: a.hooks, verifiable: a.verifiable })));\n</script>\n\n<template>\n <HCard title=\"Axes\">\n <template #footer>\n <HButton variant=\"secondary\" icon=\"arrow\" label=\"Re-resolve\" :loading=\"detail.loading\" @click=\"reloadDetail\" />\n </template>\n <HSkeleton v-if=\"detail.loading && !detail.data && !detail.error\" variant=\"text\" :lines=\"3\" label=\"Loading axes\" />\n <HAlert v-else-if=\"detail.error\" tone=\"danger\" title=\"Spec did not resolve\" :description=\"detail.error\" />\n <HStack v-else direction=\"column\" :gap=\"3\">\n <HDataTable :rows=\"rows\" :columns=\"columns\" label=\"Axes\" empty-text=\"No axes.\">\n <template #cell=\"{ row, column, value }\">\n <HStack direction=\"row\" v-if=\"column.key === 'hooks'\" :gap=\"1\" wrap>\n <HBadge v-for=\"h in HOOKS\" :key=\"h\" size=\"sm\" :label=\"(row.hooks as string[]).includes(h) ? h : `${h} (none)`\" :variant=\"(row.hooks as string[]).includes(h) ? 'soft' : 'dashed'\" />\n </HStack>\n <HBadge v-else-if=\"column.key === 'verifiable'\" :tone=\"value ? 'success' : 'warning'\" :label=\"value ? 'assert_gone' : 'Unverifiable'\" />\n <template v-else>{{ value }}</template>\n </template>\n </HDataTable>\n <HAlert\n v-if=\"unverifiableAxes.length\"\n tone=\"warning\"\n :title=\"`${unverifiableAxes.length === 1 ? '1 axis cannot' : `${unverifiableAxes.length} axes cannot`} be verified: ${unverifiableAxes.join(', ')}`\"\n />\n </HStack>\n </HCard>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Request variables (what we send) and declared env (what the spec declares).\n * A request variable overrides a stored one, so `up` and `down` can resolve to different stacks\n * if they disagree. The pairs are remembered per browser; other clients send their own.\n */\nimport { computed, watch } from 'vue';\nimport { HAlert, HBadge, HButton, HCard, HDataTable, HDescriptionList, HSkeleton, HStack, HText, type TableColumn } from '@hearth-ui/vue';\nimport type { DeploymentRow, Runtime } from '@samyx/preview-stacks-client';\nimport { conflictingVars } from '../../lib/vars';\nimport { applyVars, detail, openDetail, persistVars } from '../../vars/useDetail';\nimport VarEditor from '../../vars/VarEditor.vue';\n\nconst props = defineProps<{ id: string; dep: DeploymentRow | null; runtime: Runtime | null }>();\nwatch(() => props.id, openDetail, { immediate: true });\n\nconst stored = computed(() => props.dep?.vars);\nconst storedItems = computed(() => Object.entries(stored.value ?? {}).map(([k, v]) => ({ key: k, label: k, value: v })));\nconst clashes = computed(() => conflictingVars(detail.vars, stored.value));\nconst count = computed(() => detail.vars.filter((e) => e.k).length);\n\nconst columns: TableColumn[] = [\n { key: 'key', label: 'Key', sortable: true },\n { key: 'value', label: 'Value' },\n { key: 'visibility', label: 'Visibility', hideBelow: 420 },\n { key: 'length', label: 'Length (chars)', align: 'end', hideBelow: 520 },\n];\nconst rows = computed(() => (detail.data?.env ?? []).map((e) => ({ ...e, id: e.key })));\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HCard title=\"Request variables\" description=\"Per browser.\">\n <HStack direction=\"column\" :gap=\"3\">\n <VarEditor v-model=\"detail.vars\" @change=\"persistVars\" />\n <HStack direction=\"row\" :gap=\"3\" align=\"center\" wrap>\n <HButton variant=\"primary\" :loading=\"detail.loading\" @click=\"applyVars\">Apply and reload</HButton>\n <HText tone=\"muted\" size=\"sm\">{{ count ? `${count} variable${count === 1 ? '' : 's'}` : 'No variables' }}</HText>\n </HStack>\n </HStack>\n </HCard>\n\n <HCard v-if=\"storedItems.length\" title=\"Stored on the server\" description=\"Request variables override these.\">\n <HStack direction=\"column\" :gap=\"3\">\n <HDescriptionList :items=\"storedItems\" variant=\"inline\" dense />\n <HAlert v-if=\"clashes.length\" tone=\"warning\" :title=\"`Overridden: ${clashes.join(', ')}`\" description=\"Stacks differ.\" />\n </HStack>\n </HCard>\n\n <HCard title=\"Declared env\" description=\"After interpolation.\">\n <HSkeleton v-if=\"detail.loading && !detail.data && !detail.error\" variant=\"text\" :lines=\"4\" label=\"Loading env\" />\n <HAlert v-else-if=\"detail.error\" tone=\"danger\" title=\"Spec did not resolve\" :description=\"detail.error\" />\n <HStack v-else direction=\"column\" :gap=\"3\">\n <HDataTable :rows=\"rows\" :columns=\"columns\" label=\"Declared env\" empty-text=\"No env block.\" :page-size=\"25\">\n <template #cell=\"{ row, column, value }\">\n <HBadge v-if=\"column.key === 'visibility'\" :tone=\"value === 'masked' ? 'warning' : 'neutral'\" :label=\"String(value)\" />\n <template v-else-if=\"column.key === 'length'\">\n {{ value }}\n <HBadge v-if=\"value === 0\" tone=\"warning\" label=\"Never set\" />\n </template>\n <code v-else-if=\"column.key === 'value' && row.visibility === 'masked'\">{{ value }}</code>\n <span v-else-if=\"column.key === 'value'\" class=\"wrap\">{{ value }}</span>\n <template v-else>{{ value }}</template>\n </template>\n </HDataTable>\n <HText tone=\"muted\" size=\"sm\">Masked values are never sent to this page.</HText>\n </HStack>\n </HCard>\n </HStack>\n</template>\n\n<style scoped>\n.wrap {\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * A 409, explained. It always means refused, nothing started; the cause differs and the fix with it.\n * The server's own message is printed verbatim and nothing is retried.\n */\nimport { computed } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { HAlert, HButton } from '@hearth-ui/vue';\nimport type { Conflict } from '../../lib/deployment';\n\nconst props = defineProps<{ conflict: Conflict; jobId?: string }>();\nconst router = useRouter();\n\nconst hint = computed(() => {\n const c = props.conflict;\n if (c.kind === 'shared') return 'Type the stack name and tear down again.';\n if (c.kind === 'containers') return 'Tear down first. Forgetting now would orphan those containers.';\n if (c.kind === 'referenced') return `Still used by ${c.deployments.join(', ')}.`;\n return props.jobId ? '' : 'Nothing was retried. Wait for the current work to finish.';\n});\n</script>\n\n<template>\n <HAlert :tone=\"conflict.kind === 'shared' ? 'warning' : 'info'\" title=\"Refused. Nothing was started.\" :description=\"[conflict.text, hint].filter(Boolean).join(' ')\">\n <HButton v-if=\"jobId\" variant=\"ghost\" label=\"Follow the running job\" trailing-icon=\"right\" @click=\"router.push(`/jobs/${encodeURIComponent(jobId)}`)\" />\n </HAlert>\n</template>\n","<script setup lang=\"ts\">\n/** \"Show equivalent command\": the curl for the request the button beside it sends. The token stays a variable. */\nimport { computed, ref } from 'vue';\nimport { HButton, HCodeBlock, HDialog } from '@hearth-ui/vue';\nimport { curlFor } from '../../lib/deployment';\n\nconst props = defineProps<{ method: string; path: string; body?: unknown }>();\nconst open = ref(false);\nconst text = computed(() => curlFor(`${location.protocol}//${location.host}`, props.method, props.path, props.body));\n</script>\n\n<template>\n <HButton variant=\"ghost\" icon=\"code\" label=\"Equivalent command\" @click=\"open = true\" />\n <HDialog :open=\"open\" title=\"Equivalent command\" description=\"$PSTACK_TOKEN stays a variable.\" @close=\"open = false\">\n <HCodeBlock :code=\"text\" language=\"bash\" title=\"curl\" wrap />\n </HDialog>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Sleep, share, tear down, stop, forget. Deploy and Verify are in the page header; this section is\n * what destroys something or mints a credential, and every destructive button here asks first.\n *\n * Two guards matter. A shared tear down needs the stack name typed out (a checkbox is one stray\n * click; the server also refuses without `force`). Forgetting removes the record only and never\n * touches a container; the server refuses while any exists, or while Docker cannot confirm.\n */\nimport { computed, reactive, ref, watch } from 'vue';\nimport { HAlert, HAlertDialog, HButton, HCard, HCheckbox, HCopyField, HInput, HSelect, HStack, HText } from '@hearth-ui/vue';\nimport { deploymentApi, sharePath, type DeploymentDetail } from '../../api-deployment';\nimport { refresh, toast } from '../../state';\nimport { problemText, SHARE_TTLS, shareViews } from '../../lib/deployment';\nimport type { DeploymentActions } from '../../lib/use-deployment-actions';\nimport type { ShareLink } from '@samyx/preview-stacks-client';\nimport ConflictNote from './ConflictNote.vue';\nimport EquivalentCommand from './EquivalentCommand.vue';\n\nconst props = defineProps<{ id: string; dep: DeploymentDetail | null; actions: DeploymentActions }>();\nconst a = props.actions;\n\nconst shared = computed(() => props.dep?.kind === 'shared');\nconst stack = computed(() => props.dep?.stack ?? '');\n\n// ── sleep ───────────────────────────────────────────────────────────────────────────────────────\nconst sleepWhy = computed(() => a.why('sleep'));\n\n// ── share: a credential, shown once, held in this component only ────────────────────────────────\nconst shareDetails = ref(true);\nconst shareLogs = ref(true);\nconst ttl = ref('7d');\nconst link = ref<ShareLink | null>(null);\nconst shareError = ref('');\nconst sharing = ref(false);\nconst views = computed(() => shareViews(shareDetails.value, shareLogs.value));\n\nasync function createLink(): Promise<void> {\n sharing.value = true;\n shareError.value = '';\n link.value = null;\n const r = await deploymentApi.share(props.id, views.value, ttl.value);\n sharing.value = false;\n if (r.status === 201) link.value = r.body;\n else shareError.value = problemText(r.status, r.body.error, 'Share link');\n}\n\n// ── tear down ───────────────────────────────────────────────────────────────────────────────────\nconst verify = ref(true);\nconst typed = ref('');\n// Exact match against the resolved stack name. Nothing looser.\nconst armed = computed(() => !!stack.value && typed.value === stack.value);\nconst downWhy = computed(() => a.why('down', armed.value));\n\nconst interrupted = ref(false);\nconst stopping = ref(false);\nasync function stopEverything(): Promise<void> {\n stopping.value = true;\n const r = await deploymentApi.cancel(props.id);\n stopping.value = false;\n if (!r.ok) {\n toast('Stop refused', 'danger', problemText(r.status, r.body.error, 'Stop'));\n return;\n }\n const n = r.body.cancelled.length;\n toast(n ? `Stopped ${n} job${n > 1 ? 's' : ''}` : 'Nothing was running or queued', n ? 'success' : 'info');\n // Cancelling a running job undoes nothing it already did; a queued one never ran.\n interrupted.value = r.body.cancelled.some((j) => j.state === 'running');\n void refresh();\n}\n\n// ── one dialog for every destructive button ─────────────────────────────────────────────────────\ntype Ask = 'down' | 'down-forget' | 'stop' | 'forget';\nconst ask = reactive({ open: false, kind: 'down' as Ask });\nconst COPY: Record<Ask, { title: string; text: string; confirm: string }> = {\n down: { title: 'Tear down', text: 'Containers, networks and volumes are removed.', confirm: 'Tear down' },\n 'down-forget': { title: 'Tear down and forget', text: 'Tears down, then removes the record if nothing is left behind.', confirm: 'Tear down and forget' },\n stop: { title: 'Stop everything on this stack', text: 'Cancels the running job and the one queued behind it. Nothing is undone.', confirm: 'Stop everything' },\n forget: { title: 'Forget this deployment', text: 'Removes the record only. Containers are not touched.', confirm: 'Forget' },\n};\nfunction open(kind: Ask): void {\n ask.kind = kind;\n ask.open = true;\n}\nfunction confirmed(): void {\n ask.open = false;\n const force = shared.value && armed.value;\n if (ask.kind === 'down') void a.act('down', { verify: verify.value, force });\n else if (ask.kind === 'down-forget') void a.act('down', { verify: true, force, forget: true });\n else if (ask.kind === 'stop') void stopEverything();\n else void a.forgetRecord();\n}\n\nwatch(\n () => props.id,\n () => {\n link.value = null;\n shareError.value = '';\n typed.value = '';\n interrupted.value = false;\n },\n);\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HAlert v-if=\"!dep\" tone=\"warning\" title=\"Needs this deployment's variables\" description=\"Open Config to set them.\" />\n\n <HCard v-if=\"dep && !shared\">\n <template #header><HText weight=\"medium\">Sleep</HText></template>\n <HStack direction=\"column\" :gap=\"3\">\n <HText tone=\"muted\">Takes the {{ dep.orchestrator === 'swarm' ? 'swarm stack' : 'compose project' }} down and keeps its volumes. A request to its hostnames wakes it.</HText>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\">\n <HButton label=\"Sleep now\" icon=\"moon\" :loading=\"a.pending.value === 'sleep'\" :disabled=\"!!a.pending.value || !!sleepWhy\" @click=\"a.act('sleep')\" />\n <HText v-if=\"sleepWhy\" tone=\"muted\" size=\"sm\">{{ sleepWhy }}</HText>\n </HStack>\n </HStack>\n </HCard>\n\n <HCard v-if=\"dep\">\n <template #header>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\" justify=\"between\">\n <HText weight=\"medium\">Share a read-only link</HText>\n <EquivalentCommand method=\"POST\" :path=\"sharePath(id)\" :body=\"{ views, ttl }\" />\n </HStack>\n </template>\n <HStack direction=\"column\" :gap=\"3\">\n <HText tone=\"muted\">Read-only, this deployment only. No per-link revoke: rotating PSTACK_TOKEN ends every link.</HText>\n <HStack direction=\"row\" :gap=\"4\" wrap align=\"end\">\n <HCheckbox v-model=\"shareDetails\" label=\"Details and containers\" />\n <HCheckbox v-model=\"shareLogs\" label=\"Logs\" />\n <HSelect v-model=\"ttl\" label=\"Expires in\" :options=\"SHARE_TTLS\" />\n <HButton label=\"Create link\" :loading=\"sharing\" :disabled=\"sharing || !views.length\" @click=\"createLink\" />\n </HStack>\n <HText v-if=\"!views.length\" tone=\"muted\" size=\"sm\">Pick at least one view.</HText>\n <HAlert v-if=\"shareError\" tone=\"danger\" :title=\"shareError\" />\n <HAlert v-if=\"link\" tone=\"success\" title=\"Shown once. Copy it now.\" :description=\"`Opens ${link.views.join(' and ')} until ${new Date(link.expiresAt).toLocaleString()}.`\" dismissible @dismiss=\"link = null\">\n <HCopyField label=\"Share link\" :value=\"link.url\" secret />\n <HButton variant=\"ghost\" label=\"Open\" icon=\"launch\" :href=\"link.url\" target=\"_blank\" />\n </HAlert>\n </HStack>\n </HCard>\n\n <HCard v-if=\"dep\">\n <template #header><HText weight=\"medium\">Tear down</HText></template>\n <HStack direction=\"column\" :gap=\"3\">\n <HText tone=\"muted\">Stops and removes this deployment's containers, networks and volumes.</HText>\n\n <HAlert v-if=\"shared\" tone=\"warning\" title=\"Shared stack\" description=\"This deletes the volumes every preview on this host depends on. Nothing recreates them.\">\n <HInput v-model=\"typed\" :label=\"`Type ${stack} to confirm`\" :placeholder=\"stack\" autocomplete=\"off\" :error=\"typed && !armed ? 'Does not match.' : undefined\" />\n </HAlert>\n\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\">\n <HButton variant=\"danger\" :label=\"shared ? 'Tear down (force)' : 'Tear down'\" :loading=\"a.pending.value === 'down'\" :disabled=\"!!a.pending.value || !!downWhy\" @click=\"open('down')\" />\n <!-- One job: the teardown, then the record, only if it finished clean. Needs the leftovers check, or a leak is hidden. -->\n <HButton variant=\"danger\" label=\"Tear down and forget\" :loading=\"a.pending.value === 'down-forget'\" :disabled=\"!!a.pending.value || !!downWhy || !verify\" @click=\"open('down-forget')\" />\n <HCheckbox v-model=\"verify\" label=\"Check for leftovers afterwards\" />\n </HStack>\n <HText v-if=\"downWhy\" tone=\"muted\" size=\"sm\">{{ downWhy }}</HText>\n <HText v-if=\"!verify\" tone=\"muted\" size=\"sm\">Nothing will check that the teardown finished. Forgetting needs the check.</HText>\n <HText v-if=\"a.busy.value\" tone=\"muted\" size=\"sm\">A job is running on {{ stack }}. Tearing down cancels it first.</HText>\n <HText tone=\"muted\" size=\"sm\">Tear down and forget keeps the record if anything is left behind.</HText>\n\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\">\n <HButton variant=\"danger\" label=\"Stop everything on this stack\" :loading=\"stopping\" :disabled=\"stopping\" @click=\"open('stop')\" />\n <HText tone=\"muted\" size=\"sm\">Destroys nothing. Whatever already ran stays done.</HText>\n </HStack>\n <HAlert v-if=\"interrupted\" tone=\"warning\" title=\"Stopped mid-run\" description=\"What it created before stopping is still there. Run Verify.\" compact />\n\n <HAlert v-if=\"a.error.value\" tone=\"danger\" :title=\"a.error.value\" />\n <ConflictNote v-if=\"a.conflict.value\" :conflict=\"a.conflict.value\" :job-id=\"a.conflictJobId.value\" />\n </HStack>\n </HCard>\n\n <HCard v-if=\"dep\">\n <template #header><HText weight=\"medium\">Forget this deployment</HText></template>\n <HStack direction=\"column\" :gap=\"3\">\n <HText tone=\"muted\">Removes the record only. It never tears anything down. Refused while any container exists, or while Docker cannot confirm.</HText>\n <div>\n <HButton variant=\"danger\" label=\"Forget\" :loading=\"a.pending.value === 'forget'\" :disabled=\"!!a.pending.value\" @click=\"open('forget')\" />\n </div>\n </HStack>\n </HCard>\n\n <HAlertDialog\n v-model:open=\"ask.open\"\n danger\n :title=\"`${COPY[ask.kind].title}${ask.kind === 'stop' ? '?' : ` ${id}?`}`\"\n :description=\"COPY[ask.kind].text\"\n :confirm-label=\"COPY[ask.kind].confirm\"\n @confirm=\"confirmed\"\n />\n </HStack>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Compose logs, read on demand or followed live. Never polled: an auto-refresh against a chatty\n * stack would hammer the host that runs everyone else's previews. The tail is clamped by the server.\n */\nimport { computed, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { HAlert, HButton, HEmptyState, HLogViewer, HSelect, HStack, HSwitch, HText, type LogEntry } from '@hearth-ui/vue';\nimport type { Runtime } from '@samyx/preview-stacks-client';\nimport type { DeploymentDetail } from '../../api-deployment';\nimport { containersWithServices, filterLines, logFileName, logLevel, parseLogLine } from '../../lib/deployment';\nimport { MAX_FOLLOW_LINES, useLogs } from '../../lib/use-logs';\n\nconst props = defineProps<{ id: string; dep: DeploymentDetail | null; runtime: Runtime | null }>();\nconst route = useRoute();\nconst router = useRouter();\n\nconst selected = ref(''); // '' = the whole stack, else a container name\nconst tail = ref('200');\nconst since = ref('');\nconst timestamps = ref(false);\nconst query = ref('');\n\nconst containers = computed(() => (props.runtime ? containersWithServices(props.runtime) : []));\nconst current = computed(() => containers.value.find((c) => c.name === selected.value) ?? null);\n// Compose narrows by service, not by container.\nconst service = computed(() => current.value?.service ?? '');\nconst tailN = computed(() => Number(tail.value));\n\nconst logs = useLogs({ id: () => props.id, service, timestamps, tail: tailN, since });\n\nconst containerOptions = computed(() => [\n { value: '', label: 'All services' },\n ...containers.value.map((c) => ({ value: c.name, label: c.service && c.service !== c.name ? `${c.service} (${c.name})` : c.name })),\n]);\nconst TAILS = ['50', '200', '500', '1000', '2000'].map((v) => ({ value: v, label: `${v} lines` }));\nconst SINCES = [\n { value: '', label: 'Anything kept' },\n { value: '5m', label: 'Last 5 minutes' },\n { value: '30m', label: 'Last 30 minutes' },\n { value: '1h', label: 'Last hour' },\n { value: '24h', label: 'Last day' },\n];\n\nconst hasCompose = computed(() => !!props.dep?.compose);\nconst swarm = computed(() => props.dep?.orchestrator === 'swarm');\n\nfunction select(name: string): void {\n selected.value = name;\n // Keep the URL honest so the pane can be linked to and survives a reload.\n void router.replace({ query: { ...route.query, container: name || undefined } });\n if (!logs.following.value && hasCompose.value) void logs.fetchOnce();\n}\n\n// ?container= is how the Containers table jumps here. Applied once the name resolves to a container,\n// and it fetches at once: arriving from \"show me its logs\" and then pressing Fetch is a wasted click.\nwatch(\n [containers, () => route.query.container],\n ([list, wanted]) => {\n const name = typeof wanted === 'string' ? wanted : '';\n if (!name || selected.value === name || !list.some((c) => c.name === name)) return;\n selected.value = name;\n if (hasCompose.value) void logs.fetchOnce();\n },\n { immediate: true },\n);\n\nwatch(\n () => props.id,\n () => {\n selected.value = '';\n query.value = '';\n logs.reset();\n },\n);\n\nconst entries = computed<LogEntry[]>(() => {\n const only = current.value?.name ?? '';\n const names = new Set(containers.value.map((c) => c.name));\n const out: LogEntry[] = [];\n logs.lines.value.forEach((line, i) => {\n const p = parseLogLine(line);\n // A service with several replicas answers as one stream; keep only the chosen replica's lines.\n if (only && p.service && p.service !== only && names.has(p.service)) return;\n out.push({\n id: String(i),\n message: p.service && !only ? `${p.service} ${p.message}` : p.message,\n level: logLevel(p.message),\n ...(p.time ? { timestamp: new Date(p.time).toTimeString().slice(0, 8) } : {}),\n });\n });\n return out;\n});\n\nfunction download(): void {\n const text = filterLines(entries.value.map((e) => e.message), query.value).join('\\n');\n const url = URL.createObjectURL(new Blob([text], { type: 'text/plain' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = logFileName(props.id, current.value?.service ?? '');\n a.click();\n URL.revokeObjectURL(url);\n}\n</script>\n\n<template>\n <HEmptyState v-if=\"!dep\" title=\"Unavailable\" description=\"The spec has not resolved.\" icon=\"info\" />\n <HEmptyState v-else-if=\"!hasCompose\" title=\"No compose section\" description=\"Nothing to read logs from.\" icon=\"info\" />\n\n <HStack v-else direction=\"column\" :gap=\"3\">\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"end\">\n <HSelect :model-value=\"selected\" label=\"Container\" :options=\"containerOptions\" @change=\"select\" />\n <HSelect v-model=\"tail\" label=\"Lines\" :options=\"TAILS\" />\n <HSelect v-model=\"since\" label=\"Since\" :options=\"SINCES\" />\n <HSwitch v-model=\"timestamps\" label=\"Timestamps\" />\n <HButton :variant=\"logs.following.value ? 'danger' : 'secondary'\" :label=\"logs.following.value ? 'Stop following' : 'Follow'\" @click=\"logs.toggle\" />\n <HButton :label=\"logs.touched.value ? 'Refresh' : 'Fetch'\" icon=\"arrow\" :loading=\"logs.loading.value\" :disabled=\"logs.following.value\" @click=\"logs.fetchOnce\" />\n <HButton variant=\"ghost\" icon=\"down\" label=\"Download\" :disabled=\"!entries.length\" @click=\"download\" />\n </HStack>\n\n <HAlert v-if=\"logs.error.value\" tone=\"danger\" :title=\"logs.error.value\" />\n <!-- ok:false means compose exited non-zero: usually nothing brought up yet, or asleep. A note, not a fault. -->\n <HAlert\n v-else-if=\"logs.touched.value && !logs.following.value && !logs.lastOk.value\"\n tone=\"warning\"\n :title=\"`${swarm ? 'docker service logs' : 'Compose'} exited non-zero`\"\n :description=\"dep.asleep ? 'Asleep. No containers to read.' : 'Usually nothing is brought up yet. What it printed is below.'\"\n compact\n />\n <HAlert v-if=\"logs.note.value\" tone=\"info\" :title=\"logs.note.value\" compact />\n\n <HLogViewer\n v-if=\"logs.touched.value\"\n :entries=\"entries\"\n :follow=\"logs.following.value\"\n :max-lines=\"MAX_FOLLOW_LINES\"\n label=\"Deployment logs\"\n wrap\n @search-change=\"(q: string) => (query = q)\"\n />\n <HText v-else tone=\"muted\">Fetch the last lines, or follow live.</HText>\n\n <HText v-if=\"logs.following.value\" tone=\"muted\" size=\"sm\">Following {{ current ? current.name : 'the whole stack' }}. Last {{ MAX_FOLLOW_LINES.toLocaleString() }} lines kept.</HText>\n <HText v-else-if=\"logs.touched.value && logs.lastMeta.value\" tone=\"muted\" size=\"sm\">{{ logs.lastMeta.value }}. Secrets redacted on the host.</HText>\n </HStack>\n</template>\n","<script setup lang=\"ts\">\n/** The resolved spec, summarised, plus an on-demand readiness check. Read-only: actions live in the header and Danger. */\nimport { computed, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { HAlert, HBadge, HButton, HCard, HDataTable, HDescriptionList, HSkeleton, HStack, HText, type DescriptionItem, type TableColumn } from '@hearth-ui/vue';\nimport type { Readiness, Runtime } from '@samyx/preview-stacks-client';\nimport { deploymentApi, type DeploymentDetail } from '../../api-deployment';\n\nimport { problemText, sentence } from '../../lib/deployment';\nimport { can } from '../../lib/users';\nimport { auth } from '../../state';\n\nconst props = defineProps<{ id: string; dep: DeploymentDetail | null; runtime: Runtime | null; error: string; loading: boolean }>();\nconst router = useRouter();\nconst stamp = (at?: number | null) => (at ? new Date(at).toLocaleString() : '—');\n\nconst items = computed<DescriptionItem[]>(() => {\n const d = props.dep;\n if (!d) return [];\n const c = d.compose;\n const out: DescriptionItem[] = [\n { key: 'stack', label: 'Stack', value: d.stack || '—' },\n { key: 'kind', label: 'Kind', value: sentence(d.kind) },\n ];\n if (d.specName) out.push({ key: 'spec', label: 'Spec', value: d.specName });\n out.push({ key: 'file', label: 'Compose file', value: c ? c.file : 'none' });\n if (c) {\n out.push({ key: 'profiles', label: 'Profiles', value: c.profiles.join(', ') || 'none' });\n if (c.subdomains?.length)\n out.push({\n key: 'sub',\n label: 'Subdomains',\n value: c.subdomains.map((s) => `*.${s.host} → ${s.profile}${s.depth === 'any' ? ' (any depth, HTTP only)' : ''}`).join('; '),\n });\n out.push({ key: 'orch', label: 'Orchestrator', value: d.orchestrator ?? 'compose' });\n }\n if (d.sleep) {\n const parts = [d.sleep.idle && `${d.sleep.idle} idle`, d.sleep.after && `${d.sleep.after} after deploy`].filter(Boolean);\n out.push({ key: 'sleep', label: 'Sleep policy', value: parts.join(' · ') || 'none' });\n }\n if (c) out.push({ key: 'overlays', label: 'Overlays', value: c.overlays.join(', ') || 'none' });\n out.push(\n { key: 'axes', label: 'Axes', value: d.axes?.length ?? 0 },\n { key: 'requires', label: 'Requires', value: d.requires?.length ?? 0 },\n { key: 'created', label: 'Created', value: stamp(d.createdAt) },\n { key: 'updated', label: 'Updated', value: stamp(d.updatedAt) },\n );\n return out;\n});\n\nconst wakeOn = computed(() => {\n const a = props.dep?.asleep;\n if (!a) return '';\n const on = [...a.hosts, ...a.rules.map((r) => `/${r}/`)];\n return on.length ? `Wakes on a request to ${on.join(', ')}.` : 'No hostnames. Only Wake brings it back.';\n});\n\n// ── readiness: on demand, because reading it starts a silent watch on the server ───────────────\nconst rd = ref<Readiness | null>(null);\nconst rdError = ref('');\nconst rdLoading = ref(false);\nasync function checkReadiness(): Promise<void> {\n rdLoading.value = true;\n rdError.value = '';\n const r = await deploymentApi.readiness(props.id);\n rdLoading.value = false;\n if (!r.ok) {\n rdError.value = problemText(r.status, r.body.error, 'Readiness');\n return;\n }\n rd.value = r.body;\n}\nconst rdColumns: TableColumn[] = [\n { key: 'name', label: 'Container', truncate: true },\n { key: 'state', label: 'State' },\n { key: 'health', label: 'Health', hideBelow: 480 },\n { key: 'restarts', label: 'Restarts', align: 'end', hideBelow: 560 },\n { key: 'reason', label: 'Reason', hideBelow: 640 },\n];\nconst rdRows = computed(() =>\n (rd.value?.containers ?? []).map((c) => ({\n id: c.name,\n name: c.name,\n state: c.failed ? 'Failed' : c.ready ? 'Ready' : 'Waiting',\n health: c.hasHealthcheck ? (c.health ?? '—') : 'No healthcheck',\n restarts: c.restartCount,\n reason: c.reason ?? '',\n })),\n);\nconst rdTone = computed(() => (rd.value?.state === 'ready' ? 'success' : rd.value?.state === 'failed' || rd.value?.state === 'timedout' ? 'danger' : 'info'));\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HAlert v-if=\"error\" tone=\"danger\" title=\"Could not resolve this deployment\" :description=\"error\">\n <HButton variant=\"secondary\" label=\"Open Config\" @click=\"router.push(`/deployments/${encodeURIComponent(id)}/config`)\" />\n </HAlert>\n <HAlert v-if=\"dep?.asleep\" tone=\"info\" :title=\"`Asleep since ${stamp(dep.asleep.since)}`\" :description=\"`${dep.asleep.reason}. ${wakeOn}`\" />\n <HAlert\n v-if=\"runtime?.findings.length\"\n :tone=\"runtime.findings.some((f) => f.level === 'error') ? 'danger' : 'warning'\"\n :title=\"`${runtime.findings.length} finding${runtime.findings.length === 1 ? '' : 's'}`\"\n >\n <HButton variant=\"ghost\" label=\"See containers and routes\" @click=\"router.push(`/deployments/${encodeURIComponent(id)}/runtime`)\" />\n </HAlert>\n\n <HCard>\n <template #header>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\" justify=\"between\">\n <HText weight=\"medium\">Resolved spec</HText>\n <HStack v-if=\"dep && can('developer', auth)\" direction=\"row\" :gap=\"2\" wrap>\n <HButton variant=\"ghost\" label=\"Duplicate\" @click=\"router.push({ path: '/submit', query: { from: id } })\" />\n <HButton variant=\"ghost\" label=\"Edit spec and compose\" trailing-icon=\"right\" @click=\"router.push(`/submit/${encodeURIComponent(id)}`)\" />\n </HStack>\n </HStack>\n </template>\n <HSkeleton v-if=\"loading && !dep\" variant=\"rectangle\" height=\"10rem\" label=\"Loading spec\" />\n <HText v-else-if=\"!dep\" tone=\"muted\">Spec not resolved.</HText>\n <HDescriptionList v-else :items=\"items\" columns=\"auto\" min-column-width=\"14rem\" />\n </HCard>\n\n <HCard>\n <template #header>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\" justify=\"between\">\n <HStack direction=\"row\" :gap=\"2\" align=\"center\">\n <HText weight=\"medium\">Readiness</HText>\n <HBadge v-if=\"rd\" :label=\"sentence(rd.state)\" :tone=\"rdTone\" dot />\n </HStack>\n <HButton variant=\"secondary\" icon=\"arrow\" label=\"Check\" :loading=\"rdLoading\" :disabled=\"!dep?.stack\" @click=\"checkReadiness\" />\n </HStack>\n </template>\n <HAlert v-if=\"rdError\" tone=\"danger\" :title=\"rdError\" compact />\n <HAlert v-else-if=\"rd && !rd.reachable\" tone=\"warning\" title=\"Docker did not answer\" description=\"Container fields are the last known.\" compact />\n <HDataTable v-if=\"rd\" label=\"Readiness\" :rows=\"rdRows\" :columns=\"rdColumns\" empty-text=\"No containers yet.\" />\n <HText v-else-if=\"!rdError\" tone=\"muted\">{{ dep?.stack ? 'Not checked.' : 'Needs variables.' }}</HText>\n </HCard>\n </HStack>\n</template>\n","<script setup lang=\"ts\">\n/** Preconditions, checked in order before anything is created. `up` stops at the first failure. */\nimport { computed, watch } from 'vue';\nimport { HAlert, HButton, HCard, HDataTable, HSkeleton, HStack, type TableColumn } from '@hearth-ui/vue';\nimport type { DeploymentRow, Runtime } from '@samyx/preview-stacks-client';\nimport { detail, openDetail, reloadDetail } from '../../vars/useDetail';\n\nconst props = defineProps<{ id: string; dep: DeploymentRow | null; runtime: Runtime | null }>();\nwatch(() => props.id, openDetail, { immediate: true });\n\nconst columns: TableColumn[] = [\n { key: 'name', label: 'Requirement' },\n { key: 'hint', label: 'Hint on failure' },\n];\nconst rows = computed(() => (detail.data?.requires ?? []).map((r) => ({ id: r.name, name: r.name, hint: r.hint || 'No hint' })));\n</script>\n\n<template>\n <HCard title=\"Requires\" description=\"Checked before anything is created.\">\n <template #footer>\n <HButton variant=\"secondary\" icon=\"arrow\" label=\"Re-resolve\" :loading=\"detail.loading\" @click=\"reloadDetail\" />\n </template>\n <HSkeleton v-if=\"detail.loading && !detail.data && !detail.error\" variant=\"text\" :lines=\"3\" label=\"Loading requirements\" />\n <HAlert v-else-if=\"detail.error\" tone=\"danger\" title=\"Spec did not resolve\" :description=\"detail.error\" />\n <HStack v-else direction=\"column\" :gap=\"3\">\n <HDataTable :rows=\"rows\" :columns=\"columns\" label=\"Requirements\" empty-text=\"None declared.\" />\n </HStack>\n </HCard>\n</template>\n","<script setup lang=\"ts\">\n/**\n * What is running, and what Traefik was told about it. This is the page that answers \"the hostname\n * does not work\": the routing table shows the address Traefik assembled, or the one reason it could\n * not, and the containers table has the per-container verbs.\n */\nimport { computed, reactive, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport {\n HAlert,\n HAlertDialog,\n HBadge,\n HButton,\n HCard,\n HDataTable,\n HDialog,\n HEmptyState,\n HSkeleton,\n HStack,\n HText,\n type MenuAction,\n type TableColumn,\n type TableRow,\n} from '@hearth-ui/vue';\nimport type { DeploymentRow, Runtime, RuntimeContainer } from '@samyx/preview-stacks-client';\nimport { deploymentApi } from '../../api-deployment';\nimport { toast } from '../../state';\nimport { byLabel } from '../../lib/labels';\nimport { containerState, containersWithServices, findingLabel, findingTone, routeTarget, sortFindings, taskOf, urlFor, problemText } from '../../lib/deployment';\n\nconst props = defineProps<{ id: string; dep: DeploymentRow | null; runtime: Runtime | null; error?: string; loading?: boolean }>();\nconst emit = defineEmits<{ refresh: [] }>();\nconst router = useRouter();\nconst go = (tab: string, container: string) => router.push({ path: `/deployments/${encodeURIComponent(props.id)}/${tab}`, query: { container } });\n\nconst containers = computed(() => (props.runtime ? containersWithServices(props.runtime) : []));\nconst running = computed(() => containers.value.filter((c) => c.state === 'running').length);\nconst hasNode = computed(() => containers.value.some((c) => c.node));\nconst findings = computed(() => sortFindings(props.runtime?.findings ?? []));\nconst worst = computed(() => findings.value[0]?.level ?? 'info');\nconst showFindings = ref(false);\n\n// ── routes ──────────────────────────────────────────────────────────────────────────────────────\nconst routeColumns: TableColumn[] = [\n { key: 'url', label: 'URL', minWidth: '12rem' },\n { key: 'target', label: 'Forwards to', hideBelow: 520 },\n { key: 'router', label: 'Router', truncate: true, hideBelow: 700 },\n { key: 'tls', label: 'TLS', hideBelow: 420 },\n];\nconst routeRows = computed(() =>\n (props.runtime?.routes ?? []).map((r) => ({\n id: r.router,\n hosts: r.hosts,\n rule: r.rule,\n target: routeTarget(r),\n container: r.container,\n router: r.router,\n priority: r.priority,\n tls: r.tls ? r.certresolver || 'inherited' : '',\n })),\n);\n\n// ── containers ──────────────────────────────────────────────────────────────────────────────────\nconst containerColumns = computed<TableColumn[]>(() => [\n { key: 'service', label: 'Service', minWidth: '10rem' },\n ...(hasNode.value ? [{ key: 'node', label: 'Node', hideBelow: 760 }] : []),\n { key: 'state', label: 'State' },\n { key: 'ports', label: 'Ports', hideBelow: 640 },\n { key: 'networks', label: 'Networks', hideBelow: 900 },\n { key: 'image', label: 'Image', truncate: true, hideBelow: 1000 },\n]);\nconst named = computed(() => byLabel(containers.value, (c) => c.name, (c) => c.id));\nconst containerRows = computed(() => [...named.value].map(([rid, c]) => ({ id: rid, c, st: containerState(c) })));\nconst byId = (rid: string): RuntimeContainer | undefined => named.value.get(rid);\n\nfunction actionsFor(row: TableRow): MenuAction[] {\n const c = row.c as RuntimeContainer;\n const locked = !!busy.value;\n const out: MenuAction[] = [];\n if (c.id.startsWith('service:')) return [{ id: 'logs', label: 'Logs' }];\n if (!c.job && !c.remote) {\n out.push(c.state !== 'running' ? { id: 'start', label: 'Start', disabled: locked } : { id: 'stop', label: 'Stop', disabled: locked, danger: true });\n out.push({ id: 'restart', label: 'Restart', disabled: locked });\n }\n out.push({ id: 'logs', label: 'Logs' });\n if (c.state === 'running' && !c.remote && !c.job) out.push({ id: 'shell', label: 'Shell' });\n // Only while running: the router label survives a stopped container, so the URL would answer 502.\n if (c.state === 'running' && urlFor(props.runtime, c)) out.push({ id: 'open', label: 'Open', icon: 'launch' });\n return out;\n}\n\n/** One container verb in flight, as `action:name`: two `docker restart`s racing on one stack is not worth making easy. */\nconst busy = ref('');\nconst ask = reactive({ open: false, c: null as RuntimeContainer | null, action: 'stop' as 'start' | 'stop' | 'restart' });\nconst VERB = { start: 'Start', stop: 'Stop', restart: 'Restart' } as const;\n\nfunction onRowAction(e: { id: string; action: string }): void {\n const c = byId(e.id);\n if (!c) return;\n if (e.action === 'logs') void go('logs', c.name);\n else if (e.action === 'shell') void go('terminal', c.name);\n else if (e.action === 'open') {\n const u = urlFor(props.runtime, c);\n if (u) window.open(u, '_blank', 'noopener');\n } else {\n ask.c = c;\n ask.action = e.action as 'start' | 'stop' | 'restart';\n ask.open = true;\n }\n}\n\nasync function runVerb(): Promise<void> {\n const c = ask.c;\n if (!c) return;\n busy.value = `${ask.action}:${c.name}`;\n const r = await deploymentApi.container(props.id, c.name, ask.action);\n busy.value = '';\n ask.open = false;\n if (!r.ok) {\n // Docker's own words say \"already started\" and \"no such container\" better than this layer could.\n toast(`${VERB[ask.action]} refused`, 'danger', problemText(r.status, r.body.error, c.name));\n return;\n }\n toast(r.body.note ?? `${VERB[ask.action]} sent`, 'success', c.name);\n emit('refresh');\n}\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HAlert v-if=\"error\" tone=\"danger\" title=\"Could not inspect this deployment\" :description=\"error\" />\n <HSkeleton v-if=\"loading && !runtime\" variant=\"rectangle\" height=\"12rem\" label=\"Loading runtime\" />\n\n <template v-else-if=\"runtime\">\n <!-- reachable:false is not \"nothing is running\": a healthy stack can sit behind a Docker socket this process cannot reach. -->\n <HAlert v-if=\"!runtime.reachable\" tone=\"warning\" title=\"Docker did not answer\" description=\"That is not the same as nothing running.\" />\n\n <template v-else>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\">\n <HButton v-if=\"findings.length\" variant=\"secondary\" icon=\"info\" :label=\"`${findings.length} ${findingLabel(worst).toLowerCase()}`\" @click=\"showFindings = true\" />\n <HAlert v-else-if=\"containers.length\" tone=\"success\" title=\"Nothing looks wrong\" compact />\n </HStack>\n\n <HCard>\n <template #header>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\" justify=\"between\">\n <HText weight=\"medium\">Routing</HText>\n <HStack direction=\"row\" :gap=\"2\" align=\"center\" wrap>\n <HText tone=\"muted\" size=\"sm\">TLS: {{ runtime.challenge }}</HText>\n <HButton variant=\"ghost\" label=\"Change on Control\" @click=\"router.push('/control')\" />\n </HStack>\n </HStack>\n </template>\n <HEmptyState v-if=\"!routeRows.length\" title=\"No routes\" description=\"Traefik labels come from your compose file.\" icon=\"globe\" />\n <HDataTable v-else label=\"Routes\" :rows=\"routeRows\" :columns=\"routeColumns\">\n <template #cell=\"{ row, column }\">\n <template v-if=\"column.key === 'url'\">\n <div v-for=\"h in (row.hosts as string[])\" :key=\"h\">\n <a v-if=\"!h.startsWith('(pattern)')\" :href=\"`https://${h}`\" target=\"_blank\" rel=\"noopener noreferrer\">{{ h }}</a>\n <HText v-else as=\"code\" tone=\"muted\">{{ h }}</HText>\n </div>\n <HText v-if=\"!(row.hosts as string[]).length\" tone=\"muted\">No host in the rule</HText>\n </template>\n <template v-else-if=\"column.key === 'target'\">\n <HBadge\n :label=\"(row.target as ReturnType<typeof routeTarget>).text\"\n :tone=\"(row.target as ReturnType<typeof routeTarget>).tone\"\n :title=\"(row.target as ReturnType<typeof routeTarget>).hint\"\n />\n <div><HText tone=\"muted\" size=\"sm\">{{ row.container }}</HText></div>\n </template>\n <template v-else-if=\"column.key === 'router'\">\n {{ row.router }}<template v-if=\"row.priority\"> · priority {{ row.priority }}</template>\n </template>\n <template v-else-if=\"column.key === 'tls'\">\n <HBadge v-if=\"row.tls\" :label=\"String(row.tls)\" tone=\"success\" />\n <HBadge v-else label=\"Off\" />\n </template>\n </template>\n </HDataTable>\n </HCard>\n\n <HCard>\n <template #header>\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"center\" justify=\"between\">\n <HText weight=\"medium\">Containers</HText>\n <HStack direction=\"row\" :gap=\"2\" align=\"center\">\n <HText tone=\"muted\" size=\"sm\">{{ running }} of {{ containers.length }} running</HText>\n <HButton variant=\"ghost\" icon=\"arrow\" label=\"Refresh\" :loading=\"loading\" @click=\"emit('refresh')\" />\n </HStack>\n </HStack>\n </template>\n <HEmptyState v-if=\"!containers.length\" title=\"No containers\" description=\"Nothing is running for this stack.\" icon=\"server\" />\n <HDataTable\n v-else\n label=\"Containers\"\n :rows=\"containerRows\"\n :columns=\"containerColumns\"\n :get-row-actions=\"actionsFor\"\n action-display=\"label\"\n @row-action=\"onRowAction\"\n >\n <template #cell=\"{ row, column }\">\n <template v-if=\"column.key === 'service'\">\n <div>{{ (row.c as RuntimeContainer).service ?? (row.c as RuntimeContainer).name }}</div>\n <HText v-if=\"!(row.c as RuntimeContainer).id.startsWith('service:')\" tone=\"muted\" size=\"sm\" :title=\"(row.c as RuntimeContainer).name\">{{ taskOf((row.c as RuntimeContainer).name) }}</HText>\n </template>\n <template v-else-if=\"column.key === 'node'\">\n {{ (row.c as RuntimeContainer).node ?? '—' }}\n <HBadge v-if=\"(row.c as RuntimeContainer).remote\" label=\"Remote\" title=\"On another node. Logs reach it; a shell and stop/start do not.\" />\n </template>\n <template v-else-if=\"column.key === 'state'\">\n <HBadge dot :label=\"(row.st as ReturnType<typeof containerState>).label\" :tone=\"(row.st as ReturnType<typeof containerState>).tone\" />\n <HBadge v-if=\"(row.c as RuntimeContainer).job\" label=\"One-shot\" title=\"No container to start, stop or shell into.\" />\n <HBadge v-if=\"(row.c as RuntimeContainer).restartCount > 0\" :label=\"`${(row.c as RuntimeContainer).restartCount}x restarted`\" tone=\"warning\" />\n </template>\n <template v-else-if=\"column.key === 'ports'\">\n <div v-for=\"p in (row.c as RuntimeContainer).ports\" :key=\"`${p.containerPort}/${p.protocol}`\">\n {{ p.containerPort }}<HText v-if=\"p.hostPort\" tone=\"muted\"> ← host {{ p.hostPort }}</HText>\n </div>\n <HText v-if=\"!(row.c as RuntimeContainer).ports.length\" tone=\"muted\">None</HText>\n </template>\n <template v-else-if=\"column.key === 'networks'\">\n <div v-for=\"n in (row.c as RuntimeContainer).networks\" :key=\"n\">{{ n }}</div>\n <HText v-if=\"(row.c as RuntimeContainer).ingressIp\" as=\"code\" tone=\"muted\" size=\"sm\">{{ (row.c as RuntimeContainer).ingressIp }}</HText>\n </template>\n <template v-else-if=\"column.key === 'image'\">{{ (row.c as RuntimeContainer).image }}</template>\n </template>\n </HDataTable>\n </HCard>\n </template>\n </template>\n\n <HDialog :open=\"showFindings\" title=\"What pstack noticed\" @close=\"showFindings = false\">\n <HStack direction=\"column\" :gap=\"3\">\n <HAlert v-for=\"(f, i) in findings\" :key=\"i\" :tone=\"findingTone(f.level)\" :title=\"findingLabel(f.level)\" :description=\"f.message\" />\n </HStack>\n </HDialog>\n\n <HAlertDialog\n v-model:open=\"ask.open\"\n :danger=\"ask.action !== 'start'\"\n :busy=\"!!busy\"\n :title=\"`${VERB[ask.action]} ${ask.c?.name ?? ''}?`\"\n :description=\"ask.action === 'stop' ? 'This container only. It stays stopped until something starts it.' : 'This container only.'\"\n :confirm-label=\"VERB[ask.action]\"\n @confirm=\"runVerb\"\n />\n </HStack>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A shell inside one of this deployment's containers, over the terminal WebSocket.\n *\n * The server decides which container: this picker lists what /runtime says the deployment owns, and\n * the server checks the name again on upgrade. The session cookie authenticates the handshake (a\n * browser cannot set a header on a WebSocket), so no token is ever put in the URL.\n *\n * No pty: the server runs `docker exec -i`, so there is no prompt and no Ctrl-C. Said on the page.\n */\nimport { computed, onBeforeUnmount, ref, shallowRef, watch } from 'vue';\nimport { useRoute } from 'vue-router';\nimport { HAlert, HBadge, HButton, HSelect, HStack, HText } from '@hearth-ui/vue';\nimport type { DeploymentRow, Runtime } from '@samyx/preview-stacks-client';\nimport '@xterm/xterm/css/xterm.css';\nimport { terminalUrl } from '../../api-deployment';\n\nconst props = defineProps<{ id: string; dep: DeploymentRow | null; runtime: Runtime | null; error?: string }>();\nconst route = useRoute();\n\nconst SHELLS = ['sh', 'bash', 'ash', 'zsh', 'fish'].map((s) => ({ value: s, label: s }));\ntype Phase = 'idle' | 'connecting' | 'open' | 'closed';\n\nconst container = ref('');\nconst shell = ref('sh');\nconst phase = ref<Phase>('idle');\nconst closeReason = ref('');\n\nconst host = ref<HTMLDivElement | null>(null);\n// shallowRef: xterm's Terminal is a large mutable object and must not be made reactive.\nconst term = shallowRef<import('@xterm/xterm').Terminal | null>(null);\nconst socket = shallowRef<WebSocket | null>(null);\nlet observer: ResizeObserver | null = null;\n// Bumped by teardown: a connect() that was awaiting the xterm import sees it moved and stops.\nlet gen = 0;\n\n/** Only containers a shell can reach: running, on this node, not a one-shot job. */\nconst reachable = computed(() => (props.runtime?.containers ?? []).filter((c) => c.state === 'running' && !c.remote && !c.job));\nconst options = computed(() => reachable.value.map((c) => ({ value: c.name, label: c.service ? `${c.service} (${c.name})` : c.name })));\nconst live = computed(() => phase.value === 'open' || phase.value === 'connecting');\n\n// ?container= is how the Containers table jumps here. Honoured only for a container this deployment\n// owns and runs; anything else falls back to the first, so the picker never sits on a name that 404s.\nwatch(\n reachable,\n (list) => {\n if (container.value && list.some((c) => c.name === container.value)) return;\n const wanted = typeof route.query.container === 'string' ? route.query.container : '';\n container.value = list.find((c) => c.name === wanted)?.name ?? list[0]?.name ?? '';\n },\n { immediate: true },\n);\n\nasync function connect(): Promise<void> {\n if (live.value || !container.value) return;\n closeReason.value = '';\n phase.value = 'connecting';\n const mine = gen;\n // Loaded on demand: xterm is large and only this tab needs it.\n const [{ Terminal }, { FitAddon }] = await Promise.all([import('@xterm/xterm'), import('@xterm/addon-fit')]);\n if (mine !== gen) return;\n term.value?.dispose();\n const t = new Terminal({\n // The output half of the line discipline a missing pty would provide: NL -> CR-NL, or `ls` staircases.\n convertEol: true,\n fontSize: 13,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n cursorBlink: true,\n theme: { background: '#0b0e14' },\n });\n const fit = new FitAddon();\n t.loadAddon(fit);\n if (host.value) {\n host.value.replaceChildren();\n t.open(host.value);\n fit.fit();\n }\n term.value = t;\n observer?.disconnect();\n observer = new ResizeObserver(() => {\n try {\n fit.fit();\n } catch {\n /* detached mid-transition */\n }\n });\n if (host.value) observer.observe(host.value);\n\n const ws = new WebSocket(terminalUrl(props.id, container.value, shell.value));\n ws.binaryType = 'arraybuffer';\n socket.value = ws;\n ws.onopen = () => {\n phase.value = 'open';\n t.focus();\n };\n // Bytes, not text: decoding per frame would corrupt a multi-byte character split across reads.\n ws.onmessage = (e) => t.write(typeof e.data === 'string' ? e.data : new Uint8Array(e.data as ArrayBuffer));\n ws.onclose = (e) => {\n phase.value = 'closed';\n // 1006 is the browser's \"it went away\", which here almost always means the upgrade was refused.\n closeReason.value = e.reason || (e.code === 1006 ? 'connection dropped' : `code ${e.code}`);\n };\n ws.onerror = () => {\n if (phase.value === 'connecting') closeReason.value = 'could not connect';\n };\n t.onData((d) => {\n if (ws.readyState === WebSocket.OPEN) ws.send(d);\n });\n}\n\nfunction disconnect(): void {\n if (!socket.value) {\n // Still loading xterm: cancel the pending connect.\n gen++;\n phase.value = 'idle';\n return;\n }\n socket.value.close(1000, 'closed by the operator');\n}\n\nfunction teardown(): void {\n gen++;\n if (socket.value) socket.value.onclose = socket.value.onmessage = socket.value.onerror = socket.value.onopen = null;\n observer?.disconnect();\n observer = null;\n socket.value?.close();\n socket.value = null;\n term.value?.dispose();\n term.value = null;\n}\n\n// Changing container or shell must not leave the old shell running against a stale picker.\nwatch([container, shell], () => {\n if (live.value) disconnect();\n});\nwatch(\n () => props.id,\n () => {\n teardown();\n phase.value = 'idle';\n closeReason.value = '';\n },\n);\nonBeforeUnmount(teardown);\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"3\">\n <HAlert tone=\"warning\" title=\"No TTY\" description=\"No prompt, no Ctrl-C, no full-screen programs.\" compact />\n\n <HStack direction=\"row\" :gap=\"3\" wrap align=\"end\">\n <HSelect v-model=\"container\" label=\"Container\" :options=\"options\" :disabled=\"live || !options.length\" :placeholder=\"options.length ? undefined : (runtime ? 'No container' : 'Loading')\" />\n <HSelect v-model=\"shell\" label=\"Shell\" :options=\"SHELLS\" :disabled=\"live\" />\n <HButton v-if=\"phase !== 'open'\" label=\"Open shell\" :loading=\"phase === 'connecting'\" :disabled=\"!container\" @click=\"connect\" />\n <HButton v-else variant=\"secondary\" label=\"Close shell\" @click=\"disconnect\" />\n <HBadge v-if=\"phase === 'open'\" dot tone=\"success\" label=\"Connected\" />\n </HStack>\n\n <HAlert v-if=\"error\" tone=\"danger\" title=\"Could not list containers\" :description=\"error\" />\n <HText v-else-if=\"!reachable.length\" tone=\"muted\">{{ runtime ? 'No container to open a shell in.' : 'Loading containers.' }}</HText>\n <HText v-if=\"phase === 'closed' && closeReason\" tone=\"muted\">Session ended: {{ closeReason }}.</HText>\n\n <div v-show=\"phase !== 'idle'\" ref=\"host\" class=\"term\" role=\"group\" aria-label=\"Terminal\" />\n\n <HText tone=\"muted\" size=\"sm\">Every session is recorded: who, which container, when.</HText>\n </HStack>\n</template>\n\n<style scoped>\n.term {\n min-height: 26rem;\n max-width: 100%;\n padding: 0.5rem;\n overflow: hidden;\n background: #0b0e14;\n border: 1px solid var(--h-border);\n border-radius: var(--h-radius-control);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * One deployment: what it is, what runs for it, its logs, its jobs, and the things that destroy it.\n * HResourceDetail owns breadcrumbs, state, metadata and tabs; each tab body is its own component.\n * The page polls detail and runtime together, so every tab reads the same snapshot.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { HAlert, HBadge, HButton, HEmptyState, HErrorPage, HResourceDetail, HSkeleton, HStack, HText, HTimeline, type TimelineItem } from '@hearth-ui/vue';\nimport type { Runtime } from '@samyx/preview-stacks-client';\nimport { deploymentApi, type DeploymentDetail } from '../api-deployment';\nimport { ACTION_LABEL, ago, jobTone, took } from '../format';\nimport { problemText, runState, sentence } from '../lib/deployment';\nimport { useDeploymentActions } from '../lib/use-deployment-actions';\nimport { can } from '../lib/users';\nimport { auth, data } from '../state';\nimport { detail as varsDetail } from '../vars/useDetail';\nimport { readVars } from '../vars/store';\nimport { varsQuery } from '../lib/vars';\nimport AxesTab from './deployment/AxesTab.vue';\nimport ConfigTab from './deployment/ConfigTab.vue';\nimport ConflictNote from './deployment/ConflictNote.vue';\nimport DeploymentDanger from './deployment/DeploymentDanger.vue';\nimport DeploymentLogs from './deployment/DeploymentLogs.vue';\nimport DeploymentOverview from './deployment/DeploymentOverview.vue';\nimport RequiresTab from './deployment/RequiresTab.vue';\nimport RuntimeTab from './deployment/RuntimeTab.vue';\nimport TerminalTab from './deployment/TerminalTab.vue';\n\nconst props = defineProps<{ id: string; tab?: string }>();\nconst router = useRouter();\n\nconst dep = ref<DeploymentDetail | null>(null);\nconst runtime = ref<Runtime | null>(null);\nconst missing = ref(false);\nconst loading = ref(true);\nconst refreshing = ref(false);\n/** Why the spec did not resolve, or any other failure of the detail call. The 400 names the missing variable. */\nconst detailError = ref('');\nconst runtimeError = ref('');\n\nconst actions = useDeploymentActions(() => props.id, dep);\n\nasync function load(): Promise<void> {\n const mine = props.id;\n const [d, r] = await Promise.all([deploymentApi.detail(mine), deploymentApi.runtime(mine)]);\n if (mine !== props.id) return; // navigated away mid-flight: never show one deployment under another's id\n loading.value = false;\n if (d.status === 404) {\n missing.value = true;\n if (poll) clearInterval(poll);\n return;\n }\n if (d.ok) {\n dep.value = d.body;\n detailError.value = '';\n } else if (dep.value && (d.status === 0 || d.status >= 500)) {\n // A blip on a poll keeps what is shown; only a real answer (400 unresolved, 403) replaces it.\n detailError.value = problemText(d.status, d.body.error, 'Deployment');\n } else {\n dep.value = null;\n detailError.value = problemText(d.status, d.body.error, 'Deployment');\n }\n if (r.ok) {\n runtime.value = r.body;\n runtimeError.value = '';\n } else {\n runtimeError.value = problemText(r.status, r.body.error, 'Runtime');\n }\n}\nasync function reload(): Promise<void> {\n refreshing.value = true;\n await load();\n refreshing.value = false;\n}\n\nlet poll: ReturnType<typeof setInterval> | undefined;\n// Config's \"Apply and reload\" saves the variables and re-resolves its own copy; follow it so this\n// page, the runtime and the lifecycle calls all use the same variables.\nlet appliedVars = varsQuery(readVars(props.id));\nwatch(\n () => varsDetail.loading,\n (l) => {\n if (l || varsDetail.id !== props.id) return;\n const q = varsQuery(readVars(props.id));\n if (q !== appliedVars) {\n appliedVars = q;\n void load();\n }\n },\n);\nwatch(\n () => props.id,\n () => {\n appliedVars = varsQuery(readVars(props.id));\n dep.value = null;\n runtime.value = null;\n missing.value = false;\n loading.value = true;\n detailError.value = '';\n runtimeError.value = '';\n actions.reset();\n void load();\n if (poll) clearInterval(poll);\n // A hidden tab does not poll: the host is running everyone else's previews too.\n poll = setInterval(() => !document.hidden && void load(), 6000);\n },\n { immediate: true },\n);\nonBeforeUnmount(() => poll && clearInterval(poll));\n\n// 'containers' was folded into the runtime tab; old links keep working.\nconst tab = computed({\n get: () => (props.tab === 'containers' ? 'runtime' : (props.tab ?? 'overview')),\n set: (v: string) => void router.replace(`/deployments/${encodeURIComponent(props.id)}/${v}`),\n});\nconst allTabs = [\n { value: 'overview', label: 'Overview' },\n { value: 'runtime', label: 'Containers and routes' },\n { value: 'config', label: 'Config and variables' },\n { value: 'axes', label: 'Axes' },\n { value: 'requires', label: 'Requires' },\n { value: 'logs', label: 'Logs' },\n { value: 'terminal', label: 'Terminal' },\n { value: 'jobs', label: 'Jobs' },\n { value: 'danger', label: 'Danger' },\n];\n// Courtesy: the shell and the lifecycle actions are developer's. The server still decides.\nconst tabs = computed(() => (can('developer', auth) ? allTabs : allTabs.filter((t) => t.value !== 'terminal' && t.value !== 'danger')));\n\n// The fix for an unresolved spec lives on Config, so land there, but only from the tab with nothing to show.\nwatch(detailError, (e) => {\n if (e && !props.tab) void router.replace(`/deployments/${encodeURIComponent(props.id)}/config`);\n});\n\n// The detail call does not say whether the stack is up; the list row does.\nconst state = computed(() => (dep.value ? runState({ busy: dep.value.busy, asleep: dep.value.asleep, running: data.deployments.find((d) => d.id === props.id)?.running ?? null }) : { label: detailError.value ? 'Unresolved' : 'Loading', tone: 'neutral' as const }));\nconst shared = computed(() => dep.value?.kind === 'shared');\nconst fields = computed(() => [\n { key: 'stack', label: 'Stack', value: dep.value?.stack ?? (detailError.value ? 'unresolved' : '—') },\n { key: 'kind', label: 'Kind', value: dep.value ? sentence(dep.value.kind) : '—' },\n { key: 'orchestrator', label: 'Orchestrator', value: dep.value?.orchestrator ?? 'none' },\n { key: 'spec', label: 'Spec', value: dep.value?.specName ?? 'inline' },\n { key: 'updated', label: 'Updated', value: ago(dep.value?.updatedAt) },\n]);\n\n// ── header actions ──────────────────────────────────────────────────────────────────────────────\nconst primary = computed(() => (dep.value?.asleep ? 'wake' : 'up'));\nconst blocked = computed(() => actions.why(primary.value));\nconst { pending } = actions;\n\n// ── jobs ────────────────────────────────────────────────────────────────────────────────────────\nconst mine = computed(() => data.jobs.filter((j) => j.deployment === props.id));\nconst timeline = computed<TimelineItem[]>(() =>\n mine.value.map((j) => ({\n id: j.id,\n title: ACTION_LABEL[j.action] ?? j.action,\n description: `${sentence(j.state)}${j.endedAt ? ` in ${took(j.startedAt, j.endedAt)}` : ''}`,\n timestamp: ago(j.startedAt),\n href: `/jobs/${encodeURIComponent(j.id)}`,\n tone: jobTone(j.state),\n })),\n);\n</script>\n\n<template>\n <HSkeleton v-if=\"loading\" variant=\"rectangle\" label=\"Loading deployment\" />\n <HErrorPage v-else-if=\"missing\" kind=\"not-found\" brand=\"pstack\" home-href=\"/deployments\" :title=\"`No deployment ${id}`\" description=\"It may have been forgotten.\" />\n\n <HResourceDetail\n v-else\n :title=\"id\"\n :description=\"dep?.stack ?? (detailError ? 'unresolved' : '')\"\n :breadcrumbs=\"[{ id: 'deployments', label: 'Deployments' }, { id: 'self', label: id }]\"\n :status=\"state.label\"\n :tone=\"state.tone\"\n :fields=\"fields\"\n :tabs=\"tabs\"\n v-model:active-tab=\"tab\"\n @navigate=\"router.push('/deployments')\"\n >\n <template #actions>\n <HButton variant=\"ghost\" icon=\"arrow\" label=\"Re-resolve\" :loading=\"refreshing\" @click=\"reload\" />\n <HButton\n :label=\"primary === 'wake' ? 'Wake' : 'Deploy'\"\n :icon=\"primary === 'wake' ? 'sun' : 'up'\"\n :loading=\"pending === primary\"\n :disabled=\"!!pending || !!blocked\"\n @click=\"actions.act(primary)\"\n />\n <HButton variant=\"secondary\" icon=\"check\" label=\"Verify\" :loading=\"pending === 'verify'\" :disabled=\"!!pending || !!actions.why('verify')\" @click=\"actions.act('verify')\" />\n </template>\n\n <template #summary>\n <HStack direction=\"column\" :gap=\"2\">\n <HStack direction=\"row\" :gap=\"2\" wrap align=\"center\">\n <HBadge v-if=\"dep?.orchestrator === 'swarm'\" label=\"Swarm\" />\n <HText v-if=\"shared\" tone=\"muted\" size=\"sm\">Shared with every preview on this host.</HText>\n <HText v-if=\"blocked && dep\" tone=\"muted\" size=\"sm\">{{ blocked }}</HText>\n </HStack>\n <HAlert v-if=\"actions.error.value\" tone=\"danger\" :title=\"actions.error.value\" />\n <ConflictNote v-if=\"actions.conflict.value\" :conflict=\"actions.conflict.value\" :job-id=\"actions.conflictJobId.value\" />\n </HStack>\n </template>\n\n <template #overview><DeploymentOverview :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" :error=\"detailError\" :loading=\"loading\" /></template>\n <template #config><ConfigTab :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" /></template>\n <template #runtime><RuntimeTab :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" :error=\"runtimeError\" :loading=\"refreshing\" @refresh=\"reload\" /></template>\n <template #axes><AxesTab :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" /></template>\n <template #requires><RequiresTab :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" /></template>\n <template #terminal><TerminalTab :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" :error=\"runtimeError\" /></template>\n <template #logs><DeploymentLogs :id=\"id\" :dep=\"dep\" :runtime=\"runtime\" /></template>\n\n <template #jobs>\n <HEmptyState v-if=\"!timeline.length\" title=\"No jobs for this deployment\" icon=\"clock\" />\n <HTimeline v-else :items=\"timeline\" label=\"Jobs\" />\n </template>\n\n <template #danger><DeploymentDanger :id=\"id\" :dep=\"dep\" :actions=\"actions\" /></template>\n </HResourceDetail>\n</template>\n"],"file":"assets/DeploymentView-D_wV0QNw.js"}
@@ -0,0 +1,2 @@
1
+ import{d as ye,c as d,w as v,u as t,N as ke,b as ge,e as a,f as c,I as we,Q as m,z as Z,C as L,D as F,j as k,k as p,g as Y,q as he,h as g,F as w,E as Ce,G as $e,S as Se,H as _,X as je,x as q,n as S,t as j,i as A,m as Ve,l as K,s as Ne,v as Ue,J as Be,r as V,A as f,K as ee,L as ze,M as te}from"./index-Cthapg0Q.js";import{s as De,f as Re,r as ne}from"./deployments-CDLMPXV3.js";import{p as Ae}from"./problem-Cs7tz86T.js";import{u as Ie}from"./now-C-iOYv8-.js";import{u as Te}from"./use-slash-focus-BeKibFvm.js";import{r as xe,a as Le}from"./format-Dr8IZDXn.js";const h={up:"Deploy",verify:"Verify",sleep:"Sleep",wake:"Wake",down:"Tear down","down-forget":"Tear down and forget"},oe=u=>u==="down"||u==="down-forget";function O(u,i){return u.unresolved||!u.stack?"needs variables":u.kind==="shared"&&oe(i)?"shared: tear down from its own page":u.kind==="shared"&&i==="sleep"?"shared stacks do not sleep":i==="sleep"&&!u.orchestrator?"no compose section":i==="sleep"&&u.asleep?"already asleep":i==="wake"&&!u.asleep?"not asleep":""}function Fe(u,i){const N=new Set(i);return u.filter(C=>N.has(C.id))}const I=(u,i)=>u.filter(N=>!O(N,i)).length,He=ye({__name:"DeploymentsView",setup(u){const i=ge(),N=Ie(),C=V(""),U=V([]),B=V([]),T=f(()=>L("developer",F)),$=V([]),E=V({key:"id",direction:"ascending"}),X=V(1),R=f(()=>De(p.deployments)),z=f(()=>Re(p.deployments,{q:C.value,kinds:U.value,states:B.value})),y=f(()=>Fe(z.value,$.value)),G=f(()=>y.value.filter(o=>o.kind==="shared").length),le=f(()=>p.deployments.filter(o=>o.unresolved)),se=[{key:"id",label:"ID",sortable:!0},{key:"kind",label:"Kind",sortable:!0,hideBelow:520},{key:"stack",label:"Stack",sortable:!0,truncate:!0,hideBelow:700},{key:"state",label:"State",sortable:!0},{key:"updated",label:"Updated",sortable:!0,align:"end",hideBelow:860}],ae=f(()=>z.value.map(o=>({id:o.id,spec:o.specName??"",kind:o.kind,stack:o.stack??"",state:ne(o),updated:o.updatedAt??0}))),re=o=>{const n=p.deployments.find(r=>r.id===o.id);if(!n)return[];const e=(r,l={})=>({id:r,label:h[r],disabled:s.busy||!!O(n,r),...l});return[{id:"open",label:"Open",icon:"launch"},e("up",{separatorBefore:!0}),e("verify"),e("sleep"),e("wake"),e("down",{danger:!0,separatorBefore:!0}),e("down-forget",{danger:!0})]},ie=f(()=>["isolated","shared"].map(o=>({value:o,label:o,count:R.value[o]}))),de=f(()=>["running","busy","asleep","idle","unknown"].map(o=>({value:o,label:o,count:p.deployments.filter(n=>ne(n)===o).length}))),ue=f(()=>U.value.length+B.value.length+(C.value?1:0));function pe(){C.value="",U.value=[],B.value=[]}const s=ee({busy:!1,action:"",results:[]}),H=o=>{var n;return((n=p.jobs.find(e=>e.id===o.id))==null?void 0:n.state)??o.state},b=ee({open:!1,action:"down",ids:[]});async function J(o,n){b.open=!1,s.busy=!0,s.action=n,s.results=[];for(const l of o){const Q=p.deployments.find(me=>me.id===l),W=Q?O(Q,n):"gone";if(W){s.results.push({id:l,skipped:W});continue}const D=await ze.act(l,n==="down-forget"?"down":n,n==="down-forget"?{forget:!0}:{});D.status===202&&D.body.job?s.results.push({id:l,job:{id:D.body.job.id,state:D.body.job.state}}):s.results.push({id:l,error:Ae(D,h[n].toLowerCase())})}s.busy=!1;const e=s.results.filter(l=>l.job).length,r=s.results.filter(l=>l.error).length;te(`${h[n]}: ${e} started`,r?"danger":"success",r?`${r} refused`:void 0),$.value=$.value.filter(l=>!o.includes(l)),Z()}const M=o=>p.deployments.filter(n=>o.includes(n.id)),P=f(()=>I(M(b.ids),b.action));function x(o,n){if(!oe(n))return void J(o,n);if(!I(M(o),n)){te("Nothing to tear down here","warning","Shared stacks are torn down from their own page.");return}Object.assign(b,{action:n,ids:o,open:!0})}function ce(o){o.action==="open"?i.push(`/deployments/${encodeURIComponent(o.id)}`):x([o.id],o.action)}const be=["up","verify","sleep","wake"],ve=["down","down-forget"],fe=Te();return(o,n)=>(a(),d(t(ke),{direction:"column",gap:4},{default:v(()=>[c(t(we),{title:"Deployments",description:`${R.value.total} submitted · ${R.value.running} running · ${R.value.busy} busy`,"actions-placement":"end"},{actions:v(()=>[c(t(m),{variant:"secondary",icon:"arrow",label:"Refresh",onClick:t(Z)},null,8,["onClick"]),t(L)("developer",t(F))?(a(),d(t(m),{key:0,icon:"plus",label:"Submit",onClick:n[0]||(n[0]=e=>t(i).push("/submit"))})):k("",!0)]),_:1},8,["description"]),!t(p).loaded&&t(p).error?(a(),d(t(Y),{key:0,tone:"danger",title:"Could not load deployments",description:t(p).error},null,8,["description"])):t(p).loaded&&!t(p).deployments.length?(a(),d(t(he),{key:1,title:"Nothing submitted yet",icon:"apps"},{default:v(()=>[t(L)("developer",t(F))?(a(),d(t(m),{key:0,icon:"plus",label:"Submit a spec",onClick:n[1]||(n[1]=e=>t(i).push("/submit"))})):k("",!0)]),_:1})):(a(),g(w,{key:2},[c(t(Ce),{label:"Filters","active-count":ue.value,onClear:pe},{default:v(()=>[$e("div",{ref_key:"search",ref:fe},[c(t(Se),{modelValue:C.value,"onUpdate:modelValue":n[2]||(n[2]=e=>C.value=e),label:"Search","hide-label":"",type:"search",placeholder:"Search deployments","leading-icon":"search",clearable:""},null,8,["modelValue"])],512),c(t(_),{modelValue:U.value,"onUpdate:modelValue":n[3]||(n[3]=e=>U.value=e),label:"Kind",options:ie.value},null,8,["modelValue","options"]),c(t(_),{modelValue:B.value,"onUpdate:modelValue":n[4]||(n[4]=e=>B.value=e),label:"State",options:de.value},null,8,["modelValue","options"])]),_:1},8,["active-count"]),T.value&&(y.value.length||s.busy)?(a(),d(t(je),{key:0,label:"Selection"},{default:v(()=>[c(t(q),{weight:"bold"},{default:v(()=>[S(j(y.value.length)+" selected",1)]),_:1}),y.value.length<z.value.length?(a(),d(t(m),{key:0,size:"compact",variant:"ghost",label:`Select all ${z.value.length}`,onClick:n[5]||(n[5]=e=>$.value=z.value.map(r=>r.id))},null,8,["label"])):k("",!0),c(t(m),{size:"compact",variant:"ghost",label:"Clear",onClick:n[6]||(n[6]=e=>$.value=[])}),G.value?(a(),d(t(q),{key:1,tone:"muted"},{default:v(()=>[S(j(G.value)+" shared, skipped by tear down",1)]),_:1})):k("",!0),(a(),g(w,null,A(be,e=>c(t(m),{key:e,size:"compact",variant:"secondary",label:t(h)[e],loading:s.busy&&s.action===e,disabled:s.busy||!t(I)(y.value,e),onClick:r=>x(y.value.map(l=>l.id),e)},null,8,["label","loading","disabled","onClick"])),64)),(a(),g(w,null,A(ve,e=>c(t(m),{key:e,size:"compact",variant:"danger",label:t(h)[e],loading:s.busy&&s.action===e,disabled:s.busy||!t(I)(y.value,e),onClick:r=>x(y.value.map(l=>l.id),e)},null,8,["label","loading","disabled","onClick"])),64))]),_:1})):k("",!0),c(t(Ve),{selected:$.value,"onUpdate:selected":n[7]||(n[7]=e=>$.value=e),page:X.value,"onUpdate:page":n[8]||(n[8]=e=>X.value=e),label:"Deployments",rows:ae.value,columns:se,loading:!t(p).loaded,sort:E.value,"page-size":15,"get-row-actions":T.value?re:void 0,"row-activatable":"",selectable:T.value,"empty-text":"Nothing matches. Clear the filters.",onSortChange:n[9]||(n[9]=e=>E.value=e),onRowAction:ce,onRowActivate:n[10]||(n[10]=e=>t(i).push(`/deployments/${encodeURIComponent(String(e.id))}`))},{cell:v(({row:e,column:r,value:l})=>[r.key==="id"?(a(),g(w,{key:0},[S(j(l)+" ",1),e.spec?(a(),d(t(q),{key:0,tone:"muted",size:"sm"},{default:v(()=>[S(" · "+j(e.spec),1)]),_:2},1024)):k("",!0)],64)):r.key==="state"?(a(),d(t(K),{key:1,dot:"",label:String(l),tone:t(xe)(String(l))},null,8,["label","tone"])):r.key==="kind"?(a(),d(t(K),{key:2,label:String(l),tone:l==="shared"?"warning":"neutral",variant:"outline"},null,8,["label","tone"])):r.key==="stack"&&!l?(a(),d(t(K),{key:3,label:"Needs variables",tone:"warning"})):r.key==="updated"?(a(),g(w,{key:4},[S(j(t(Le)(Number(l)||null,t(N))),1)],64)):(a(),g(w,{key:5},[S(j(l),1)],64))]),_:1},8,["selected","page","rows","loading","sort","get-row-actions","selectable"]),(a(!0),g(w,null,A(le.value,e=>(a(),d(t(Y),{key:e.id,tone:"warning",title:`${e.id} could not be resolved`,description:e.unresolved,compact:""},{default:v(()=>[c(t(m),{size:"compact",variant:"secondary",label:"Set its variables",onClick:r=>t(i).push(`/deployments/${encodeURIComponent(e.id)}/config`)},null,8,["onClick"])]),_:2},1032,["title","description"]))),128)),s.results.length&&s.action?(a(),d(t(Ne),{key:1,label:`${t(h)[s.action]} results`,divided:""},{default:v(()=>[(a(!0),g(w,null,A(s.results,e=>(a(),d(t(Ue),{key:e.id,title:e.id,description:e.error??(e.job?H(e.job):`skipped: ${e.skipped}`),tone:e.error||e.job&&["failed","leaked"].includes(H(e.job))?"danger":e.job?"success":"neutral",badge:e.job?"job":e.error?"refused":"skipped",interactive:!!e.job,onActivate:r=>e.job&&t(i).push(`/jobs/${encodeURIComponent(e.job.id)}`)},null,8,["title","description","tone","badge","interactive","onActivate"]))),128))]),_:1},8,["label"])):k("",!0),s.results.length&&!s.busy?(a(),d(t(m),{key:2,size:"compact",variant:"ghost",label:"Dismiss results",onClick:n[11]||(n[11]=e=>s.results=[])})):k("",!0)],64)),c(t(Be),{open:b.open,"onUpdate:open":n[12]||(n[12]=e=>b.open=e),danger:"",title:`${t(h)[b.action]} ${P.value} deployment${P.value===1?"":"s"}?`,description:b.action==="down-forget"?"Torn down, then forgotten if the teardown is clean.":"Torn down and checked for leftovers.","confirm-label":t(h)[b.action],busy:s.busy,onConfirm:n[13]||(n[13]=e=>J(b.ids,b.action))},null,8,["open","title","description","confirm-label","busy"])]),_:1}))}});export{He as default};
2
+ //# sourceMappingURL=DeploymentsView-Be8tO0RI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeploymentsView-Be8tO0RI.js","sources":["../../src/bulk.ts","../../src/views/DeploymentsView.vue"],"sourcesContent":["/**\n * What a bulk action sends and what it skips. Shared stacks are never torn down in bulk: their own\n * page asks for the stack name typed out, and a checkbox in a list must not be a way around that.\n */\nimport type { DeploymentRow } from '@samyx/preview-stacks-client';\n\nexport type BulkAction = 'up' | 'verify' | 'sleep' | 'wake' | 'down' | 'down-forget';\n\nexport const BULK_LABEL: Record<BulkAction, string> = {\n up: 'Deploy',\n verify: 'Verify',\n sleep: 'Sleep',\n wake: 'Wake',\n down: 'Tear down',\n 'down-forget': 'Tear down and forget',\n};\n\nexport const isTearDown = (a: BulkAction): boolean => a === 'down' || a === 'down-forget';\n\n/** Why this deployment is left out of this action, or '' to send it. */\nexport function skipReason(d: DeploymentRow, a: BulkAction): string {\n if (d.unresolved || !d.stack) return 'needs variables';\n if (d.kind === 'shared' && isTearDown(a)) return 'shared: tear down from its own page';\n if (d.kind === 'shared' && a === 'sleep') return 'shared stacks do not sleep';\n if (a === 'sleep' && !d.orchestrator) return 'no compose section';\n if (a === 'sleep' && d.asleep) return 'already asleep';\n if (a === 'wake' && !d.asleep) return 'not asleep';\n return '';\n}\n\n/** The selected rows that are still shown. A row a filter hid is never acted on. */\nexport function chosen(shown: DeploymentRow[], selected: string[]): DeploymentRow[] {\n const set = new Set(selected);\n return shown.filter((d) => set.has(d.id));\n}\n\n/** How many of these the action would actually send. */\nexport const sendable = (rows: DeploymentRow[], a: BulkAction): number => rows.filter((d) => !skipReason(d, a)).length;\n","<script setup lang=\"ts\">\n/**\n * Every deployment, filterable, sortable and selectable, with the lifecycle actions on each row and\n * on the selection. One request per deployment: there is no bulk API, and each is its own job.\n */\nimport { computed, reactive, ref } from 'vue';\nimport { useRouter } from 'vue-router';\nimport {\n HAlert,\n HAlertDialog,\n HBadge,\n HButton,\n HChipGroup,\n HDataTable,\n HEmptyState,\n HFilterBar,\n HInput,\n HList,\n HListItem,\n HPageHeader,\n HStack,\n HText,\n HToolbar,\n type MenuAction,\n type TableColumn,\n type TableRow,\n type TableSort,\n} from '@hearth-ui/vue';\nimport { api } from '../api';\nimport { BULK_LABEL, chosen, isTearDown, sendable, skipReason, type BulkAction } from '../bulk';\nimport { filterDeployments, runState, summarize } from '../lib/deployments';\nimport { problem } from '../lib/problem';\nimport { useNow } from '../lib/now';\nimport { useSlashFocus } from '../lib/use-slash-focus';\nimport { ago, runTone } from '../format';\nimport { can } from '../lib/users';\nimport { auth, data, refresh, toast } from '../state';\n\nconst router = useRouter();\nconst now = useNow();\n\nconst q = ref('');\nconst kinds = ref<string[]>([]);\nconst states = ref<string[]>([]);\n/** Courtesy: lifecycle actions are developer's. The server still decides. */\nconst canAct = computed(() => can('developer', auth));\nconst selected = ref<string[]>([]);\nconst sort = ref<TableSort>({ key: 'id', direction: 'ascending' });\nconst page = ref(1);\n\nconst sum = computed(() => summarize(data.deployments));\nconst rows = computed(() => filterDeployments(data.deployments, { q: q.value, kinds: kinds.value, states: states.value }));\nconst picked = computed(() => chosen(rows.value, selected.value));\nconst sharedPicked = computed(() => picked.value.filter((d) => d.kind === 'shared').length);\nconst unresolved = computed(() => data.deployments.filter((d) => d.unresolved));\n\nconst columns: TableColumn[] = [\n { key: 'id', label: 'ID', sortable: true },\n { key: 'kind', label: 'Kind', sortable: true, hideBelow: 520 },\n { key: 'stack', label: 'Stack', sortable: true, truncate: true, hideBelow: 700 },\n { key: 'state', label: 'State', sortable: true },\n { key: 'updated', label: 'Updated', sortable: true, align: 'end', hideBelow: 860 },\n];\nconst tableRows = computed<TableRow[]>(() =>\n rows.value.map((d) => ({\n id: d.id,\n spec: d.specName ?? '',\n kind: d.kind,\n stack: d.stack ?? '',\n state: runState(d),\n updated: d.updatedAt ?? 0, // the number sorts; the cell renders it\n })),\n);\n\nconst rowActions = (row: TableRow): MenuAction[] => {\n const d = data.deployments.find((x) => x.id === row.id);\n if (!d) return [];\n const a = (id: BulkAction, extra: Partial<MenuAction> = {}): MenuAction => ({ id, label: BULK_LABEL[id], disabled: run.busy || !!skipReason(d, id), ...extra });\n return [\n { id: 'open', label: 'Open', icon: 'launch' },\n a('up', { separatorBefore: true }),\n a('verify'),\n a('sleep'),\n a('wake'),\n a('down', { danger: true, separatorBefore: true }),\n a('down-forget', { danger: true }),\n ];\n};\n\nconst kindOptions = computed(() => (['isolated', 'shared'] as const).map((k) => ({ value: k, label: k, count: sum.value[k] })));\nconst stateOptions = computed(() =>\n (['running', 'busy', 'asleep', 'idle', 'unknown'] as const).map((s) => ({ value: s, label: s, count: data.deployments.filter((d) => runState(d) === s).length })),\n);\nconst filtering = computed(() => kinds.value.length + states.value.length + (q.value ? 1 : 0));\nfunction clearFilters(): void {\n q.value = '';\n kinds.value = [];\n states.value = [];\n}\n\n// ── acting ──────────────────────────────────────────────────────────────────────────────────────\ntype Result = { id: string; job?: { id: string; state: string }; error?: string; skipped?: string };\nconst run = reactive({ busy: false, action: '' as BulkAction | '', results: [] as Result[] });\n/** The job's state now: the 202 only knew it as queued or running. */\nconst jobState = (j: { id: string; state: string }): string => data.jobs.find((x) => x.id === j.id)?.state ?? j.state;\nconst confirm = reactive({ open: false, action: 'down' as BulkAction, ids: [] as string[] });\n\nasync function send(ids: string[], action: BulkAction): Promise<void> {\n confirm.open = false;\n run.busy = true;\n run.action = action;\n run.results = [];\n for (const id of ids) {\n const d = data.deployments.find((x) => x.id === id);\n const why = d ? skipReason(d, action) : 'gone';\n if (why) {\n run.results.push({ id, skipped: why });\n continue;\n }\n const r = await api.act(id, action === 'down-forget' ? 'down' : action, action === 'down-forget' ? { forget: true } : {});\n if (r.status === 202 && r.body.job) run.results.push({ id, job: { id: r.body.job.id, state: r.body.job.state } });\n else run.results.push({ id, error: problem(r, BULK_LABEL[action].toLowerCase()) });\n }\n run.busy = false;\n const sent = run.results.filter((x) => x.job).length;\n const bad = run.results.filter((x) => x.error).length;\n toast(`${BULK_LABEL[action]}: ${sent} started`, bad ? 'danger' : 'success', bad ? `${bad} refused` : undefined);\n selected.value = selected.value.filter((id) => !ids.includes(id));\n void refresh();\n}\n\nconst byIds = (ids: string[]) => data.deployments.filter((d) => ids.includes(d.id));\nconst confirmCount = computed(() => sendable(byIds(confirm.ids), confirm.action));\n\nfunction request(ids: string[], action: BulkAction): void {\n if (!isTearDown(action)) return void send(ids, action);\n if (!sendable(byIds(ids), action)) {\n toast('Nothing to tear down here', 'warning', 'Shared stacks are torn down from their own page.');\n return;\n }\n Object.assign(confirm, { action, ids, open: true });\n}\n\nfunction onRowAction(e: { id: string; action: string }): void {\n if (e.action === 'open') void router.push(`/deployments/${encodeURIComponent(e.id)}`);\n else request([e.id], e.action as BulkAction);\n}\n\nconst plain: BulkAction[] = ['up', 'verify', 'sleep', 'wake'];\nconst destructive: BulkAction[] = ['down', 'down-forget'];\n\n// \"/\" focuses the search box, as in the first UI.\nconst search = useSlashFocus();\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HPageHeader title=\"Deployments\" :description=\"`${sum.total} submitted · ${sum.running} running · ${sum.busy} busy`\" actions-placement=\"end\">\n <template #actions>\n <HButton variant=\"secondary\" icon=\"arrow\" label=\"Refresh\" @click=\"refresh\" />\n <HButton v-if=\"can('developer', auth)\" icon=\"plus\" label=\"Submit\" @click=\"router.push('/submit')\" />\n </template>\n </HPageHeader>\n\n <HAlert v-if=\"!data.loaded && data.error\" tone=\"danger\" title=\"Could not load deployments\" :description=\"data.error\" />\n\n <HEmptyState v-else-if=\"data.loaded && !data.deployments.length\" title=\"Nothing submitted yet\" icon=\"apps\">\n <HButton v-if=\"can('developer', auth)\" icon=\"plus\" label=\"Submit a spec\" @click=\"router.push('/submit')\" />\n </HEmptyState>\n\n <template v-else>\n <HFilterBar label=\"Filters\" :active-count=\"filtering\" @clear=\"clearFilters\">\n <div ref=\"search\">\n <HInput v-model=\"q\" label=\"Search\" hide-label type=\"search\" placeholder=\"Search deployments\" leading-icon=\"search\" clearable />\n </div>\n <HChipGroup v-model=\"kinds\" label=\"Kind\" :options=\"kindOptions\" />\n <HChipGroup v-model=\"states\" label=\"State\" :options=\"stateOptions\" />\n </HFilterBar>\n\n <HToolbar v-if=\"canAct && (picked.length || run.busy)\" label=\"Selection\">\n <HText weight=\"bold\">{{ picked.length }} selected</HText>\n <HButton v-if=\"picked.length < rows.length\" size=\"compact\" variant=\"ghost\" :label=\"`Select all ${rows.length}`\" @click=\"selected = rows.map((d) => d.id)\" />\n <HButton size=\"compact\" variant=\"ghost\" label=\"Clear\" @click=\"selected = []\" />\n <HText v-if=\"sharedPicked\" tone=\"muted\">{{ sharedPicked }} shared, skipped by tear down</HText>\n <HButton\n v-for=\"a in plain\"\n :key=\"a\"\n size=\"compact\"\n variant=\"secondary\"\n :label=\"BULK_LABEL[a]\"\n :loading=\"run.busy && run.action === a\"\n :disabled=\"run.busy || !sendable(picked, a)\"\n @click=\"request(picked.map((d) => d.id), a)\"\n />\n <HButton\n v-for=\"a in destructive\"\n :key=\"a\"\n size=\"compact\"\n variant=\"danger\"\n :label=\"BULK_LABEL[a]\"\n :loading=\"run.busy && run.action === a\"\n :disabled=\"run.busy || !sendable(picked, a)\"\n @click=\"request(picked.map((d) => d.id), a)\"\n />\n </HToolbar>\n\n <HDataTable\n v-model:selected=\"selected\"\n v-model:page=\"page\"\n label=\"Deployments\"\n :rows=\"tableRows\"\n :columns=\"columns\"\n :loading=\"!data.loaded\"\n :sort=\"sort\"\n :page-size=\"15\"\n :get-row-actions=\"canAct ? rowActions : undefined\"\n row-activatable\n :selectable=\"canAct\"\n empty-text=\"Nothing matches. Clear the filters.\"\n @sort-change=\"sort = $event\"\n @row-action=\"onRowAction\"\n @row-activate=\"router.push(`/deployments/${encodeURIComponent(String($event.id))}`)\"\n >\n <template #cell=\"{ row, column, value }\">\n <template v-if=\"column.key === 'id'\">\n {{ value }}\n <HText v-if=\"row.spec\" tone=\"muted\" size=\"sm\"> · {{ row.spec }}</HText>\n </template>\n <HBadge v-else-if=\"column.key === 'state'\" dot :label=\"String(value)\" :tone=\"runTone(String(value))\" />\n <HBadge v-else-if=\"column.key === 'kind'\" :label=\"String(value)\" :tone=\"value === 'shared' ? 'warning' : 'neutral'\" variant=\"outline\" />\n <HBadge v-else-if=\"column.key === 'stack' && !value\" label=\"Needs variables\" tone=\"warning\" />\n <template v-else-if=\"column.key === 'updated'\">{{ ago(Number(value) || null, now) }}</template>\n <template v-else>{{ value }}</template>\n </template>\n </HDataTable>\n\n <HAlert v-for=\"d in unresolved\" :key=\"d.id\" tone=\"warning\" :title=\"`${d.id} could not be resolved`\" :description=\"d.unresolved\" compact>\n <HButton size=\"compact\" variant=\"secondary\" label=\"Set its variables\" @click=\"router.push(`/deployments/${encodeURIComponent(d.id)}/config`)\" />\n </HAlert>\n\n <HList v-if=\"run.results.length && run.action\" :label=\"`${BULK_LABEL[run.action]} results`\" divided>\n <HListItem\n v-for=\"r in run.results\"\n :key=\"r.id\"\n :title=\"r.id\"\n :description=\"r.error ?? (r.job ? jobState(r.job) : `skipped: ${r.skipped}`)\"\n :tone=\"r.error || (r.job && ['failed', 'leaked'].includes(jobState(r.job))) ? 'danger' : r.job ? 'success' : 'neutral'\"\n :badge=\"r.job ? 'job' : r.error ? 'refused' : 'skipped'\"\n :interactive=\"!!r.job\"\n @activate=\"r.job && router.push(`/jobs/${encodeURIComponent(r.job.id)}`)\"\n />\n </HList>\n <HButton v-if=\"run.results.length && !run.busy\" size=\"compact\" variant=\"ghost\" label=\"Dismiss results\" @click=\"run.results = []\" />\n </template>\n\n <HAlertDialog\n v-model:open=\"confirm.open\"\n danger\n :title=\"`${BULK_LABEL[confirm.action]} ${confirmCount} deployment${confirmCount === 1 ? '' : 's'}?`\"\n :description=\"confirm.action === 'down-forget' ? 'Torn down, then forgotten if the teardown is clean.' : 'Torn down and checked for leftovers.'\"\n :confirm-label=\"BULK_LABEL[confirm.action]\"\n :busy=\"run.busy\"\n @confirm=\"send(confirm.ids, confirm.action)\"\n />\n </HStack>\n</template>\n"],"names":["BULK_LABEL","isTearDown","a","skipReason","d","chosen","shown","selected","set","sendable","rows","router","useRouter","now","useNow","q","ref","kinds","states","canAct","computed","can","auth","sort","page","sum","summarize","data","filterDeployments","picked","sharedPicked","unresolved","columns","tableRows","runState","rowActions","row","x","id","extra","run","kindOptions","k","stateOptions","s","filtering","clearFilters","reactive","jobState","j","_a","confirm","send","ids","action","why","r","api","problem","sent","bad","toast","refresh","byIds","confirmCount","request","onRowAction","e","plain","destructive","search","useSlashFocus","_createBlock","_unref","HStack","_createVNode","HPageHeader","HButton","_cache","$event","HAlert","HEmptyState","_createElementBlock","_Fragment","HFilterBar","_createElementVNode","HInput","HChipGroup","HToolbar","HText","_createTextVNode","_toDisplayString","_renderList","HDataTable","column","value","HBadge","runTone","ago","HList","_openBlock","HListItem","HAlertDialog"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{d as oe,O as se,a as ue,c as o,w as r,u as e,q as F,g as y,Z as ie,a8 as re,b as de,r as v,A as i,f as C,Q as c,j as u,ac as ve,Y as ce,x as Z,n as J,t as M,h as Q,F as Y,a9 as pe,N as be,J as fe,l as me,C as G,D as H,L as K,M as L,e as n,k as P}from"./index-Cthapg0Q.js";import{c as X}from"./api-core-DUb3ejZ0.js";import{s as ye,t as ke,j as ge,b as N}from"./format-Dr8IZDXn.js";import{w as je,b as we,i as _,a as he,s as Ce,l as Se,c as $e,j as Ne,d as Re,e as xe,f as Ae}from"./jobs-Bz_YeOAs.js";import{p as U}from"./problem-Cs7tz86T.js";import{u as Te}from"./now-C-iOYv8-.js";const Ve=oe({__name:"JobView",props:{id:{}},setup(R){const p=R,k=de(),ee=Te(1e3),t=v(null),b=v([]),x=v(!1),f=v(""),g=v(!1);let m=null;const A=i(()=>!!t.value&&_(t.value.state)),d=i(()=>{var l;return((l=t.value)==null?void 0:l.state)==="queued"}),j=i(()=>t.value?he(t.value,P.jobs):null),T=i(()=>t.value?Ce(t.value,P.jobs):null),D=i(()=>{var l,a;return((a=(l=t.value)==null?void 0:l.outcome)==null?void 0:a.steps)??[]}),B=i(()=>Se(D.value)),O=i(()=>$e(D.value)),V=i(()=>t.value?Ne(t.value):null),q=i(()=>Re(b.value)),te={ok:"success",unverifiable:"warning",leaked:"danger",failed:"danger"},z=i(()=>D.value.map((l,a)=>({id:String(a),title:`${l.axis} · ${l.phase.replace("_"," ")}`,description:Ae(l),tone:te[xe(l)]})));async function w(){var s;const l=p.id,a=await K.job(l);return l!==p.id?null:a.status===404?(x.value=!0,null):a.ok?(f.value="",t.value=a.body.job,(s=a.body.job.log)!=null&&s.length&&!b.value.length&&(b.value=[...a.body.job.log]),a.body.job):(f.value=U(a,"Load job"),null)}function h(){m==null||m.close(),m=null,g.value=!1}function E(){h(),b.value=[];let l=d.value;m=new EventSource(X.streamUrl(p.id)),g.value=!0,m.onmessage=a=>{let s;try{s=JSON.parse(a.data)}catch{return}if(s.done){h(),w();return}l&&(l=!1,w()),b.value=we(b.value,s)},m.onerror=()=>{h(),w()}}async function W(){const l=p.id,a=await w();a&&l===p.id&&!_(a.state)&&E()}se(()=>p.id,()=>{h(),b.value=[],t.value=null,x.value=!1,f.value="",W()},{immediate:!0}),ue(h);const S=v(!1),$=v(!1);async function ae(){S.value=!1,$.value=!0;const l=await X.cancelJob(p.id);$.value=!1,l.ok?L(l.body.warning??"Stopped.","success"):L(l.status===409?"Already finished":U(l,"Stop job"),l.status===409?"info":"danger"),w()}const le=i(()=>{var l;return G("developer",H)&&A.value&&!!((l=t.value)!=null&&l.deployment)&&(t.value.action==="up"||t.value.action==="verify")}),I=v(!1);async function ne(){var a;if(!((a=t.value)!=null&&a.deployment))return;I.value=!0;const l=await K.act(t.value.deployment,t.value.action);I.value=!1,l.status===202&&l.body.job?k.push(`/jobs/${encodeURIComponent(l.body.job.id)}`):L(U(l,N(t.value.action)),"danger")}return(l,a)=>x.value?(n(),o(e(F),{key:0,title:`No job ${R.id}`,icon:"search",description:"The history is held in memory. A restart clears it."},{default:r(()=>[C(e(c),{label:"Jobs",onClick:a[0]||(a[0]=s=>e(k).push("/jobs"))})]),_:1},8,["title"])):f.value&&!t.value?(n(),o(e(y),{key:1,tone:"danger",title:"Could not load the job",description:f.value},{default:r(()=>[C(e(c),{size:"compact",variant:"secondary",label:"Retry",onClick:W})]),_:1},8,["description"])):t.value?(n(),o(e(re),{key:3,title:e(N)(t.value.action),description:t.value.stack,breadcrumbs:[{id:"jobs",label:"Jobs"},{id:"self",label:R.id}],status:t.value.state,tone:e(ge)(t.value.state),fields:[{key:"started",label:"Started",value:t.value.startedAt?e(ye)(t.value.startedAt):d.value?"Not started":"Never started"},{key:"took",label:"Took",value:e(ke)(t.value.startedAt,t.value.endedAt,e(ee))},{key:"deployment",label:"Deployment",value:t.value.deployment??"Control plane"}],onNavigate:a[6]||(a[6]=s=>e(k).push("/jobs"))},{actions:r(()=>[g.value?(n(),o(e(me),{key:0,dot:"",tone:"info",label:"live"})):u("",!0),!g.value&&!A.value?(n(),o(e(c),{key:1,variant:"secondary",label:"Reconnect",onClick:E})):u("",!0),V.value?(n(),o(e(c),{key:2,variant:"secondary",label:t.value.deployment?"Deployment":"Control",icon:"launch",onClick:a[1]||(a[1]=s=>e(k).push(V.value))},null,8,["label"])):u("",!0),le.value?(n(),o(e(c),{key:3,variant:"secondary",icon:"arrow",label:"Run again",loading:I.value,onClick:ne},null,8,["loading"])):u("",!0),!A.value&&e(G)("developer",e(H))?(n(),o(e(c),{key:4,variant:"danger",label:d.value?"Drop":"Stop",loading:$.value,onClick:a[2]||(a[2]=s=>S.value=!0)},null,8,["label","loading"])):u("",!0)]),default:r(()=>[C(e(be),{direction:"column",gap:4},{default:r(()=>[f.value?(n(),o(e(y),{key:0,tone:"danger",title:"Could not refresh the job",description:f.value,compact:""},null,8,["description"])):u("",!0),t.value.state==="running"?(n(),o(e(ve),{key:1,label:"Running"})):u("",!0),d.value?(n(),o(e(y),{key:2,tone:"info",title:"Waiting to start",description:j.value?e(je)(j.value):""},{default:r(()=>{var s;return[((s=j.value)==null?void 0:s.kind)==="stack"?(n(),o(e(c),{key:0,size:"compact",variant:"secondary",label:`Open ${e(N)(j.value.blocker.action)}`,onClick:a[3]||(a[3]=De=>e(k).push(`/jobs/${encodeURIComponent(j.value.blocker.id)}`))},null,8,["label"])):u("",!0)]}),_:1},8,["description"])):u("",!0),t.value.state==="superseded"?(n(),o(e(y),{key:3,tone:"neutral",title:"Superseded. It never ran.",description:`Replaced while queued for ${t.value.stack}.`},{default:r(()=>[T.value?(n(),o(e(c),{key:0,size:"compact",variant:"secondary",label:`Open ${e(N)(T.value.action).toLowerCase()}`,onClick:a[4]||(a[4]=s=>e(k).push(`/jobs/${encodeURIComponent(T.value.id)}`))},null,8,["label"])):u("",!0)]),_:1},8,["description"])):u("",!0),t.value.state==="cancelled"?(n(),o(e(y),{key:4,tone:"warning",title:`Stopped by ${t.value.cancelledBy??"an operator"}. Nothing was undone.`,description:"Run Verify to see what exists."},null,8,["title"])):u("",!0),B.value.length?(n(),o(e(y),{key:5,tone:"danger",title:`Leaked: ${B.value.join(", ")}`,description:"Still present and not retried. Remove by hand."},null,8,["title"])):u("",!0),t.value.error?(n(),o(e(y),{key:6,tone:"danger",title:"The job crashed",description:t.value.error},null,8,["description"])):u("",!0),q.value.length?(n(),o(e(ce),{key:7,entries:q.value,label:"Job log","max-lines":5e3,follow:""},null,8,["entries"])):(n(),o(e(Z),{key:8,tone:"muted"},{default:r(()=>[J(M(d.value?"Waiting to start.":g.value?"Waiting for output.":"No output."),1)]),_:1})),t.value.outcome?(n(),Q(Y,{key:9},[C(e(Z),{weight:"bold"},{default:r(()=>[a[7]||(a[7]=J("Steps",-1)),O.value?(n(),Q(Y,{key:0},[J(" · "+M(O.value)+" unverifiable",1)],64)):u("",!0)]),_:1}),z.value.length?(n(),o(e(pe),{key:0,items:z.value,label:"Steps"},null,8,["items"])):(n(),o(e(F),{key:1,title:"No steps recorded",icon:"clock"}))],64)):u("",!0)]),_:1}),C(e(fe),{open:S.value,"onUpdate:open":a[5]||(a[5]=s=>S.value=s),danger:"",title:d.value?"Drop this job?":"Stop this job?",description:d.value?"It never ran.":"Nothing is undone.","confirm-label":d.value?"Drop":"Stop",busy:$.value,onConfirm:ae},null,8,["open","title","description","confirm-label","busy"])]),_:1},8,["title","description","breadcrumbs","status","tone","fields"])):(n(),o(e(ie),{key:2,variant:"rectangle"}))}});export{Ve as default};
2
+ //# sourceMappingURL=JobView-DL9KQcjx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobView-DL9KQcjx.js","sources":["../../src/views/JobView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * One job: state, the log, and what each step did.\n *\n * The log streams over EventSource. The server replays the whole buffer and then goes live, so\n * attaching late still shows the start; a final `{done:true}` ends it and the job is read once more\n * for `outcome`, which only exists after it finishes. A queued job's stream is open and silent\n * until it dispatches, and its first line is that dispatch, so that line triggers one re-read.\n */\nimport { computed, onBeforeUnmount, ref, watch } from 'vue';\nimport { useRouter } from 'vue-router';\nimport {\n HAlert,\n HAlertDialog,\n HBadge,\n HButton,\n HEmptyState,\n HLogViewer,\n HProgress,\n HResourceDetail,\n HSkeleton,\n HStack,\n HText,\n HTimeline,\n type TimelineItem,\n} from '@hearth-ui/vue';\nimport type { Job } from '@samyx/preview-stacks-client';\nimport { api } from '../api';\nimport { coreApi } from '../api-core';\nimport { actionLabel, jobTone, stamp, took } from '../format';\nimport { addLine, countUnverifiable, isTerminal, jobTarget, leakedAxes, logEntries, stepLine, stepState, supersededBy, waitReason, waitText, type LogLine } from '../lib/jobs';\nimport { problem } from '../lib/problem';\nimport { useNow } from '../lib/now';\nimport { can } from '../lib/users';\nimport { auth, data, toast } from '../state';\n\nconst props = defineProps<{ id: string }>();\nconst router = useRouter();\nconst now = useNow(1000);\n\nconst job = ref<Job | null>(null);\nconst lines = ref<LogLine[]>([]);\nconst missing = ref(false);\nconst error = ref('');\nconst streaming = ref(false);\nlet source: EventSource | null = null;\n\nconst terminal = computed(() => !!job.value && isTerminal(job.value.state));\nconst queued = computed(() => job.value?.state === 'queued');\nconst wait = computed(() => (job.value ? waitReason(job.value, data.jobs) : null));\nconst replacement = computed(() => (job.value ? supersededBy(job.value, data.jobs) : null));\nconst steps = computed(() => job.value?.outcome?.steps ?? []);\nconst leaks = computed(() => leakedAxes(steps.value));\nconst unverifiable = computed(() => countUnverifiable(steps.value));\nconst target = computed(() => (job.value ? jobTarget(job.value) : null));\nconst entries = computed(() => logEntries(lines.value));\n\nconst stepTone = { ok: 'success', unverifiable: 'warning', leaked: 'danger', failed: 'danger' } as const;\nconst stepItems = computed<TimelineItem[]>(() =>\n steps.value.map((s, i) => ({\n id: String(i),\n title: `${s.axis} · ${s.phase.replace('_', ' ')}`,\n description: stepLine(s),\n tone: stepTone[stepState(s)],\n })),\n);\n\nasync function load(): Promise<Job | null> {\n const want = props.id;\n const r = await api.job(want);\n if (want !== props.id) return null; // navigated to another job meanwhile\n if (r.status === 404) {\n missing.value = true;\n return null;\n }\n if (!r.ok) {\n error.value = problem(r, 'Load job');\n return null;\n }\n error.value = '';\n job.value = r.body.job;\n if (r.body.job.log?.length && !lines.value.length) lines.value = [...r.body.job.log];\n return r.body.job;\n}\n\nfunction closeStream(): void {\n source?.close();\n source = null;\n streaming.value = false;\n}\n\nfunction stream(): void {\n closeStream();\n lines.value = []; // the stream replays the whole buffer, so the seed would show twice\n let awaitingDispatch = queued.value;\n source = new EventSource(coreApi.streamUrl(props.id));\n streaming.value = true;\n source.onmessage = (ev) => {\n let p: unknown;\n try {\n p = JSON.parse(ev.data as string);\n } catch {\n return;\n }\n if ((p as { done?: boolean }).done) {\n closeStream();\n void load();\n return;\n }\n if (awaitingDispatch) {\n awaitingDispatch = false;\n void load();\n }\n lines.value = addLine(lines.value, p as LogLine);\n };\n // Usually the job ended between the read and the connect. Stop rather than reconnect forever.\n source.onerror = () => {\n closeStream();\n void load();\n };\n}\n\nasync function init(): Promise<void> {\n const want = props.id;\n const loaded = await load();\n if (loaded && want === props.id && !isTerminal(loaded.state)) stream();\n}\nwatch(\n () => props.id,\n () => {\n closeStream();\n lines.value = [];\n job.value = null;\n missing.value = false;\n error.value = '';\n void init();\n },\n { immediate: true },\n);\nonBeforeUnmount(closeStream);\n\n// ── acting ──────────────────────────────────────────────────────────────────────────────────────\nconst confirmStop = ref(false);\nconst stopping = ref(false);\nasync function stop(): Promise<void> {\n confirmStop.value = false;\n stopping.value = true;\n const r = await coreApi.cancelJob(props.id);\n stopping.value = false;\n // 409: it finished on its own between the click and the request.\n if (!r.ok) toast(r.status === 409 ? 'Already finished' : problem(r, 'Stop job'), r.status === 409 ? 'info' : 'danger');\n else toast(r.body.warning ?? 'Stopped.', 'success');\n void load();\n}\n\nconst rerunnable = computed(() => can('developer', auth) && terminal.value && !!job.value?.deployment && (job.value.action === 'up' || job.value.action === 'verify'));\nconst rerunning = ref(false);\nasync function rerun(): Promise<void> {\n if (!job.value?.deployment) return;\n rerunning.value = true;\n const r = await api.act(job.value.deployment, job.value.action as 'up' | 'verify');\n rerunning.value = false;\n if (r.status === 202 && r.body.job) void router.push(`/jobs/${encodeURIComponent(r.body.job.id)}`);\n else toast(problem(r, actionLabel(job.value.action)), 'danger');\n}\n</script>\n\n<template>\n <HEmptyState v-if=\"missing\" :title=\"`No job ${id}`\" icon=\"search\" description=\"The history is held in memory. A restart clears it.\">\n <HButton label=\"Jobs\" @click=\"router.push('/jobs')\" />\n </HEmptyState>\n <HAlert v-else-if=\"error && !job\" tone=\"danger\" title=\"Could not load the job\" :description=\"error\">\n <HButton size=\"compact\" variant=\"secondary\" label=\"Retry\" @click=\"init\" />\n </HAlert>\n <HSkeleton v-else-if=\"!job\" variant=\"rectangle\" />\n\n <HResourceDetail\n v-else\n :title=\"actionLabel(job.action)\"\n :description=\"job.stack\"\n :breadcrumbs=\"[{ id: 'jobs', label: 'Jobs' }, { id: 'self', label: id }]\"\n :status=\"job.state\"\n :tone=\"jobTone(job.state)\"\n :fields=\"[\n { key: 'started', label: 'Started', value: job.startedAt ? stamp(job.startedAt) : queued ? 'Not started' : 'Never started' },\n { key: 'took', label: 'Took', value: took(job.startedAt, job.endedAt, now) },\n { key: 'deployment', label: 'Deployment', value: job.deployment ?? 'Control plane' },\n ]\"\n @navigate=\"router.push('/jobs')\"\n >\n <template #actions>\n <HBadge v-if=\"streaming\" dot tone=\"info\" label=\"live\" />\n <HButton v-if=\"!streaming && !terminal\" variant=\"secondary\" label=\"Reconnect\" @click=\"stream\" />\n <HButton v-if=\"target\" variant=\"secondary\" :label=\"job.deployment ? 'Deployment' : 'Control'\" icon=\"launch\" @click=\"router.push(target)\" />\n <HButton v-if=\"rerunnable\" variant=\"secondary\" icon=\"arrow\" label=\"Run again\" :loading=\"rerunning\" @click=\"rerun\" />\n <HButton v-if=\"!terminal && can('developer', auth)\" variant=\"danger\" :label=\"queued ? 'Drop' : 'Stop'\" :loading=\"stopping\" @click=\"confirmStop = true\" />\n </template>\n\n <HStack direction=\"column\" :gap=\"4\">\n <HAlert v-if=\"error\" tone=\"danger\" title=\"Could not refresh the job\" :description=\"error\" compact />\n <HProgress v-if=\"job.state === 'running'\" label=\"Running\" />\n\n <HAlert v-if=\"queued\" tone=\"info\" title=\"Waiting to start\" :description=\"wait ? waitText(wait) : ''\">\n <HButton v-if=\"wait?.kind === 'stack'\" size=\"compact\" variant=\"secondary\" :label=\"`Open ${actionLabel(wait.blocker.action)}`\" @click=\"router.push(`/jobs/${encodeURIComponent(wait.blocker.id)}`)\" />\n </HAlert>\n <HAlert v-if=\"job.state === 'superseded'\" tone=\"neutral\" title=\"Superseded. It never ran.\" :description=\"`Replaced while queued for ${job.stack}.`\">\n <HButton v-if=\"replacement\" size=\"compact\" variant=\"secondary\" :label=\"`Open ${actionLabel(replacement.action).toLowerCase()}`\" @click=\"router.push(`/jobs/${encodeURIComponent(replacement.id)}`)\" />\n </HAlert>\n <HAlert v-if=\"job.state === 'cancelled'\" tone=\"warning\" :title=\"`Stopped by ${job.cancelledBy ?? 'an operator'}. Nothing was undone.`\" description=\"Run Verify to see what exists.\" />\n <HAlert v-if=\"leaks.length\" tone=\"danger\" :title=\"`Leaked: ${leaks.join(', ')}`\" description=\"Still present and not retried. Remove by hand.\" />\n <HAlert v-if=\"job.error\" tone=\"danger\" title=\"The job crashed\" :description=\"job.error\" />\n\n <HLogViewer v-if=\"entries.length\" :entries=\"entries\" label=\"Job log\" :max-lines=\"5000\" follow />\n <HText v-else tone=\"muted\">{{ queued ? 'Waiting to start.' : streaming ? 'Waiting for output.' : 'No output.' }}</HText>\n\n <template v-if=\"job.outcome\">\n <HText weight=\"bold\">Steps<template v-if=\"unverifiable\"> · {{ unverifiable }} unverifiable</template></HText>\n <HTimeline v-if=\"stepItems.length\" :items=\"stepItems\" label=\"Steps\" />\n <HEmptyState v-else title=\"No steps recorded\" icon=\"clock\" />\n </template>\n </HStack>\n\n <HAlertDialog\n v-model:open=\"confirmStop\"\n danger\n :title=\"queued ? 'Drop this job?' : 'Stop this job?'\"\n :description=\"queued ? 'It never ran.' : 'Nothing is undone.'\"\n :confirm-label=\"queued ? 'Drop' : 'Stop'\"\n :busy=\"stopping\"\n @confirm=\"stop\"\n />\n </HResourceDetail>\n</template>\n"],"names":["props","__props","router","useRouter","now","useNow","job","ref","lines","missing","error","streaming","source","terminal","computed","isTerminal","queued","_a","wait","waitReason","data","replacement","supersededBy","steps","_b","leaks","leakedAxes","unverifiable","countUnverifiable","target","jobTarget","entries","logEntries","stepTone","stepItems","s","i","stepLine","stepState","load","want","r","api","problem","closeStream","stream","awaitingDispatch","coreApi","ev","p","addLine","init","loaded","watch","onBeforeUnmount","confirmStop","stopping","stop","toast","rerunnable","can","auth","rerunning","rerun","actionLabel","_createBlock","_unref","HEmptyState","_createVNode","HButton","_cache","$event","HAlert","HResourceDetail","jobTone","stamp","took","HBadge","HStack","HProgress","waitText","HLogViewer","HText","_createTextVNode","_toDisplayString","_createElementBlock","_Fragment","HTimeline","HAlertDialog","HSkeleton"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{d as U,r as h,c as d,w as n,u as a,N as $,_ as F,f as r,Q as z,z as J,I as D,k as l,g as E,h as k,G as j,S as G,H,aa as O,j as N,E as P,F as y,l as Q,x as Z,n as f,t as g,m as K,b as M,A as m,ab as W,e as s}from"./index-Cthapg0Q.js";import{d as X,j as Y,t as ee,a as te,b as R}from"./format-Dr8IZDXn.js";import{j as ae,w as oe,a as se,s as le}from"./jobs-Bz_YeOAs.js";import{u as ne}from"./now-C-iOYv8-.js";import{u as re}from"./use-slash-focus-BeKibFvm.js";const be=U({__name:"JobsView",setup(ue){const b=F(),v=M(),S=ne(),c=h(""),u=h(typeof b.query.state=="string"?[b.query.state]:[]),w=h(1),i=m(()=>typeof b.query.deployment=="string"?b.query.deployment:""),V=m(()=>{const t=c.value.trim().toLowerCase();return l.jobs.filter(e=>i.value&&e.deployment!==i.value||u.value.length&&!u.value.includes(e.state)?!1:!t||e.stack.toLowerCase().includes(t)||e.action.includes(t))}),_=[{key:"state",label:"State"},{key:"action",label:"Action"},{key:"stack",label:"Stack",truncate:!0},{key:"started",label:"Started",hideBelow:560},{key:"took",label:"Took",align:"end",hideBelow:700},{key:"steps",label:"Steps",align:"end",hideBelow:820}];function B(t){if(t.state==="queued")return{text:oe(se(t,l.jobs))};if(t.state!=="superseded")return null;const e=le(t,l.jobs);return e?{text:`Replaced by a newer ${R(e.action).toLowerCase()}.`,to:`/jobs/${encodeURIComponent(e.id)}`}:{text:"Never ran."}}const T=m(()=>V.value.map(t=>{const e=B(t);return{id:t.id,state:t.state,action:R(t.action),stack:t.stack,target:ae(t)??"",note:(e==null?void 0:e.text)??"",noteTo:(e==null?void 0:e.to)??"",started:te(t.startedAt,S.value),took:ee(t.startedAt,t.endedAt,S.value),steps:t.outcome?t.outcome.steps.length:"—"}})),q=m(()=>["queued","running","ok","failed","leaked","cancelled","superseded"].map(t=>({value:t,label:t,count:l.jobs.filter(e=>e.state===t).length}))),A=m(()=>u.value.length+(c.value?1:0)+(i.value?1:0));function L(){c.value="",u.value=[],i.value&&v.replace("/jobs")}const I=re();return(t,e)=>{const C=W("RouterLink");return s(),d(a($),{direction:"column",gap:4},{default:n(()=>[r(a(D),{title:"Jobs",description:"Newest first, the last 50. A restart clears them.","actions-placement":"end"},{actions:n(()=>[r(a(z),{variant:"secondary",icon:"arrow",label:"Refresh",onClick:a(J)},null,8,["onClick"])]),_:1}),!a(l).loaded&&a(l).error?(s(),d(a(E),{key:0,tone:"danger",title:"Could not load jobs",description:a(l).error},null,8,["description"])):(s(),k(y,{key:1},[r(a(P),{label:"Filters","active-count":A.value,onClear:L},{default:n(()=>[j("div",{ref_key:"search",ref:I},[r(a(G),{modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=o=>c.value=o),label:"Search","hide-label":"",type:"search",placeholder:"Search by stack or action. Press /","leading-icon":"search",clearable:""},null,8,["modelValue"])],512),r(a(H),{modelValue:u.value,"onUpdate:modelValue":e[1]||(e[1]=o=>u.value=o),label:"State",options:q.value},null,8,["modelValue","options"]),i.value?(s(),d(a(O),{key:0,label:`Deployment ${i.value}`,removable:"",onRemove:e[2]||(e[2]=o=>a(v).replace("/jobs"))},null,8,["label"])):N("",!0)]),_:1},8,["active-count"]),r(a(K),{page:w.value,"onUpdate:page":e[3]||(e[3]=o=>w.value=o),label:"Jobs",rows:T.value,columns:_,loading:!a(l).loaded,"page-size":15,"row-activatable":"","empty-text":a(l).jobs.length?"Nothing matches. Clear the filters.":"No jobs recorded.",onRowActivate:e[4]||(e[4]=o=>a(v).push(`/jobs/${encodeURIComponent(String(o.id))}`))},{cell:n(({row:o,column:x,value:p})=>[x.key==="state"?(s(),k(y,{key:0},[r(a(Q),{dot:"",label:String(p),tone:a(Y)(String(p)),title:a(X)(String(p))},null,8,["label","tone","title"]),o.note?(s(),d(a(Z),{key:0,tone:"muted",size:"sm",as:"div"},{default:n(()=>[o.noteTo?(s(),d(C,{key:0,to:String(o.noteTo)},{default:n(()=>[f(g(o.note),1)]),_:2},1032,["to"])):(s(),k(y,{key:1},[f(g(o.note),1)],64))]),_:2},1024)):N("",!0)],64)):x.key==="stack"&&o.target?(s(),d(C,{key:1,to:String(o.target)},{default:n(()=>[f(g(p),1)]),_:2},1032,["to"])):(s(),k(y,{key:2},[f(g(p),1)],64))]),_:1},8,["page","rows","loading","empty-text"])],64))]),_:1})}}});export{be as default};
2
+ //# sourceMappingURL=JobsView-Bq4PtEaW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobsView-Bq4PtEaW.js","sources":["../../src/views/JobsView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/** Job history, newest first. `?deployment=<id>` narrows it: the link a deployment page uses. */\nimport { computed, ref } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport {\n HAlert,\n HBadge,\n HButton,\n HChip,\n HChipGroup,\n HDataTable,\n HFilterBar,\n HInput,\n HPageHeader,\n HStack,\n HText,\n type TableColumn,\n type TableRow,\n} from '@hearth-ui/vue';\nimport { actionLabel, ago, jobTone, sentence, took } from '../format';\nimport { jobTarget, supersededBy, waitReason, waitText } from '../lib/jobs';\nimport { useNow } from '../lib/now';\nimport { useSlashFocus } from '../lib/use-slash-focus';\nimport { data, refresh } from '../state';\n\nconst route = useRoute();\nconst router = useRouter();\nconst now = useNow();\n\nconst q = ref('');\nconst states = ref<string[]>(typeof route.query.state === 'string' ? [route.query.state] : []);\nconst page = ref(1);\nconst deployment = computed(() => (typeof route.query.deployment === 'string' ? route.query.deployment : ''));\n\nconst jobs = computed(() => {\n const needle = q.value.trim().toLowerCase();\n return data.jobs.filter((j) => {\n if (deployment.value && j.deployment !== deployment.value) return false;\n if (states.value.length && !states.value.includes(j.state)) return false;\n return !needle || j.stack.toLowerCase().includes(needle) || j.action.includes(needle);\n });\n});\n\nconst columns: TableColumn[] = [\n { key: 'state', label: 'State' },\n { key: 'action', label: 'Action' },\n { key: 'stack', label: 'Stack', truncate: true },\n { key: 'started', label: 'Started', hideBelow: 560 },\n { key: 'took', label: 'Took', align: 'end', hideBelow: 700 },\n { key: 'steps', label: 'Steps', align: 'end', hideBelow: 820 },\n];\n\n/** Under a queued or superseded badge: why it is not moving, or what replaced it. */\nfunction note(j: (typeof jobs.value)[number]): { text: string; to?: string } | null {\n if (j.state === 'queued') return { text: waitText(waitReason(j, data.jobs)) };\n if (j.state !== 'superseded') return null;\n const by = supersededBy(j, data.jobs);\n return by ? { text: `Replaced by a newer ${actionLabel(by.action).toLowerCase()}.`, to: `/jobs/${encodeURIComponent(by.id)}` } : { text: 'Never ran.' };\n}\n\nconst rows = computed<TableRow[]>(() =>\n jobs.value.map((j) => {\n const n = note(j);\n return {\n id: j.id,\n state: j.state,\n action: actionLabel(j.action),\n stack: j.stack,\n target: jobTarget(j) ?? '',\n note: n?.text ?? '',\n noteTo: n?.to ?? '',\n started: ago(j.startedAt, now.value),\n took: took(j.startedAt, j.endedAt, now.value),\n steps: j.outcome ? j.outcome.steps.length : '—',\n };\n }),\n);\nconst stateOptions = computed(() =>\n ['queued', 'running', 'ok', 'failed', 'leaked', 'cancelled', 'superseded'].map((s) => ({ value: s, label: s, count: data.jobs.filter((j) => j.state === s).length })),\n);\nconst filtering = computed(() => states.value.length + (q.value ? 1 : 0) + (deployment.value ? 1 : 0));\nfunction clear(): void {\n q.value = '';\n states.value = [];\n if (deployment.value) void router.replace('/jobs');\n}\n\n// \"/\" focuses the search box, as in the first UI.\nconst search = useSlashFocus();\n</script>\n\n<template>\n <HStack direction=\"column\" :gap=\"4\">\n <HPageHeader title=\"Jobs\" description=\"Newest first, the last 50. A restart clears them.\" actions-placement=\"end\">\n <template #actions>\n <HButton variant=\"secondary\" icon=\"arrow\" label=\"Refresh\" @click=\"refresh\" />\n </template>\n </HPageHeader>\n\n <HAlert v-if=\"!data.loaded && data.error\" tone=\"danger\" title=\"Could not load jobs\" :description=\"data.error\" />\n\n <template v-else>\n <HFilterBar label=\"Filters\" :active-count=\"filtering\" @clear=\"clear\">\n <div ref=\"search\">\n <HInput v-model=\"q\" label=\"Search\" hide-label type=\"search\" placeholder=\"Search by stack or action. Press /\" leading-icon=\"search\" clearable />\n </div>\n <HChipGroup v-model=\"states\" label=\"State\" :options=\"stateOptions\" />\n <HChip v-if=\"deployment\" :label=\"`Deployment ${deployment}`\" removable @remove=\"router.replace('/jobs')\" />\n </HFilterBar>\n\n <HDataTable\n v-model:page=\"page\"\n label=\"Jobs\"\n :rows=\"rows\"\n :columns=\"columns\"\n :loading=\"!data.loaded\"\n :page-size=\"15\"\n row-activatable\n :empty-text=\"data.jobs.length ? 'Nothing matches. Clear the filters.' : 'No jobs recorded.'\"\n @row-activate=\"router.push(`/jobs/${encodeURIComponent(String($event.id))}`)\"\n >\n <template #cell=\"{ row, column, value }\">\n <template v-if=\"column.key === 'state'\">\n <HBadge dot :label=\"String(value)\" :tone=\"jobTone(String(value))\" :title=\"sentence(String(value))\" />\n <HText v-if=\"row.note\" tone=\"muted\" size=\"sm\" as=\"div\">\n <template v-if=\"row.noteTo\">\n <RouterLink :to=\"String(row.noteTo)\">{{ row.note }}</RouterLink>\n </template>\n <template v-else>{{ row.note }}</template>\n </HText>\n </template>\n <RouterLink v-else-if=\"column.key === 'stack' && row.target\" :to=\"String(row.target)\">{{ value }}</RouterLink>\n <template v-else>{{ value }}</template>\n </template>\n </HDataTable>\n </template>\n </HStack>\n</template>\n"],"names":["route","useRoute","router","useRouter","now","useNow","q","ref","states","page","deployment","computed","jobs","needle","data","j","columns","note","waitText","waitReason","by","supersededBy","actionLabel","rows","n","jobTarget","ago","took","stateOptions","s","filtering","clear","search","useSlashFocus","_createBlock","_unref","HStack","_createVNode","HPageHeader","HButton","refresh","HAlert","_createElementBlock","_Fragment","HFilterBar","_createElementVNode","HInput","$event","HChipGroup","HChip","_cache","HDataTable","row","column","value","HBadge","jobTone","sentence","HText","_component_RouterLink","_createTextVNode","_toDisplayString"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{d as i,c as l,w as u,u as e,q as p,_ as d,f as n,Q as s,b as c,e as f}from"./index-Cthapg0Q.js";const k=i({__name:"NotFoundView",setup(m){const r=d(),o=c();return(v,t)=>(f(),l(e(p),{title:"404",icon:"search",description:`Nothing at ${e(r).fullPath}.`},{default:u(()=>[n(e(s),{label:"Overview",onClick:t[0]||(t[0]=a=>e(o).push("/"))}),n(e(s),{variant:"secondary",label:"Deployments",onClick:t[1]||(t[1]=a=>e(o).push("/deployments"))}),n(e(s),{variant:"secondary",label:"Jobs",onClick:t[2]||(t[2]=a=>e(o).push("/jobs"))})]),_:1},8,["description"]))}});export{k as default};
2
+ //# sourceMappingURL=NotFoundView-BKHjS8HU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotFoundView-BKHjS8HU.js","sources":["../../src/views/NotFoundView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useRoute, useRouter } from 'vue-router';\nimport { HButton, HEmptyState } from '@hearth-ui/vue';\n\nconst route = useRoute();\nconst router = useRouter();\n</script>\n\n<template>\n <HEmptyState title=\"404\" icon=\"search\" :description=\"`Nothing at ${route.fullPath}.`\">\n <HButton label=\"Overview\" @click=\"router.push('/')\" />\n <HButton variant=\"secondary\" label=\"Deployments\" @click=\"router.push('/deployments')\" />\n <HButton variant=\"secondary\" label=\"Jobs\" @click=\"router.push('/jobs')\" />\n </HEmptyState>\n</template>\n"],"names":["route","useRoute","router","useRouter","_createBlock","_unref","HEmptyState","_createVNode","HButton","_cache","$event"],"mappings":"iJAIA,MAAMA,EAAQC,EAAA,EACRC,EAASC,EAAA,oBAIbC,EAIcC,EAAAC,CAAA,EAAA,CAJD,MAAM,MAAM,KAAK,SAAU,YAAW,cAAgBD,EAAAL,CAAA,EAAM,QAAQ,GAAA,aAC/E,IAAsD,CAAtDO,EAAsDF,EAAAG,CAAA,EAAA,CAA7C,MAAM,WAAY,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEL,EAAAH,CAAA,EAAO,KAAI,GAAA,EAAA,GAC7CK,EAAwFF,EAAAG,CAAA,EAAA,CAA/E,QAAQ,YAAY,MAAM,cAAe,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEL,EAAAH,CAAA,EAAO,KAAI,cAAA,EAAA,GACpEK,EAA0EF,EAAAG,CAAA,EAAA,CAAjE,QAAQ,YAAY,MAAM,OAAQ,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEL,EAAAH,CAAA,EAAO,KAAI,OAAA,EAAA"}