@openpalm/ui 0.11.0-rc.7 → 0.11.0-rc.9

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 (137) hide show
  1. package/build/.openpalm-ui-version +1 -1
  2. package/build/client/_app/immutable/assets/0.DS8L5ANe.css +1 -0
  3. package/build/client/_app/immutable/assets/0.DS8L5ANe.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.DS8L5ANe.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/4.Dj7oigNN.css +1 -0
  6. package/build/client/_app/immutable/assets/4.Dj7oigNN.css.br +0 -0
  7. package/build/client/_app/immutable/assets/4.Dj7oigNN.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/6.COn4HE1H.css +1 -0
  9. package/build/client/_app/immutable/assets/6.COn4HE1H.css.br +0 -0
  10. package/build/client/_app/immutable/assets/{6.DJenXolA.css.gz → 6.COn4HE1H.css.gz} +0 -0
  11. package/build/client/_app/immutable/assets/7.gblpY08p.css +1 -0
  12. package/build/client/_app/immutable/assets/7.gblpY08p.css.br +0 -0
  13. package/build/client/_app/immutable/assets/7.gblpY08p.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css +1 -0
  15. package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css.br +0 -0
  16. package/build/client/_app/immutable/assets/AuthGate.BTdwrgKg.css.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{s2DJ2Hzc.js → B7bBnuEe.js} +1 -1
  18. package/build/client/_app/immutable/chunks/B7bBnuEe.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/B7bBnuEe.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{D24QgzW3.js → BW39ik5x.js} +1 -1
  21. package/build/client/_app/immutable/chunks/BW39ik5x.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/BW39ik5x.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/yIwPo_wo.js +5 -0
  24. package/build/client/_app/immutable/chunks/yIwPo_wo.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/yIwPo_wo.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/{app.Cn3CnYEK.js → app.v-Fuqj7D.js} +2 -2
  27. package/build/client/_app/immutable/entry/app.v-Fuqj7D.js.br +0 -0
  28. package/build/client/_app/immutable/entry/app.v-Fuqj7D.js.gz +0 -0
  29. package/build/client/_app/immutable/entry/start.h2IOTLqd.js +1 -0
  30. package/build/client/_app/immutable/entry/start.h2IOTLqd.js.br +0 -0
  31. package/build/client/_app/immutable/entry/start.h2IOTLqd.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{1.CFZtmr9Z.js → 1.DZaTVyfp.js} +1 -1
  33. package/build/client/_app/immutable/nodes/1.DZaTVyfp.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/1.DZaTVyfp.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/4.DXR2B9JX.js +19 -0
  36. package/build/client/_app/immutable/nodes/4.DXR2B9JX.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/4.DXR2B9JX.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{5.DOV0FWgV.js → 5.DOoWjdno.js} +1 -1
  39. package/build/client/_app/immutable/nodes/5.DOoWjdno.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/5.DOoWjdno.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/{6.OjOdE489.js → 6.Rdn2byIl.js} +1 -1
  42. package/build/client/_app/immutable/nodes/6.Rdn2byIl.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/6.Rdn2byIl.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/{7.BmeNI8zH.js → 7.BPYbekMv.js} +1 -1
  45. package/build/client/_app/immutable/nodes/7.BPYbekMv.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/7.BPYbekMv.js.gz +0 -0
  47. package/build/client/_app/version.json +1 -1
  48. package/build/client/_app/version.json.br +0 -0
  49. package/build/client/_app/version.json.gz +0 -0
  50. package/build/server/chunks/{0-BSfigTUQ.js → 0-BV-dSgKl.js} +4 -4
  51. package/build/server/chunks/{0-BSfigTUQ.js.map → 0-BV-dSgKl.js.map} +1 -1
  52. package/build/server/chunks/1-BaC08_Sf.js +9 -0
  53. package/build/server/chunks/{1-BT8Fv1iZ.js.map → 1-BaC08_Sf.js.map} +1 -1
  54. package/build/server/chunks/4-aThWANXD.js +9 -0
  55. package/build/server/chunks/{4-Dogph41a.js.map → 4-aThWANXD.js.map} +1 -1
  56. package/build/server/chunks/5-DLhgTDFN.js +9 -0
  57. package/build/server/chunks/{5-B2ffACT5.js.map → 5-DLhgTDFN.js.map} +1 -1
  58. package/build/server/chunks/6-DwkLbgop.js +9 -0
  59. package/build/server/chunks/{6-SeG59S0A.js.map → 6-DwkLbgop.js.map} +1 -1
  60. package/build/server/chunks/7-D5gXKRbq.js +9 -0
  61. package/build/server/chunks/{7-C49AAXUP.js.map → 7-D5gXKRbq.js.map} +1 -1
  62. package/build/server/chunks/{AuthGate-Bd07jybQ.js → AuthGate-DL3Htqtl.js} +66 -27
  63. package/build/server/chunks/AuthGate-DL3Htqtl.js.map +1 -0
  64. package/build/server/chunks/{_layout.svelte-CWc5uRoo.js → _layout.svelte-CcloHuB_.js} +2 -2
  65. package/build/server/chunks/{_layout.svelte-CWc5uRoo.js.map → _layout.svelte-CcloHuB_.js.map} +1 -1
  66. package/build/server/chunks/{_page.svelte-CnbQWtht.js → _page.svelte-24A1xNrb.js} +5 -5
  67. package/build/server/chunks/{_page.svelte-CnbQWtht.js.map → _page.svelte-24A1xNrb.js.map} +1 -1
  68. package/build/server/chunks/_page.svelte-BNcatsUe.js +414 -0
  69. package/build/server/chunks/_page.svelte-BNcatsUe.js.map +1 -0
  70. package/build/server/chunks/{_page.svelte-BankODKC.js → _page.svelte-CQXBb6Vv.js} +5 -5
  71. package/build/server/chunks/{_page.svelte-BankODKC.js.map → _page.svelte-CQXBb6Vv.js.map} +1 -1
  72. package/build/server/chunks/{_page.svelte-BguwEDhs.js → _page.svelte-DJuM-_YW.js} +5 -5
  73. package/build/server/chunks/{_page.svelte-BguwEDhs.js.map → _page.svelte-DJuM-_YW.js.map} +1 -1
  74. package/build/server/chunks/{error.svelte-CB2UX4hU.js → error.svelte-B_yfxYYS.js} +3 -3
  75. package/build/server/chunks/{error.svelte-CB2UX4hU.js.map → error.svelte-B_yfxYYS.js.map} +1 -1
  76. package/build/server/chunks/{hooks.server-E9Cpxup2.js → hooks.server-BEVMYNQ4.js} +6 -2
  77. package/build/server/chunks/hooks.server-BEVMYNQ4.js.map +1 -0
  78. package/build/server/chunks/{internal-mQUKV7SV.js → internal-DRqRyEjV.js} +3 -3
  79. package/build/server/chunks/{internal-mQUKV7SV.js.map → internal-DRqRyEjV.js.map} +1 -1
  80. package/build/server/chunks/{state-BVlApqbN.js → state-D0tEXcn4.js} +2 -2
  81. package/build/server/chunks/{state-BVlApqbN.js.map → state-D0tEXcn4.js.map} +1 -1
  82. package/build/server/chunks/{theme-state.svelte-wqhXqgCA.js → theme-state.svelte-PtPMmKGN.js} +2 -17
  83. package/build/server/chunks/{theme-state.svelte-wqhXqgCA.js.map → theme-state.svelte-PtPMmKGN.js.map} +1 -1
  84. package/build/server/index.js +1 -1
  85. package/build/server/index.js.map +1 -1
  86. package/build/server/manifest.js +7 -7
  87. package/build/server/manifest.js.map +1 -1
  88. package/package.json +1 -1
  89. package/build/client/_app/immutable/assets/0.BoT18krG.css +0 -1
  90. package/build/client/_app/immutable/assets/0.BoT18krG.css.br +0 -0
  91. package/build/client/_app/immutable/assets/0.BoT18krG.css.gz +0 -0
  92. package/build/client/_app/immutable/assets/4.D9MwgTDo.css +0 -1
  93. package/build/client/_app/immutable/assets/4.D9MwgTDo.css.br +0 -0
  94. package/build/client/_app/immutable/assets/4.D9MwgTDo.css.gz +0 -0
  95. package/build/client/_app/immutable/assets/6.DJenXolA.css +0 -1
  96. package/build/client/_app/immutable/assets/6.DJenXolA.css.br +0 -0
  97. package/build/client/_app/immutable/assets/7.BimnqtTb.css +0 -1
  98. package/build/client/_app/immutable/assets/7.BimnqtTb.css.br +0 -0
  99. package/build/client/_app/immutable/assets/7.BimnqtTb.css.gz +0 -0
  100. package/build/client/_app/immutable/assets/AuthGate._EJNXKUm.css +0 -1
  101. package/build/client/_app/immutable/assets/AuthGate._EJNXKUm.css.br +0 -0
  102. package/build/client/_app/immutable/assets/AuthGate._EJNXKUm.css.gz +0 -0
  103. package/build/client/_app/immutable/chunks/D24QgzW3.js.br +0 -0
  104. package/build/client/_app/immutable/chunks/D24QgzW3.js.gz +0 -0
  105. package/build/client/_app/immutable/chunks/DqNbg4NA.js +0 -5
  106. package/build/client/_app/immutable/chunks/DqNbg4NA.js.br +0 -0
  107. package/build/client/_app/immutable/chunks/DqNbg4NA.js.gz +0 -0
  108. package/build/client/_app/immutable/chunks/s2DJ2Hzc.js.br +0 -0
  109. package/build/client/_app/immutable/chunks/s2DJ2Hzc.js.gz +0 -0
  110. package/build/client/_app/immutable/entry/app.Cn3CnYEK.js.br +0 -0
  111. package/build/client/_app/immutable/entry/app.Cn3CnYEK.js.gz +0 -0
  112. package/build/client/_app/immutable/entry/start.BKJ_XPtH.js +0 -1
  113. package/build/client/_app/immutable/entry/start.BKJ_XPtH.js.br +0 -0
  114. package/build/client/_app/immutable/entry/start.BKJ_XPtH.js.gz +0 -0
  115. package/build/client/_app/immutable/nodes/1.CFZtmr9Z.js.br +0 -0
  116. package/build/client/_app/immutable/nodes/1.CFZtmr9Z.js.gz +0 -0
  117. package/build/client/_app/immutable/nodes/4.qMg9S6NF.js +0 -19
  118. package/build/client/_app/immutable/nodes/4.qMg9S6NF.js.br +0 -0
  119. package/build/client/_app/immutable/nodes/4.qMg9S6NF.js.gz +0 -0
  120. package/build/client/_app/immutable/nodes/5.DOV0FWgV.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/5.DOV0FWgV.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/6.OjOdE489.js.br +0 -0
  123. package/build/client/_app/immutable/nodes/6.OjOdE489.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/7.BmeNI8zH.js.br +0 -0
  125. package/build/client/_app/immutable/nodes/7.BmeNI8zH.js.gz +0 -0
  126. package/build/server/chunks/1-BT8Fv1iZ.js +0 -9
  127. package/build/server/chunks/4-Dogph41a.js +0 -9
  128. package/build/server/chunks/5-B2ffACT5.js +0 -9
  129. package/build/server/chunks/6-SeG59S0A.js +0 -9
  130. package/build/server/chunks/7-C49AAXUP.js +0 -9
  131. package/build/server/chunks/AuthGate-Bd07jybQ.js.map +0 -1
  132. package/build/server/chunks/_page.svelte-omfzeOSO.js +0 -546
  133. package/build/server/chunks/_page.svelte-omfzeOSO.js.map +0 -1
  134. package/build/server/chunks/hooks.server-E9Cpxup2.js.map +0 -1
  135. /package/build/client/_app/immutable/nodes/{0.C-6HAZZl.js → 0.BHFOJkcF.js} +0 -0
  136. /package/build/client/_app/immutable/nodes/{0.C-6HAZZl.js.br → 0.BHFOJkcF.js.br} +0 -0
  137. /package/build/client/_app/immutable/nodes/{0.C-6HAZZl.js.gz → 0.BHFOJkcF.js.gz} +0 -0
@@ -0,0 +1,414 @@
1
+ import { B as head, n as ensure_array_like, e as attr_class, d as attr, p as escape_html, a6 as stringify, C as html, m as derived } from './dev-DjANv7AF.js';
2
+ import { o as onDestroy } from './state-D0tEXcn4.js';
3
+ import { e as fetchHealth, a as fetchContainers, f as fetchAutomations, i as fetchVersions, g as fetchReleases, h as fetchUiVersions } from './theme-state.svelte-PtPMmKGN.js';
4
+ import { A as AuthGate, N as Navbar } from './AuthGate-DL3Htqtl.js';
5
+ import './internal-DRqRyEjV.js';
6
+ import './utils-BSRjJDrZ.js';
7
+ import 'node:module';
8
+ import './chunk-CLZ62Ad-.js';
9
+
10
+ //#region src/lib/components/TabBar.svelte
11
+ function TabBar($$renderer, $$props) {
12
+ $$renderer.component(($$renderer) => {
13
+ let { active} = $$props;
14
+ const ICONS = {
15
+ overview: `<rect x="3" y="3" width="7" height="7" /><rect x="14" y="3" width="7" height="7" /><rect x="14" y="14" width="7" height="7" /><rect x="3" y="14" width="7" height="7" />`,
16
+ containers: `<rect x="2" y="2" width="20" height="8" rx="2" ry="2" /><rect x="2" y="14" width="20" height="8" rx="2" ry="2" /><line x1="6" y1="6" x2="6.01" y2="6" /><line x1="6" y1="18" x2="6.01" y2="18" />`,
17
+ logs: `<polyline points="4 17 10 11 4 5" /><line x1="12" y1="19" x2="20" y2="19" />`,
18
+ connections: `<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />`,
19
+ akm: `<path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" />`,
20
+ voice: `<path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" /><path d="M19 10v2a7 7 0 0 1-14 0v-2" /><line x1="12" y1="19" x2="12" y2="23" /><line x1="8" y1="23" x2="16" y2="23" />`,
21
+ addons: `<path d="M12 2L2 7l10 5 10-5-10-5z" /><path d="M2 17l10 5 10-5" /><path d="M2 12l10 5 10-5" />`,
22
+ automations: `<circle cx="12" cy="12" r="10" /><polyline points="12 6 12 12 16 14" />`,
23
+ secrets: `<rect x="3" y="11" width="18" height="11" rx="2" ry="2" /><path d="M7 11V7a5 5 0 0 1 10 0v4" />`,
24
+ updates: `<polyline points="8 17 12 21 16 17" /><line x1="12" y1="12" x2="12" y2="21" /><path d="M20.88 18.09A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.29" />`
25
+ };
26
+ const SECTIONS = [
27
+ {
28
+ id: "system",
29
+ label: "System",
30
+ tabs: [
31
+ {
32
+ id: "overview",
33
+ label: "Overview",
34
+ icon: ICONS.overview
35
+ },
36
+ {
37
+ id: "containers",
38
+ label: "Containers",
39
+ icon: ICONS.containers
40
+ },
41
+ {
42
+ id: "logs",
43
+ label: "Logs",
44
+ icon: ICONS.logs
45
+ },
46
+ {
47
+ id: "updates",
48
+ label: "Updates",
49
+ icon: ICONS.updates
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ id: "configure",
55
+ label: "Configure",
56
+ tabs: [
57
+ {
58
+ id: "connections",
59
+ label: "AI Providers",
60
+ icon: ICONS.connections
61
+ },
62
+ {
63
+ id: "akm",
64
+ label: "Knowledge",
65
+ icon: ICONS.akm
66
+ },
67
+ {
68
+ id: "voice",
69
+ label: "Voice",
70
+ icon: ICONS.voice
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ id: "extend",
76
+ label: "Extend",
77
+ tabs: [
78
+ {
79
+ id: "addons",
80
+ label: "Addons",
81
+ icon: ICONS.addons
82
+ },
83
+ {
84
+ id: "automations",
85
+ label: "Automations",
86
+ icon: ICONS.automations
87
+ },
88
+ {
89
+ id: "secrets",
90
+ label: "Secrets",
91
+ icon: ICONS.secrets
92
+ }
93
+ ]
94
+ }
95
+ ];
96
+ let activeSection = derived(() => SECTIONS.find((s) => s.tabs.some((t) => t.id === active)) ?? SECTIONS[0]);
97
+ $$renderer.push(`<nav class="nav-shell svelte-1wwzsr0" aria-label="Admin sections"><div class="section-strip svelte-1wwzsr0" role="tablist" aria-label="Sections"><!--[-->`);
98
+ const each_array = ensure_array_like(SECTIONS);
99
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
100
+ let section = each_array[$$index];
101
+ $$renderer.push(`<button${attr_class("section-tab svelte-1wwzsr0", void 0, { "section-tab-active": activeSection().id === section.id })} role="tab"${attr("aria-selected", activeSection().id === section.id)}>${escape_html(section.label)}</button>`);
102
+ }
103
+ $$renderer.push(`<!--]--></div> <div class="subtab-row svelte-1wwzsr0"><div class="tabs svelte-1wwzsr0" role="tablist"${attr("aria-label", `${stringify(activeSection().label)} tabs`)}><!--[-->`);
104
+ const each_array_1 = ensure_array_like(activeSection().tabs);
105
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
106
+ let tab = each_array_1[$$index_1];
107
+ $$renderer.push(`<button${attr_class("tab svelte-1wwzsr0", void 0, { "tab-active": active === tab.id })} role="tab"${attr("aria-selected", active === tab.id)}><svg aria-hidden="true" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${html(tab.icon)}</svg> ${escape_html(tab.label)}</button>`);
108
+ }
109
+ $$renderer.push(`<!--]--></div></div></nav>`);
110
+ });
111
+ }
112
+ //#endregion
113
+ //#region src/lib/components/OverviewTab.svelte
114
+ function OverviewTab($$renderer, $$props) {
115
+ $$renderer.component(($$renderer) => {
116
+ let { adminHealth, healthLoading, anyDangerousLoading, automationsData, mergedServices} = $$props;
117
+ let automationCount = derived(() => automationsData?.automations.length ?? 0);
118
+ let enabledAutomationCount = derived(() => automationsData?.automations.filter((a) => a.enabled).length ?? 0);
119
+ let containerCounts = derived(() => {
120
+ if (mergedServices.size === 0) return null;
121
+ return {
122
+ total: mergedServices.size,
123
+ running: [...mergedServices.values()].filter((s) => s === "running").length
124
+ };
125
+ });
126
+ let guardianContainerStatus = derived(() => {
127
+ const status = mergedServices.get("guardian");
128
+ if (status === "running") return "running";
129
+ if (status === "stopped" || status === "exited" || status === "created") return "stopped";
130
+ if (status) return "stopped";
131
+ return "unknown";
132
+ });
133
+ let assistantStatus = derived(() => {
134
+ const status = mergedServices.get("assistant");
135
+ if (status === "running") return "connected";
136
+ if (status === "stopped" || status === "exited" || status === "created") return "disconnected";
137
+ if (status) return "disconnected";
138
+ return "unknown";
139
+ });
140
+ let healthSummary = derived(() => {
141
+ if (!containerCounts()) return {
142
+ status: "unknown",
143
+ message: "Checking services…"
144
+ };
145
+ if (containerCounts().running === containerCounts().total && containerCounts().total > 0) return {
146
+ status: "ok",
147
+ message: `All ${containerCounts().total} services running`
148
+ };
149
+ return {
150
+ status: "warning",
151
+ message: `${containerCounts().total - containerCounts().running} of ${containerCounts().total} services not running — check the Containers tab`
152
+ };
153
+ });
154
+ $$renderer.push(`<div${attr_class(`health-summary health-summary--${stringify(healthSummary().status)}`, "svelte-1ob1zsm")} role="status" aria-live="polite"><span class="health-icon svelte-1ob1zsm" aria-hidden="true">`);
155
+ if (healthSummary().status === "warning") {
156
+ $$renderer.push("<!--[0-->");
157
+ $$renderer.push(`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>`);
158
+ } else if (healthSummary().status === "ok") {
159
+ $$renderer.push("<!--[1-->");
160
+ $$renderer.push(`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg>`);
161
+ } else {
162
+ $$renderer.push("<!--[-1-->");
163
+ $$renderer.push(`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>`);
164
+ }
165
+ $$renderer.push(`<!--]--></span> <span class="health-msg">${escape_html(healthSummary().message)}</span></div> `);
166
+ $$renderer.push("<!--[-1-->");
167
+ $$renderer.push(`<!--]--> <div class="panel-grid svelte-1ob1zsm" role="tabpanel"><div class="panel"><div class="panel-header"><h2>Quick Actions</h2></div> <div class="panel-body"><div class="action-list svelte-1ob1zsm"><button class="action-item svelte-1ob1zsm"${attr("disabled", healthLoading, true)}><span class="action-icon action-icon--blue svelte-1ob1zsm">`);
168
+ if (healthLoading) {
169
+ $$renderer.push("<!--[0-->");
170
+ $$renderer.push(`<span class="spinner"></span>`);
171
+ } else {
172
+ $$renderer.push("<!--[-1-->");
173
+ $$renderer.push(`<svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"></path></svg>`);
174
+ }
175
+ $$renderer.push(`<!--]--></span> <div class="action-content svelte-1ob1zsm"><span class="action-title svelte-1ob1zsm">Health Check</span> <span class="action-desc svelte-1ob1zsm">Verify admin and guardian services are reachable</span></div> <span class="action-arrow svelte-1ob1zsm"><svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg></span></button> <button class="action-item svelte-1ob1zsm"${attr("disabled", anyDangerousLoading || false, true)}><span class="action-icon action-icon--blue svelte-1ob1zsm">`);
176
+ {
177
+ $$renderer.push("<!--[-1-->");
178
+ $$renderer.push(`<svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 16 12 12 8 16"></polyline><line x1="12" y1="12" x2="12" y2="21"></line><path d="M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3"></path></svg>`);
179
+ }
180
+ $$renderer.push(`<!--]--></span> <div class="action-content svelte-1ob1zsm"><span class="action-title svelte-1ob1zsm">Apply Config + Restart</span> <span class="action-desc svelte-1ob1zsm">Update configuration and restart running services</span> <span class="action-hint svelte-1ob1zsm">Restarts services with updated compose config.</span></div> <span class="action-arrow svelte-1ob1zsm"><svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg></span></button> <a class="action-item svelte-1ob1zsm" href="/setup?rerun=1"><span class="action-icon action-icon--purple svelte-1ob1zsm"><svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14"></path></svg></span> <div class="action-content svelte-1ob1zsm"><span class="action-title svelte-1ob1zsm">Update Settings</span> <span class="action-desc svelte-1ob1zsm">Re-run setup wizard to change providers, channels, or options</span></div> <span class="action-arrow svelte-1ob1zsm"><svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg></span></a></div></div></div> <div class="panel"><div class="panel-header"><h2>System Information</h2></div> <div class="panel-body"><div class="info-grid svelte-1ob1zsm"><div class="info-item svelte-1ob1zsm"><span class="info-label svelte-1ob1zsm">Admin API</span> <span class="info-value svelte-1ob1zsm">`);
181
+ if (adminHealth) {
182
+ $$renderer.push("<!--[0-->");
183
+ $$renderer.push(`<span${attr_class("badge", void 0, {
184
+ "badge-success": adminHealth.status === "ok",
185
+ "badge-danger": adminHealth.status !== "ok"
186
+ })}>${escape_html(adminHealth.status)}</span>`);
187
+ } else {
188
+ $$renderer.push("<!--[-1-->");
189
+ $$renderer.push(`<span class="badge badge-idle">Unknown</span>`);
190
+ }
191
+ $$renderer.push(`<!--]--></span></div> <div class="info-item svelte-1ob1zsm"><span class="info-label svelte-1ob1zsm">Guardian</span> <span class="info-value svelte-1ob1zsm">`);
192
+ if (guardianContainerStatus() === "running") {
193
+ $$renderer.push("<!--[0-->");
194
+ $$renderer.push(`<span class="badge badge-success">Running</span>`);
195
+ } else if (guardianContainerStatus() === "stopped") {
196
+ $$renderer.push("<!--[1-->");
197
+ $$renderer.push(`<span class="badge badge-danger">Stopped</span>`);
198
+ } else {
199
+ $$renderer.push("<!--[-1-->");
200
+ $$renderer.push(`<span class="badge badge-idle">Unknown</span>`);
201
+ }
202
+ $$renderer.push(`<!--]--></span></div> <div class="info-item svelte-1ob1zsm"><span class="info-label svelte-1ob1zsm">Containers</span> <span class="info-value svelte-1ob1zsm">`);
203
+ if (containerCounts()) {
204
+ $$renderer.push("<!--[0-->");
205
+ if (containerCounts().running === containerCounts().total) {
206
+ $$renderer.push("<!--[0-->");
207
+ $$renderer.push(`<span class="badge badge-success">${escape_html(containerCounts().running)} / ${escape_html(containerCounts().total)} running</span>`);
208
+ } else if (containerCounts().running > 0) {
209
+ $$renderer.push("<!--[1-->");
210
+ $$renderer.push(`<span class="badge badge-warning">${escape_html(containerCounts().running)} / ${escape_html(containerCounts().total)} running</span>`);
211
+ } else {
212
+ $$renderer.push("<!--[-1-->");
213
+ $$renderer.push(`<span class="badge badge-danger">0 / ${escape_html(containerCounts().total)} running</span>`);
214
+ }
215
+ $$renderer.push(`<!--]-->`);
216
+ } else {
217
+ $$renderer.push("<!--[-1-->");
218
+ $$renderer.push(`<span class="badge badge-idle">Unknown</span>`);
219
+ }
220
+ $$renderer.push(`<!--]--></span></div> <div class="info-item svelte-1ob1zsm"><span class="info-label svelte-1ob1zsm">Assistant</span> <span class="info-value svelte-1ob1zsm">`);
221
+ if (assistantStatus() === "connected") {
222
+ $$renderer.push("<!--[0-->");
223
+ $$renderer.push(`<span class="badge badge-success">Connected</span>`);
224
+ } else if (assistantStatus() === "disconnected") {
225
+ $$renderer.push("<!--[1-->");
226
+ $$renderer.push(`<span class="badge badge-danger">Disconnected</span>`);
227
+ } else {
228
+ $$renderer.push("<!--[-1-->");
229
+ $$renderer.push(`<span class="badge badge-idle">Unknown</span>`);
230
+ }
231
+ $$renderer.push(`<!--]--></span></div> <div class="info-item svelte-1ob1zsm"><span class="info-label svelte-1ob1zsm">Automations</span> <span class="info-value svelte-1ob1zsm">`);
232
+ if (automationsData) {
233
+ $$renderer.push("<!--[0-->");
234
+ $$renderer.push(`<span class="info-mono svelte-1ob1zsm">${escape_html(enabledAutomationCount())} active / ${escape_html(automationCount())} total</span>`);
235
+ } else {
236
+ $$renderer.push("<!--[-1-->");
237
+ $$renderer.push(`<span class="badge badge-idle">Loading</span>`);
238
+ }
239
+ $$renderer.push(`<!--]--></span></div></div></div></div></div>`);
240
+ });
241
+ }
242
+ //#endregion
243
+ //#region src/routes/admin/+page.svelte
244
+ function _page($$renderer, $$props) {
245
+ $$renderer.component(($$renderer) => {
246
+ let authLocked = true;
247
+ let authLoading = false;
248
+ let authError = "";
249
+ let adminHealth = null;
250
+ let healthLoading = false;
251
+ let upgradeLoading = false;
252
+ let containerData = null;
253
+ let automationsData = null;
254
+ let activeTab = "overview";
255
+ let currentImageTag = "";
256
+ let inElectron = false;
257
+ let selectedUiTag = "";
258
+ let releases = [];
259
+ let uiVersions = [];
260
+ const POLL_INTERVAL_MS = 1e4;
261
+ let pollTimer = null;
262
+ function startContainerPolling() {
263
+ stopContainerPolling();
264
+ pollTimer = setInterval(() => {
265
+ if (!authLocked && containerData) loadContainers();
266
+ }, POLL_INTERVAL_MS);
267
+ }
268
+ function stopContainerPolling() {
269
+ if (pollTimer !== null) {
270
+ clearInterval(pollTimer);
271
+ pollTimer = null;
272
+ }
273
+ }
274
+ onDestroy(() => {
275
+ stopContainerPolling();
276
+ });
277
+ let anyDangerousLoading = derived(() => upgradeLoading);
278
+ /** Merged service → state map (used by OverviewTab for health indicators) */
279
+ let mergedServices = derived(() => {
280
+ if (!containerData) return /* @__PURE__ */ new Map();
281
+ const merged = /* @__PURE__ */ new Map();
282
+ if (containerData.containers) for (const [name, state] of Object.entries(containerData.containers)) merged.set(name, state);
283
+ if (containerData.dockerContainers) for (const c of containerData.dockerContainers) merged.set(c.Service, c.State);
284
+ return merged;
285
+ });
286
+ function applyInvalidTokenState() {
287
+ authLocked = true;
288
+ authError = "Invalid password.";
289
+ }
290
+ async function handleAuthSuccess(token) {
291
+ if (authLoading) return false;
292
+ authLoading = true;
293
+ authError = "";
294
+ try {
295
+ if (!(await fetch("/admin/auth/login", {
296
+ method: "POST",
297
+ headers: { "content-type": "application/json" },
298
+ body: JSON.stringify({ password: token }),
299
+ credentials: "include"
300
+ })).ok) {
301
+ applyInvalidTokenState();
302
+ return false;
303
+ }
304
+ authLocked = false;
305
+ authError = "";
306
+ startContainerPolling();
307
+ await loadHealth();
308
+ loadContainers();
309
+ loadAutomations();
310
+ loadVersions();
311
+ loadReleases();
312
+ return true;
313
+ } catch (e) {
314
+ console.warn("[page] Auth failed:", e);
315
+ authError = "Unable to reach admin API.";
316
+ return false;
317
+ } finally {
318
+ authLoading = false;
319
+ }
320
+ }
321
+ async function loadHealth() {
322
+ healthLoading = true;
323
+ try {
324
+ const health = await fetchHealth();
325
+ adminHealth = health.admin;
326
+ health.guardian;
327
+ } catch (e) {
328
+ console.warn("[page] Health check failed:", e);
329
+ adminHealth = {
330
+ status: "error",
331
+ service: "admin"
332
+ };
333
+ }
334
+ healthLoading = false;
335
+ }
336
+ async function loadContainers() {
337
+ try {
338
+ containerData = await fetchContainers();
339
+ } catch (e) {
340
+ containerData = null;
341
+ const err = e;
342
+ if (err.status === 401) {
343
+ applyInvalidTokenState();
344
+ } else `Failed to load containers: ${err.message ?? e}`;
345
+ }
346
+ if (containerData) (/* @__PURE__ */ new Date()).toLocaleTimeString();
347
+ }
348
+ async function loadAutomations() {
349
+ try {
350
+ automationsData = await fetchAutomations();
351
+ } catch (e) {
352
+ automationsData = null;
353
+ const err = e;
354
+ if (err.status === 401) {
355
+ applyInvalidTokenState();
356
+ } else `Failed to load automations: ${err.message ?? e}`;
357
+ }
358
+ }
359
+ async function loadVersions() {
360
+ try {
361
+ const data = await fetchVersions();
362
+ currentImageTag = data.imageTag;
363
+ inElectron = data.inElectron;
364
+ } catch {}
365
+ }
366
+ async function loadReleases() {
367
+ try {
368
+ const [releaseData, uiData] = await Promise.all([fetchReleases(), fetchUiVersions()]);
369
+ releases = releaseData.releases;
370
+ uiVersions = uiData.versions;
371
+ if (!selectedUiTag) {
372
+ const channelPick = uiData.versions.find((v) => v.distTag === "next" || v.distTag === "latest") ?? uiData.versions[0];
373
+ if (channelPick) selectedUiTag = channelPick.version;
374
+ }
375
+ } catch {}
376
+ }
377
+ head("1jef3w8", $$renderer, ($$renderer) => {
378
+ $$renderer.title(($$renderer) => {
379
+ $$renderer.push(`<title>OpenPalm Console</title>`);
380
+ });
381
+ });
382
+ if (authLocked) {
383
+ $$renderer.push("<!--[0-->");
384
+ AuthGate($$renderer, {
385
+ onSuccess: handleAuthSuccess,
386
+ loading: authLoading,
387
+ error: authError
388
+ });
389
+ } else {
390
+ $$renderer.push("<!--[-1-->");
391
+ Navbar($$renderer);
392
+ $$renderer.push(`<!----> <main class="svelte-1jef3w8">`);
393
+ TabBar($$renderer, {
394
+ active: activeTab});
395
+ $$renderer.push(`<!----> `);
396
+ {
397
+ $$renderer.push("<!--[0-->");
398
+ OverviewTab($$renderer, {
399
+ adminHealth,
400
+ healthLoading,
401
+ anyDangerousLoading: anyDangerousLoading(),
402
+ automationsData,
403
+ mergedServices: mergedServices()});
404
+ }
405
+ $$renderer.push(`<!--]--> `);
406
+ $$renderer.push("<!--[-1-->");
407
+ $$renderer.push(`<!--]--></main>`);
408
+ }
409
+ $$renderer.push(`<!--]-->`);
410
+ });
411
+ }
412
+
413
+ export { _page as default };
414
+ //# sourceMappingURL=_page.svelte-BNcatsUe.js.map