getkova 2026.4.21 → 2026.4.22

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 (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1,471 @@
1
+ import{i as e,n as t}from"./lit-zdTgzAJI.js";import{l as n}from"./format-BahKhiOC.js";import{K as r,l as i,q as a,u as o}from"./index-XGDpaFxG.js";import{n as s,t as c}from"./channel-config-extras-YNNd-4PG.js";function l(e,t){let n=e;for(let e of t){if(!n)return null;let t=a(n);if(t===`object`){let t=n.properties??{};if(typeof e==`string`&&t[e]){n=t[e];continue}let r=n.additionalProperties;if(typeof e==`string`&&r&&typeof r==`object`){n=r;continue}return null}if(t===`array`){if(typeof e!=`number`)return null;n=(Array.isArray(n.items)?n.items[0]:n.items)??null;continue}return null}return n}function u(e,t){return s(e,t)??{}}var d=[`groupPolicy`,`streamMode`,`dmPolicy`];function f(t){let n=d.flatMap(e=>e in t?[[e,t[e]]]:[]);return n.length===0?null:e`
2
+ <div class="status-list" style="margin-top: 12px;">
3
+ ${n.map(([t,n])=>e`
4
+ <div>
5
+ <span class="label">${t}</span>
6
+ <span>${c(n)}</span>
7
+ </div>
8
+ `)}
9
+ </div>
10
+ `}function p(t){let n=i(t.schema),r=n.schema;if(!r)return e` <div class="callout danger">Schema unavailable. Use Raw.</div> `;let a=l(r,[`channels`,t.channelId]);if(!a)return e` <div class="callout danger">Channel config schema unavailable.</div> `;let s=u(t.configValue??{},t.channelId);return e`
11
+ <div class="config-form">
12
+ ${o({schema:a,value:s,path:[`channels`,t.channelId],hints:t.uiHints,unsupported:new Set(n.unsupportedPaths),disabled:t.disabled,showLabel:!1,onPatch:t.onPatch})}
13
+ </div>
14
+ ${f(s)}
15
+ `}function m(t){let{channelId:n,props:r}=t,i=r.configSaving||r.configSchemaLoading;return e`
16
+ <div style="margin-top: 16px;">
17
+ ${r.configSchemaLoading?e` <div class="muted">Loading config schema…</div> `:p({channelId:n,configValue:r.configForm,schema:r.configSchema,uiHints:r.configUiHints,disabled:i,onPatch:r.onConfigPatch})}
18
+ <div class="row" style="margin-top: 12px;">
19
+ <button
20
+ class="btn primary"
21
+ ?disabled=${i||!r.configFormDirty}
22
+ @click=${()=>r.onConfigSave()}
23
+ >
24
+ ${r.configSaving?`Saving…`:`Save`}
25
+ </button>
26
+ <button class="btn" ?disabled=${i} @click=${()=>r.onConfigReload()}>
27
+ Reload
28
+ </button>
29
+ </div>
30
+ </div>
31
+ `}function h(e,t){return t.snapshot?.channels?.[e]}function g(e,t){let n=t.snapshot?.channelAccounts?.[e]??[],r=t.snapshot?.channelDefaultAccountId?.[e];return(r?n.find(e=>e.accountId===r):void 0)??n[0]??null}function _(e,t){let n=h(e,t),r=t.snapshot?.channelAccounts?.[e]??[],i=g(e,t);return{configured:typeof n?.configured==`boolean`?n.configured:typeof i?.configured==`boolean`?i.configured:null,running:typeof n?.running==`boolean`?n.running:null,connected:typeof n?.connected==`boolean`?n.connected:null,defaultAccount:i,hasAnyActiveAccount:r.some(e=>e.configured||e.running||e.connected),status:n}}function v(e,t){if(!t.snapshot)return!1;let n=_(e,t);return n.configured===!0||n.running===!0||n.connected===!0||n.hasAnyActiveAccount}function y(e,t){return _(e,t).configured}function b(e){return e==null?`n/a`:e?`Yes`:`No`}function x(n){return e`
32
+ <div class="card">
33
+ <div class="card-title">${n.title}</div>
34
+ <div class="card-sub">${n.subtitle}</div>
35
+ ${n.accountCountLabel}
36
+
37
+ <div class="status-list" style="margin-top: 16px;">
38
+ ${n.statusRows.map(t=>e`
39
+ <div>
40
+ <span class="label">${t.label}</span>
41
+ <span>${t.value}</span>
42
+ </div>
43
+ `)}
44
+ </div>
45
+
46
+ ${n.lastError?e`<div class="callout danger" style="margin-top: 12px;">${n.lastError}</div>`:t}
47
+ ${n.secondaryCallout??t} ${n.extraContent??t}
48
+ ${n.configSection} ${n.footer??t}
49
+ </div>
50
+ `}function S(e,t){return t?.[e]?.length??0}function C(n,r){let i=S(n,r);return i<2?t:e`<div class="account-count">Accounts (${i})</div>`}function w(r){let{props:i,discord:a,accountCountLabel:o}=r;return x({title:`Discord`,subtitle:`Bot status and channel configuration.`,accountCountLabel:o,statusRows:[{label:`Configured`,value:b(y(`discord`,i))},{label:`Running`,value:a?.running?`Yes`:`No`},{label:`Last start`,value:a?.lastStartAt?n(a.lastStartAt):`n/a`},{label:`Last probe`,value:a?.lastProbeAt?n(a.lastProbeAt):`n/a`}],lastError:a?.lastError,secondaryCallout:a?.probe?e`<div class="callout" style="margin-top: 12px;">
51
+ Probe ${a.probe.ok?`ok`:`failed`} · ${a.probe.status??``}
52
+ ${a.probe.error??``}
53
+ </div>`:t,configSection:m({channelId:`discord`,props:i}),footer:e`<div class="row" style="margin-top: 12px;">
54
+ <button class="btn" @click=${()=>i.onRefresh(!0)}>Probe</button>
55
+ </div>`})}function T(r){let{props:i,googleChat:a,accountCountLabel:o}=r;return x({title:`Google Chat`,subtitle:`Chat API webhook status and channel configuration.`,accountCountLabel:o,statusRows:[{label:`Configured`,value:b(y(`googlechat`,i))},{label:`Running`,value:a?a.running?`Yes`:`No`:`n/a`},{label:`Credential`,value:a?.credentialSource??`n/a`},{label:`Audience`,value:a?.audienceType?`${a.audienceType}${a.audience?` · ${a.audience}`:``}`:`n/a`},{label:`Last start`,value:a?.lastStartAt?n(a.lastStartAt):`n/a`},{label:`Last probe`,value:a?.lastProbeAt?n(a.lastProbeAt):`n/a`}],lastError:a?.lastError,secondaryCallout:a?.probe?e`<div class="callout" style="margin-top: 12px;">
56
+ Probe ${a.probe.ok?`ok`:`failed`} · ${a.probe.status??``}
57
+ ${a.probe.error??``}
58
+ </div>`:t,configSection:m({channelId:`googlechat`,props:i}),footer:e`<div class="row" style="margin-top: 12px;">
59
+ <button class="btn" @click=${()=>i.onRefresh(!0)}>Probe</button>
60
+ </div>`})}function E(r){let{props:i,imessage:a,accountCountLabel:o}=r;return x({title:`iMessage`,subtitle:`macOS bridge status and channel configuration.`,accountCountLabel:o,statusRows:[{label:`Configured`,value:b(y(`imessage`,i))},{label:`Running`,value:a?.running?`Yes`:`No`},{label:`Last start`,value:a?.lastStartAt?n(a.lastStartAt):`n/a`},{label:`Last probe`,value:a?.lastProbeAt?n(a.lastProbeAt):`n/a`}],lastError:a?.lastError,secondaryCallout:a?.probe?e`<div class="callout" style="margin-top: 12px;">
61
+ Probe ${a.probe.ok?`ok`:`failed`} · ${a.probe.error??``}
62
+ </div>`:t,configSection:m({channelId:`imessage`,props:i}),footer:e`<div class="row" style="margin-top: 12px;">
63
+ <button class="btn" @click=${()=>i.onRefresh(!0)}>Probe</button>
64
+ </div>`})}function D(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:`n/a`}function O(i){let{props:a,nostr:o,nostrAccounts:s,accountCountLabel:c,profileFormState:l,profileFormCallbacks:u,onEditProfile:d}=i,f=s[0],p=o?.configured??f?.configured??!1,h=o?.running??f?.running??!1,g=o?.publicKey??f?.publicKey,_=o?.lastStartAt??f?.lastStartAt??null,v=o?.lastError??f?.lastError??null,y=s.length>1,b=l!=null,x=r=>{let i=r.publicKey,a=r.profile;return e`
65
+ <div class="account-card">
66
+ <div class="account-card-header">
67
+ <div class="account-card-title">${a?.displayName??a?.name??r.name??r.accountId}</div>
68
+ <div class="account-card-id">${r.accountId}</div>
69
+ </div>
70
+ <div class="status-list account-card-status">
71
+ <div>
72
+ <span class="label">Running</span>
73
+ <span>${r.running?`Yes`:`No`}</span>
74
+ </div>
75
+ <div>
76
+ <span class="label">Configured</span>
77
+ <span>${r.configured?`Yes`:`No`}</span>
78
+ </div>
79
+ <div>
80
+ <span class="label">Public Key</span>
81
+ <span class="monospace" title="${i??``}">${D(i)}</span>
82
+ </div>
83
+ <div>
84
+ <span class="label">Last inbound</span>
85
+ <span
86
+ >${r.lastInboundAt?n(r.lastInboundAt):`n/a`}</span
87
+ >
88
+ </div>
89
+ ${r.lastError?e` <div class="account-card-error">${r.lastError}</div> `:t}
90
+ </div>
91
+ </div>
92
+ `};return e`
93
+ <div class="card">
94
+ <div class="card-title">Nostr</div>
95
+ <div class="card-sub">Decentralized DMs via Nostr relays (NIP-04).</div>
96
+ ${c}
97
+ ${y?e`
98
+ <div class="account-card-list">
99
+ ${s.map(e=>x(e))}
100
+ </div>
101
+ `:e`
102
+ <div class="status-list" style="margin-top: 16px;">
103
+ <div>
104
+ <span class="label">Configured</span>
105
+ <span>${p?`Yes`:`No`}</span>
106
+ </div>
107
+ <div>
108
+ <span class="label">Running</span>
109
+ <span>${h?`Yes`:`No`}</span>
110
+ </div>
111
+ <div>
112
+ <span class="label">Public Key</span>
113
+ <span class="monospace" title="${g??``}"
114
+ >${D(g)}</span
115
+ >
116
+ </div>
117
+ <div>
118
+ <span class="label">Last start</span>
119
+ <span
120
+ >${_?n(_):`n/a`}</span
121
+ >
122
+ </div>
123
+ </div>
124
+ `}
125
+ ${v?e`<div class="callout danger" style="margin-top: 12px;">${v}</div>`:t}
126
+ ${(()=>{if(b&&u)return r({state:l,callbacks:u,accountId:s[0]?.accountId??`default`});let{name:n,displayName:i,about:a,picture:c,nip05:m}=f?.profile??o?.profile??{},h=n||i||a||c||m;return e`
127
+ <div
128
+ style="margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: var(--radius-md);"
129
+ >
130
+ <div
131
+ style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"
132
+ >
133
+ <div style="font-weight: 500;">Profile</div>
134
+ ${p?e`
135
+ <button
136
+ class="btn btn--sm"
137
+ @click=${d}
138
+ style="font-size: 12px; padding: 4px 8px;"
139
+ >
140
+ Edit Profile
141
+ </button>
142
+ `:t}
143
+ </div>
144
+ ${h?e`
145
+ <div class="status-list">
146
+ ${c?e`
147
+ <div style="margin-bottom: 8px;">
148
+ <img
149
+ src=${c}
150
+ alt="Profile picture"
151
+ style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
152
+ @error=${e=>{e.target.style.display=`none`}}
153
+ />
154
+ </div>
155
+ `:t}
156
+ ${n?e`<div><span class="label">Name</span><span>${n}</span></div>`:t}
157
+ ${i?e`<div>
158
+ <span class="label">Display Name</span><span>${i}</span>
159
+ </div>`:t}
160
+ ${a?e`<div>
161
+ <span class="label">About</span
162
+ ><span style="max-width: 300px; overflow: hidden; text-overflow: ellipsis;"
163
+ >${a}</span
164
+ >
165
+ </div>`:t}
166
+ ${m?e`<div><span class="label">NIP-05</span><span>${m}</span></div>`:t}
167
+ </div>
168
+ `:e`
169
+ <div style="color: var(--text-muted); font-size: 13px">
170
+ No profile set. Click "Edit Profile" to add your name, bio, and avatar.
171
+ </div>
172
+ `}
173
+ </div>
174
+ `})()} ${m({channelId:`nostr`,props:a})}
175
+
176
+ <div class="row" style="margin-top: 12px;">
177
+ <button class="btn" @click=${()=>a.onRefresh(!1)}>Refresh</button>
178
+ </div>
179
+ </div>
180
+ `}function k(r){let{props:i,signal:a,accountCountLabel:o}=r;return x({title:`Signal`,subtitle:`signal-cli status and channel configuration.`,accountCountLabel:o,statusRows:[{label:`Configured`,value:b(y(`signal`,i))},{label:`Running`,value:a?.running?`Yes`:`No`},{label:`Base URL`,value:a?.baseUrl??`n/a`},{label:`Last start`,value:a?.lastStartAt?n(a.lastStartAt):`n/a`},{label:`Last probe`,value:a?.lastProbeAt?n(a.lastProbeAt):`n/a`}],lastError:a?.lastError,secondaryCallout:a?.probe?e`<div class="callout" style="margin-top: 12px;">
181
+ Probe ${a.probe.ok?`ok`:`failed`} · ${a.probe.status??``}
182
+ ${a.probe.error??``}
183
+ </div>`:t,configSection:m({channelId:`signal`,props:i}),footer:e`<div class="row" style="margin-top: 12px;">
184
+ <button class="btn" @click=${()=>i.onRefresh(!0)}>Probe</button>
185
+ </div>`})}function A(r){let{props:i,slack:a,accountCountLabel:o}=r;return x({title:`Slack`,subtitle:`Socket mode status and channel configuration.`,accountCountLabel:o,statusRows:[{label:`Configured`,value:b(y(`slack`,i))},{label:`Running`,value:a?.running?`Yes`:`No`},{label:`Last start`,value:a?.lastStartAt?n(a.lastStartAt):`n/a`},{label:`Last probe`,value:a?.lastProbeAt?n(a.lastProbeAt):`n/a`}],lastError:a?.lastError,secondaryCallout:a?.probe?e`<div class="callout" style="margin-top: 12px;">
186
+ Probe ${a.probe.ok?`ok`:`failed`} · ${a.probe.status??``}
187
+ ${a.probe.error??``}
188
+ </div>`:t,configSection:m({channelId:`slack`,props:i}),footer:e`<div class="row" style="margin-top: 12px;">
189
+ <button class="btn" @click=${()=>i.onRefresh(!0)}>Probe</button>
190
+ </div>`})}function j(e){let t=e.configForm?.channels;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=t.telegram;return!n||typeof n!=`object`||Array.isArray(n)?null:n}function M(e){let t=j(e);return typeof t?.botToken==`string`&&t.botToken.trim().length>0}function N(e,t){let n=t[0];return e?.tokenSource??n?.tokenSource??n?.botTokenSource??null}function P(e,t,n){return y(`telegram`,e)===!0||t?.configured||t?.running?!0:n.some(e=>e.configured||e.running)}function F(n){let{props:r,busy:i,tokenSource:a}=n;return e`
191
+ <div
192
+ style="margin-top: 12px; padding: 12px; border: 1px solid var(--border); border-radius: 12px; display: grid; gap: 12px;"
193
+ >
194
+ <div class="row" style="justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;">
195
+ <div>
196
+ <div style="font-weight: 600;">Quick setup</div>
197
+ <div class="muted" style="font-size: 13px;">
198
+ Paste a Telegram bot token and connect without editing config files.
199
+ </div>
200
+ </div>
201
+ <span class="pill pill--sm">Not connected</span>
202
+ </div>
203
+
204
+ <label class="field">
205
+ <span>Bot token</span>
206
+ <input
207
+ type="password"
208
+ .value=${r.telegramSetupToken}
209
+ @input=${e=>r.onTelegramTokenInput(e.target.value)}
210
+ placeholder="123456:ABCDEF..."
211
+ autocomplete="off"
212
+ ?disabled=${i}
213
+ />
214
+ </label>
215
+
216
+ <div class="row" style="gap: 8px; flex-wrap: wrap; align-items: center;">
217
+ <button
218
+ class="btn primary"
219
+ ?disabled=${i||!r.connected}
220
+ @click=${()=>r.onTelegramConnect()}
221
+ >
222
+ ${i?`Saving...`:`Connect Telegram`}
223
+ </button>
224
+ ${a&&a!==`config`?e`<div class="muted" style="font-size: 12px;">Current token source: ${a}</div>`:t}
225
+ </div>
226
+
227
+ ${r.telegramSetupMessage?e`
228
+ <div class="callout ${r.telegramSetupMessage.kind===`error`?`danger`:`success`}">
229
+ ${r.telegramSetupMessage.text}
230
+ </div>
231
+ `:t}
232
+ </div>
233
+ `}function I(r){let i=r.telegramPendingApprovals;return e`
234
+ <div
235
+ style="margin-top: 12px; padding: 12px; border: 1px solid var(--border); border-radius: 12px; display: grid; gap: 12px;"
236
+ >
237
+ <div class="row" style="justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;">
238
+ <div>
239
+ <div style="font-weight: 600;">Pending approvals</div>
240
+ <div class="muted" style="font-size: 13px;">
241
+ Approve or reject new Telegram users without using the terminal.
242
+ </div>
243
+ </div>
244
+ <button
245
+ class="btn"
246
+ ?disabled=${r.telegramApprovalsLoading||!r.connected||!!r.telegramApprovalsBusyCode}
247
+ @click=${()=>r.onTelegramApprovalsRefresh()}
248
+ >
249
+ ${r.telegramApprovalsLoading?`Refreshing...`:`Refresh`}
250
+ </button>
251
+ </div>
252
+
253
+ ${r.telegramApprovalsMessage?e`
254
+ <div class="callout ${r.telegramApprovalsMessage.kind===`error`?`danger`:`success`}">
255
+ ${r.telegramApprovalsMessage.text}
256
+ </div>
257
+ `:t}
258
+
259
+ ${r.telegramApprovalsLoading&&i.length===0?e`<div class="muted" style="font-size: 13px;">Loading pending approvals...</div>`:i.length===0?e`<div class="muted" style="font-size: 13px;">No pending approvals.</div>`:e`
260
+ <div style="display: grid; gap: 8px;">
261
+ ${i.map(t=>{let i=r.telegramApprovalsBusyCode===t.code;return e`
262
+ <div
263
+ style="padding: 12px; border: 1px solid var(--border); border-radius: 10px; display: grid; gap: 10px;"
264
+ >
265
+ <div style="display: grid; gap: 4px;">
266
+ <div style="font-weight: 600;">Telegram user ID ${t.userId}</div>
267
+ <div class="muted" style="font-size: 12px;">Pairing code ${t.code}</div>
268
+ <div class="muted" style="font-size: 12px;">
269
+ Requested ${n(t.createdAt)}
270
+ </div>
271
+ </div>
272
+ <div class="row" style="gap: 8px; flex-wrap: wrap; align-items: center;">
273
+ <button
274
+ class="btn"
275
+ style="background: var(--success, #15803d); border-color: var(--success, #15803d); color: white;"
276
+ ?disabled=${i||!r.connected}
277
+ @click=${()=>r.onTelegramApprove(t.code)}
278
+ >
279
+ ${i?`Working...`:`Approve`}
280
+ </button>
281
+ <button
282
+ class="btn"
283
+ ?disabled=${i||!r.connected}
284
+ @click=${()=>r.onTelegramReject(t.code)}
285
+ >
286
+ Reject
287
+ </button>
288
+ </div>
289
+ </div>
290
+ `})}
291
+ </div>
292
+ `}
293
+ </div>
294
+ `}function L(r){let i=r.probe?.bot?.username,a=r.name||r.accountId;return e`
295
+ <div class="account-card">
296
+ <div class="account-card-header">
297
+ <div class="account-card-title">${i?`@${i}`:a}</div>
298
+ <div class="account-card-id">${r.accountId}</div>
299
+ </div>
300
+ <div class="status-list account-card-status">
301
+ <div>
302
+ <span class="label">Running</span>
303
+ <span>${r.running?`Yes`:`No`}</span>
304
+ </div>
305
+ <div>
306
+ <span class="label">Configured</span>
307
+ <span>${r.configured?`Yes`:`No`}</span>
308
+ </div>
309
+ <div>
310
+ <span class="label">Last inbound</span>
311
+ <span>${r.lastInboundAt?n(r.lastInboundAt):`n/a`}</span>
312
+ </div>
313
+ ${r.lastError?e`<div class="account-card-error">${r.lastError}</div>`:t}
314
+ </div>
315
+ </div>
316
+ `}function R(t){let{telegram:r,telegramAccounts:i}=t;return i.length>1?e`
317
+ <div class="account-card-list" style="margin-top: 16px;">
318
+ ${i.map(e=>L(e))}
319
+ </div>
320
+ `:e`
321
+ <div class="status-list" style="margin-top: 16px;">
322
+ <div>
323
+ <span class="label">Running</span>
324
+ <span>${r?.running?`Yes`:`No`}</span>
325
+ </div>
326
+ <div>
327
+ <span class="label">Mode</span>
328
+ <span>${r?.mode??`n/a`}</span>
329
+ </div>
330
+ <div>
331
+ <span class="label">Last start</span>
332
+ <span>${r?.lastStartAt?n(r.lastStartAt):`n/a`}</span>
333
+ </div>
334
+ <div>
335
+ <span class="label">Last probe</span>
336
+ <span>${r?.lastProbeAt?n(r.lastProbeAt):`n/a`}</span>
337
+ </div>
338
+ </div>
339
+ `}function z(n){let{props:r,telegram:i,telegramAccounts:a,accountCountLabel:o}=n,s=P(r,i,a),c=r.telegramSetupBusy||r.configSaving,l=N(i,a),u=l===`config`||M(r);return s?e`
340
+ <div class="card">
341
+ <div class="row" style="justify-content: space-between; align-items: flex-start; gap: 12px; flex-wrap: wrap;">
342
+ <div>
343
+ <div class="card-title">Telegram</div>
344
+ <div class="card-sub">Bot status, approvals, and channel configuration.</div>
345
+ </div>
346
+ <span class="pill pill--sm pill--ok">Connected</span>
347
+ </div>
348
+
349
+ ${o}
350
+ ${R({telegram:i,telegramAccounts:a})}
351
+
352
+ ${i?.lastError?e`<div class="callout danger" style="margin-top: 12px;">${i.lastError}</div>`:t}
353
+ ${i?.probe?e`<div class="callout" style="margin-top: 12px;">
354
+ Probe ${i.probe.ok?`ok`:`failed`} · ${i.probe.status??``}
355
+ ${i.probe.error??``}
356
+ </div>`:t}
357
+
358
+ ${I(r)}
359
+ ${m({channelId:`telegram`,props:r})}
360
+
361
+ <div class="row" style="margin-top: 12px; gap: 8px; flex-wrap: wrap; align-items: center;">
362
+ ${u?e`
363
+ <button
364
+ class="btn"
365
+ ?disabled=${c||!r.connected}
366
+ @click=${()=>r.onTelegramDisconnect()}
367
+ >
368
+ Disconnect
369
+ </button>
370
+ `:t}
371
+ <button class="btn" ?disabled=${r.loading} @click=${()=>r.onRefresh(!0)}>Probe</button>
372
+ ${l&&l!==`config`?e`<div class="muted" style="font-size: 12px;">Current token source: ${l}</div>`:t}
373
+ </div>
374
+
375
+ ${r.telegramSetupMessage&&r.telegramSetupMessage.kind===`error`?e`
376
+ <div class="callout danger" style="margin-top: 12px;">
377
+ ${r.telegramSetupMessage.text}
378
+ </div>
379
+ `:t}
380
+ </div>
381
+ `:e`
382
+ <div class="card">
383
+ <div class="row" style="justify-content: space-between; align-items: flex-start; gap: 12px;">
384
+ <div>
385
+ <div class="card-title">Telegram</div>
386
+ <div class="card-sub">Connect a Telegram bot to start receiving and sending messages.</div>
387
+ </div>
388
+ <span class="pill pill--sm">Not connected</span>
389
+ </div>
390
+ ${o}
391
+ ${F({props:r,busy:c,tokenSource:l})}
392
+ </div>
393
+ `}var B=[`telegram`];function V(r){let i=r.snapshot?.channels,a=i?.whatsapp??void 0,o=i?.telegram??void 0,s=i?.discord??null,c=i?.googlechat??null,l=i?.slack??null,u=i?.signal??null,d=i?.imessage??null,f=i?.nostr??null;return e`
394
+ <section class="grid grid-cols-2">
395
+ ${H(r.snapshot).map((e,t)=>({key:e,enabled:v(e,r),order:t})).toSorted((e,t)=>e.enabled===t.enabled?e.order-t.order:e.enabled?-1:1).map(e=>U(e.key,r,{whatsapp:a,telegram:o,discord:s,googlechat:c,slack:l,signal:u,imessage:d,nostr:f,channelAccounts:r.snapshot?.channelAccounts??null}))}
396
+ </section>
397
+
398
+ <section class="card" style="margin-top: 18px;">
399
+ <div class="row" style="justify-content: space-between;">
400
+ <div>
401
+ <div class="card-title">Channel health</div>
402
+ <div class="card-sub">Channel status snapshots from the gateway.</div>
403
+ </div>
404
+ <div class="muted">
405
+ ${r.lastSuccessAt?n(r.lastSuccessAt):`n/a`}
406
+ </div>
407
+ </div>
408
+ ${r.lastError?e`<div class="callout danger" style="margin-top: 12px;">${r.lastError}</div>`:t}
409
+ <pre class="code-block" style="margin-top: 12px;">
410
+ ${r.snapshot?JSON.stringify(r.snapshot,null,2):`No snapshot yet.`}
411
+ </pre
412
+ >
413
+ </section>
414
+ `}function H(e){let t=e?.channelMeta?.length?e.channelMeta.map(e=>e.id):e?.channelOrder?.length?e.channelOrder:[];return[...new Set([...B,...t])].filter(e=>e!==`whatsapp`)}function U(e,n,r){let i=C(e,r.channelAccounts);switch(e){case`whatsapp`:return t;case`telegram`:return z({props:n,telegram:r.telegram,telegramAccounts:r.channelAccounts?.telegram??[],accountCountLabel:i});case`discord`:return w({props:n,discord:r.discord,accountCountLabel:i});case`googlechat`:return T({props:n,googleChat:r.googlechat,accountCountLabel:i});case`slack`:return A({props:n,slack:r.slack,accountCountLabel:i});case`signal`:return k({props:n,signal:r.signal,accountCountLabel:i});case`imessage`:return E({props:n,imessage:r.imessage,accountCountLabel:i});case`nostr`:{let e=r.channelAccounts?.nostr??[],t=e[0],a=t?.accountId??`default`,o=t?.profile??null,s=n.nostrProfileAccountId===a?n.nostrProfileFormState:null,c=s?{onFieldChange:n.onNostrProfileFieldChange,onSave:n.onNostrProfileSave,onImport:n.onNostrProfileImport,onCancel:n.onNostrProfileCancel,onToggleAdvanced:n.onNostrProfileToggleAdvanced}:null;return O({props:n,nostr:r.nostr,nostrAccounts:e,accountCountLabel:i,profileFormState:s,profileFormCallbacks:c,onEditProfile:()=>n.onNostrProfileEdit(a,o)})}default:return W(e,n,r.channelAccounts??{})}}function W(n,r,i){let a=K(r.snapshot,n),o=_(n,r),s=typeof o.status?.lastError==`string`?o.status.lastError:void 0,c=i[n]??[];return e`
415
+ <div class="card">
416
+ <div class="card-title">${a}</div>
417
+ <div class="card-sub">Channel status and configuration.</div>
418
+ ${C(n,i)}
419
+ ${c.length>0?e`
420
+ <div class="account-card-list">
421
+ ${c.map(e=>Z(e))}
422
+ </div>
423
+ `:e`
424
+ <div class="status-list" style="margin-top: 16px;">
425
+ <div>
426
+ <span class="label">Configured</span>
427
+ <span>${b(o.configured)}</span>
428
+ </div>
429
+ <div>
430
+ <span class="label">Running</span>
431
+ <span>${b(o.running)}</span>
432
+ </div>
433
+ <div>
434
+ <span class="label">Connected</span>
435
+ <span>${b(o.connected)}</span>
436
+ </div>
437
+ </div>
438
+ `}
439
+ ${s?e`<div class="callout danger" style="margin-top: 12px;">${s}</div>`:t}
440
+ ${m({channelId:n,props:r})}
441
+ </div>
442
+ `}function G(e){return e?.channelMeta?.length?Object.fromEntries(e.channelMeta.map(e=>[e.id,e])):{}}function K(e,t){return G(e)[t]?.label??e?.channelLabels?.[t]??t}var q=600*1e3;function J(e){return e.lastInboundAt?Date.now()-e.lastInboundAt<q:!1}function Y(e){return e.running?`Yes`:J(e)?`Active`:`No`}function X(e){return e.connected===!0?`Yes`:e.connected===!1?`No`:J(e)?`Active`:`n/a`}function Z(r){let i=Y(r),a=X(r);return e`
443
+ <div class="account-card">
444
+ <div class="account-card-header">
445
+ <div class="account-card-title">${r.name||r.accountId}</div>
446
+ <div class="account-card-id">${r.accountId}</div>
447
+ </div>
448
+ <div class="status-list account-card-status">
449
+ <div>
450
+ <span class="label">Running</span>
451
+ <span>${i}</span>
452
+ </div>
453
+ <div>
454
+ <span class="label">Configured</span>
455
+ <span>${r.configured?`Yes`:`No`}</span>
456
+ </div>
457
+ <div>
458
+ <span class="label">Connected</span>
459
+ <span>${a}</span>
460
+ </div>
461
+ <div>
462
+ <span class="label">Last inbound</span>
463
+ <span
464
+ >${r.lastInboundAt?n(r.lastInboundAt):`n/a`}</span
465
+ >
466
+ </div>
467
+ ${r.lastError?e` <div class="account-card-error">${r.lastError}</div> `:t}
468
+ </div>
469
+ </div>
470
+ `}export{V as renderChannels};
471
+ //# sourceMappingURL=channels-BKdM7i5r.js.map