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.
- package/dist/control-ui/apple-touch-icon.png +0 -0
- package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
- package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
- package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
- package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
- package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
- package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
- package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
- package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
- package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
- package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
- package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
- package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
- package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
- package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
- package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
- package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
- package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
- package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
- package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
- package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
- package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
- package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
- package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
- package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
- package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
- package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
- package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
- package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
- package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
- package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
- package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
- package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
- package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
- package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
- package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
- package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
- package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
- package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
- package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
- package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
- package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
- package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
- package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
- package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
- package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
- package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
- package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
- package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
- package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
- package/dist/control-ui/assets/kova-logo.png +0 -0
- package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
- package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
- package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
- package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
- package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
- package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
- package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
- package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
- package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
- package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
- package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
- package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
- package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
- package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
- package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
- package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
- package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
- package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
- package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
- package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
- package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
- package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
- package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
- package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
- package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
- package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
- package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
- package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
- package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
- package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
- package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
- package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
- package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
- package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
- package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
- package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
- package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
- package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
- package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
- package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
- package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
- package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
- package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
- package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
- package/dist/control-ui/favicon-32.png +0 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/favicon.png +0 -0
- package/dist/control-ui/favicon.svg +22 -0
- package/dist/control-ui/index.html +73 -0
- package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
- 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
|