@gguf/claw 2026.2.1 → 2026.2.2

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 (1601) hide show
  1. package/CHANGELOG.md +138 -1
  2. package/README.md +42 -39
  3. package/dist/acp/client.d.ts +1 -1
  4. package/dist/acp/client.js +1 -1
  5. package/dist/acp/server.js +1 -1
  6. package/dist/acp/translator.d.ts +1 -1
  7. package/dist/acp/translator.js +3 -3
  8. package/dist/agents/agent-scope.d.ts +2 -0
  9. package/dist/agents/agent-scope.js +9 -0
  10. package/dist/agents/anthropic-payload-log.js +2 -2
  11. package/dist/agents/apply-patch.js +1 -1
  12. package/dist/agents/auth-profiles/oauth.js +12 -3
  13. package/dist/agents/auth-profiles/session-override.js +1 -1
  14. package/dist/agents/bash-tools.exec.d.ts +1 -1
  15. package/dist/agents/bash-tools.exec.js +51 -9
  16. package/dist/agents/bootstrap-files.d.ts +1 -1
  17. package/dist/agents/bootstrap-files.js +1 -1
  18. package/dist/agents/cache-trace.js +1 -1
  19. package/dist/agents/cli-credentials.d.ts +1 -1
  20. package/dist/agents/cli-runner/helpers.js +2 -2
  21. package/dist/agents/cli-runner.js +2 -2
  22. package/dist/agents/context-window-guard.js +10 -11
  23. package/dist/agents/model-auth.js +2 -2
  24. package/dist/agents/model-fallback.js +1 -1
  25. package/dist/agents/model-selection.js +1 -1
  26. package/dist/agents/models-config.providers.js +1 -1
  27. package/dist/agents/openclaw-tools.js +2 -1
  28. package/dist/agents/pi-embedded-block-chunker.d.ts +2 -0
  29. package/dist/agents/pi-embedded-block-chunker.js +85 -26
  30. package/dist/agents/pi-embedded-helpers/errors.d.ts +1 -0
  31. package/dist/agents/pi-embedded-helpers/errors.js +13 -0
  32. package/dist/agents/pi-embedded-runner/compact.d.ts +2 -2
  33. package/dist/agents/pi-embedded-runner/compact.js +20 -24
  34. package/dist/agents/pi-embedded-runner/extensions.js +8 -0
  35. package/dist/agents/pi-embedded-runner/extra-params.d.ts +1 -0
  36. package/dist/agents/pi-embedded-runner/extra-params.js +50 -12
  37. package/dist/agents/pi-embedded-runner/google.d.ts +1 -1
  38. package/dist/agents/pi-embedded-runner/google.js +6 -5
  39. package/dist/agents/pi-embedded-runner/model.d.ts +1 -1
  40. package/dist/agents/pi-embedded-runner/model.js +1 -1
  41. package/dist/agents/pi-embedded-runner/run/attempt.js +34 -34
  42. package/dist/agents/pi-embedded-runner/run/images.js +3 -3
  43. package/dist/agents/pi-embedded-runner/run/params.d.ts +1 -1
  44. package/dist/agents/pi-embedded-runner/run/types.d.ts +3 -3
  45. package/dist/agents/pi-embedded-runner/system-prompt.d.ts +3 -1
  46. package/dist/agents/pi-embedded-runner/system-prompt.js +9 -2
  47. package/dist/agents/pi-embedded-runner/types.d.ts +1 -1
  48. package/dist/agents/pi-embedded-subscribe.handlers.messages.js +2 -2
  49. package/dist/agents/pi-embedded-subscribe.handlers.types.d.ts +1 -1
  50. package/dist/agents/pi-embedded-subscribe.tools.js +1 -1
  51. package/dist/agents/pi-extensions/compaction-safeguard-runtime.d.ts +1 -0
  52. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -2
  53. package/dist/agents/pi-model-discovery.js +1 -1
  54. package/dist/agents/pi-tool-definition-adapter.d.ts +4 -1
  55. package/dist/agents/pi-tool-definition-adapter.js +48 -7
  56. package/dist/agents/pi-tools.abort.js +9 -1
  57. package/dist/agents/pi-tools.before-tool-call.d.ts +25 -0
  58. package/dist/agents/pi-tools.before-tool-call.js +69 -0
  59. package/dist/agents/pi-tools.d.ts +3 -3
  60. package/dist/agents/pi-tools.js +9 -4
  61. package/dist/agents/pi-tools.policy.js +2 -2
  62. package/dist/agents/pi-tools.read.js +1 -1
  63. package/dist/agents/sandbox/context.js +1 -1
  64. package/dist/agents/sandbox/docker.js +2 -2
  65. package/dist/agents/sandbox/runtime-status.js +1 -1
  66. package/dist/agents/session-file-repair.d.ts +11 -0
  67. package/dist/agents/session-file-repair.js +83 -0
  68. package/dist/agents/session-tool-result-guard-wrapper.js +15 -14
  69. package/dist/agents/session-tool-result-guard.js +20 -8
  70. package/dist/agents/session-transcript-repair.d.ts +7 -0
  71. package/dist/agents/session-transcript-repair.js +58 -0
  72. package/dist/agents/skills/refresh.js +1 -1
  73. package/dist/agents/skills/workspace.js +1 -1
  74. package/dist/agents/skills-install.js +6 -4
  75. package/dist/agents/subagent-announce.js +2 -2
  76. package/dist/agents/system-prompt-report.d.ts +1 -1
  77. package/dist/agents/system-prompt.js +6 -1
  78. package/dist/agents/timeout.js +11 -2
  79. package/dist/agents/tool-policy.conformance.d.ts +11 -0
  80. package/dist/agents/tool-policy.conformance.js +14 -0
  81. package/dist/agents/tool-policy.js +4 -0
  82. package/dist/agents/tools/browser-tool.js +3 -3
  83. package/dist/agents/tools/browser-tool.schema.d.ts +2 -2
  84. package/dist/agents/tools/canvas-tool.js +1 -1
  85. package/dist/agents/tools/cron-tool.js +2 -2
  86. package/dist/agents/tools/discord-actions-messaging.js +2 -2
  87. package/dist/agents/tools/gateway-tool.js +8 -3
  88. package/dist/agents/tools/image-tool.js +3 -3
  89. package/dist/agents/tools/message-tool.d.ts +1 -0
  90. package/dist/agents/tools/message-tool.js +16 -5
  91. package/dist/agents/tools/nodes-tool.js +33 -2
  92. package/dist/agents/tools/session-status-tool.js +2 -2
  93. package/dist/agents/tools/sessions-helpers.js +1 -1
  94. package/dist/agents/tools/sessions-list-tool.js +1 -1
  95. package/dist/agents/tools/sessions-send-tool.d.ts +1 -1
  96. package/dist/agents/tools/sessions-send-tool.js +1 -1
  97. package/dist/agents/tools/sessions-spawn-tool.js +7 -4
  98. package/dist/agents/tools/telegram-actions.js +1 -1
  99. package/dist/agents/tools/web-fetch.js +117 -101
  100. package/dist/agents/tools/web-search.js +15 -8
  101. package/dist/agents/transcript-policy.js +1 -1
  102. package/dist/agents/workspace.js +1 -1
  103. package/dist/auto-reply/commands-registry.d.ts +1 -1
  104. package/dist/auto-reply/commands-registry.data.js +1 -1
  105. package/dist/auto-reply/commands-registry.js +1 -1
  106. package/dist/auto-reply/dispatch.d.ts +1 -1
  107. package/dist/auto-reply/dispatch.js +1 -1
  108. package/dist/auto-reply/envelope.d.ts +1 -1
  109. package/dist/auto-reply/reply/abort.js +2 -2
  110. package/dist/auto-reply/reply/agent-runner-execution.d.ts +4 -3
  111. package/dist/auto-reply/reply/agent-runner-execution.js +71 -50
  112. package/dist/auto-reply/reply/agent-runner-helpers.d.ts +2 -2
  113. package/dist/auto-reply/reply/agent-runner-memory.d.ts +1 -1
  114. package/dist/auto-reply/reply/agent-runner.d.ts +4 -3
  115. package/dist/auto-reply/reply/agent-runner.js +2 -2
  116. package/dist/auto-reply/reply/block-reply-coalescer.js +14 -1
  117. package/dist/auto-reply/reply/block-streaming.d.ts +5 -0
  118. package/dist/auto-reply/reply/block-streaming.js +20 -12
  119. package/dist/auto-reply/reply/commands-allowlist.js +8 -8
  120. package/dist/auto-reply/reply/commands-approve.js +1 -1
  121. package/dist/auto-reply/reply/commands-config.js +3 -3
  122. package/dist/auto-reply/reply/commands-context-report.js +4 -4
  123. package/dist/auto-reply/reply/commands-core.js +35 -31
  124. package/dist/auto-reply/reply/commands-info.js +1 -1
  125. package/dist/auto-reply/reply/commands-models.js +1 -1
  126. package/dist/auto-reply/reply/commands-ptt.d.ts +2 -0
  127. package/dist/auto-reply/reply/commands-ptt.js +171 -0
  128. package/dist/auto-reply/reply/commands-session.js +2 -2
  129. package/dist/auto-reply/reply/commands-status.d.ts +1 -1
  130. package/dist/auto-reply/reply/commands-status.js +2 -2
  131. package/dist/auto-reply/reply/commands-subagents.js +2 -2
  132. package/dist/auto-reply/reply/commands-types.d.ts +1 -1
  133. package/dist/auto-reply/reply/directive-handling.impl.d.ts +1 -1
  134. package/dist/auto-reply/reply/directive-handling.model-picker.d.ts +1 -1
  135. package/dist/auto-reply/reply/directive-handling.model.d.ts +1 -1
  136. package/dist/auto-reply/reply/directive-handling.model.js +1 -1
  137. package/dist/auto-reply/reply/directive-handling.persist.d.ts +2 -2
  138. package/dist/auto-reply/reply/dispatch-from-config.d.ts +1 -1
  139. package/dist/auto-reply/reply/dispatch-from-config.js +1 -1
  140. package/dist/auto-reply/reply/followup-runner.d.ts +1 -1
  141. package/dist/auto-reply/reply/followup-runner.js +1 -1
  142. package/dist/auto-reply/reply/get-reply-directives-apply.d.ts +2 -2
  143. package/dist/auto-reply/reply/get-reply-directives.d.ts +2 -1
  144. package/dist/auto-reply/reply/get-reply-inline-actions.d.ts +1 -1
  145. package/dist/auto-reply/reply/get-reply-inline-actions.js +6 -4
  146. package/dist/auto-reply/reply/get-reply-run.d.ts +4 -3
  147. package/dist/auto-reply/reply/get-reply-run.js +4 -3
  148. package/dist/auto-reply/reply/get-reply.d.ts +1 -1
  149. package/dist/auto-reply/reply/get-reply.js +35 -9
  150. package/dist/auto-reply/reply/inbound-dedupe.d.ts +1 -1
  151. package/dist/auto-reply/reply/model-selection.d.ts +2 -2
  152. package/dist/auto-reply/reply/model-selection.js +1 -1
  153. package/dist/auto-reply/reply/normalize-reply.js +2 -2
  154. package/dist/auto-reply/reply/provider-dispatcher.d.ts +1 -1
  155. package/dist/auto-reply/reply/queue/types.d.ts +1 -1
  156. package/dist/auto-reply/reply/reply-dispatcher.d.ts +1 -1
  157. package/dist/auto-reply/reply/reply-dispatcher.js +1 -2
  158. package/dist/auto-reply/reply/reply-elevated.js +1 -1
  159. package/dist/auto-reply/reply/route-reply.d.ts +1 -1
  160. package/dist/auto-reply/reply/session-reset-model.d.ts +1 -1
  161. package/dist/auto-reply/reply/session-reset-model.js +1 -1
  162. package/dist/auto-reply/reply/session.d.ts +1 -1
  163. package/dist/auto-reply/reply/session.js +4 -4
  164. package/dist/auto-reply/skill-commands.js +1 -1
  165. package/dist/auto-reply/status.d.ts +3 -3
  166. package/dist/auto-reply/status.js +2 -2
  167. package/dist/auto-reply/templating.d.ts +1 -1
  168. package/dist/browser/cdp.helpers.d.ts +3 -1
  169. package/dist/browser/cdp.helpers.js +7 -4
  170. package/dist/browser/chrome.d.ts +1 -1
  171. package/dist/browser/chrome.js +1 -1
  172. package/dist/browser/config.js +1 -1
  173. package/dist/browser/extension-relay.d.ts +1 -0
  174. package/dist/browser/extension-relay.js +64 -0
  175. package/dist/browser/profiles-service.js +1 -1
  176. package/dist/browser/profiles.js +0 -1
  177. package/dist/browser/pw-session.js +2 -1
  178. package/dist/browser/routes/agent.shared.d.ts +1 -1
  179. package/dist/build-info.json +2 -2
  180. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  181. package/dist/canvas-host/server.d.ts +1 -1
  182. package/dist/canvas-host/server.js +1 -1
  183. package/dist/channels/dock.js +2 -2
  184. package/dist/channels/plugins/actions/discord/handle-action.js +1 -1
  185. package/dist/channels/plugins/directory-config.js +2 -2
  186. package/dist/channels/plugins/index.js +1 -1
  187. package/dist/channels/plugins/onboarding/discord.js +1 -1
  188. package/dist/channels/plugins/onboarding/signal.js +1 -1
  189. package/dist/channels/plugins/onboarding/telegram.js +1 -1
  190. package/dist/channels/plugins/onboarding/whatsapp.js +1 -1
  191. package/dist/channels/plugins/outbound/whatsapp.js +1 -1
  192. package/dist/channels/plugins/pairing.d.ts +1 -1
  193. package/dist/channels/plugins/types.adapters.d.ts +1 -1
  194. package/dist/channels/reply-prefix.d.ts +1 -1
  195. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +1 -1
  196. package/dist/cli/browser-cli-actions-observe.js +1 -1
  197. package/dist/cli/browser-cli-debug.js +1 -1
  198. package/dist/cli/browser-cli-extension.js +1 -1
  199. package/dist/cli/browser-cli.js +2 -2
  200. package/dist/cli/channel-options.js +1 -1
  201. package/dist/cli/channels-cli.js +1 -1
  202. package/dist/cli/command-format.js +1 -1
  203. package/dist/cli/config-cli.js +1 -1
  204. package/dist/cli/cron-cli/register.cron-add.js +1 -1
  205. package/dist/cli/cron-cli/register.cron-edit.js +1 -1
  206. package/dist/cli/daemon-cli/install.js +1 -1
  207. package/dist/cli/daemon-cli/lifecycle.js +1 -1
  208. package/dist/cli/daemon-cli/status.gather.d.ts +1 -1
  209. package/dist/cli/daemon-cli/status.gather.js +1 -1
  210. package/dist/cli/deps.d.ts +1 -1
  211. package/dist/cli/devices-cli.js +1 -1
  212. package/dist/cli/directory-cli.js +2 -2
  213. package/dist/cli/exec-approvals-cli.js +3 -3
  214. package/dist/cli/gateway-cli/dev.js +1 -1
  215. package/dist/cli/gateway-cli/register.js +1 -1
  216. package/dist/cli/hooks-cli.js +12 -5
  217. package/dist/cli/memory-cli.js +3 -3
  218. package/dist/cli/node-cli/daemon.js +2 -2
  219. package/dist/cli/node-cli/register.js +3 -3
  220. package/dist/cli/nodes-cli/register.camera.js +2 -2
  221. package/dist/cli/nodes-cli/register.canvas.js +1 -1
  222. package/dist/cli/nodes-cli/register.invoke.js +4 -4
  223. package/dist/cli/nodes-cli/register.pairing.js +2 -2
  224. package/dist/cli/nodes-cli/register.screen.js +1 -1
  225. package/dist/cli/nodes-cli/register.status.js +4 -4
  226. package/dist/cli/pairing-cli.js +1 -1
  227. package/dist/cli/ports.js +1 -3
  228. package/dist/cli/program/build-program.js +1 -1
  229. package/dist/cli/program/config-guard.js +2 -2
  230. package/dist/cli/program/message/helpers.js +1 -1
  231. package/dist/cli/program/preaction.js +5 -5
  232. package/dist/cli/program/register.agent.js +2 -2
  233. package/dist/cli/program/register.message.js +1 -1
  234. package/dist/cli/program/register.setup.js +1 -1
  235. package/dist/cli/program/register.status-health-sessions.js +1 -1
  236. package/dist/cli/progress.js +1 -1
  237. package/dist/cli/route.js +4 -4
  238. package/dist/cli/run-main.js +1 -1
  239. package/dist/cli/sandbox-cli.js +1 -1
  240. package/dist/cli/update-cli.js +16 -10
  241. package/dist/cli/webhooks-cli.js +1 -1
  242. package/dist/commands/agent/delivery.d.ts +1 -1
  243. package/dist/commands/agent/delivery.js +1 -1
  244. package/dist/commands/agent/session.d.ts +1 -1
  245. package/dist/commands/agent-via-gateway.d.ts +1 -1
  246. package/dist/commands/agent-via-gateway.js +3 -3
  247. package/dist/commands/agent.d.ts +1 -1
  248. package/dist/commands/agent.js +8 -6
  249. package/dist/commands/agents.commands.add.js +1 -1
  250. package/dist/commands/agents.commands.list.js +1 -1
  251. package/dist/commands/auth-choice-options.js +1 -1
  252. package/dist/commands/auth-choice.apply.minimax.js +1 -1
  253. package/dist/commands/auth-choice.apply.oauth.js +1 -1
  254. package/dist/commands/auth-choice.apply.openai.js +1 -1
  255. package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
  256. package/dist/commands/channels/capabilities.js +1 -1
  257. package/dist/commands/channels/logs.js +1 -1
  258. package/dist/commands/channels/resolve.js +1 -1
  259. package/dist/commands/channels/status.js +1 -1
  260. package/dist/commands/configure.daemon.js +3 -3
  261. package/dist/commands/configure.gateway-auth.js +1 -1
  262. package/dist/commands/configure.wizard.js +2 -2
  263. package/dist/commands/daemon-install-helpers.js +2 -2
  264. package/dist/commands/docs.js +1 -1
  265. package/dist/commands/doctor-auth.js +1 -1
  266. package/dist/commands/doctor-config-flow.js +2 -2
  267. package/dist/commands/doctor-format.js +1 -1
  268. package/dist/commands/doctor-gateway-daemon-flow.js +4 -4
  269. package/dist/commands/doctor-gateway-health.js +1 -1
  270. package/dist/commands/doctor-gateway-services.js +1 -1
  271. package/dist/commands/doctor-sandbox.js +3 -1
  272. package/dist/commands/doctor-security.js +2 -2
  273. package/dist/commands/doctor-update.js +2 -2
  274. package/dist/commands/doctor.js +2 -2
  275. package/dist/commands/gateway-status.js +1 -1
  276. package/dist/commands/health.d.ts +1 -1
  277. package/dist/commands/health.js +1 -1
  278. package/dist/commands/message.d.ts +1 -1
  279. package/dist/commands/models/auth.js +7 -7
  280. package/dist/commands/models/list.auth-overview.d.ts +1 -1
  281. package/dist/commands/models/list.probe.js +3 -3
  282. package/dist/commands/models/list.registry.js +1 -1
  283. package/dist/commands/models/list.status-command.js +4 -4
  284. package/dist/commands/models/shared.js +1 -1
  285. package/dist/commands/onboard-channels.js +4 -4
  286. package/dist/commands/onboard-helpers.js +2 -2
  287. package/dist/commands/onboard-hooks.js +1 -1
  288. package/dist/commands/onboard-interactive.js +4 -0
  289. package/dist/commands/onboard-non-interactive/local/auth-choice.js +1 -1
  290. package/dist/commands/onboard-non-interactive/local/daemon-install.js +1 -1
  291. package/dist/commands/onboard-non-interactive/local.js +1 -1
  292. package/dist/commands/onboard-non-interactive/remote.js +1 -1
  293. package/dist/commands/onboard.js +4 -3
  294. package/dist/commands/onboarding/plugin-install.js +2 -2
  295. package/dist/commands/reset.js +1 -1
  296. package/dist/commands/setup.js +1 -1
  297. package/dist/commands/status-all/diagnosis.js +4 -4
  298. package/dist/commands/status-all.js +4 -4
  299. package/dist/commands/status.command.js +5 -5
  300. package/dist/commands/status.daemon.js +1 -1
  301. package/dist/commands/status.scan.d.ts +3 -3
  302. package/dist/commands/status.scan.js +1 -1
  303. package/dist/commands/status.update.js +1 -1
  304. package/dist/commands/uninstall.js +1 -1
  305. package/dist/config/defaults.js +5 -5
  306. package/dist/config/includes.js +1 -1
  307. package/dist/config/io.d.ts +1 -1
  308. package/dist/config/io.js +2 -2
  309. package/dist/config/plugin-auto-enable.js +2 -2
  310. package/dist/config/schema.js +8 -0
  311. package/dist/config/sessions/main-session.d.ts +1 -1
  312. package/dist/config/sessions/reset.js +1 -1
  313. package/dist/config/sessions/store.d.ts +1 -1
  314. package/dist/config/sessions/store.js +2 -2
  315. package/dist/config/sessions/transcript.js +3 -3
  316. package/dist/config/types.agent-defaults.d.ts +4 -2
  317. package/dist/config/types.agents.d.ts +2 -0
  318. package/dist/config/types.channels.d.ts +1 -1
  319. package/dist/config/types.discord.d.ts +3 -0
  320. package/dist/config/types.msteams.d.ts +5 -0
  321. package/dist/config/zod-schema.agent-defaults.d.ts +1 -0
  322. package/dist/config/zod-schema.agent-defaults.js +1 -0
  323. package/dist/config/zod-schema.agent-runtime.d.ts +2 -0
  324. package/dist/config/zod-schema.agent-runtime.js +2 -0
  325. package/dist/config/zod-schema.agents.d.ts +3 -0
  326. package/dist/config/zod-schema.d.ts +12 -0
  327. package/dist/config/zod-schema.js +1 -1
  328. package/dist/config/zod-schema.providers-core.d.ts +13 -0
  329. package/dist/config/zod-schema.providers-core.js +42 -2
  330. package/dist/config/zod-schema.providers-whatsapp.js +1 -1
  331. package/dist/config/zod-schema.providers.d.ts +9 -0
  332. package/dist/config/zod-schema.providers.js +2 -2
  333. package/dist/control-ui/assets/index-B6zgZRLn.js +4586 -0
  334. package/dist/control-ui/assets/index-B6zgZRLn.js.map +1 -0
  335. package/dist/control-ui/assets/index-BVBLXya3.css +1 -0
  336. package/dist/control-ui/index.html +3 -3
  337. package/dist/cron/isolated-agent/run.d.ts +1 -1
  338. package/dist/cron/isolated-agent/run.js +3 -4
  339. package/dist/cron/service.d.ts +1 -1
  340. package/dist/cron/store.js +1 -1
  341. package/dist/daemon/launchd.js +2 -2
  342. package/dist/daemon/node-service.js +1 -1
  343. package/dist/daemon/schtasks.js +1 -1
  344. package/dist/daemon/systemd.js +2 -2
  345. package/dist/discord/directory-live.d.ts +1 -1
  346. package/dist/discord/monitor/allow-list.d.ts +1 -1
  347. package/dist/discord/monitor/allow-list.js +3 -3
  348. package/dist/discord/monitor/exec-approvals.d.ts +1 -1
  349. package/dist/discord/monitor/exec-approvals.js +1 -1
  350. package/dist/discord/monitor/listeners.js +2 -1
  351. package/dist/discord/monitor/message-handler.preflight.js +83 -48
  352. package/dist/discord/monitor/message-handler.preflight.types.d.ts +3 -0
  353. package/dist/discord/monitor/message-handler.process.js +21 -18
  354. package/dist/discord/monitor/native-command.js +19 -16
  355. package/dist/discord/monitor/provider.js +2 -2
  356. package/dist/discord/monitor/reply-context.d.ts +1 -1
  357. package/dist/discord/monitor/reply-context.js +11 -6
  358. package/dist/discord/monitor/sender-identity.d.ts +31 -0
  359. package/dist/discord/monitor/sender-identity.js +45 -0
  360. package/dist/discord/monitor/threading.d.ts +1 -1
  361. package/dist/discord/pluralkit.d.ts +26 -0
  362. package/dist/discord/pluralkit.js +27 -0
  363. package/dist/discord/send.shared.d.ts +2 -2
  364. package/dist/discord/targets.d.ts +1 -1
  365. package/dist/gateway/assistant-identity.d.ts +1 -0
  366. package/dist/gateway/assistant-identity.js +35 -1
  367. package/dist/gateway/boot.js +1 -1
  368. package/dist/gateway/call.js +2 -2
  369. package/dist/gateway/client.js +3 -2
  370. package/dist/gateway/config-reload.d.ts +1 -1
  371. package/dist/gateway/hooks-mapping.d.ts +1 -1
  372. package/dist/gateway/open-responses.schema.d.ts +6 -6
  373. package/dist/gateway/openresponses-http.d.ts +1 -1
  374. package/dist/gateway/openresponses-http.js +2 -2
  375. package/dist/gateway/protocol/index.d.ts +30 -16
  376. package/dist/gateway/protocol/index.js +5 -2
  377. package/dist/gateway/protocol/schema/agent.d.ts +1 -0
  378. package/dist/gateway/protocol/schema/agent.js +1 -0
  379. package/dist/gateway/protocol/schema/agents-models-skills.d.ts +60 -1
  380. package/dist/gateway/protocol/schema/agents-models-skills.js +39 -1
  381. package/dist/gateway/protocol/schema/frames.d.ts +2 -2
  382. package/dist/gateway/protocol/schema/primitives.d.ts +2 -2
  383. package/dist/gateway/protocol/schema/protocol-schemas.js +9 -2
  384. package/dist/gateway/protocol/schema/types.d.ts +9 -2
  385. package/dist/gateway/server/health-state.d.ts +1 -1
  386. package/dist/gateway/server/health-state.js +1 -1
  387. package/dist/gateway/server/ws-connection/message-handler.js +61 -44
  388. package/dist/gateway/server-channels.d.ts +1 -1
  389. package/dist/gateway/server-close.d.ts +1 -1
  390. package/dist/gateway/server-http.d.ts +1 -1
  391. package/dist/gateway/server-http.js +2 -2
  392. package/dist/gateway/server-maintenance.d.ts +1 -1
  393. package/dist/gateway/server-maintenance.js +1 -1
  394. package/dist/gateway/server-methods/agent.js +5 -5
  395. package/dist/gateway/server-methods/agents.js +179 -1
  396. package/dist/gateway/server-methods/channels.d.ts +1 -1
  397. package/dist/gateway/server-methods/channels.js +1 -1
  398. package/dist/gateway/server-methods/chat.js +3 -3
  399. package/dist/gateway/server-methods/config.js +2 -2
  400. package/dist/gateway/server-methods/nodes.js +3 -3
  401. package/dist/gateway/server-methods/send.js +3 -3
  402. package/dist/gateway/server-methods/skills.js +12 -2
  403. package/dist/gateway/server-methods/types.d.ts +1 -1
  404. package/dist/gateway/server-methods/update.js +1 -1
  405. package/dist/gateway/server-methods/usage.js +1 -1
  406. package/dist/gateway/server-methods-list.js +3 -0
  407. package/dist/gateway/server-reload-handlers.js +2 -2
  408. package/dist/gateway/server-runtime-state.d.ts +4 -4
  409. package/dist/gateway/server-runtime-state.js +3 -3
  410. package/dist/gateway/server-startup.js +1 -1
  411. package/dist/gateway/server-ws-runtime.d.ts +1 -1
  412. package/dist/gateway/server.impl.js +15 -15
  413. package/dist/gateway/session-utils.d.ts +1 -1
  414. package/dist/gateway/sessions-patch.js +1 -1
  415. package/dist/gateway/test-helpers.mocks.d.ts +4 -0
  416. package/dist/gateway/test-helpers.mocks.js +10 -1
  417. package/dist/gateway/test-helpers.server.d.ts +1 -1
  418. package/dist/gateway/test-helpers.server.js +3 -2
  419. package/dist/gateway/tools-invoke-http.js +5 -1
  420. package/dist/gateway/ws-log.js +2 -2
  421. package/dist/hooks/bundled/command-logger/handler.js +1 -1
  422. package/dist/hooks/bundled/session-memory/handler.js +3 -2
  423. package/dist/hooks/gmail-ops.js +2 -2
  424. package/dist/hooks/gmail-watcher.js +1 -1
  425. package/dist/hooks/install.js +54 -5
  426. package/dist/hooks/llm-slug-generator.js +1 -1
  427. package/dist/hooks/loader.js +3 -3
  428. package/dist/imessage/monitor/monitor-provider.js +3 -3
  429. package/dist/imessage/send.js +1 -1
  430. package/dist/index.js +1 -1
  431. package/dist/infra/archive.js +1 -1
  432. package/dist/infra/dotenv.js +1 -1
  433. package/dist/infra/exec-approvals.js +32 -0
  434. package/dist/infra/gateway-lock.js +1 -1
  435. package/dist/infra/heartbeat-runner.d.ts +1 -1
  436. package/dist/infra/heartbeat-runner.js +2 -2
  437. package/dist/infra/net/fetch-guard.d.ts +20 -0
  438. package/dist/infra/net/fetch-guard.js +122 -0
  439. package/dist/infra/net/ssrf.d.ts +10 -3
  440. package/dist/infra/net/ssrf.js +27 -10
  441. package/dist/infra/outbound/agent-delivery.d.ts +2 -2
  442. package/dist/infra/outbound/deliver.d.ts +1 -1
  443. package/dist/infra/outbound/deliver.js +1 -1
  444. package/dist/infra/outbound/message-action-runner.d.ts +1 -1
  445. package/dist/infra/outbound/message-action-runner.js +6 -6
  446. package/dist/infra/outbound/outbound-policy.js +1 -1
  447. package/dist/infra/outbound/outbound-session.d.ts +1 -1
  448. package/dist/infra/outbound/outbound-session.js +1 -1
  449. package/dist/infra/outbound/target-resolver.js +1 -1
  450. package/dist/infra/path-env.js +1 -1
  451. package/dist/infra/ports-inspect.js +1 -1
  452. package/dist/infra/provider-usage.load.d.ts +1 -1
  453. package/dist/infra/provider-usage.load.js +1 -1
  454. package/dist/infra/retry.js +1 -1
  455. package/dist/infra/skills-remote.js +3 -3
  456. package/dist/infra/state-migrations.fs.js +1 -1
  457. package/dist/infra/state-migrations.js +1 -1
  458. package/dist/infra/tailscale.js +1 -1
  459. package/dist/infra/tls/gateway.js +1 -1
  460. package/dist/infra/update-global.d.ts +6 -0
  461. package/dist/infra/update-global.js +35 -0
  462. package/dist/infra/update-runner.js +7 -3
  463. package/dist/infra/update-startup.js +3 -3
  464. package/dist/line/auto-reply-delivery.d.ts +1 -1
  465. package/dist/line/bot-handlers.d.ts +1 -1
  466. package/dist/line/bot-handlers.js +1 -1
  467. package/dist/line/download.js +2 -2
  468. package/dist/line/monitor.js +8 -8
  469. package/dist/line/webhook.d.ts +1 -1
  470. package/dist/link-understanding/apply.d.ts +1 -1
  471. package/dist/link-understanding/runner.d.ts +1 -1
  472. package/dist/link-understanding/runner.js +1 -1
  473. package/dist/logging/config.js +1 -1
  474. package/dist/logging/console.js +1 -1
  475. package/dist/logging/logger.js +2 -2
  476. package/dist/logging/subsystem.js +2 -2
  477. package/dist/media/fetch.d.ts +4 -0
  478. package/dist/media/fetch.js +67 -52
  479. package/dist/media/host.js +1 -1
  480. package/dist/media/input-files.js +24 -57
  481. package/dist/media/mime.js +1 -1
  482. package/dist/media/server.js +2 -2
  483. package/dist/media/store.js +1 -1
  484. package/dist/media-understanding/apply.d.ts +1 -1
  485. package/dist/media-understanding/apply.js +156 -41
  486. package/dist/media-understanding/attachments.js +2 -2
  487. package/dist/media-understanding/providers/deepgram/audio.js +18 -12
  488. package/dist/media-understanding/providers/google/audio.js +22 -16
  489. package/dist/media-understanding/providers/google/video.js +22 -16
  490. package/dist/media-understanding/providers/image.js +2 -2
  491. package/dist/media-understanding/providers/openai/audio.js +18 -12
  492. package/dist/media-understanding/providers/shared.d.ts +7 -0
  493. package/dist/media-understanding/providers/shared.js +12 -0
  494. package/dist/media-understanding/resolve.d.ts +1 -1
  495. package/dist/media-understanding/runner.d.ts +2 -2
  496. package/dist/media-understanding/runner.js +3 -3
  497. package/dist/memory/batch-gemini.js +1 -1
  498. package/dist/memory/embeddings.js +10 -2
  499. package/dist/memory/manager-cache-key.js +1 -1
  500. package/dist/memory/manager.js +6 -6
  501. package/dist/memory/provider-key.js +1 -1
  502. package/dist/node-host/runner.js +10 -10
  503. package/dist/plugins/discovery.d.ts +1 -1
  504. package/dist/plugins/hook-runner-global.d.ts +1 -1
  505. package/dist/plugins/hooks.js +2 -0
  506. package/dist/plugins/http-registry.js +1 -1
  507. package/dist/plugins/install.js +49 -4
  508. package/dist/plugins/loader.d.ts +1 -1
  509. package/dist/plugins/loader.js +5 -5
  510. package/dist/plugins/manifest-registry.d.ts +1 -1
  511. package/dist/plugins/manifest.d.ts +1 -1
  512. package/dist/plugins/providers.d.ts +1 -1
  513. package/dist/plugins/registry.d.ts +3 -3
  514. package/dist/plugins/registry.js +1 -1
  515. package/dist/plugins/runtime/index.js +22 -22
  516. package/dist/plugins/status.d.ts +1 -1
  517. package/dist/plugins/types.d.ts +6 -6
  518. package/dist/plugins/update.js +12 -1
  519. package/dist/process/exec.js +23 -2
  520. package/dist/routing/resolve-route.d.ts +3 -1
  521. package/dist/routing/resolve-route.js +10 -0
  522. package/dist/runtime.js +2 -0
  523. package/dist/security/audit-extra.js +8 -8
  524. package/dist/security/audit.d.ts +2 -2
  525. package/dist/security/audit.js +6 -5
  526. package/dist/security/external-content.d.ts +7 -2
  527. package/dist/security/external-content.js +81 -3
  528. package/dist/security/fix.js +4 -4
  529. package/dist/sessions/level-overrides.d.ts +1 -1
  530. package/dist/signal/monitor/event-handler.js +2 -2
  531. package/dist/signal/monitor.js +1 -1
  532. package/dist/slack/directory-live.d.ts +1 -1
  533. package/dist/slack/directory-live.js +1 -1
  534. package/dist/slack/monitor/context.d.ts +2 -2
  535. package/dist/slack/monitor/context.js +1 -1
  536. package/dist/slack/monitor/events/channels.js +2 -2
  537. package/dist/slack/monitor/media.d.ts +2 -2
  538. package/dist/slack/monitor/media.js +77 -11
  539. package/dist/slack/monitor/message-handler/dispatch.js +1 -1
  540. package/dist/slack/monitor/message-handler/prepare.d.ts +1 -1
  541. package/dist/slack/monitor/message-handler/prepare.js +8 -8
  542. package/dist/slack/monitor/message-handler/types.d.ts +1 -1
  543. package/dist/slack/monitor/provider.js +3 -3
  544. package/dist/slack/monitor/replies.js +1 -1
  545. package/dist/slack/monitor/slash.js +9 -7
  546. package/dist/slack/send.js +1 -1
  547. package/dist/telegram/bot/delivery.d.ts +3 -2
  548. package/dist/telegram/bot/delivery.js +13 -13
  549. package/dist/telegram/bot/helpers.d.ts +11 -2
  550. package/dist/telegram/bot/helpers.js +24 -5
  551. package/dist/telegram/bot-handlers.d.ts +2 -15
  552. package/dist/telegram/bot-handlers.js +10 -10
  553. package/dist/telegram/bot-message-context.d.ts +2 -1
  554. package/dist/telegram/bot-message-context.js +23 -17
  555. package/dist/telegram/bot-message-dispatch.d.ts +1 -12
  556. package/dist/telegram/bot-message-dispatch.js +11 -10
  557. package/dist/telegram/bot-native-commands.d.ts +29 -2
  558. package/dist/telegram/bot-native-commands.js +37 -22
  559. package/dist/telegram/bot.js +6 -4
  560. package/dist/telegram/download.d.ts +2 -2
  561. package/dist/telegram/download.js +4 -4
  562. package/dist/telegram/draft-stream.d.ts +2 -1
  563. package/dist/telegram/draft-stream.js +1 -1
  564. package/dist/telegram/monitor.js +105 -100
  565. package/dist/telegram/network-errors.js +10 -0
  566. package/dist/telegram/send.d.ts +1 -1
  567. package/dist/telegram/send.js +10 -8
  568. package/dist/telegram/sticker-cache.js +4 -4
  569. package/dist/telegram/webhook-set.js +1 -1
  570. package/dist/telegram/webhook.js +3 -3
  571. package/dist/terminal/restore.d.ts +1 -0
  572. package/dist/terminal/restore.js +45 -0
  573. package/dist/terminal/table.js +1 -1
  574. package/dist/tts/tts.js +5 -5
  575. package/dist/tui/components/filterable-select-list.d.ts +1 -1
  576. package/dist/tui/components/searchable-select-list.js +3 -3
  577. package/dist/tui/tui-formatters.js +1 -1
  578. package/dist/tui/tui.js +7 -1
  579. package/dist/web/accounts.js +2 -2
  580. package/dist/web/auth-store.d.ts +1 -1
  581. package/dist/web/auth-store.js +1 -1
  582. package/dist/web/auto-reply/deliver-reply.d.ts +2 -2
  583. package/dist/web/auto-reply/deliver-reply.js +2 -2
  584. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  585. package/dist/web/auto-reply/monitor/ack-reaction.js +1 -1
  586. package/dist/web/auto-reply/monitor/group-gating.js +2 -2
  587. package/dist/web/auto-reply/monitor/message-line.d.ts +1 -1
  588. package/dist/web/auto-reply/monitor/process-message.js +3 -3
  589. package/dist/web/auto-reply/monitor.d.ts +1 -1
  590. package/dist/web/auto-reply/monitor.js +3 -3
  591. package/dist/web/inbound/monitor.js +1 -1
  592. package/dist/web/login-qr.js +1 -1
  593. package/dist/web/login.js +1 -1
  594. package/dist/web/media.d.ts +7 -2
  595. package/dist/web/media.js +15 -5
  596. package/dist/web/outbound.js +3 -3
  597. package/dist/web/session.js +2 -2
  598. package/dist/wizard/onboarding.finalize.d.ts +3 -1
  599. package/dist/wizard/onboarding.finalize.js +9 -10
  600. package/dist/wizard/onboarding.js +8 -5
  601. package/docs/.i18n/README.md +31 -0
  602. package/docs/.i18n/glossary.zh-CN.json +134 -0
  603. package/docs/.i18n/zh-CN.tm.jsonl +1371 -0
  604. package/docs/channels/bluebubbles.md +2 -2
  605. package/docs/channels/discord.md +35 -0
  606. package/docs/channels/grammy.md +1 -1
  607. package/docs/channels/msteams.md +2 -0
  608. package/docs/channels/telegram.md +5 -5
  609. package/docs/channels/twitch.md +7 -5
  610. package/docs/concepts/model-providers.md +12 -9
  611. package/docs/concepts/session-pruning.md +6 -6
  612. package/docs/docs.json +628 -301
  613. package/docs/gateway/configuration.md +1 -1
  614. package/docs/gateway/security/index.md +2 -1
  615. package/docs/gateway/troubleshooting.md +2 -2
  616. package/docs/help/faq.md +24 -11
  617. package/docs/help/troubleshooting.md +2 -2
  618. package/docs/index.md +2 -2
  619. package/docs/install/docker.md +85 -0
  620. package/docs/install/index.md +11 -7
  621. package/docs/install/installer.md +6 -6
  622. package/docs/install/uninstall.md +1 -1
  623. package/docs/install/updating.md +4 -4
  624. package/docs/nodes/index.md +22 -0
  625. package/docs/pi.md +20 -8
  626. package/docs/platforms/digitalocean.md +1 -1
  627. package/docs/platforms/exe-dev.md +3 -3
  628. package/docs/platforms/mac/release.md +7 -7
  629. package/docs/platforms/oracle.md +1 -1
  630. package/docs/platforms/raspberry-pi.md +1 -1
  631. package/docs/platforms/windows.md +2 -1
  632. package/docs/providers/anthropic.md +24 -4
  633. package/docs/providers/index.md +3 -3
  634. package/docs/providers/minimax.md +4 -4
  635. package/docs/providers/models.md +3 -3
  636. package/docs/providers/moonshot.md +4 -3
  637. package/docs/reference/RELEASING.md +3 -3
  638. package/docs/reference/templates/BOOTSTRAP.md +7 -0
  639. package/docs/reference/transcript-hygiene.md +23 -1
  640. package/docs/start/getting-started.md +1 -1
  641. package/docs/start/onboarding.md +10 -6
  642. package/docs/testing.md +1 -1
  643. package/docs/token-use.md +1 -1
  644. package/docs/tools/browser.md +14 -0
  645. package/docs/tools/chrome-extension.md +1 -0
  646. package/docs/tools/clawhub.md +56 -1
  647. package/docs/tools/exec-approvals.md +2 -0
  648. package/docs/tools/exec.md +7 -5
  649. package/docs/tools/skills.md +1 -1
  650. package/docs/tools/subagents.md +1 -0
  651. package/docs/web/control-ui.md +30 -0
  652. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  653. package/docs/zh-CN/automation/auth-monitoring.md +47 -0
  654. package/docs/zh-CN/automation/cron-jobs.md +434 -0
  655. package/docs/zh-CN/automation/cron-vs-heartbeat.md +286 -0
  656. package/docs/zh-CN/automation/gmail-pubsub.md +249 -0
  657. package/docs/zh-CN/automation/poll.md +75 -0
  658. package/docs/zh-CN/automation/webhook.md +163 -0
  659. package/docs/zh-CN/bedrock.md +170 -0
  660. package/docs/zh-CN/brave-search.md +48 -0
  661. package/docs/zh-CN/broadcast-groups.md +449 -0
  662. package/docs/zh-CN/channels/bluebubbles.md +271 -0
  663. package/docs/zh-CN/channels/discord.md +463 -0
  664. package/docs/zh-CN/channels/googlechat.md +257 -0
  665. package/docs/zh-CN/channels/grammy.md +38 -0
  666. package/docs/zh-CN/channels/imessage.md +302 -0
  667. package/docs/zh-CN/channels/index.md +50 -0
  668. package/docs/zh-CN/channels/line.md +180 -0
  669. package/docs/zh-CN/channels/location.md +63 -0
  670. package/docs/zh-CN/channels/matrix.md +221 -0
  671. package/docs/zh-CN/channels/mattermost.md +142 -0
  672. package/docs/zh-CN/channels/msteams.md +770 -0
  673. package/docs/zh-CN/channels/nextcloud-talk.md +141 -0
  674. package/docs/zh-CN/channels/nostr.md +240 -0
  675. package/docs/zh-CN/channels/signal.md +209 -0
  676. package/docs/zh-CN/channels/slack.md +530 -0
  677. package/docs/zh-CN/channels/telegram.md +755 -0
  678. package/docs/zh-CN/channels/tlon.md +138 -0
  679. package/docs/zh-CN/channels/troubleshooting.md +36 -0
  680. package/docs/zh-CN/channels/twitch.md +384 -0
  681. package/docs/zh-CN/channels/whatsapp.md +410 -0
  682. package/docs/zh-CN/channels/zalo.md +196 -0
  683. package/docs/zh-CN/channels/zalouser.md +147 -0
  684. package/docs/zh-CN/cli/acp.md +173 -0
  685. package/docs/zh-CN/cli/agent.md +31 -0
  686. package/docs/zh-CN/cli/agents.md +82 -0
  687. package/docs/zh-CN/cli/approvals.md +57 -0
  688. package/docs/zh-CN/cli/browser.md +114 -0
  689. package/docs/zh-CN/cli/channels.md +86 -0
  690. package/docs/zh-CN/cli/config.md +56 -0
  691. package/docs/zh-CN/cli/configure.md +40 -0
  692. package/docs/zh-CN/cli/cron.md +38 -0
  693. package/docs/zh-CN/cli/dashboard.md +23 -0
  694. package/docs/zh-CN/cli/devices.md +74 -0
  695. package/docs/zh-CN/cli/directory.md +70 -0
  696. package/docs/zh-CN/cli/dns.md +30 -0
  697. package/docs/zh-CN/cli/docs.md +22 -0
  698. package/docs/zh-CN/cli/doctor.md +48 -0
  699. package/docs/zh-CN/cli/gateway.md +202 -0
  700. package/docs/zh-CN/cli/health.md +28 -0
  701. package/docs/zh-CN/cli/hooks.md +310 -0
  702. package/docs/zh-CN/cli/index.md +1033 -0
  703. package/docs/zh-CN/cli/logs.md +31 -0
  704. package/docs/zh-CN/cli/memory.md +52 -0
  705. package/docs/zh-CN/cli/message.md +246 -0
  706. package/docs/zh-CN/cli/models.md +85 -0
  707. package/docs/zh-CN/cli/node.md +115 -0
  708. package/docs/zh-CN/cli/nodes.md +79 -0
  709. package/docs/zh-CN/cli/onboard.md +36 -0
  710. package/docs/zh-CN/cli/pairing.md +28 -0
  711. package/docs/zh-CN/cli/plugins.md +66 -0
  712. package/docs/zh-CN/cli/reset.md +24 -0
  713. package/docs/zh-CN/cli/sandbox.md +158 -0
  714. package/docs/zh-CN/cli/security.md +33 -0
  715. package/docs/zh-CN/cli/sessions.md +23 -0
  716. package/docs/zh-CN/cli/setup.md +36 -0
  717. package/docs/zh-CN/cli/skills.md +33 -0
  718. package/docs/zh-CN/cli/status.md +33 -0
  719. package/docs/zh-CN/cli/system.md +63 -0
  720. package/docs/zh-CN/cli/tui.md +30 -0
  721. package/docs/zh-CN/cli/uninstall.md +24 -0
  722. package/docs/zh-CN/cli/update.md +101 -0
  723. package/docs/zh-CN/cli/voicecall.md +41 -0
  724. package/docs/zh-CN/cli/webhooks.md +32 -0
  725. package/docs/zh-CN/concepts/agent-loop.md +150 -0
  726. package/docs/zh-CN/concepts/agent-workspace.md +214 -0
  727. package/docs/zh-CN/concepts/agent.md +114 -0
  728. package/docs/zh-CN/concepts/architecture.md +123 -0
  729. package/docs/zh-CN/concepts/channel-routing.md +117 -0
  730. package/docs/zh-CN/concepts/compaction.md +67 -0
  731. package/docs/zh-CN/concepts/context.md +168 -0
  732. package/docs/zh-CN/concepts/group-messages.md +91 -0
  733. package/docs/zh-CN/concepts/groups.md +380 -0
  734. package/docs/zh-CN/concepts/markdown-formatting.md +117 -0
  735. package/docs/zh-CN/concepts/memory.md +409 -0
  736. package/docs/zh-CN/concepts/messages.md +141 -0
  737. package/docs/zh-CN/concepts/model-failover.md +156 -0
  738. package/docs/zh-CN/concepts/model-providers.md +317 -0
  739. package/docs/zh-CN/concepts/models.md +196 -0
  740. package/docs/zh-CN/concepts/multi-agent.md +369 -0
  741. package/docs/zh-CN/concepts/oauth.md +151 -0
  742. package/docs/zh-CN/concepts/presence.md +99 -0
  743. package/docs/zh-CN/concepts/queue.md +94 -0
  744. package/docs/zh-CN/concepts/retry.md +76 -0
  745. package/docs/zh-CN/concepts/session-pruning.md +129 -0
  746. package/docs/zh-CN/concepts/session-tool.md +200 -0
  747. package/docs/zh-CN/concepts/session.md +166 -0
  748. package/docs/zh-CN/concepts/sessions.md +17 -0
  749. package/docs/zh-CN/concepts/streaming.md +133 -0
  750. package/docs/zh-CN/concepts/system-prompt.md +101 -0
  751. package/docs/zh-CN/concepts/timezone.md +96 -0
  752. package/docs/zh-CN/concepts/typebox.md +284 -0
  753. package/docs/zh-CN/concepts/typing-indicators.md +74 -0
  754. package/docs/zh-CN/concepts/usage-tracking.md +42 -0
  755. package/docs/zh-CN/date-time.md +129 -0
  756. package/docs/zh-CN/debug/node-issue.md +90 -0
  757. package/docs/zh-CN/debugging.md +160 -0
  758. package/docs/zh-CN/diagnostics/flags.md +98 -0
  759. package/docs/zh-CN/environment.md +88 -0
  760. package/docs/zh-CN/experiments/onboarding-config-protocol.md +47 -0
  761. package/docs/zh-CN/experiments/plans/cron-add-hardening.md +70 -0
  762. package/docs/zh-CN/experiments/plans/group-policy-hardening.md +45 -0
  763. package/docs/zh-CN/experiments/plans/openresponses-gateway.md +121 -0
  764. package/docs/zh-CN/experiments/proposals/model-config.md +42 -0
  765. package/docs/zh-CN/experiments/research/memory.md +235 -0
  766. package/docs/zh-CN/gateway/authentication.md +142 -0
  767. package/docs/zh-CN/gateway/background-process.md +100 -0
  768. package/docs/zh-CN/gateway/bonjour.md +160 -0
  769. package/docs/zh-CN/gateway/bridge-protocol.md +84 -0
  770. package/docs/zh-CN/gateway/cli-backends.md +214 -0
  771. package/docs/zh-CN/gateway/configuration-examples.md +587 -0
  772. package/docs/zh-CN/gateway/configuration.md +3331 -0
  773. package/docs/zh-CN/gateway/discovery.md +123 -0
  774. package/docs/zh-CN/gateway/doctor.md +236 -0
  775. package/docs/zh-CN/gateway/gateway-lock.md +41 -0
  776. package/docs/zh-CN/gateway/health.md +42 -0
  777. package/docs/zh-CN/gateway/heartbeat.md +274 -0
  778. package/docs/zh-CN/gateway/index.md +328 -0
  779. package/docs/zh-CN/gateway/local-models.md +157 -0
  780. package/docs/zh-CN/gateway/logging.md +116 -0
  781. package/docs/zh-CN/gateway/multiple-gateways.md +119 -0
  782. package/docs/zh-CN/gateway/openai-http-api.md +125 -0
  783. package/docs/zh-CN/gateway/openresponses-http-api.md +319 -0
  784. package/docs/zh-CN/gateway/pairing.md +99 -0
  785. package/docs/zh-CN/gateway/protocol.md +211 -0
  786. package/docs/zh-CN/gateway/remote-gateway-readme.md +164 -0
  787. package/docs/zh-CN/gateway/remote.md +133 -0
  788. package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +135 -0
  789. package/docs/zh-CN/gateway/sandboxing.md +196 -0
  790. package/docs/zh-CN/gateway/security/formal-verification.md +169 -0
  791. package/docs/zh-CN/gateway/security/index.md +777 -0
  792. package/docs/zh-CN/gateway/tailscale.md +120 -0
  793. package/docs/zh-CN/gateway/tools-invoke-http-api.md +92 -0
  794. package/docs/zh-CN/gateway/troubleshooting.md +773 -0
  795. package/docs/zh-CN/help/faq.md +2628 -0
  796. package/docs/zh-CN/help/index.md +28 -0
  797. package/docs/zh-CN/help/troubleshooting.md +104 -0
  798. package/docs/zh-CN/hooks/soul-evil.md +72 -0
  799. package/docs/zh-CN/hooks.md +919 -0
  800. package/docs/zh-CN/index.md +268 -0
  801. package/docs/zh-CN/install/ansible.md +215 -0
  802. package/docs/zh-CN/install/bun.md +65 -0
  803. package/docs/zh-CN/install/development-channels.md +79 -0
  804. package/docs/zh-CN/install/docker.md +461 -0
  805. package/docs/zh-CN/install/index.md +193 -0
  806. package/docs/zh-CN/install/installer.md +128 -0
  807. package/docs/zh-CN/install/migrating.md +199 -0
  808. package/docs/zh-CN/install/nix.md +103 -0
  809. package/docs/zh-CN/install/node.md +85 -0
  810. package/docs/zh-CN/install/uninstall.md +135 -0
  811. package/docs/zh-CN/install/updating.md +233 -0
  812. package/docs/zh-CN/logging.md +328 -0
  813. package/docs/zh-CN/multi-agent-sandbox-tools.md +399 -0
  814. package/docs/zh-CN/network.md +59 -0
  815. package/docs/zh-CN/nodes/audio.md +120 -0
  816. package/docs/zh-CN/nodes/camera.md +162 -0
  817. package/docs/zh-CN/nodes/images.md +79 -0
  818. package/docs/zh-CN/nodes/index.md +316 -0
  819. package/docs/zh-CN/nodes/location-command.md +120 -0
  820. package/docs/zh-CN/nodes/media-understanding.md +381 -0
  821. package/docs/zh-CN/nodes/talk.md +97 -0
  822. package/docs/zh-CN/nodes/voicewake.md +72 -0
  823. package/docs/zh-CN/northflank.mdx +60 -0
  824. package/docs/zh-CN/perplexity.md +84 -0
  825. package/docs/zh-CN/pi-dev.md +77 -0
  826. package/docs/zh-CN/pi.md +607 -0
  827. package/docs/zh-CN/platforms/android.md +155 -0
  828. package/docs/zh-CN/platforms/digitalocean.md +269 -0
  829. package/docs/zh-CN/platforms/exe-dev.md +127 -0
  830. package/docs/zh-CN/platforms/fly.md +490 -0
  831. package/docs/zh-CN/platforms/gcp.md +510 -0
  832. package/docs/zh-CN/platforms/hetzner.md +337 -0
  833. package/docs/zh-CN/platforms/index.md +60 -0
  834. package/docs/zh-CN/platforms/ios.md +114 -0
  835. package/docs/zh-CN/platforms/linux.md +99 -0
  836. package/docs/zh-CN/platforms/mac/bundled-gateway.md +77 -0
  837. package/docs/zh-CN/platforms/mac/canvas.md +127 -0
  838. package/docs/zh-CN/platforms/mac/child-process.md +62 -0
  839. package/docs/zh-CN/platforms/mac/dev-setup.md +109 -0
  840. package/docs/zh-CN/platforms/mac/health.md +41 -0
  841. package/docs/zh-CN/platforms/mac/icon.md +38 -0
  842. package/docs/zh-CN/platforms/mac/logging.md +64 -0
  843. package/docs/zh-CN/platforms/mac/menu-bar.md +88 -0
  844. package/docs/zh-CN/platforms/mac/peekaboo.md +62 -0
  845. package/docs/zh-CN/platforms/mac/permissions.md +46 -0
  846. package/docs/zh-CN/platforms/mac/release.md +92 -0
  847. package/docs/zh-CN/platforms/mac/remote.md +90 -0
  848. package/docs/zh-CN/platforms/mac/signing.md +54 -0
  849. package/docs/zh-CN/platforms/mac/skills.md +40 -0
  850. package/docs/zh-CN/platforms/mac/voice-overlay.md +67 -0
  851. package/docs/zh-CN/platforms/mac/voicewake.md +74 -0
  852. package/docs/zh-CN/platforms/mac/webchat.md +43 -0
  853. package/docs/zh-CN/platforms/mac/xpc.md +68 -0
  854. package/docs/zh-CN/platforms/macos-vm.md +288 -0
  855. package/docs/zh-CN/platforms/macos.md +194 -0
  856. package/docs/zh-CN/platforms/oracle.md +310 -0
  857. package/docs/zh-CN/platforms/raspberry-pi.md +365 -0
  858. package/docs/zh-CN/platforms/windows.md +156 -0
  859. package/docs/zh-CN/plugin.md +639 -0
  860. package/docs/zh-CN/plugins/agent-tools.md +99 -0
  861. package/docs/zh-CN/plugins/manifest.md +68 -0
  862. package/docs/zh-CN/plugins/voice-call.md +250 -0
  863. package/docs/zh-CN/plugins/zalouser.md +88 -0
  864. package/docs/zh-CN/prose.md +141 -0
  865. package/docs/zh-CN/providers/anthropic.md +158 -0
  866. package/docs/zh-CN/providers/claude-max-api-proxy.md +155 -0
  867. package/docs/zh-CN/providers/deepgram.md +97 -0
  868. package/docs/zh-CN/providers/github-copilot.md +67 -0
  869. package/docs/zh-CN/providers/glm.md +39 -0
  870. package/docs/zh-CN/providers/index.md +67 -0
  871. package/docs/zh-CN/providers/minimax.md +206 -0
  872. package/docs/zh-CN/providers/models.md +55 -0
  873. package/docs/zh-CN/providers/moonshot.md +145 -0
  874. package/docs/zh-CN/providers/ollama.md +230 -0
  875. package/docs/zh-CN/providers/openai.md +68 -0
  876. package/docs/zh-CN/providers/opencode.md +41 -0
  877. package/docs/zh-CN/providers/openrouter.md +43 -0
  878. package/docs/zh-CN/providers/qwen.md +55 -0
  879. package/docs/zh-CN/providers/synthetic.md +102 -0
  880. package/docs/zh-CN/providers/venice.md +274 -0
  881. package/docs/zh-CN/providers/vercel-ai-gateway.md +57 -0
  882. package/docs/zh-CN/providers/xiaomi.md +68 -0
  883. package/docs/zh-CN/providers/zai.md +41 -0
  884. package/docs/zh-CN/railway.mdx +106 -0
  885. package/docs/zh-CN/refactor/clawnet.md +424 -0
  886. package/docs/zh-CN/refactor/exec-host.md +323 -0
  887. package/docs/zh-CN/refactor/outbound-session-mirroring.md +92 -0
  888. package/docs/zh-CN/refactor/plugin-sdk.md +221 -0
  889. package/docs/zh-CN/refactor/strict-config.md +100 -0
  890. package/docs/zh-CN/reference/AGENTS.default.md +131 -0
  891. package/docs/zh-CN/reference/RELEASING.md +123 -0
  892. package/docs/zh-CN/reference/api-usage-costs.md +136 -0
  893. package/docs/zh-CN/reference/device-models.md +54 -0
  894. package/docs/zh-CN/reference/rpc.md +48 -0
  895. package/docs/zh-CN/reference/session-management-compaction.md +288 -0
  896. package/docs/zh-CN/reference/templates/AGENTS.dev.md +89 -0
  897. package/docs/zh-CN/reference/templates/AGENTS.md +225 -0
  898. package/docs/zh-CN/reference/templates/BOOT.md +17 -0
  899. package/docs/zh-CN/reference/templates/BOOTSTRAP.md +68 -0
  900. package/docs/zh-CN/reference/templates/HEARTBEAT.md +18 -0
  901. package/docs/zh-CN/reference/templates/IDENTITY.dev.md +54 -0
  902. package/docs/zh-CN/reference/templates/IDENTITY.md +35 -0
  903. package/docs/zh-CN/reference/templates/SOUL.dev.md +83 -0
  904. package/docs/zh-CN/reference/templates/SOUL.md +49 -0
  905. package/docs/zh-CN/reference/templates/TOOLS.dev.md +31 -0
  906. package/docs/zh-CN/reference/templates/TOOLS.md +53 -0
  907. package/docs/zh-CN/reference/templates/USER.dev.md +25 -0
  908. package/docs/zh-CN/reference/templates/USER.md +30 -0
  909. package/docs/zh-CN/reference/test.md +57 -0
  910. package/docs/zh-CN/reference/transcript-hygiene.md +109 -0
  911. package/docs/zh-CN/render.mdx +169 -0
  912. package/docs/zh-CN/scripts.md +40 -0
  913. package/docs/zh-CN/security/formal-verification.md +169 -0
  914. package/docs/zh-CN/start/getting-started.md +210 -0
  915. package/docs/zh-CN/start/hubs.md +191 -0
  916. package/docs/zh-CN/start/lore.md +226 -0
  917. package/docs/zh-CN/start/onboarding.md +105 -0
  918. package/docs/zh-CN/start/openclaw.md +248 -0
  919. package/docs/zh-CN/start/pairing.md +90 -0
  920. package/docs/zh-CN/start/setup.md +154 -0
  921. package/docs/zh-CN/start/showcase.md +423 -0
  922. package/docs/zh-CN/start/wizard.md +331 -0
  923. package/docs/zh-CN/testing.md +375 -0
  924. package/docs/zh-CN/token-use.md +105 -0
  925. package/docs/zh-CN/tools/agent-send.md +60 -0
  926. package/docs/zh-CN/tools/apply-patch.md +57 -0
  927. package/docs/zh-CN/tools/browser-linux-troubleshooting.md +146 -0
  928. package/docs/zh-CN/tools/browser-login.md +75 -0
  929. package/docs/zh-CN/tools/browser.md +542 -0
  930. package/docs/zh-CN/tools/chrome-extension.md +185 -0
  931. package/docs/zh-CN/tools/clawhub.md +209 -0
  932. package/docs/zh-CN/tools/creating-skills.md +61 -0
  933. package/docs/zh-CN/tools/elevated.md +64 -0
  934. package/docs/zh-CN/tools/exec-approvals.md +233 -0
  935. package/docs/zh-CN/tools/exec.md +168 -0
  936. package/docs/zh-CN/tools/firecrawl.md +65 -0
  937. package/docs/zh-CN/tools/index.md +513 -0
  938. package/docs/zh-CN/tools/llm-task.md +117 -0
  939. package/docs/zh-CN/tools/lobster.md +348 -0
  940. package/docs/zh-CN/tools/reactions.md +29 -0
  941. package/docs/zh-CN/tools/skills-config.md +78 -0
  942. package/docs/zh-CN/tools/skills.md +284 -0
  943. package/docs/zh-CN/tools/slash-commands.md +205 -0
  944. package/docs/zh-CN/tools/subagents.md +156 -0
  945. package/docs/zh-CN/tools/thinking.md +80 -0
  946. package/docs/zh-CN/tools/web.md +264 -0
  947. package/docs/zh-CN/tts.md +380 -0
  948. package/docs/zh-CN/tui.md +166 -0
  949. package/docs/zh-CN/vps.md +47 -0
  950. package/docs/zh-CN/web/control-ui.md +201 -0
  951. package/docs/zh-CN/web/dashboard.md +49 -0
  952. package/docs/zh-CN/web/index.md +118 -0
  953. package/docs/zh-CN/web/webchat.md +56 -0
  954. package/extensions/bluebubbles/index.ts +0 -1
  955. package/extensions/bluebubbles/node_modules/.bin/moltbot +21 -0
  956. package/extensions/bluebubbles/node_modules/.bin/moltbot.CMD +12 -0
  957. package/extensions/{discord/node_modules/.bin/claw.ps1 → bluebubbles/node_modules/.bin/moltbot.ps1} +2 -2
  958. package/extensions/bluebubbles/node_modules/.bin/openclaw +21 -0
  959. package/extensions/bluebubbles/node_modules/.bin/openclaw.CMD +12 -0
  960. package/extensions/{copilot-proxy/node_modules/.bin/claw.ps1 → bluebubbles/node_modules/.bin/openclaw.ps1} +2 -2
  961. package/extensions/bluebubbles/node_modules/.bin/pigbot +21 -0
  962. package/extensions/bluebubbles/node_modules/.bin/pigbot.CMD +12 -0
  963. package/extensions/bluebubbles/node_modules/.bin/{claw.ps1 → pigbot.ps1} +2 -2
  964. package/extensions/bluebubbles/package.json +1 -1
  965. package/extensions/bluebubbles/src/actions.test.ts +1 -2
  966. package/extensions/bluebubbles/src/actions.ts +6 -7
  967. package/extensions/bluebubbles/src/attachments.test.ts +1 -2
  968. package/extensions/bluebubbles/src/attachments.ts +1 -1
  969. package/extensions/bluebubbles/src/channel.ts +4 -5
  970. package/extensions/bluebubbles/src/chat.test.ts +0 -1
  971. package/extensions/bluebubbles/src/chat.ts +1 -1
  972. package/extensions/bluebubbles/src/media-send.ts +0 -2
  973. package/extensions/bluebubbles/src/monitor.test.ts +5 -4
  974. package/extensions/bluebubbles/src/monitor.ts +50 -30
  975. package/extensions/bluebubbles/src/onboarding.ts +1 -1
  976. package/extensions/bluebubbles/src/reactions.test.ts +0 -1
  977. package/extensions/bluebubbles/src/reactions.ts +1 -1
  978. package/extensions/bluebubbles/src/send.test.ts +1 -2
  979. package/extensions/bluebubbles/src/send.ts +1 -2
  980. package/extensions/bluebubbles/src/targets.test.ts +0 -1
  981. package/extensions/copilot-proxy/node_modules/.bin/moltbot +21 -0
  982. package/extensions/copilot-proxy/node_modules/.bin/moltbot.CMD +12 -0
  983. package/extensions/{diagnostics-otel/node_modules/.bin/claw.ps1 → copilot-proxy/node_modules/.bin/moltbot.ps1} +2 -2
  984. package/extensions/copilot-proxy/node_modules/.bin/openclaw +21 -0
  985. package/extensions/copilot-proxy/node_modules/.bin/openclaw.CMD +12 -0
  986. package/extensions/copilot-proxy/node_modules/.bin/openclaw.ps1 +41 -0
  987. package/extensions/copilot-proxy/node_modules/.bin/pigbot +21 -0
  988. package/extensions/copilot-proxy/node_modules/.bin/pigbot.CMD +12 -0
  989. package/extensions/copilot-proxy/node_modules/.bin/pigbot.ps1 +41 -0
  990. package/extensions/copilot-proxy/package.json +1 -1
  991. package/extensions/diagnostics-otel/index.ts +0 -1
  992. package/extensions/diagnostics-otel/node_modules/.bin/moltbot +21 -0
  993. package/extensions/diagnostics-otel/node_modules/.bin/moltbot.CMD +12 -0
  994. package/extensions/diagnostics-otel/node_modules/.bin/moltbot.ps1 +41 -0
  995. package/extensions/diagnostics-otel/node_modules/.bin/openclaw +21 -0
  996. package/extensions/diagnostics-otel/node_modules/.bin/openclaw.CMD +12 -0
  997. package/extensions/diagnostics-otel/node_modules/.bin/openclaw.ps1 +41 -0
  998. package/extensions/diagnostics-otel/node_modules/.bin/pigbot +21 -0
  999. package/extensions/diagnostics-otel/node_modules/.bin/pigbot.CMD +12 -0
  1000. package/extensions/diagnostics-otel/node_modules/.bin/pigbot.ps1 +41 -0
  1001. package/extensions/diagnostics-otel/package.json +1 -1
  1002. package/extensions/diagnostics-otel/src/service.test.ts +1 -1
  1003. package/extensions/diagnostics-otel/src/service.ts +2 -3
  1004. package/extensions/discord/index.ts +0 -1
  1005. package/extensions/discord/node_modules/.bin/moltbot +21 -0
  1006. package/extensions/discord/node_modules/.bin/moltbot.CMD +12 -0
  1007. package/extensions/discord/node_modules/.bin/moltbot.ps1 +41 -0
  1008. package/extensions/discord/node_modules/.bin/openclaw +21 -0
  1009. package/extensions/discord/node_modules/.bin/openclaw.CMD +12 -0
  1010. package/extensions/discord/node_modules/.bin/openclaw.ps1 +41 -0
  1011. package/extensions/discord/node_modules/.bin/pigbot +21 -0
  1012. package/extensions/discord/node_modules/.bin/pigbot.CMD +12 -0
  1013. package/extensions/discord/node_modules/.bin/pigbot.ps1 +41 -0
  1014. package/extensions/discord/package.json +1 -1
  1015. package/extensions/discord/src/channel.ts +0 -1
  1016. package/extensions/google-antigravity-auth/node_modules/.bin/moltbot +21 -0
  1017. package/extensions/google-antigravity-auth/node_modules/.bin/moltbot.CMD +12 -0
  1018. package/extensions/google-antigravity-auth/node_modules/.bin/moltbot.ps1 +41 -0
  1019. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw +21 -0
  1020. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.CMD +12 -0
  1021. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1022. package/extensions/google-antigravity-auth/node_modules/.bin/pigbot +21 -0
  1023. package/extensions/google-antigravity-auth/node_modules/.bin/pigbot.CMD +12 -0
  1024. package/extensions/google-antigravity-auth/node_modules/.bin/pigbot.ps1 +41 -0
  1025. package/extensions/google-antigravity-auth/package.json +1 -1
  1026. package/extensions/google-gemini-cli-auth/index.ts +0 -1
  1027. package/extensions/google-gemini-cli-auth/node_modules/.bin/moltbot +21 -0
  1028. package/extensions/google-gemini-cli-auth/node_modules/.bin/moltbot.CMD +12 -0
  1029. package/extensions/google-gemini-cli-auth/node_modules/.bin/moltbot.ps1 +41 -0
  1030. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw +21 -0
  1031. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.CMD +12 -0
  1032. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1033. package/extensions/google-gemini-cli-auth/node_modules/.bin/pigbot +21 -0
  1034. package/extensions/google-gemini-cli-auth/node_modules/.bin/pigbot.CMD +12 -0
  1035. package/extensions/google-gemini-cli-auth/node_modules/.bin/pigbot.ps1 +41 -0
  1036. package/extensions/google-gemini-cli-auth/oauth.test.ts +1 -1
  1037. package/extensions/google-gemini-cli-auth/package.json +1 -1
  1038. package/extensions/googlechat/index.ts +0 -1
  1039. package/extensions/googlechat/node_modules/.bin/moltbot +21 -0
  1040. package/extensions/googlechat/node_modules/.bin/moltbot.CMD +12 -0
  1041. package/extensions/googlechat/node_modules/.bin/moltbot.ps1 +41 -0
  1042. package/extensions/googlechat/node_modules/.bin/openclaw +21 -0
  1043. package/extensions/googlechat/node_modules/.bin/openclaw.CMD +12 -0
  1044. package/extensions/googlechat/node_modules/.bin/openclaw.ps1 +41 -0
  1045. package/extensions/googlechat/node_modules/.bin/pigbot +21 -0
  1046. package/extensions/googlechat/node_modules/.bin/pigbot.CMD +12 -0
  1047. package/extensions/googlechat/node_modules/.bin/pigbot.ps1 +41 -0
  1048. package/extensions/googlechat/package.json +1 -1
  1049. package/extensions/googlechat/src/accounts.ts +1 -2
  1050. package/extensions/googlechat/src/actions.ts +0 -1
  1051. package/extensions/googlechat/src/api.test.ts +0 -1
  1052. package/extensions/googlechat/src/api.ts +1 -2
  1053. package/extensions/googlechat/src/auth.ts +0 -1
  1054. package/extensions/googlechat/src/channel.ts +1 -2
  1055. package/extensions/googlechat/src/monitor.test.ts +0 -1
  1056. package/extensions/googlechat/src/monitor.ts +8 -10
  1057. package/extensions/googlechat/src/onboarding.ts +0 -1
  1058. package/extensions/googlechat/src/targets.test.ts +0 -1
  1059. package/extensions/imessage/index.ts +0 -1
  1060. package/extensions/imessage/node_modules/.bin/moltbot +21 -0
  1061. package/extensions/imessage/node_modules/.bin/moltbot.CMD +12 -0
  1062. package/extensions/imessage/node_modules/.bin/moltbot.ps1 +41 -0
  1063. package/extensions/imessage/node_modules/.bin/openclaw +21 -0
  1064. package/extensions/imessage/node_modules/.bin/openclaw.CMD +12 -0
  1065. package/extensions/imessage/node_modules/.bin/openclaw.ps1 +41 -0
  1066. package/extensions/imessage/node_modules/.bin/pigbot +21 -0
  1067. package/extensions/imessage/node_modules/.bin/pigbot.CMD +12 -0
  1068. package/extensions/imessage/node_modules/.bin/pigbot.ps1 +41 -0
  1069. package/extensions/imessage/package.json +1 -1
  1070. package/extensions/imessage/src/channel.ts +0 -1
  1071. package/extensions/line/index.ts +1 -2
  1072. package/extensions/line/node_modules/.bin/moltbot +21 -0
  1073. package/extensions/line/node_modules/.bin/moltbot.CMD +12 -0
  1074. package/extensions/line/node_modules/.bin/moltbot.ps1 +41 -0
  1075. package/extensions/line/node_modules/.bin/openclaw +21 -0
  1076. package/extensions/line/node_modules/.bin/openclaw.CMD +12 -0
  1077. package/extensions/line/node_modules/.bin/openclaw.ps1 +41 -0
  1078. package/extensions/line/node_modules/.bin/pigbot +21 -0
  1079. package/extensions/line/node_modules/.bin/pigbot.CMD +12 -0
  1080. package/extensions/line/node_modules/.bin/pigbot.ps1 +41 -0
  1081. package/extensions/line/package.json +1 -1
  1082. package/extensions/line/src/channel.logout.test.ts +3 -1
  1083. package/extensions/line/src/channel.sendPayload.test.ts +1 -1
  1084. package/extensions/line/src/channel.ts +4 -6
  1085. package/extensions/llm-task/index.ts +0 -1
  1086. package/extensions/llm-task/node_modules/.bin/moltbot +21 -0
  1087. package/extensions/llm-task/node_modules/.bin/moltbot.CMD +12 -0
  1088. package/extensions/llm-task/node_modules/.bin/moltbot.ps1 +41 -0
  1089. package/extensions/llm-task/node_modules/.bin/openclaw +21 -0
  1090. package/extensions/llm-task/node_modules/.bin/openclaw.CMD +12 -0
  1091. package/extensions/llm-task/node_modules/.bin/openclaw.ps1 +41 -0
  1092. package/extensions/llm-task/node_modules/.bin/pigbot +21 -0
  1093. package/extensions/llm-task/node_modules/.bin/pigbot.CMD +12 -0
  1094. package/extensions/llm-task/node_modules/.bin/pigbot.ps1 +41 -0
  1095. package/extensions/llm-task/package.json +1 -1
  1096. package/extensions/llm-task/src/llm-task-tool.test.ts +14 -0
  1097. package/extensions/llm-task/src/llm-task-tool.ts +11 -6
  1098. package/extensions/lobster/index.ts +0 -1
  1099. package/extensions/lobster/node_modules/.bin/moltbot +21 -0
  1100. package/extensions/lobster/node_modules/.bin/moltbot.CMD +12 -0
  1101. package/extensions/lobster/node_modules/.bin/moltbot.ps1 +41 -0
  1102. package/extensions/lobster/node_modules/.bin/openclaw +21 -0
  1103. package/extensions/lobster/node_modules/.bin/openclaw.CMD +12 -0
  1104. package/extensions/lobster/node_modules/.bin/openclaw.ps1 +41 -0
  1105. package/extensions/lobster/node_modules/.bin/pigbot +21 -0
  1106. package/extensions/lobster/node_modules/.bin/pigbot.CMD +12 -0
  1107. package/extensions/lobster/node_modules/.bin/pigbot.ps1 +41 -0
  1108. package/extensions/lobster/package.json +1 -1
  1109. package/extensions/lobster/src/lobster-tool.test.ts +3 -4
  1110. package/extensions/lobster/src/lobster-tool.ts +0 -1
  1111. package/extensions/matrix/CHANGELOG.md +12 -0
  1112. package/extensions/matrix/index.ts +0 -1
  1113. package/extensions/matrix/node_modules/.bin/markdown-it +2 -2
  1114. package/extensions/matrix/node_modules/.bin/markdown-it.CMD +2 -2
  1115. package/extensions/matrix/node_modules/.bin/markdown-it.ps1 +2 -2
  1116. package/extensions/matrix/node_modules/.bin/moltbot +21 -0
  1117. package/extensions/matrix/node_modules/.bin/moltbot.CMD +12 -0
  1118. package/extensions/matrix/node_modules/.bin/moltbot.ps1 +41 -0
  1119. package/extensions/matrix/node_modules/.bin/openclaw +21 -0
  1120. package/extensions/matrix/node_modules/.bin/openclaw.CMD +12 -0
  1121. package/extensions/matrix/node_modules/.bin/openclaw.ps1 +41 -0
  1122. package/extensions/matrix/node_modules/.bin/pigbot +21 -0
  1123. package/extensions/matrix/node_modules/.bin/pigbot.CMD +12 -0
  1124. package/extensions/matrix/node_modules/.bin/pigbot.ps1 +41 -0
  1125. package/extensions/matrix/package.json +2 -2
  1126. package/extensions/matrix/src/actions.ts +1 -1
  1127. package/extensions/matrix/src/channel.directory.test.ts +1 -3
  1128. package/extensions/matrix/src/channel.ts +2 -3
  1129. package/extensions/matrix/src/directory-live.ts +0 -1
  1130. package/extensions/matrix/src/group-mentions.ts +1 -2
  1131. package/extensions/matrix/src/matrix/accounts.test.ts +0 -1
  1132. package/extensions/matrix/src/matrix/actions/client.ts +2 -2
  1133. package/extensions/matrix/src/matrix/actions/messages.ts +3 -3
  1134. package/extensions/matrix/src/matrix/actions/pins.ts +3 -3
  1135. package/extensions/matrix/src/matrix/actions/reactions.ts +2 -2
  1136. package/extensions/matrix/src/matrix/actions/room.ts +2 -2
  1137. package/extensions/matrix/src/matrix/actions/summary.ts +0 -1
  1138. package/extensions/matrix/src/matrix/client/config.ts +1 -2
  1139. package/extensions/matrix/src/matrix/client/create-client.ts +2 -4
  1140. package/extensions/matrix/src/matrix/client/shared.ts +3 -4
  1141. package/extensions/matrix/src/matrix/client/storage.ts +1 -2
  1142. package/extensions/matrix/src/matrix/client.test.ts +0 -1
  1143. package/extensions/matrix/src/matrix/credentials.ts +0 -1
  1144. package/extensions/matrix/src/matrix/deps.ts +2 -3
  1145. package/extensions/matrix/src/matrix/format.test.ts +0 -1
  1146. package/extensions/matrix/src/matrix/monitor/auto-join.ts +1 -2
  1147. package/extensions/matrix/src/matrix/monitor/events.ts +0 -1
  1148. package/extensions/matrix/src/matrix/monitor/handler.ts +2 -3
  1149. package/extensions/matrix/src/matrix/monitor/index.ts +2 -3
  1150. package/extensions/matrix/src/matrix/monitor/location.ts +0 -1
  1151. package/extensions/matrix/src/matrix/monitor/media.test.ts +1 -2
  1152. package/extensions/matrix/src/matrix/monitor/media.ts +0 -1
  1153. package/extensions/matrix/src/matrix/monitor/replies.ts +1 -2
  1154. package/extensions/matrix/src/matrix/monitor/rooms.ts +1 -1
  1155. package/extensions/matrix/src/matrix/poll-types.test.ts +0 -1
  1156. package/extensions/matrix/src/matrix/send/client.ts +1 -2
  1157. package/extensions/matrix/src/matrix/send/formatting.ts +1 -1
  1158. package/extensions/matrix/src/matrix/send/media.ts +1 -2
  1159. package/extensions/matrix/src/matrix/send/targets.test.ts +1 -2
  1160. package/extensions/matrix/src/matrix/send/targets.ts +0 -1
  1161. package/extensions/matrix/src/matrix/send.test.ts +1 -2
  1162. package/extensions/matrix/src/matrix/send.ts +0 -1
  1163. package/extensions/matrix/src/onboarding.ts +1 -1
  1164. package/extensions/matrix/src/outbound.ts +1 -2
  1165. package/extensions/matrix/src/resolve-targets.ts +0 -1
  1166. package/extensions/matrix/src/tool-actions.ts +7 -8
  1167. package/extensions/mattermost/index.ts +0 -1
  1168. package/extensions/mattermost/node_modules/.bin/moltbot +21 -0
  1169. package/extensions/mattermost/node_modules/.bin/moltbot.CMD +12 -0
  1170. package/extensions/mattermost/node_modules/.bin/moltbot.ps1 +41 -0
  1171. package/extensions/mattermost/node_modules/.bin/openclaw +21 -0
  1172. package/extensions/mattermost/node_modules/.bin/openclaw.CMD +12 -0
  1173. package/extensions/mattermost/node_modules/.bin/openclaw.ps1 +41 -0
  1174. package/extensions/mattermost/node_modules/.bin/pigbot +21 -0
  1175. package/extensions/mattermost/node_modules/.bin/pigbot.CMD +12 -0
  1176. package/extensions/mattermost/node_modules/.bin/pigbot.ps1 +41 -0
  1177. package/extensions/mattermost/package.json +1 -1
  1178. package/extensions/mattermost/src/channel.test.ts +0 -1
  1179. package/extensions/mattermost/src/channel.ts +2 -3
  1180. package/extensions/mattermost/src/config-schema.ts +1 -2
  1181. package/extensions/mattermost/src/group-mentions.ts +0 -1
  1182. package/extensions/mattermost/src/mattermost/accounts.ts +0 -1
  1183. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +2 -4
  1184. package/extensions/mattermost/src/mattermost/monitor.ts +1 -3
  1185. package/extensions/mattermost/src/onboarding.ts +0 -1
  1186. package/extensions/memory-core/node_modules/.bin/moltbot +21 -0
  1187. package/extensions/memory-core/node_modules/.bin/moltbot.CMD +12 -0
  1188. package/extensions/memory-core/node_modules/.bin/moltbot.ps1 +41 -0
  1189. package/extensions/memory-core/node_modules/.bin/openclaw +21 -0
  1190. package/extensions/memory-core/node_modules/.bin/openclaw.CMD +12 -0
  1191. package/extensions/memory-core/node_modules/.bin/openclaw.ps1 +41 -0
  1192. package/extensions/memory-core/node_modules/.bin/pigbot +21 -0
  1193. package/extensions/memory-core/node_modules/.bin/pigbot.CMD +12 -0
  1194. package/extensions/memory-core/node_modules/.bin/pigbot.ps1 +41 -0
  1195. package/extensions/memory-core/package.json +1 -1
  1196. package/extensions/memory-lancedb/index.test.ts +11 -2
  1197. package/extensions/memory-lancedb/index.ts +3 -4
  1198. package/extensions/memory-lancedb/node_modules/.bin/moltbot +21 -0
  1199. package/extensions/memory-lancedb/node_modules/.bin/moltbot.CMD +12 -0
  1200. package/extensions/memory-lancedb/node_modules/.bin/moltbot.ps1 +41 -0
  1201. package/extensions/memory-lancedb/node_modules/.bin/openai +2 -2
  1202. package/extensions/memory-lancedb/node_modules/.bin/openai.CMD +2 -2
  1203. package/extensions/memory-lancedb/node_modules/.bin/openai.ps1 +2 -2
  1204. package/extensions/memory-lancedb/node_modules/.bin/openclaw +21 -0
  1205. package/extensions/memory-lancedb/node_modules/.bin/openclaw.CMD +12 -0
  1206. package/extensions/memory-lancedb/node_modules/.bin/openclaw.ps1 +41 -0
  1207. package/extensions/memory-lancedb/node_modules/.bin/pigbot +21 -0
  1208. package/extensions/memory-lancedb/node_modules/.bin/pigbot.CMD +12 -0
  1209. package/extensions/memory-lancedb/node_modules/.bin/pigbot.ps1 +41 -0
  1210. package/extensions/memory-lancedb/package.json +1 -1
  1211. package/extensions/minimax-portal-auth/index.ts +1 -2
  1212. package/extensions/minimax-portal-auth/node_modules/.bin/moltbot +21 -0
  1213. package/extensions/minimax-portal-auth/node_modules/.bin/moltbot.CMD +12 -0
  1214. package/extensions/minimax-portal-auth/node_modules/.bin/moltbot.ps1 +41 -0
  1215. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw +21 -0
  1216. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.CMD +12 -0
  1217. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1218. package/extensions/minimax-portal-auth/node_modules/.bin/pigbot +21 -0
  1219. package/extensions/minimax-portal-auth/node_modules/.bin/pigbot.CMD +12 -0
  1220. package/extensions/minimax-portal-auth/node_modules/.bin/pigbot.ps1 +41 -0
  1221. package/extensions/minimax-portal-auth/oauth.ts +1 -1
  1222. package/extensions/minimax-portal-auth/package.json +1 -1
  1223. package/extensions/msteams/CHANGELOG.md +12 -0
  1224. package/extensions/msteams/index.ts +0 -1
  1225. package/extensions/msteams/node_modules/.bin/moltbot +21 -0
  1226. package/extensions/msteams/node_modules/.bin/moltbot.CMD +12 -0
  1227. package/extensions/msteams/node_modules/.bin/moltbot.ps1 +41 -0
  1228. package/extensions/msteams/node_modules/.bin/openclaw +21 -0
  1229. package/extensions/msteams/node_modules/.bin/openclaw.CMD +12 -0
  1230. package/extensions/msteams/node_modules/.bin/openclaw.ps1 +41 -0
  1231. package/extensions/msteams/node_modules/.bin/pigbot +21 -0
  1232. package/extensions/msteams/node_modules/.bin/pigbot.CMD +12 -0
  1233. package/extensions/msteams/node_modules/.bin/pigbot.ps1 +41 -0
  1234. package/extensions/msteams/package.json +1 -1
  1235. package/extensions/msteams/src/attachments/download.ts +50 -5
  1236. package/extensions/msteams/src/attachments/graph.ts +8 -6
  1237. package/extensions/msteams/src/attachments/html.ts +1 -1
  1238. package/extensions/msteams/src/attachments/shared.ts +20 -0
  1239. package/extensions/msteams/src/attachments.test.ts +37 -2
  1240. package/extensions/msteams/src/channel.directory.test.ts +1 -3
  1241. package/extensions/msteams/src/channel.ts +2 -3
  1242. package/extensions/msteams/src/conversation-store-fs.test.ts +1 -3
  1243. package/extensions/msteams/src/directory-live.ts +0 -1
  1244. package/extensions/msteams/src/errors.test.ts +0 -1
  1245. package/extensions/msteams/src/inbound.test.ts +0 -1
  1246. package/extensions/msteams/src/media-helpers.test.ts +0 -1
  1247. package/extensions/msteams/src/media-helpers.ts +0 -1
  1248. package/extensions/msteams/src/messenger.test.ts +1 -2
  1249. package/extensions/msteams/src/monitor-handler/inbound-media.ts +4 -1
  1250. package/extensions/msteams/src/monitor-handler/message-handler.ts +5 -5
  1251. package/extensions/msteams/src/monitor-handler.ts +3 -3
  1252. package/extensions/msteams/src/monitor.ts +2 -2
  1253. package/extensions/msteams/src/onboarding.ts +1 -2
  1254. package/extensions/msteams/src/outbound.ts +0 -1
  1255. package/extensions/msteams/src/policy.test.ts +1 -2
  1256. package/extensions/msteams/src/polls-store.test.ts +1 -3
  1257. package/extensions/msteams/src/polls.test.ts +1 -3
  1258. package/extensions/msteams/src/polls.ts +0 -1
  1259. package/extensions/msteams/src/probe.test.ts +1 -2
  1260. package/extensions/msteams/src/reply-dispatcher.ts +2 -2
  1261. package/extensions/msteams/src/send-context.ts +1 -1
  1262. package/extensions/msteams/src/send.ts +1 -1
  1263. package/extensions/msteams/src/sent-message-cache.test.ts +0 -1
  1264. package/extensions/msteams/src/storage.ts +0 -1
  1265. package/extensions/msteams/src/store-fs.ts +0 -1
  1266. package/extensions/nextcloud-talk/index.ts +0 -1
  1267. package/extensions/nextcloud-talk/node_modules/.bin/moltbot +21 -0
  1268. package/extensions/nextcloud-talk/node_modules/.bin/moltbot.CMD +12 -0
  1269. package/extensions/nextcloud-talk/node_modules/.bin/moltbot.ps1 +41 -0
  1270. package/extensions/nextcloud-talk/node_modules/.bin/openclaw +21 -0
  1271. package/extensions/nextcloud-talk/node_modules/.bin/openclaw.CMD +12 -0
  1272. package/extensions/nextcloud-talk/node_modules/.bin/openclaw.ps1 +41 -0
  1273. package/extensions/nextcloud-talk/node_modules/.bin/pigbot +21 -0
  1274. package/extensions/nextcloud-talk/node_modules/.bin/pigbot.CMD +12 -0
  1275. package/extensions/nextcloud-talk/node_modules/.bin/pigbot.ps1 +41 -0
  1276. package/extensions/nextcloud-talk/package.json +1 -1
  1277. package/extensions/nextcloud-talk/src/accounts.ts +0 -2
  1278. package/extensions/nextcloud-talk/src/channel.ts +2 -3
  1279. package/extensions/nextcloud-talk/src/inbound.ts +2 -3
  1280. package/extensions/nextcloud-talk/src/monitor.ts +5 -7
  1281. package/extensions/nextcloud-talk/src/onboarding.ts +1 -2
  1282. package/extensions/nextcloud-talk/src/policy.ts +0 -1
  1283. package/extensions/nextcloud-talk/src/room-info.ts +1 -3
  1284. package/extensions/nextcloud-talk/src/send.ts +1 -1
  1285. package/extensions/nextcloud-talk/src/signature.ts +0 -1
  1286. package/extensions/nostr/CHANGELOG.md +12 -0
  1287. package/extensions/nostr/index.ts +2 -3
  1288. package/extensions/nostr/node_modules/.bin/moltbot +21 -0
  1289. package/extensions/nostr/node_modules/.bin/moltbot.CMD +12 -0
  1290. package/extensions/nostr/node_modules/.bin/moltbot.ps1 +41 -0
  1291. package/extensions/nostr/node_modules/.bin/openclaw +21 -0
  1292. package/extensions/nostr/node_modules/.bin/openclaw.CMD +12 -0
  1293. package/extensions/nostr/node_modules/.bin/openclaw.ps1 +41 -0
  1294. package/extensions/nostr/node_modules/.bin/pigbot +21 -0
  1295. package/extensions/nostr/node_modules/.bin/pigbot.CMD +12 -0
  1296. package/extensions/nostr/node_modules/.bin/pigbot.ps1 +41 -0
  1297. package/extensions/nostr/package.json +2 -2
  1298. package/extensions/nostr/src/channel.ts +4 -5
  1299. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +1 -1
  1300. package/extensions/nostr/src/nostr-bus.integration.test.ts +1 -1
  1301. package/extensions/nostr/src/nostr-bus.ts +9 -10
  1302. package/extensions/nostr/src/nostr-profile-http.test.ts +1 -2
  1303. package/extensions/nostr/src/nostr-profile-http.ts +1 -2
  1304. package/extensions/nostr/src/nostr-profile-import.test.ts +1 -2
  1305. package/extensions/nostr/src/nostr-profile-import.ts +1 -2
  1306. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +1 -1
  1307. package/extensions/nostr/src/nostr-profile.test.ts +2 -2
  1308. package/extensions/nostr/src/nostr-state-store.test.ts +1 -3
  1309. package/extensions/nostr/src/nostr-state-store.ts +0 -1
  1310. package/extensions/nostr/src/types.ts +1 -1
  1311. package/extensions/open-prose/node_modules/.bin/moltbot +21 -0
  1312. package/extensions/open-prose/node_modules/.bin/moltbot.CMD +12 -0
  1313. package/extensions/open-prose/node_modules/.bin/moltbot.ps1 +41 -0
  1314. package/extensions/open-prose/node_modules/.bin/openclaw +21 -0
  1315. package/extensions/open-prose/node_modules/.bin/openclaw.CMD +12 -0
  1316. package/extensions/open-prose/node_modules/.bin/openclaw.ps1 +41 -0
  1317. package/extensions/open-prose/node_modules/.bin/pigbot +21 -0
  1318. package/extensions/open-prose/node_modules/.bin/pigbot.CMD +12 -0
  1319. package/extensions/open-prose/node_modules/.bin/pigbot.ps1 +41 -0
  1320. package/extensions/open-prose/package.json +1 -1
  1321. package/extensions/qwen-portal-auth/index.ts +0 -1
  1322. package/extensions/signal/index.ts +0 -1
  1323. package/extensions/signal/node_modules/.bin/moltbot +21 -0
  1324. package/extensions/signal/node_modules/.bin/moltbot.CMD +12 -0
  1325. package/extensions/signal/node_modules/.bin/moltbot.ps1 +41 -0
  1326. package/extensions/signal/node_modules/.bin/openclaw +21 -0
  1327. package/extensions/signal/node_modules/.bin/openclaw.CMD +12 -0
  1328. package/extensions/signal/node_modules/.bin/openclaw.ps1 +41 -0
  1329. package/extensions/signal/node_modules/.bin/pigbot +21 -0
  1330. package/extensions/signal/node_modules/.bin/pigbot.CMD +12 -0
  1331. package/extensions/signal/node_modules/.bin/pigbot.ps1 +41 -0
  1332. package/extensions/signal/package.json +1 -1
  1333. package/extensions/signal/src/channel.ts +0 -1
  1334. package/extensions/slack/index.ts +0 -1
  1335. package/extensions/slack/node_modules/.bin/moltbot +21 -0
  1336. package/extensions/slack/node_modules/.bin/moltbot.CMD +12 -0
  1337. package/extensions/slack/node_modules/.bin/moltbot.ps1 +41 -0
  1338. package/extensions/slack/node_modules/.bin/openclaw +21 -0
  1339. package/extensions/slack/node_modules/.bin/openclaw.CMD +12 -0
  1340. package/extensions/slack/node_modules/.bin/openclaw.ps1 +41 -0
  1341. package/extensions/slack/node_modules/.bin/pigbot +21 -0
  1342. package/extensions/slack/node_modules/.bin/pigbot.CMD +12 -0
  1343. package/extensions/slack/node_modules/.bin/pigbot.ps1 +41 -0
  1344. package/extensions/slack/package.json +1 -1
  1345. package/extensions/slack/src/channel.ts +0 -1
  1346. package/extensions/telegram/index.ts +0 -1
  1347. package/extensions/telegram/node_modules/.bin/moltbot +21 -0
  1348. package/extensions/telegram/node_modules/.bin/moltbot.CMD +12 -0
  1349. package/extensions/telegram/node_modules/.bin/moltbot.ps1 +41 -0
  1350. package/extensions/telegram/node_modules/.bin/openclaw +21 -0
  1351. package/extensions/telegram/node_modules/.bin/openclaw.CMD +12 -0
  1352. package/extensions/telegram/node_modules/.bin/openclaw.ps1 +41 -0
  1353. package/extensions/telegram/node_modules/.bin/pigbot +21 -0
  1354. package/extensions/telegram/node_modules/.bin/pigbot.CMD +12 -0
  1355. package/extensions/telegram/node_modules/.bin/pigbot.ps1 +41 -0
  1356. package/extensions/telegram/package.json +1 -1
  1357. package/extensions/telegram/src/channel.ts +0 -1
  1358. package/extensions/tlon/index.ts +0 -1
  1359. package/extensions/tlon/node_modules/.bin/moltbot +21 -0
  1360. package/extensions/tlon/node_modules/.bin/moltbot.CMD +12 -0
  1361. package/extensions/tlon/node_modules/.bin/moltbot.ps1 +41 -0
  1362. package/extensions/tlon/node_modules/.bin/openclaw +21 -0
  1363. package/extensions/tlon/node_modules/.bin/openclaw.CMD +12 -0
  1364. package/extensions/tlon/node_modules/.bin/openclaw.ps1 +41 -0
  1365. package/extensions/tlon/node_modules/.bin/pigbot +21 -0
  1366. package/extensions/tlon/node_modules/.bin/pigbot.CMD +12 -0
  1367. package/extensions/tlon/node_modules/.bin/pigbot.ps1 +41 -0
  1368. package/extensions/tlon/package.json +1 -1
  1369. package/extensions/tlon/src/channel.ts +5 -6
  1370. package/extensions/tlon/src/config-schema.test.ts +0 -1
  1371. package/extensions/tlon/src/config-schema.ts +1 -1
  1372. package/extensions/tlon/src/monitor/discovery.ts +4 -3
  1373. package/extensions/tlon/src/monitor/history.ts +3 -2
  1374. package/extensions/tlon/src/monitor/index.ts +16 -16
  1375. package/extensions/tlon/src/monitor/processed-messages.test.ts +0 -1
  1376. package/extensions/tlon/src/monitor/utils.ts +33 -27
  1377. package/extensions/tlon/src/onboarding.ts +2 -3
  1378. package/extensions/tlon/src/urbit/sse-client.test.ts +0 -1
  1379. package/extensions/tlon/src/urbit/sse-client.ts +16 -0
  1380. package/extensions/twitch/CHANGELOG.md +12 -0
  1381. package/extensions/twitch/index.ts +1 -1
  1382. package/extensions/twitch/node_modules/.bin/moltbot +21 -0
  1383. package/extensions/twitch/node_modules/.bin/moltbot.CMD +12 -0
  1384. package/extensions/twitch/node_modules/.bin/moltbot.ps1 +41 -0
  1385. package/extensions/twitch/node_modules/.bin/openclaw +21 -0
  1386. package/extensions/twitch/node_modules/.bin/openclaw.CMD +12 -0
  1387. package/extensions/twitch/node_modules/.bin/openclaw.ps1 +41 -0
  1388. package/extensions/twitch/node_modules/.bin/pigbot +21 -0
  1389. package/extensions/twitch/node_modules/.bin/pigbot.CMD +12 -0
  1390. package/extensions/twitch/node_modules/.bin/pigbot.ps1 +41 -0
  1391. package/extensions/twitch/package.json +1 -1
  1392. package/extensions/twitch/src/access-control.test.ts +9 -9
  1393. package/extensions/twitch/src/access-control.ts +8 -4
  1394. package/extensions/twitch/src/actions.ts +1 -1
  1395. package/extensions/twitch/src/client-manager-registry.ts +1 -1
  1396. package/extensions/twitch/src/config.test.ts +0 -1
  1397. package/extensions/twitch/src/monitor.ts +1 -1
  1398. package/extensions/twitch/src/onboarding.test.ts +1 -1
  1399. package/extensions/twitch/src/onboarding.ts +2 -2
  1400. package/extensions/twitch/src/outbound.test.ts +1 -1
  1401. package/extensions/twitch/src/outbound.ts +2 -4
  1402. package/extensions/twitch/src/plugin.test.ts +1 -1
  1403. package/extensions/twitch/src/plugin.ts +11 -11
  1404. package/extensions/twitch/src/probe.test.ts +1 -1
  1405. package/extensions/twitch/src/send.test.ts +1 -1
  1406. package/extensions/twitch/src/send.ts +2 -2
  1407. package/extensions/twitch/src/status.test.ts +1 -1
  1408. package/extensions/twitch/src/status.ts +1 -1
  1409. package/extensions/twitch/src/token.test.ts +1 -1
  1410. package/extensions/twitch/src/twitch-client.test.ts +10 -1
  1411. package/extensions/twitch/src/twitch-client.ts +7 -7
  1412. package/extensions/twitch/src/types.ts +9 -9
  1413. package/extensions/voice-call/CHANGELOG.md +12 -0
  1414. package/extensions/voice-call/index.ts +1 -1
  1415. package/extensions/voice-call/node_modules/.bin/moltbot +21 -0
  1416. package/extensions/voice-call/node_modules/.bin/moltbot.CMD +12 -0
  1417. package/extensions/voice-call/node_modules/.bin/moltbot.ps1 +41 -0
  1418. package/extensions/voice-call/node_modules/.bin/openclaw +21 -0
  1419. package/extensions/voice-call/node_modules/.bin/openclaw.CMD +12 -0
  1420. package/extensions/voice-call/node_modules/.bin/openclaw.ps1 +41 -0
  1421. package/extensions/voice-call/node_modules/.bin/pigbot +21 -0
  1422. package/extensions/voice-call/node_modules/.bin/pigbot.CMD +12 -0
  1423. package/extensions/voice-call/node_modules/.bin/pigbot.ps1 +41 -0
  1424. package/extensions/voice-call/package.json +1 -1
  1425. package/extensions/voice-call/src/cli.ts +1 -3
  1426. package/extensions/voice-call/src/config.test.ts +0 -1
  1427. package/extensions/voice-call/src/core-bridge.ts +0 -1
  1428. package/extensions/voice-call/src/manager/context.ts +1 -1
  1429. package/extensions/voice-call/src/manager/events.ts +1 -2
  1430. package/extensions/voice-call/src/manager/outbound.ts +3 -4
  1431. package/extensions/voice-call/src/manager/store.ts +0 -1
  1432. package/extensions/voice-call/src/manager/timers.ts +1 -1
  1433. package/extensions/voice-call/src/manager.test.ts +3 -5
  1434. package/extensions/voice-call/src/manager.ts +1 -2
  1435. package/extensions/voice-call/src/media-stream.test.ts +0 -1
  1436. package/extensions/voice-call/src/media-stream.ts +0 -2
  1437. package/extensions/voice-call/src/providers/mock.ts +0 -1
  1438. package/extensions/voice-call/src/providers/plivo.test.ts +0 -1
  1439. package/extensions/voice-call/src/providers/plivo.ts +1 -2
  1440. package/extensions/voice-call/src/providers/telnyx.ts +0 -1
  1441. package/extensions/voice-call/src/providers/twilio/webhook.ts +1 -2
  1442. package/extensions/voice-call/src/providers/twilio.test.ts +0 -1
  1443. package/extensions/voice-call/src/providers/twilio.ts +3 -4
  1444. package/extensions/voice-call/src/response-generator.ts +1 -3
  1445. package/extensions/voice-call/src/runtime.ts +3 -3
  1446. package/extensions/voice-call/src/telephony-tts.ts +1 -1
  1447. package/extensions/voice-call/src/tunnel.ts +0 -1
  1448. package/extensions/voice-call/src/types.ts +0 -1
  1449. package/extensions/voice-call/src/webhook-security.test.ts +0 -2
  1450. package/extensions/voice-call/src/webhook-security.ts +0 -1
  1451. package/extensions/voice-call/src/webhook.ts +2 -3
  1452. package/extensions/whatsapp/index.ts +0 -1
  1453. package/extensions/whatsapp/node_modules/.bin/moltbot +21 -0
  1454. package/extensions/whatsapp/node_modules/.bin/moltbot.CMD +12 -0
  1455. package/extensions/whatsapp/node_modules/.bin/moltbot.ps1 +41 -0
  1456. package/extensions/whatsapp/node_modules/.bin/openclaw +21 -0
  1457. package/extensions/whatsapp/node_modules/.bin/openclaw.CMD +12 -0
  1458. package/extensions/whatsapp/node_modules/.bin/openclaw.ps1 +41 -0
  1459. package/extensions/whatsapp/node_modules/.bin/pigbot +21 -0
  1460. package/extensions/whatsapp/node_modules/.bin/pigbot.CMD +12 -0
  1461. package/extensions/whatsapp/node_modules/.bin/pigbot.ps1 +41 -0
  1462. package/extensions/whatsapp/package.json +1 -1
  1463. package/extensions/whatsapp/src/channel.ts +0 -1
  1464. package/extensions/zalo/CHANGELOG.md +12 -0
  1465. package/extensions/zalo/index.ts +0 -1
  1466. package/extensions/zalo/node_modules/.bin/moltbot +21 -0
  1467. package/extensions/zalo/node_modules/.bin/moltbot.CMD +12 -0
  1468. package/extensions/zalo/node_modules/.bin/moltbot.ps1 +41 -0
  1469. package/extensions/zalo/node_modules/.bin/openclaw +21 -0
  1470. package/extensions/zalo/node_modules/.bin/openclaw.CMD +12 -0
  1471. package/extensions/zalo/node_modules/.bin/openclaw.ps1 +41 -0
  1472. package/extensions/zalo/node_modules/.bin/pigbot +21 -0
  1473. package/extensions/zalo/node_modules/.bin/pigbot.CMD +12 -0
  1474. package/extensions/zalo/node_modules/.bin/pigbot.ps1 +41 -0
  1475. package/extensions/zalo/package.json +2 -2
  1476. package/extensions/zalo/src/accounts.ts +0 -1
  1477. package/extensions/zalo/src/actions.ts +0 -1
  1478. package/extensions/zalo/src/channel.directory.test.ts +1 -3
  1479. package/extensions/zalo/src/channel.ts +1 -2
  1480. package/extensions/zalo/src/monitor.ts +0 -2
  1481. package/extensions/zalo/src/monitor.webhook.test.ts +2 -4
  1482. package/extensions/zalo/src/onboarding.ts +0 -1
  1483. package/extensions/zalo/src/proxy.ts +1 -2
  1484. package/extensions/zalo/src/send.ts +1 -2
  1485. package/extensions/zalo/src/token.ts +0 -2
  1486. package/extensions/zalouser/CHANGELOG.md +12 -0
  1487. package/extensions/zalouser/index.ts +1 -2
  1488. package/extensions/zalouser/node_modules/.bin/moltbot +21 -0
  1489. package/extensions/zalouser/node_modules/.bin/moltbot.CMD +12 -0
  1490. package/extensions/zalouser/node_modules/.bin/moltbot.ps1 +41 -0
  1491. package/extensions/zalouser/node_modules/.bin/openclaw +21 -0
  1492. package/extensions/zalouser/node_modules/.bin/openclaw.CMD +12 -0
  1493. package/extensions/zalouser/node_modules/.bin/openclaw.ps1 +41 -0
  1494. package/extensions/zalouser/node_modules/.bin/pigbot +21 -0
  1495. package/extensions/zalouser/node_modules/.bin/pigbot.CMD +12 -0
  1496. package/extensions/zalouser/node_modules/.bin/pigbot.ps1 +41 -0
  1497. package/extensions/zalouser/package.json +1 -1
  1498. package/extensions/zalouser/src/accounts.ts +1 -2
  1499. package/extensions/zalouser/src/channel.test.ts +0 -1
  1500. package/extensions/zalouser/src/channel.ts +4 -4
  1501. package/extensions/zalouser/src/monitor.ts +1 -2
  1502. package/extensions/zalouser/src/onboarding.ts +1 -2
  1503. package/extensions/zalouser/src/probe.ts +1 -1
  1504. package/extensions/zalouser/src/status-issues.test.ts +0 -1
  1505. package/extensions/zalouser/src/tool.ts +0 -1
  1506. package/extensions/zalouser/src/zca.ts +0 -1
  1507. package/package.json +83 -55
  1508. package/scripts/format-staged.js +1 -1
  1509. package/scripts/postinstall.js +1 -1
  1510. package/scripts/setup-git-hooks.js +1 -1
  1511. package/skills/canvas/SKILL.md +9 -9
  1512. package/skills/healthcheck/SKILL.md +231 -0
  1513. package/skills/session-logs/SKILL.md +1 -1
  1514. package/dist/control-ui/assets/index-BKPyesll.css +0 -1
  1515. package/dist/control-ui/assets/index-CknqRMzC.js +0 -3898
  1516. package/dist/control-ui/assets/index-CknqRMzC.js.map +0 -1
  1517. package/dist/telegram/pairing-store.d.ts +0 -43
  1518. package/dist/telegram/pairing-store.js +0 -78
  1519. package/extensions/bluebubbles/node_modules/.bin/claw +0 -21
  1520. package/extensions/bluebubbles/node_modules/.bin/claw.CMD +0 -12
  1521. package/extensions/copilot-proxy/node_modules/.bin/claw +0 -21
  1522. package/extensions/copilot-proxy/node_modules/.bin/claw.CMD +0 -12
  1523. package/extensions/diagnostics-otel/node_modules/.bin/claw +0 -21
  1524. package/extensions/diagnostics-otel/node_modules/.bin/claw.CMD +0 -12
  1525. package/extensions/discord/node_modules/.bin/claw +0 -21
  1526. package/extensions/discord/node_modules/.bin/claw.CMD +0 -12
  1527. package/extensions/google-antigravity-auth/node_modules/.bin/claw +0 -21
  1528. package/extensions/google-antigravity-auth/node_modules/.bin/claw.CMD +0 -12
  1529. package/extensions/google-antigravity-auth/node_modules/.bin/claw.ps1 +0 -41
  1530. package/extensions/google-gemini-cli-auth/node_modules/.bin/claw +0 -21
  1531. package/extensions/google-gemini-cli-auth/node_modules/.bin/claw.CMD +0 -12
  1532. package/extensions/google-gemini-cli-auth/node_modules/.bin/claw.ps1 +0 -41
  1533. package/extensions/googlechat/node_modules/.bin/claw +0 -21
  1534. package/extensions/googlechat/node_modules/.bin/claw.CMD +0 -12
  1535. package/extensions/googlechat/node_modules/.bin/claw.ps1 +0 -41
  1536. package/extensions/imessage/node_modules/.bin/claw +0 -21
  1537. package/extensions/imessage/node_modules/.bin/claw.CMD +0 -12
  1538. package/extensions/imessage/node_modules/.bin/claw.ps1 +0 -41
  1539. package/extensions/line/node_modules/.bin/claw +0 -21
  1540. package/extensions/line/node_modules/.bin/claw.CMD +0 -12
  1541. package/extensions/line/node_modules/.bin/claw.ps1 +0 -41
  1542. package/extensions/llm-task/node_modules/.bin/claw +0 -21
  1543. package/extensions/llm-task/node_modules/.bin/claw.CMD +0 -12
  1544. package/extensions/llm-task/node_modules/.bin/claw.ps1 +0 -41
  1545. package/extensions/lobster/node_modules/.bin/claw +0 -21
  1546. package/extensions/lobster/node_modules/.bin/claw.CMD +0 -12
  1547. package/extensions/lobster/node_modules/.bin/claw.ps1 +0 -41
  1548. package/extensions/matrix/node_modules/.bin/claw +0 -21
  1549. package/extensions/matrix/node_modules/.bin/claw.CMD +0 -12
  1550. package/extensions/matrix/node_modules/.bin/claw.ps1 +0 -41
  1551. package/extensions/mattermost/node_modules/.bin/claw +0 -21
  1552. package/extensions/mattermost/node_modules/.bin/claw.CMD +0 -12
  1553. package/extensions/mattermost/node_modules/.bin/claw.ps1 +0 -41
  1554. package/extensions/memory-core/node_modules/.bin/claw +0 -21
  1555. package/extensions/memory-core/node_modules/.bin/claw.CMD +0 -12
  1556. package/extensions/memory-core/node_modules/.bin/claw.ps1 +0 -41
  1557. package/extensions/memory-lancedb/node_modules/.bin/claw +0 -21
  1558. package/extensions/memory-lancedb/node_modules/.bin/claw.CMD +0 -12
  1559. package/extensions/memory-lancedb/node_modules/.bin/claw.ps1 +0 -41
  1560. package/extensions/minimax-portal-auth/node_modules/.bin/claw +0 -21
  1561. package/extensions/minimax-portal-auth/node_modules/.bin/claw.CMD +0 -12
  1562. package/extensions/minimax-portal-auth/node_modules/.bin/claw.ps1 +0 -41
  1563. package/extensions/msteams/node_modules/.bin/claw +0 -21
  1564. package/extensions/msteams/node_modules/.bin/claw.CMD +0 -12
  1565. package/extensions/msteams/node_modules/.bin/claw.ps1 +0 -41
  1566. package/extensions/nextcloud-talk/node_modules/.bin/claw +0 -21
  1567. package/extensions/nextcloud-talk/node_modules/.bin/claw.CMD +0 -12
  1568. package/extensions/nextcloud-talk/node_modules/.bin/claw.ps1 +0 -41
  1569. package/extensions/nostr/node_modules/.bin/claw +0 -21
  1570. package/extensions/nostr/node_modules/.bin/claw.CMD +0 -12
  1571. package/extensions/nostr/node_modules/.bin/claw.ps1 +0 -41
  1572. package/extensions/open-prose/node_modules/.bin/claw +0 -21
  1573. package/extensions/open-prose/node_modules/.bin/claw.CMD +0 -12
  1574. package/extensions/open-prose/node_modules/.bin/claw.ps1 +0 -41
  1575. package/extensions/signal/node_modules/.bin/claw +0 -21
  1576. package/extensions/signal/node_modules/.bin/claw.CMD +0 -12
  1577. package/extensions/signal/node_modules/.bin/claw.ps1 +0 -41
  1578. package/extensions/slack/node_modules/.bin/claw +0 -21
  1579. package/extensions/slack/node_modules/.bin/claw.CMD +0 -12
  1580. package/extensions/slack/node_modules/.bin/claw.ps1 +0 -41
  1581. package/extensions/telegram/node_modules/.bin/claw +0 -21
  1582. package/extensions/telegram/node_modules/.bin/claw.CMD +0 -12
  1583. package/extensions/telegram/node_modules/.bin/claw.ps1 +0 -41
  1584. package/extensions/tlon/node_modules/.bin/claw +0 -21
  1585. package/extensions/tlon/node_modules/.bin/claw.CMD +0 -12
  1586. package/extensions/tlon/node_modules/.bin/claw.ps1 +0 -41
  1587. package/extensions/twitch/node_modules/.bin/claw +0 -21
  1588. package/extensions/twitch/node_modules/.bin/claw.CMD +0 -12
  1589. package/extensions/twitch/node_modules/.bin/claw.ps1 +0 -41
  1590. package/extensions/voice-call/node_modules/.bin/claw +0 -21
  1591. package/extensions/voice-call/node_modules/.bin/claw.CMD +0 -12
  1592. package/extensions/voice-call/node_modules/.bin/claw.ps1 +0 -41
  1593. package/extensions/whatsapp/node_modules/.bin/claw +0 -21
  1594. package/extensions/whatsapp/node_modules/.bin/claw.CMD +0 -12
  1595. package/extensions/whatsapp/node_modules/.bin/claw.ps1 +0 -41
  1596. package/extensions/zalo/node_modules/.bin/claw +0 -21
  1597. package/extensions/zalo/node_modules/.bin/claw.CMD +0 -12
  1598. package/extensions/zalo/node_modules/.bin/claw.ps1 +0 -41
  1599. package/extensions/zalouser/node_modules/.bin/claw +0 -21
  1600. package/extensions/zalouser/node_modules/.bin/claw.CMD +0 -12
  1601. package/extensions/zalouser/node_modules/.bin/claw.ps1 +0 -41
@@ -1,3898 +0,0 @@
1
- (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();const Gt=globalThis,Ls=Gt.ShadowRoot&&(Gt.ShadyCSS===void 0||Gt.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Rs=Symbol(),Ki=new WeakMap;let no=class{constructor(t,n,s){if(this._$cssResult$=!0,s!==Rs)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=n}get styleSheet(){let t=this.o;const n=this.t;if(Ls&&t===void 0){const s=n!==void 0&&n.length===1;s&&(t=Ki.get(n)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&Ki.set(n,t))}return t}toString(){return this.cssText}};const Wr=e=>new no(typeof e=="string"?e:e+"",void 0,Rs),Vr=(e,...t)=>{const n=e.length===1?e[0]:t.reduce((s,i,a)=>s+(o=>{if(o._$cssResult$===!0)return o.cssText;if(typeof o=="number")return o;throw Error("Value passed to 'css' function must be a 'css' function result: "+o+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[a+1],e[0]);return new no(n,e,Rs)},Yr=(e,t)=>{if(Ls)e.adoptedStyleSheets=t.map(n=>n instanceof CSSStyleSheet?n:n.styleSheet);else for(const n of t){const s=document.createElement("style"),i=Gt.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=n.cssText,e.appendChild(s)}},Hi=Ls?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let n="";for(const s of t.cssRules)n+=s.cssText;return Wr(n)})(e):e;const{is:Qr,defineProperty:Zr,getOwnPropertyDescriptor:Jr,getOwnPropertyNames:Xr,getOwnPropertySymbols:el,getPrototypeOf:tl}=Object,an=globalThis,zi=an.trustedTypes,nl=zi?zi.emptyScript:"",sl=an.reactiveElementPolyfillSupport,mt=(e,t)=>e,Yt={toAttribute(e,t){switch(t){case Boolean:e=e?nl:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=e!==null;break;case Number:n=e===null?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch{n=null}}return n}},Ps=(e,t)=>!Qr(e,t),ji={attribute:!0,type:String,converter:Yt,reflect:!1,useDefault:!1,hasChanged:Ps};Symbol.metadata??=Symbol("metadata"),an.litPropertyMetadata??=new WeakMap;let Qe=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,n=ji){if(n.state&&(n.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((n=Object.create(n)).wrapped=!0),this.elementProperties.set(t,n),!n.noAccessor){const s=Symbol(),i=this.getPropertyDescriptor(t,s,n);i!==void 0&&Zr(this.prototype,t,i)}}static getPropertyDescriptor(t,n,s){const{get:i,set:a}=Jr(this.prototype,t)??{get(){return this[n]},set(o){this[n]=o}};return{get:i,set(o){const r=i?.call(this);a?.call(this,o),this.requestUpdate(t,r,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??ji}static _$Ei(){if(this.hasOwnProperty(mt("elementProperties")))return;const t=tl(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(mt("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(mt("properties"))){const n=this.properties,s=[...Xr(n),...el(n)];for(const i of s)this.createProperty(i,n[i])}const t=this[Symbol.metadata];if(t!==null){const n=litPropertyMetadata.get(t);if(n!==void 0)for(const[s,i]of n)this.elementProperties.set(s,i)}this._$Eh=new Map;for(const[n,s]of this.elementProperties){const i=this._$Eu(n,s);i!==void 0&&this._$Eh.set(i,n)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const n=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const i of s)n.unshift(Hi(i))}else t!==void 0&&n.push(Hi(t));return n}static _$Eu(t,n){const s=n.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,n=this.constructor.elementProperties;for(const s of n.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Yr(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,n,s){this._$AK(t,s)}_$ET(t,n){const s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){const a=(s.converter?.toAttribute!==void 0?s.converter:Yt).toAttribute(n,s.type);this._$Em=t,a==null?this.removeAttribute(i):this.setAttribute(i,a),this._$Em=null}}_$AK(t,n){const s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){const a=s.getPropertyOptions(i),o=typeof a.converter=="function"?{fromAttribute:a.converter}:a.converter?.fromAttribute!==void 0?a.converter:Yt;this._$Em=i;const r=o.fromAttribute(n,a.type);this[i]=r??this._$Ej?.get(i)??r,this._$Em=null}}requestUpdate(t,n,s,i=!1,a){if(t!==void 0){const o=this.constructor;if(i===!1&&(a=this[t]),s??=o.getPropertyOptions(t),!((s.hasChanged??Ps)(a,n)||s.useDefault&&s.reflect&&a===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,s))))return;this.C(t,n,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,n,{useDefault:s,reflect:i,wrapped:a},o){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??n??this[t]),a!==!0||o!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(n=void 0),this._$AL.set(t,n)),i===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(n){Promise.reject(n)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[i,a]of this._$Ep)this[i]=a;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[i,a]of s){const{wrapped:o}=a,r=this[i];o!==!0||this._$AL.has(i)||r===void 0||this.C(i,void 0,a,r)}}let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(n)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(n)}willUpdate(t){}_$AE(t){this._$EO?.forEach(n=>n.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(n=>this._$ET(n,this[n])),this._$EM()}updated(t){}firstUpdated(t){}};Qe.elementStyles=[],Qe.shadowRootOptions={mode:"open"},Qe[mt("elementProperties")]=new Map,Qe[mt("finalized")]=new Map,sl?.({ReactiveElement:Qe}),(an.reactiveElementVersions??=[]).push("2.1.2");const Ns=globalThis,qi=e=>e,Qt=Ns.trustedTypes,Gi=Qt?Qt.createPolicy("lit-html",{createHTML:e=>e}):void 0,so="$lit$",xe=`lit$${Math.random().toFixed(9).slice(2)}$`,io="?"+xe,il=`<${io}>`,Oe=document,$t=()=>Oe.createComment(""),xt=e=>e===null||typeof e!="object"&&typeof e!="function",Os=Array.isArray,al=e=>Os(e)||typeof e?.[Symbol.iterator]=="function",Fn=`[
2
- \f\r]`,ot=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Wi=/-->/g,Vi=/>/g,Ie=RegExp(`>|${Fn}(?:([^\\s"'>=/]+)(${Fn}*=${Fn}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),Yi=/'/g,Qi=/"/g,ao=/^(?:script|style|textarea|title)$/i,ol=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),c=ol(1),ke=Symbol.for("lit-noChange"),f=Symbol.for("lit-nothing"),Zi=new WeakMap,Pe=Oe.createTreeWalker(Oe,129);function oo(e,t){if(!Os(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return Gi!==void 0?Gi.createHTML(t):t}const rl=(e,t)=>{const n=e.length-1,s=[];let i,a=t===2?"<svg>":t===3?"<math>":"",o=ot;for(let r=0;r<n;r++){const l=e[r];let p,d,u=-1,g=0;for(;g<l.length&&(o.lastIndex=g,d=o.exec(l),d!==null);)g=o.lastIndex,o===ot?d[1]==="!--"?o=Wi:d[1]!==void 0?o=Vi:d[2]!==void 0?(ao.test(d[2])&&(i=RegExp("</"+d[2],"g")),o=Ie):d[3]!==void 0&&(o=Ie):o===Ie?d[0]===">"?(o=i??ot,u=-1):d[1]===void 0?u=-2:(u=o.lastIndex-d[2].length,p=d[1],o=d[3]===void 0?Ie:d[3]==='"'?Qi:Yi):o===Qi||o===Yi?o=Ie:o===Wi||o===Vi?o=ot:(o=Ie,i=void 0);const v=o===Ie&&e[r+1].startsWith("/>")?" ":"";a+=o===ot?l+il:u>=0?(s.push(p),l.slice(0,u)+so+l.slice(u)+xe+v):l+xe+(u===-2?r:v)}return[oo(e,a+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};let os=class ro{constructor({strings:t,_$litType$:n},s){let i;this.parts=[];let a=0,o=0;const r=t.length-1,l=this.parts,[p,d]=rl(t,n);if(this.el=ro.createElement(p,s),Pe.currentNode=this.el.content,n===2||n===3){const u=this.el.content.firstChild;u.replaceWith(...u.childNodes)}for(;(i=Pe.nextNode())!==null&&l.length<r;){if(i.nodeType===1){if(i.hasAttributes())for(const u of i.getAttributeNames())if(u.endsWith(so)){const g=d[o++],v=i.getAttribute(u).split(xe),y=/([.?@])?(.*)/.exec(g);l.push({type:1,index:a,name:y[2],strings:v,ctor:y[1]==="."?cl:y[1]==="?"?dl:y[1]==="@"?ul:rn}),i.removeAttribute(u)}else u.startsWith(xe)&&(l.push({type:6,index:a}),i.removeAttribute(u));if(ao.test(i.tagName)){const u=i.textContent.split(xe),g=u.length-1;if(g>0){i.textContent=Qt?Qt.emptyScript:"";for(let v=0;v<g;v++)i.append(u[v],$t()),Pe.nextNode(),l.push({type:2,index:++a});i.append(u[g],$t())}}}else if(i.nodeType===8)if(i.data===io)l.push({type:2,index:a});else{let u=-1;for(;(u=i.data.indexOf(xe,u+1))!==-1;)l.push({type:7,index:a}),u+=xe.length-1}a++}}static createElement(t,n){const s=Oe.createElement("template");return s.innerHTML=t,s}};function Xe(e,t,n=e,s){if(t===ke)return t;let i=s!==void 0?n._$Co?.[s]:n._$Cl;const a=xt(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,s)),s!==void 0?(n._$Co??=[])[s]=i:n._$Cl=i),i!==void 0&&(t=Xe(e,i._$AS(e,t.values),i,s)),t}class ll{constructor(t,n){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=n}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:n},parts:s}=this._$AD,i=(t?.creationScope??Oe).importNode(n,!0);Pe.currentNode=i;let a=Pe.nextNode(),o=0,r=0,l=s[0];for(;l!==void 0;){if(o===l.index){let p;l.type===2?p=new on(a,a.nextSibling,this,t):l.type===1?p=new l.ctor(a,l.name,l.strings,this,t):l.type===6&&(p=new pl(a,this,t)),this._$AV.push(p),l=s[++r]}o!==l?.index&&(a=Pe.nextNode(),o++)}return Pe.currentNode=Oe,i}p(t){let n=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,n),n+=s.strings.length-2):s._$AI(t[n])),n++}}let on=class lo{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,n,s,i){this.type=2,this._$AH=f,this._$AN=void 0,this._$AA=t,this._$AB=n,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const n=this._$AM;return n!==void 0&&t?.nodeType===11&&(t=n.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,n=this){t=Xe(this,t,n),xt(t)?t===f||t==null||t===""?(this._$AH!==f&&this._$AR(),this._$AH=f):t!==this._$AH&&t!==ke&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):al(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==f&&xt(this._$AH)?this._$AA.nextSibling.data=t:this.T(Oe.createTextNode(t)),this._$AH=t}$(t){const{values:n,_$litType$:s}=t,i=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=os.createElement(oo(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(n);else{const a=new ll(i,this),o=a.u(this.options);a.p(n),this.T(o),this._$AH=a}}_$AC(t){let n=Zi.get(t.strings);return n===void 0&&Zi.set(t.strings,n=new os(t)),n}k(t){Os(this._$AH)||(this._$AH=[],this._$AR());const n=this._$AH;let s,i=0;for(const a of t)i===n.length?n.push(s=new lo(this.O($t()),this.O($t()),this,this.options)):s=n[i],s._$AI(a),i++;i<n.length&&(this._$AR(s&&s._$AB.nextSibling,i),n.length=i)}_$AR(t=this._$AA.nextSibling,n){for(this._$AP?.(!1,!0,n);t!==this._$AB;){const s=qi(t).nextSibling;qi(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}};class rn{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,n,s,i,a){this.type=1,this._$AH=f,this._$AN=void 0,this.element=t,this.name=n,this._$AM=i,this.options=a,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=f}_$AI(t,n=this,s,i){const a=this.strings;let o=!1;if(a===void 0)t=Xe(this,t,n,0),o=!xt(t)||t!==this._$AH&&t!==ke,o&&(this._$AH=t);else{const r=t;let l,p;for(t=a[0],l=0;l<a.length-1;l++)p=Xe(this,r[s+l],n,l),p===ke&&(p=this._$AH[l]),o||=!xt(p)||p!==this._$AH[l],p===f?t=f:t!==f&&(t+=(p??"")+a[l+1]),this._$AH[l]=p}o&&!i&&this.j(t)}j(t){t===f?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}let cl=class extends rn{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===f?void 0:t}},dl=class extends rn{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==f)}},ul=class extends rn{constructor(t,n,s,i,a){super(t,n,s,i,a),this.type=5}_$AI(t,n=this){if((t=Xe(this,t,n,0)??f)===ke)return;const s=this._$AH,i=t===f&&s!==f||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,a=t!==f&&(s===f||i);i&&this.element.removeEventListener(this.name,this,s),a&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},pl=class{constructor(t,n,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=n,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){Xe(this,t)}};const hl={I:on},fl=Ns.litHtmlPolyfillSupport;fl?.(os,on),(Ns.litHtmlVersions??=[]).push("3.3.2");const gl=(e,t,n)=>{const s=n?.renderBefore??t;let i=s._$litPart$;if(i===void 0){const a=n?.renderBefore??null;s._$litPart$=i=new on(t.insertBefore($t(),a),a,void 0,n??{})}return i._$AI(e),i};const Ds=globalThis;let Je=class extends Qe{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const n=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=gl(n,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ke}};Je._$litElement$=!0,Je.finalized=!0,Ds.litElementHydrateSupport?.({LitElement:Je});const vl=Ds.litElementPolyfillSupport;vl?.({LitElement:Je});(Ds.litElementVersions??=[]).push("4.2.2");const co=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const ml={attribute:!0,type:String,converter:Yt,reflect:!1,hasChanged:Ps},yl=(e=ml,t,n)=>{const{kind:s,metadata:i}=n;let a=globalThis.litPropertyMetadata.get(i);if(a===void 0&&globalThis.litPropertyMetadata.set(i,a=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),a.set(n.name,e),s==="accessor"){const{name:o}=n;return{set(r){const l=t.get.call(this);t.set.call(this,r),this.requestUpdate(o,l,e,!0,r)},init(r){return r!==void 0&&this.C(o,void 0,e,r),r}}}if(s==="setter"){const{name:o}=n;return function(r){const l=this[o];t.call(this,r),this.requestUpdate(o,l,e,!0,r)}}throw Error("Unsupported decorator location: "+s)};function ln(e){return(t,n)=>typeof n=="object"?yl(e,t,n):((s,i,a)=>{const o=i.hasOwnProperty(a);return i.constructor.createProperty(a,s),o?Object.getOwnPropertyDescriptor(i,a):void 0})(e,t,n)}function w(e){return ln({...e,state:!0,attribute:!1})}const bl=50,wl=200,$l="Assistant";function Ji(e,t){if(typeof e!="string")return;const n=e.trim();if(n)return n.length<=t?n:n.slice(0,t)}function rs(e){const t=Ji(e?.name,bl)??$l,n=Ji(e?.avatar??void 0,wl)??null;return{agentId:typeof e?.agentId=="string"&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}function xl(){return rs(typeof window>"u"?{}:{name:window.__OPENCLAW_ASSISTANT_NAME__,avatar:window.__OPENCLAW_ASSISTANT_AVATAR__})}const uo="openclaw.control.settings.v1";function Al(){const t={gatewayUrl:`${location.protocol==="https:"?"wss":"ws"}://${location.host}`,token:"",sessionKey:"main",lastActiveSessionKey:"main",theme:"system",chatFocusMode:!1,chatShowThinking:!0,splitRatio:.6,navCollapsed:!1,navGroupsCollapsed:{}};try{const n=localStorage.getItem(uo);if(!n)return t;const s=JSON.parse(n);return{gatewayUrl:typeof s.gatewayUrl=="string"&&s.gatewayUrl.trim()?s.gatewayUrl.trim():t.gatewayUrl,token:typeof s.token=="string"?s.token:t.token,sessionKey:typeof s.sessionKey=="string"&&s.sessionKey.trim()?s.sessionKey.trim():t.sessionKey,lastActiveSessionKey:typeof s.lastActiveSessionKey=="string"&&s.lastActiveSessionKey.trim()?s.lastActiveSessionKey.trim():typeof s.sessionKey=="string"&&s.sessionKey.trim()||t.lastActiveSessionKey,theme:s.theme==="light"||s.theme==="dark"||s.theme==="system"?s.theme:t.theme,chatFocusMode:typeof s.chatFocusMode=="boolean"?s.chatFocusMode:t.chatFocusMode,chatShowThinking:typeof s.chatShowThinking=="boolean"?s.chatShowThinking:t.chatShowThinking,splitRatio:typeof s.splitRatio=="number"&&s.splitRatio>=.4&&s.splitRatio<=.7?s.splitRatio:t.splitRatio,navCollapsed:typeof s.navCollapsed=="boolean"?s.navCollapsed:t.navCollapsed,navGroupsCollapsed:typeof s.navGroupsCollapsed=="object"&&s.navGroupsCollapsed!==null?s.navGroupsCollapsed:t.navGroupsCollapsed}}catch{return t}}function kl(e){localStorage.setItem(uo,JSON.stringify(e))}function po(e){const t=(e??"").trim();if(!t)return null;const n=t.split(":").filter(Boolean);if(n.length<3||n[0]!=="agent")return null;const s=n[1]?.trim(),i=n.slice(2).join(":");return!s||!i?null:{agentId:s,rest:i}}const Sl=[{label:"Chat",tabs:["chat"]},{label:"Control",tabs:["overview","channels","instances","sessions","cron"]},{label:"Agent",tabs:["skills","nodes"]},{label:"Settings",tabs:["config","debug","logs"]}],ho={overview:"/overview",channels:"/channels",instances:"/instances",sessions:"/sessions",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",config:"/config",debug:"/debug",logs:"/logs"},fo=new Map(Object.entries(ho).map(([e,t])=>[t,e]));function cn(e){if(!e)return"";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t==="/"?"":(t.endsWith("/")&&(t=t.slice(0,-1)),t)}function At(e){if(!e)return"/";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t}function Bs(e,t=""){const n=cn(t),s=ho[e];return n?`${n}${s}`:s}function go(e,t=""){const n=cn(t);let s=e||"/";n&&(s===n?s="/":s.startsWith(`${n}/`)&&(s=s.slice(n.length)));let i=At(s).toLowerCase();return i.endsWith("/index.html")&&(i="/"),i==="/"?"chat":fo.get(i)??null}function _l(e){let t=At(e);if(t.endsWith("/index.html")&&(t=At(t.slice(0,-11))),t==="/")return"";const n=t.split("/").filter(Boolean);if(n.length===0)return"";for(let s=0;s<n.length;s++){const i=`/${n.slice(s).join("/")}`.toLowerCase();if(fo.has(i)){const a=n.slice(0,s);return a.length?`/${a.join("/")}`:""}}return`/${n.join("/")}`}function Cl(e){switch(e){case"chat":return"messageSquare";case"overview":return"barChart";case"channels":return"link";case"instances":return"radio";case"sessions":return"fileText";case"cron":return"loader";case"skills":return"zap";case"nodes":return"monitor";case"config":return"settings";case"debug":return"bug";case"logs":return"scrollText";default:return"folder"}}function ls(e){switch(e){case"overview":return"Overview";case"channels":return"Channels";case"instances":return"Instances";case"sessions":return"Sessions";case"cron":return"Cron Jobs";case"skills":return"Skills";case"nodes":return"Nodes";case"chat":return"Chat";case"config":return"Config";case"debug":return"Debug";case"logs":return"Logs";default:return"Control"}}function Tl(e){switch(e){case"overview":return"Gateway status, entry points, and a fast health read.";case"channels":return"Manage channels and settings.";case"instances":return"Presence beacons from connected clients and nodes.";case"sessions":return"Inspect active sessions and adjust per-session defaults.";case"cron":return"Schedule wakeups and recurring agent runs.";case"skills":return"Manage skill availability and API key injection.";case"nodes":return"Paired devices, capabilities, and command exposure.";case"chat":return"Direct gateway chat session for quick interventions.";case"config":return"Edit ~/.openclaw/openclaw.json safely.";case"debug":return"Gateway snapshots, events, and manual RPC calls.";case"logs":return"Live tail of the gateway file logs.";default:return""}}const W={messageSquare:c`
4
- <svg viewBox="0 0 24 24">
5
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
6
- </svg>
7
- `,barChart:c`
8
- <svg viewBox="0 0 24 24">
9
- <line x1="12" x2="12" y1="20" y2="10" />
10
- <line x1="18" x2="18" y1="20" y2="4" />
11
- <line x1="6" x2="6" y1="20" y2="16" />
12
- </svg>
13
- `,link:c`
14
- <svg viewBox="0 0 24 24">
15
- <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" />
16
- <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />
17
- </svg>
18
- `,radio:c`
19
- <svg viewBox="0 0 24 24">
20
- <circle cx="12" cy="12" r="2" />
21
- <path
22
- d="M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"
23
- />
24
- </svg>
25
- `,fileText:c`
26
- <svg viewBox="0 0 24 24">
27
- <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
28
- <polyline points="14 2 14 8 20 8" />
29
- <line x1="16" x2="8" y1="13" y2="13" />
30
- <line x1="16" x2="8" y1="17" y2="17" />
31
- <line x1="10" x2="8" y1="9" y2="9" />
32
- </svg>
33
- `,zap:c`
34
- <svg viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" /></svg>
35
- `,monitor:c`
36
- <svg viewBox="0 0 24 24">
37
- <rect width="20" height="14" x="2" y="3" rx="2" />
38
- <line x1="8" x2="16" y1="21" y2="21" />
39
- <line x1="12" x2="12" y1="17" y2="21" />
40
- </svg>
41
- `,settings:c`
42
- <svg viewBox="0 0 24 24">
43
- <path
44
- d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"
45
- />
46
- <circle cx="12" cy="12" r="3" />
47
- </svg>
48
- `,bug:c`
49
- <svg viewBox="0 0 24 24">
50
- <path d="m8 2 1.88 1.88" />
51
- <path d="M14.12 3.88 16 2" />
52
- <path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1" />
53
- <path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6" />
54
- <path d="M12 20v-9" />
55
- <path d="M6.53 9C4.6 8.8 3 7.1 3 5" />
56
- <path d="M6 13H2" />
57
- <path d="M3 21c0-2.1 1.7-3.9 3.8-4" />
58
- <path d="M20.97 5c0 2.1-1.6 3.8-3.5 4" />
59
- <path d="M22 13h-4" />
60
- <path d="M17.2 17c2.1.1 3.8 1.9 3.8 4" />
61
- </svg>
62
- `,scrollText:c`
63
- <svg viewBox="0 0 24 24">
64
- <path d="M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4" />
65
- <path d="M19 17V5a2 2 0 0 0-2-2H4" />
66
- <path d="M15 8h-5" />
67
- <path d="M15 12h-5" />
68
- </svg>
69
- `,folder:c`
70
- <svg viewBox="0 0 24 24">
71
- <path
72
- d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"
73
- />
74
- </svg>
75
- `,menu:c`
76
- <svg viewBox="0 0 24 24">
77
- <line x1="4" x2="20" y1="12" y2="12" />
78
- <line x1="4" x2="20" y1="6" y2="6" />
79
- <line x1="4" x2="20" y1="18" y2="18" />
80
- </svg>
81
- `,x:c`
82
- <svg viewBox="0 0 24 24">
83
- <path d="M18 6 6 18" />
84
- <path d="m6 6 12 12" />
85
- </svg>
86
- `,check:c`
87
- <svg viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5" /></svg>
88
- `,copy:c`
89
- <svg viewBox="0 0 24 24">
90
- <rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
91
- <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
92
- </svg>
93
- `,search:c`
94
- <svg viewBox="0 0 24 24">
95
- <circle cx="11" cy="11" r="8" />
96
- <path d="m21 21-4.3-4.3" />
97
- </svg>
98
- `,brain:c`
99
- <svg viewBox="0 0 24 24">
100
- <path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z" />
101
- <path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z" />
102
- <path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4" />
103
- <path d="M17.599 6.5a3 3 0 0 0 .399-1.375" />
104
- <path d="M6.003 5.125A3 3 0 0 0 6.401 6.5" />
105
- <path d="M3.477 10.896a4 4 0 0 1 .585-.396" />
106
- <path d="M19.938 10.5a4 4 0 0 1 .585.396" />
107
- <path d="M6 18a4 4 0 0 1-1.967-.516" />
108
- <path d="M19.967 17.484A4 4 0 0 1 18 18" />
109
- </svg>
110
- `,book:c`
111
- <svg viewBox="0 0 24 24">
112
- <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20" />
113
- </svg>
114
- `,loader:c`
115
- <svg viewBox="0 0 24 24">
116
- <path d="M12 2v4" />
117
- <path d="m16.2 7.8 2.9-2.9" />
118
- <path d="M18 12h4" />
119
- <path d="m16.2 16.2 2.9 2.9" />
120
- <path d="M12 18v4" />
121
- <path d="m4.9 19.1 2.9-2.9" />
122
- <path d="M2 12h4" />
123
- <path d="m4.9 4.9 2.9 2.9" />
124
- </svg>
125
- `,wrench:c`
126
- <svg viewBox="0 0 24 24">
127
- <path
128
- d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
129
- />
130
- </svg>
131
- `,fileCode:c`
132
- <svg viewBox="0 0 24 24">
133
- <path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
134
- <polyline points="14 2 14 8 20 8" />
135
- <path d="m10 13-2 2 2 2" />
136
- <path d="m14 17 2-2-2-2" />
137
- </svg>
138
- `,edit:c`
139
- <svg viewBox="0 0 24 24">
140
- <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
141
- <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" />
142
- </svg>
143
- `,penLine:c`
144
- <svg viewBox="0 0 24 24">
145
- <path d="M12 20h9" />
146
- <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" />
147
- </svg>
148
- `,paperclip:c`
149
- <svg viewBox="0 0 24 24">
150
- <path
151
- d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"
152
- />
153
- </svg>
154
- `,globe:c`
155
- <svg viewBox="0 0 24 24">
156
- <circle cx="12" cy="12" r="10" />
157
- <path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />
158
- <path d="M2 12h20" />
159
- </svg>
160
- `,image:c`
161
- <svg viewBox="0 0 24 24">
162
- <rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
163
- <circle cx="9" cy="9" r="2" />
164
- <path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
165
- </svg>
166
- `,smartphone:c`
167
- <svg viewBox="0 0 24 24">
168
- <rect width="14" height="20" x="5" y="2" rx="2" ry="2" />
169
- <path d="M12 18h.01" />
170
- </svg>
171
- `,plug:c`
172
- <svg viewBox="0 0 24 24">
173
- <path d="M12 22v-5" />
174
- <path d="M9 8V2" />
175
- <path d="M15 8V2" />
176
- <path d="M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z" />
177
- </svg>
178
- `,circle:c`
179
- <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10" /></svg>
180
- `,puzzle:c`
181
- <svg viewBox="0 0 24 24">
182
- <path
183
- d="M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.076.874.54 1.02 1.02a2.5 2.5 0 1 0 3.237-3.237c-.48-.146-.944-.505-1.02-1.02a.98.98 0 0 1 .303-.917l1.526-1.526A2.402 2.402 0 0 1 11.998 2c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.236 3.236c-.464.18-.894.527-.967 1.02Z"
184
- />
185
- </svg>
186
- `},El=/<\s*\/?\s*(?:think(?:ing)?|thought|antthinking|final)\b/i,Bt=/<\s*\/?\s*final\b[^<>]*>/gi,Xi=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/gi;function ea(e){const t=[],n=/(^|\n)(```|~~~)[^\n]*\n[\s\S]*?(?:\n\2(?:\n|$)|$)/g;for(const i of e.matchAll(n)){const a=(i.index??0)+i[1].length;t.push({start:a,end:a+i[0].length-i[1].length})}const s=/`+[^`]+`+/g;for(const i of e.matchAll(s)){const a=i.index??0,o=a+i[0].length;t.some(l=>a>=l.start&&o<=l.end)||t.push({start:a,end:o})}return t.sort((i,a)=>i.start-a.start),t}function ta(e,t){return t.some(n=>e>=n.start&&e<n.end)}function Il(e,t){return e.trimStart()}function Ml(e,t){if(!e||!El.test(e))return e;let n=e;if(Bt.test(n)){Bt.lastIndex=0;const r=[],l=ea(n);for(const p of n.matchAll(Bt)){const d=p.index??0;r.push({start:d,length:p[0].length,inCode:ta(d,l)})}for(let p=r.length-1;p>=0;p--){const d=r[p];d.inCode||(n=n.slice(0,d.start)+n.slice(d.start+d.length))}}else Bt.lastIndex=0;const s=ea(n);Xi.lastIndex=0;let i="",a=0,o=!1;for(const r of n.matchAll(Xi)){const l=r.index??0,p=r[1]==="/";ta(l,s)||(o?p&&(o=!1):(i+=n.slice(a,l),p||(o=!0)),a=l+r[0].length)}return i+=n.slice(a),Il(i)}function kt(e){return!e&&e!==0?"n/a":new Date(e).toLocaleString()}function O(e){if(!e&&e!==0)return"n/a";const t=Date.now()-e;if(t<0)return"just now";const n=Math.round(t/1e3);if(n<60)return`${n}s ago`;const s=Math.round(n/60);if(s<60)return`${s}m ago`;const i=Math.round(s/60);return i<48?`${i}h ago`:`${Math.round(i/24)}d ago`}function vo(e){if(!e&&e!==0)return"n/a";if(e<1e3)return`${e}ms`;const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const s=Math.round(n/60);return s<48?`${s}h`:`${Math.round(s/24)}d`}function cs(e){return!e||e.length===0?"none":e.filter(t=>!!(t&&t.trim())).join(", ")}function ds(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function mo(e,t){return e.length<=t?{text:e,truncated:!1,total:e.length}:{text:e.slice(0,Math.max(0,t)),truncated:!0,total:e.length}}function Zt(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function Un(e){return Ml(e)}const Ll=/^\[([^\]]+)\]\s*/,Rl=["WebChat","WhatsApp","Telegram","Signal","Slack","Discord","iMessage","Teams","Matrix","Zalo","Zalo Personal","BlueBubbles"],Kn=new WeakMap,Hn=new WeakMap;function Pl(e){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(e)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(e)?!0:Rl.some(t=>e.startsWith(`${t} `))}function zn(e){const t=e.match(Ll);if(!t)return e;const n=t[1]??"";return Pl(n)?e.slice(t[0].length):e}function us(e){const t=e,n=typeof t.role=="string"?t.role:"",s=t.content;if(typeof s=="string")return n==="assistant"?Un(s):zn(s);if(Array.isArray(s)){const i=s.map(a=>{const o=a;return o.type==="text"&&typeof o.text=="string"?o.text:null}).filter(a=>typeof a=="string");if(i.length>0){const a=i.join(`
187
- `);return n==="assistant"?Un(a):zn(a)}}return typeof t.text=="string"?n==="assistant"?Un(t.text):zn(t.text):null}function yo(e){if(!e||typeof e!="object")return us(e);const t=e;if(Kn.has(t))return Kn.get(t)??null;const n=us(e);return Kn.set(t,n),n}function na(e){const n=e.content,s=[];if(Array.isArray(n))for(const r of n){const l=r;if(l.type==="thinking"&&typeof l.thinking=="string"){const p=l.thinking.trim();p&&s.push(p)}}if(s.length>0)return s.join(`
188
- `);const i=Ol(e);if(!i)return null;const o=[...i.matchAll(/<\s*think(?:ing)?\s*>([\s\S]*?)<\s*\/\s*think(?:ing)?\s*>/gi)].map(r=>(r[1]??"").trim()).filter(Boolean);return o.length>0?o.join(`
189
- `):null}function Nl(e){if(!e||typeof e!="object")return na(e);const t=e;if(Hn.has(t))return Hn.get(t)??null;const n=na(e);return Hn.set(t,n),n}function Ol(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const s=n.map(i=>{const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>typeof i=="string");if(s.length>0)return s.join(`
190
- `)}return typeof t.text=="string"?t.text:null}function Dl(e){const t=e.trim();if(!t)return"";const n=t.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>`_${s}_`);return n.length?["_Reasoning:_",...n].join(`
191
- `):""}let sa=!1;function ia(e){e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function Bl(){const e=new Uint8Array(16),t=Date.now();for(let n=0;n<e.length;n++)e[n]=Math.floor(Math.random()*256);return e[0]^=t&255,e[1]^=t>>>8&255,e[2]^=t>>>16&255,e[3]^=t>>>24&255,e}function Fl(){sa||(sa=!0,console.warn("[uuid] crypto API missing; falling back to weak randomness"))}function Fs(e=globalThis.crypto){if(e&&typeof e.randomUUID=="function")return e.randomUUID();if(e&&typeof e.getRandomValues=="function"){const t=new Uint8Array(16);return e.getRandomValues(t),ia(t)}return Fl(),ia(Bl())}async function St(e){if(!(!e.client||!e.connected)){e.chatLoading=!0,e.lastError=null;try{const t=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:200});e.chatMessages=Array.isArray(t.messages)?t.messages:[],e.chatThinkingLevel=t.thinkingLevel??null}catch(t){e.lastError=String(t)}finally{e.chatLoading=!1}}}function Ul(e){const t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}async function Kl(e,t,n){if(!e.client||!e.connected)return null;const s=t.trim(),i=n&&n.length>0;if(!s&&!i)return null;const a=Date.now(),o=[];if(s&&o.push({type:"text",text:s}),i)for(const p of n)o.push({type:"image",source:{type:"base64",media_type:p.mimeType,data:p.dataUrl}});e.chatMessages=[...e.chatMessages,{role:"user",content:o,timestamp:a}],e.chatSending=!0,e.lastError=null;const r=Fs();e.chatRunId=r,e.chatStream="",e.chatStreamStartedAt=a;const l=i?n.map(p=>{const d=Ul(p.dataUrl);return d?{type:"image",mimeType:d.mimeType,content:d.content}:null}).filter(p=>p!==null):void 0;try{return await e.client.request("chat.send",{sessionKey:e.sessionKey,message:s,deliver:!1,idempotencyKey:r,attachments:l}),r}catch(p){const d=String(p);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.lastError=d,e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:"Error: "+d}],timestamp:Date.now()}],null}finally{e.chatSending=!1}}async function Hl(e){if(!e.client||!e.connected)return!1;const t=e.chatRunId;try{return await e.client.request("chat.abort",t?{sessionKey:e.sessionKey,runId:t}:{sessionKey:e.sessionKey}),!0}catch(n){return e.lastError=String(n),!1}}function zl(e,t){if(!t||t.sessionKey!==e.sessionKey)return null;if(t.runId&&e.chatRunId&&t.runId!==e.chatRunId)return t.state==="final"?"final":null;if(t.state==="delta"){const n=us(t.message);if(typeof n=="string"){const s=e.chatStream??"";(!s||n.length>=s.length)&&(e.chatStream=n)}}else t.state==="final"||t.state==="aborted"?(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null):t.state==="error"&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.lastError=t.errorMessage??"chat error");return t.state}async function Ke(e,t){if(!(!e.client||!e.connected)&&!e.sessionsLoading){e.sessionsLoading=!0,e.sessionsError=null;try{const n=t?.includeGlobal??e.sessionsIncludeGlobal,s=t?.includeUnknown??e.sessionsIncludeUnknown,i=t?.activeMinutes??Zt(e.sessionsFilterActive,0),a=t?.limit??Zt(e.sessionsFilterLimit,0),o={includeGlobal:n,includeUnknown:s};i>0&&(o.activeMinutes=i),a>0&&(o.limit=a);const r=await e.client.request("sessions.list",o);r&&(e.sessionsResult=r)}catch(n){e.sessionsError=String(n)}finally{e.sessionsLoading=!1}}}async function jl(e,t,n){if(!e.client||!e.connected)return;const s={key:t};"label"in n&&(s.label=n.label),"thinkingLevel"in n&&(s.thinkingLevel=n.thinkingLevel),"verboseLevel"in n&&(s.verboseLevel=n.verboseLevel),"reasoningLevel"in n&&(s.reasoningLevel=n.reasoningLevel);try{await e.client.request("sessions.patch",s),await Ke(e)}catch(i){e.sessionsError=String(i)}}async function ql(e,t){if(!(!e.client||!e.connected||e.sessionsLoading||!window.confirm(`Delete session "${t}"?
192
-
193
- Deletes the session entry and archives its transcript.`))){e.sessionsLoading=!0,e.sessionsError=null;try{await e.client.request("sessions.delete",{key:t,deleteTranscript:!0}),await Ke(e)}catch(s){e.sessionsError=String(s)}finally{e.sessionsLoading=!1}}}const aa=50,Gl=80,Wl=12e4;function Vl(e){if(!e||typeof e!="object")return null;const t=e;if(typeof t.text=="string")return t.text;const n=t.content;if(!Array.isArray(n))return null;const s=n.map(i=>{if(!i||typeof i!="object")return null;const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>!!i);return s.length===0?null:s.join(`
194
- `)}function oa(e){if(e==null)return null;if(typeof e=="number"||typeof e=="boolean")return String(e);const t=Vl(e);let n;if(typeof e=="string")n=e;else if(t)n=t;else try{n=JSON.stringify(e,null,2)}catch{n=String(e)}const s=mo(n,Wl);return s.truncated?`${s.text}
195
-
196
- … truncated (${s.total} chars, showing first ${s.text.length}).`:s.text}function Yl(e){const t=[];return t.push({type:"toolcall",name:e.name,arguments:e.args??{}}),e.output&&t.push({type:"toolresult",name:e.name,text:e.output}),{role:"assistant",toolCallId:e.toolCallId,runId:e.runId,content:t,timestamp:e.startedAt}}function Ql(e){if(e.toolStreamOrder.length<=aa)return;const t=e.toolStreamOrder.length-aa,n=e.toolStreamOrder.splice(0,t);for(const s of n)e.toolStreamById.delete(s)}function Zl(e){e.chatToolMessages=e.toolStreamOrder.map(t=>e.toolStreamById.get(t)?.message).filter(t=>!!t)}function ps(e){e.toolStreamSyncTimer!=null&&(clearTimeout(e.toolStreamSyncTimer),e.toolStreamSyncTimer=null),Zl(e)}function Jl(e,t=!1){if(t){ps(e);return}e.toolStreamSyncTimer==null&&(e.toolStreamSyncTimer=window.setTimeout(()=>ps(e),Gl))}function dn(e){e.toolStreamById.clear(),e.toolStreamOrder=[],e.chatToolMessages=[],ps(e)}const Xl=5e3;function ec(e,t){const n=t.data??{},s=typeof n.phase=="string"?n.phase:"";e.compactionClearTimer!=null&&(window.clearTimeout(e.compactionClearTimer),e.compactionClearTimer=null),s==="start"?e.compactionStatus={active:!0,startedAt:Date.now(),completedAt:null}:s==="end"&&(e.compactionStatus={active:!1,startedAt:e.compactionStatus?.startedAt??null,completedAt:Date.now()},e.compactionClearTimer=window.setTimeout(()=>{e.compactionStatus=null,e.compactionClearTimer=null},Xl))}function tc(e,t){if(!t)return;if(t.stream==="compaction"){ec(e,t);return}if(t.stream!=="tool")return;const n=typeof t.sessionKey=="string"?t.sessionKey:void 0;if(n&&n!==e.sessionKey||!n&&e.chatRunId&&t.runId!==e.chatRunId||e.chatRunId&&t.runId!==e.chatRunId||!e.chatRunId)return;const s=t.data??{},i=typeof s.toolCallId=="string"?s.toolCallId:"";if(!i)return;const a=typeof s.name=="string"?s.name:"tool",o=typeof s.phase=="string"?s.phase:"",r=o==="start"?s.args:void 0,l=o==="update"?oa(s.partialResult):o==="result"?oa(s.result):void 0,p=Date.now();let d=e.toolStreamById.get(i);d?(d.name=a,r!==void 0&&(d.args=r),l!==void 0&&(d.output=l),d.updatedAt=p):(d={toolCallId:i,runId:t.runId,sessionKey:n,name:a,args:r,output:l,startedAt:typeof t.ts=="number"?t.ts:p,updatedAt:p,message:{}},e.toolStreamById.set(i,d),e.toolStreamOrder.push(i)),d.message=Yl(d),Ql(e),Jl(e,o==="result")}function un(e,t=!1){e.chatScrollFrame&&cancelAnimationFrame(e.chatScrollFrame),e.chatScrollTimeout!=null&&(clearTimeout(e.chatScrollTimeout),e.chatScrollTimeout=null);const n=()=>{const s=e.querySelector(".chat-thread");if(s){const i=getComputedStyle(s).overflowY;if(i==="auto"||i==="scroll"||s.scrollHeight-s.clientHeight>1)return s}return document.scrollingElement??document.documentElement};e.updateComplete.then(()=>{e.chatScrollFrame=requestAnimationFrame(()=>{e.chatScrollFrame=null;const s=n();if(!s)return;const i=s.scrollHeight-s.scrollTop-s.clientHeight;if(!(t||e.chatUserNearBottom||i<200))return;t&&(e.chatHasAutoScrolled=!0),s.scrollTop=s.scrollHeight,e.chatUserNearBottom=!0;const o=t?150:120;e.chatScrollTimeout=window.setTimeout(()=>{e.chatScrollTimeout=null;const r=n();if(!r)return;const l=r.scrollHeight-r.scrollTop-r.clientHeight;(t||e.chatUserNearBottom||l<200)&&(r.scrollTop=r.scrollHeight,e.chatUserNearBottom=!0)},o)})})}function bo(e,t=!1){e.logsScrollFrame&&cancelAnimationFrame(e.logsScrollFrame),e.updateComplete.then(()=>{e.logsScrollFrame=requestAnimationFrame(()=>{e.logsScrollFrame=null;const n=e.querySelector(".log-stream");if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;(t||s<80)&&(n.scrollTop=n.scrollHeight)})})}function nc(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.chatUserNearBottom=s<200}function sc(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.logsAtBottom=s<80}function ic(e){e.chatHasAutoScrolled=!1,e.chatUserNearBottom=!0}function ac(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
197
- `)}
198
- `],{type:"text/plain"}),s=URL.createObjectURL(n),i=document.createElement("a"),a=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");i.href=s,i.download=`openclaw-logs-${t}-${a}.log`,i.click(),URL.revokeObjectURL(s)}function oc(e){if(typeof ResizeObserver>"u")return;const t=e.querySelector(".topbar");if(!t)return;const n=()=>{const{height:s}=t.getBoundingClientRect();e.style.setProperty("--topbar-height",`${s}px`)};n(),e.topbarObserver=new ResizeObserver(()=>n()),e.topbarObserver.observe(t)}function De(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function et(e){return`${JSON.stringify(e,null,2).trimEnd()}
199
- `}function wo(e,t,n){if(t.length===0)return;let s=e;for(let a=0;a<t.length-1;a+=1){const o=t[a],r=t[a+1];if(typeof o=="number"){if(!Array.isArray(s))return;s[o]==null&&(s[o]=typeof r=="number"?[]:{}),s=s[o]}else{if(typeof s!="object"||s==null)return;const l=s;l[o]==null&&(l[o]=typeof r=="number"?[]:{}),s=l[o]}}const i=t[t.length-1];if(typeof i=="number"){Array.isArray(s)&&(s[i]=n);return}typeof s=="object"&&s!=null&&(s[i]=n)}function $o(e,t){if(t.length===0)return;let n=e;for(let i=0;i<t.length-1;i+=1){const a=t[i];if(typeof a=="number"){if(!Array.isArray(n))return;n=n[a]}else{if(typeof n!="object"||n==null)return;n=n[a]}if(n==null)return}const s=t[t.length-1];if(typeof s=="number"){Array.isArray(n)&&n.splice(s,1);return}typeof n=="object"&&n!=null&&delete n[s]}async function ye(e){if(!(!e.client||!e.connected)){e.configLoading=!0,e.lastError=null;try{const t=await e.client.request("config.get",{});lc(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function xo(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});rc(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function rc(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function lc(e,t){e.configSnapshot=t;const n=typeof t.raw=="string"?t.raw:t.config&&typeof t.config=="object"?et(t.config):e.configRaw;!e.configFormDirty||e.configFormMode==="raw"?e.configRaw=n:e.configForm?e.configRaw=et(e.configForm):e.configRaw=n,e.configValid=typeof t.valid=="boolean"?t.valid:null,e.configIssues=Array.isArray(t.issues)?t.issues:[],e.configFormDirty||(e.configForm=De(t.config??{}),e.configFormOriginal=De(t.config??{}),e.configRawOriginal=n)}async function hs(e){if(!(!e.client||!e.connected)){e.configSaving=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?et(e.configForm):e.configRaw,n=e.configSnapshot?.hash;if(!n){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.set",{raw:t,baseHash:n}),e.configFormDirty=!1,await ye(e)}catch(t){e.lastError=String(t)}finally{e.configSaving=!1}}}async function cc(e){if(!(!e.client||!e.connected)){e.configApplying=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?et(e.configForm):e.configRaw,n=e.configSnapshot?.hash;if(!n){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.apply",{raw:t,baseHash:n,sessionKey:e.applySessionKey}),e.configFormDirty=!1,await ye(e)}catch(t){e.lastError=String(t)}finally{e.configApplying=!1}}}async function dc(e){if(!(!e.client||!e.connected)){e.updateRunning=!0,e.lastError=null;try{await e.client.request("update.run",{sessionKey:e.applySessionKey})}catch(t){e.lastError=String(t)}finally{e.updateRunning=!1}}}function Ft(e,t,n){const s=De(e.configForm??e.configSnapshot?.config??{});wo(s,t,n),e.configForm=s,e.configFormDirty=!0,e.configFormMode==="form"&&(e.configRaw=et(s))}function ra(e,t){const n=De(e.configForm??e.configSnapshot?.config??{});$o(n,t),e.configForm=n,e.configFormDirty=!0,e.configFormMode==="form"&&(e.configRaw=et(n))}async function Tt(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("cron.status",{});e.cronStatus=t}catch(t){e.cronError=String(t)}}async function pn(e){if(!(!e.client||!e.connected)&&!e.cronLoading){e.cronLoading=!0,e.cronError=null;try{const t=await e.client.request("cron.list",{includeDisabled:!0});e.cronJobs=Array.isArray(t.jobs)?t.jobs:[]}catch(t){e.cronError=String(t)}finally{e.cronLoading=!1}}}function uc(e){if(e.scheduleKind==="at"){const n=Date.parse(e.scheduleAt);if(!Number.isFinite(n))throw new Error("Invalid run time.");return{kind:"at",atMs:n}}if(e.scheduleKind==="every"){const n=Zt(e.everyAmount,0);if(n<=0)throw new Error("Invalid interval amount.");const s=e.everyUnit;return{kind:"every",everyMs:n*(s==="minutes"?6e4:s==="hours"?36e5:864e5)}}const t=e.cronExpr.trim();if(!t)throw new Error("Cron expression required.");return{kind:"cron",expr:t,tz:e.cronTz.trim()||void 0}}function pc(e){if(e.payloadKind==="systemEvent"){const i=e.payloadText.trim();if(!i)throw new Error("System event text required.");return{kind:"systemEvent",text:i}}const t=e.payloadText.trim();if(!t)throw new Error("Agent message required.");const n={kind:"agentTurn",message:t};e.deliver&&(n.deliver=!0),e.channel&&(n.channel=e.channel),e.to.trim()&&(n.to=e.to.trim());const s=Zt(e.timeoutSeconds,0);return s>0&&(n.timeoutSeconds=s),n}async function hc(e){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const t=uc(e.cronForm),n=pc(e.cronForm),s=e.cronForm.agentId.trim(),i={name:e.cronForm.name.trim(),description:e.cronForm.description.trim()||void 0,agentId:s||void 0,enabled:e.cronForm.enabled,schedule:t,sessionTarget:e.cronForm.sessionTarget,wakeMode:e.cronForm.wakeMode,payload:n,isolation:e.cronForm.postToMainPrefix.trim()&&e.cronForm.sessionTarget==="isolated"?{postToMainPrefix:e.cronForm.postToMainPrefix.trim()}:void 0};if(!i.name)throw new Error("Name required.");await e.client.request("cron.add",i),e.cronForm={...e.cronForm,name:"",description:"",payloadText:""},await pn(e),await Tt(e)}catch(t){e.cronError=String(t)}finally{e.cronBusy=!1}}}async function fc(e,t,n){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.update",{id:t.id,patch:{enabled:n}}),await pn(e),await Tt(e)}catch(s){e.cronError=String(s)}finally{e.cronBusy=!1}}}async function gc(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.run",{id:t.id,mode:"force"}),await Ao(e,t.id)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function vc(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.remove",{id:t.id}),e.cronRunsJobId===t.id&&(e.cronRunsJobId=null,e.cronRuns=[]),await pn(e),await Tt(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function Ao(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("cron.runs",{id:t,limit:50});e.cronRunsJobId=t,e.cronRuns=Array.isArray(n.entries)?n.entries:[]}catch(n){e.cronError=String(n)}}async function oe(e,t){if(!(!e.client||!e.connected)&&!e.channelsLoading){e.channelsLoading=!0,e.channelsError=null;try{const n=await e.client.request("channels.status",{probe:t,timeoutMs:8e3});e.channelsSnapshot=n,e.channelsLastSuccess=Date.now()}catch(n){e.channelsError=String(n)}finally{e.channelsLoading=!1}}}async function mc(e,t){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const n=await e.client.request("web.login.start",{force:t,timeoutMs:3e4});e.whatsappLoginMessage=n.message??null,e.whatsappLoginQrDataUrl=n.qrDataUrl??null,e.whatsappLoginConnected=null}catch(n){e.whatsappLoginMessage=String(n),e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function yc(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const t=await e.client.request("web.login.wait",{timeoutMs:12e4});e.whatsappLoginMessage=t.message??null,e.whatsappLoginConnected=t.connected??null,t.connected&&(e.whatsappLoginQrDataUrl=null)}catch(t){e.whatsappLoginMessage=String(t),e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function bc(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{await e.client.request("channels.logout",{channel:"whatsapp"}),e.whatsappLoginMessage="Logged out.",e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}catch(t){e.whatsappLoginMessage=String(t)}finally{e.whatsappBusy=!1}}}async function hn(e){if(!(!e.client||!e.connected)&&!e.debugLoading){e.debugLoading=!0;try{const[t,n,s,i]=await Promise.all([e.client.request("status",{}),e.client.request("health",{}),e.client.request("models.list",{}),e.client.request("last-heartbeat",{})]);e.debugStatus=t,e.debugHealth=n;const a=s;e.debugModels=Array.isArray(a?.models)?a?.models:[],e.debugHeartbeat=i}catch(t){e.debugCallError=String(t)}finally{e.debugLoading=!1}}}async function wc(e){if(!(!e.client||!e.connected)){e.debugCallError=null,e.debugCallResult=null;try{const t=e.debugCallParams.trim()?JSON.parse(e.debugCallParams):{},n=await e.client.request(e.debugCallMethod.trim(),t);e.debugCallResult=JSON.stringify(n,null,2)}catch(t){e.debugCallError=String(t)}}}const $c=2e3,xc=new Set(["trace","debug","info","warn","error","fatal"]);function Ac(e){if(typeof e!="string")return null;const t=e.trim();if(!t.startsWith("{")||!t.endsWith("}"))return null;try{const n=JSON.parse(t);return!n||typeof n!="object"?null:n}catch{return null}}function kc(e){if(typeof e!="string")return null;const t=e.toLowerCase();return xc.has(t)?t:null}function Sc(e){if(!e.trim())return{raw:e,message:e};try{const t=JSON.parse(e),n=t&&typeof t._meta=="object"&&t._meta!==null?t._meta:null,s=typeof t.time=="string"?t.time:typeof n?.date=="string"?n?.date:null,i=kc(n?.logLevelName??n?.level),a=typeof t[0]=="string"?t[0]:typeof n?.name=="string"?n?.name:null,o=Ac(a);let r=null;o&&(typeof o.subsystem=="string"?r=o.subsystem:typeof o.module=="string"&&(r=o.module)),!r&&a&&a.length<120&&(r=a);let l=null;return typeof t[1]=="string"?l=t[1]:!o&&typeof t[0]=="string"?l=t[0]:typeof t.message=="string"&&(l=t.message),{raw:e,time:s,level:i,subsystem:r,message:l??e,meta:n??void 0}}catch{return{raw:e,message:e}}}async function Us(e,t){if(!(!e.client||!e.connected)&&!(e.logsLoading&&!t?.quiet)){t?.quiet||(e.logsLoading=!0),e.logsError=null;try{const s=await e.client.request("logs.tail",{cursor:t?.reset?void 0:e.logsCursor??void 0,limit:e.logsLimit,maxBytes:e.logsMaxBytes}),a=(Array.isArray(s.lines)?s.lines.filter(r=>typeof r=="string"):[]).map(Sc),o=!!(t?.reset||s.reset||e.logsCursor==null);e.logsEntries=o?a:[...e.logsEntries,...a].slice(-$c),typeof s.cursor=="number"&&(e.logsCursor=s.cursor),typeof s.file=="string"&&(e.logsFile=s.file),e.logsTruncated=!!s.truncated,e.logsLastFetchAt=Date.now()}catch(n){e.logsError=String(n)}finally{t?.quiet||(e.logsLoading=!1)}}}const ko={p:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,n:0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,h:8n,a:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,d:0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,Gx:0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,Gy:0x6666666666666666666666666666666666666666666666666666666666666658n},{p:G,n:Wt,Gx:la,Gy:ca,a:jn,d:qn,h:_c}=ko,Be=32,Ks=64,Cc=(...e)=>{"captureStackTrace"in Error&&typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(...e)},H=(e="")=>{const t=new Error(e);throw Cc(t,H),t},Tc=e=>typeof e=="bigint",Ec=e=>typeof e=="string",Ic=e=>e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array",_e=(e,t,n="")=>{const s=Ic(e),i=e?.length,a=t!==void 0;if(!s||a&&i!==t){const o=n&&`"${n}" `,r=a?` of length ${t}`:"",l=s?`length=${i}`:`type=${typeof e}`;H(o+"expected Uint8Array"+r+", got "+l)}return e},fn=e=>new Uint8Array(e),So=e=>Uint8Array.from(e),_o=(e,t)=>e.toString(16).padStart(t,"0"),Co=e=>Array.from(_e(e)).map(t=>_o(t,2)).join(""),ve={_0:48,_9:57,A:65,F:70,a:97,f:102},da=e=>{if(e>=ve._0&&e<=ve._9)return e-ve._0;if(e>=ve.A&&e<=ve.F)return e-(ve.A-10);if(e>=ve.a&&e<=ve.f)return e-(ve.a-10)},To=e=>{const t="hex invalid";if(!Ec(e))return H(t);const n=e.length,s=n/2;if(n%2)return H(t);const i=fn(s);for(let a=0,o=0;a<s;a++,o+=2){const r=da(e.charCodeAt(o)),l=da(e.charCodeAt(o+1));if(r===void 0||l===void 0)return H(t);i[a]=r*16+l}return i},Eo=()=>globalThis?.crypto,Mc=()=>Eo()?.subtle??H("crypto.subtle must be defined, consider polyfill"),_t=(...e)=>{const t=fn(e.reduce((s,i)=>s+_e(i).length,0));let n=0;return e.forEach(s=>{t.set(s,n),n+=s.length}),t},Lc=(e=Be)=>Eo().getRandomValues(fn(e)),Jt=BigInt,Re=(e,t,n,s="bad number: out of range")=>Tc(e)&&t<=e&&e<n?e:H(s),k=(e,t=G)=>{const n=e%t;return n>=0n?n:t+n},Io=e=>k(e,Wt),Rc=(e,t)=>{(e===0n||t<=0n)&&H("no inverse n="+e+" mod="+t);let n=k(e,t),s=t,i=0n,a=1n;for(;n!==0n;){const o=s/n,r=s%n,l=i-a*o;s=n,n=r,i=a,a=l}return s===1n?k(i,t):H("no inverse")},Pc=e=>{const t=Po[e];return typeof t!="function"&&H("hashes."+e+" not set"),t},Gn=e=>e instanceof ee?e:H("Point expected"),fs=2n**256n;class ee{static BASE;static ZERO;X;Y;Z;T;constructor(t,n,s,i){const a=fs;this.X=Re(t,0n,a),this.Y=Re(n,0n,a),this.Z=Re(s,1n,a),this.T=Re(i,0n,a),Object.freeze(this)}static CURVE(){return ko}static fromAffine(t){return new ee(t.x,t.y,1n,k(t.x*t.y))}static fromBytes(t,n=!1){const s=qn,i=So(_e(t,Be)),a=t[31];i[31]=a&-129;const o=Lo(i);Re(o,0n,n?fs:G);const l=k(o*o),p=k(l-1n),d=k(s*l+1n);let{isValid:u,value:g}=Oc(p,d);u||H("bad point: y not sqrt");const v=(g&1n)===1n,y=(a&128)!==0;return!n&&g===0n&&y&&H("bad point: x==0, isLastByteOdd"),y!==v&&(g=k(-g)),new ee(g,o,1n,k(g*o))}static fromHex(t,n){return ee.fromBytes(To(t),n)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}assertValidity(){const t=jn,n=qn,s=this;if(s.is0())return H("bad point: ZERO");const{X:i,Y:a,Z:o,T:r}=s,l=k(i*i),p=k(a*a),d=k(o*o),u=k(d*d),g=k(l*t),v=k(d*k(g+p)),y=k(u+k(n*k(l*p)));if(v!==y)return H("bad point: equation left != right (1)");const $=k(i*a),A=k(o*r);return $!==A?H("bad point: equation left != right (2)"):this}equals(t){const{X:n,Y:s,Z:i}=this,{X:a,Y:o,Z:r}=Gn(t),l=k(n*r),p=k(a*i),d=k(s*r),u=k(o*i);return l===p&&d===u}is0(){return this.equals(Ze)}negate(){return new ee(k(-this.X),this.Y,this.Z,k(-this.T))}double(){const{X:t,Y:n,Z:s}=this,i=jn,a=k(t*t),o=k(n*n),r=k(2n*k(s*s)),l=k(i*a),p=t+n,d=k(k(p*p)-a-o),u=l+o,g=u-r,v=l-o,y=k(d*g),$=k(u*v),A=k(d*v),_=k(g*u);return new ee(y,$,_,A)}add(t){const{X:n,Y:s,Z:i,T:a}=this,{X:o,Y:r,Z:l,T:p}=Gn(t),d=jn,u=qn,g=k(n*o),v=k(s*r),y=k(a*u*p),$=k(i*l),A=k((n+s)*(o+r)-g-v),_=k($-y),M=k($+y),P=k(v-d*g),I=k(A*_),T=k(M*P),E=k(A*P),pe=k(_*M);return new ee(I,T,pe,E)}subtract(t){return this.add(Gn(t).negate())}multiply(t,n=!0){if(!n&&(t===0n||this.is0()))return Ze;if(Re(t,1n,Wt),t===1n)return this;if(this.equals(Fe))return Wc(t).p;let s=Ze,i=Fe;for(let a=this;t>0n;a=a.double(),t>>=1n)t&1n?s=s.add(a):n&&(i=i.add(a));return s}multiplyUnsafe(t){return this.multiply(t,!1)}toAffine(){const{X:t,Y:n,Z:s}=this;if(this.equals(Ze))return{x:0n,y:1n};const i=Rc(s,G);k(s*i)!==1n&&H("invalid inverse");const a=k(t*i),o=k(n*i);return{x:a,y:o}}toBytes(){const{x:t,y:n}=this.assertValidity().toAffine(),s=Mo(n);return s[31]|=t&1n?128:0,s}toHex(){return Co(this.toBytes())}clearCofactor(){return this.multiply(Jt(_c),!1)}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){let t=this.multiply(Wt/2n,!1).double();return Wt%2n&&(t=t.add(this)),t.is0()}}const Fe=new ee(la,ca,1n,k(la*ca)),Ze=new ee(0n,1n,1n,0n);ee.BASE=Fe;ee.ZERO=Ze;const Mo=e=>To(_o(Re(e,0n,fs),Ks)).reverse(),Lo=e=>Jt("0x"+Co(So(_e(e)).reverse())),ce=(e,t)=>{let n=e;for(;t-- >0n;)n*=n,n%=G;return n},Nc=e=>{const n=e*e%G*e%G,s=ce(n,2n)*n%G,i=ce(s,1n)*e%G,a=ce(i,5n)*i%G,o=ce(a,10n)*a%G,r=ce(o,20n)*o%G,l=ce(r,40n)*r%G,p=ce(l,80n)*l%G,d=ce(p,80n)*l%G,u=ce(d,10n)*a%G;return{pow_p_5_8:ce(u,2n)*e%G,b2:n}},ua=0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n,Oc=(e,t)=>{const n=k(t*t*t),s=k(n*n*t),i=Nc(e*s).pow_p_5_8;let a=k(e*n*i);const o=k(t*a*a),r=a,l=k(a*ua),p=o===e,d=o===k(-e),u=o===k(-e*ua);return p&&(a=r),(d||u)&&(a=l),(k(a)&1n)===1n&&(a=k(-a)),{isValid:p||d,value:a}},gs=e=>Io(Lo(e)),Hs=(...e)=>Po.sha512Async(_t(...e)),Dc=(...e)=>Pc("sha512")(_t(...e)),Ro=e=>{const t=e.slice(0,Be);t[0]&=248,t[31]&=127,t[31]|=64;const n=e.slice(Be,Ks),s=gs(t),i=Fe.multiply(s),a=i.toBytes();return{head:t,prefix:n,scalar:s,point:i,pointBytes:a}},zs=e=>Hs(_e(e,Be)).then(Ro),Bc=e=>Ro(Dc(_e(e,Be))),Fc=e=>zs(e).then(t=>t.pointBytes),Uc=e=>Hs(e.hashable).then(e.finish),Kc=(e,t,n)=>{const{pointBytes:s,scalar:i}=e,a=gs(t),o=Fe.multiply(a).toBytes();return{hashable:_t(o,s,n),finish:p=>{const d=Io(a+gs(p)*i);return _e(_t(o,Mo(d)),Ks)}}},Hc=async(e,t)=>{const n=_e(e),s=await zs(t),i=await Hs(s.prefix,n);return Uc(Kc(s,i,n))},Po={sha512Async:async e=>{const t=Mc(),n=_t(e);return fn(await t.digest("SHA-512",n.buffer))},sha512:void 0},zc=(e=Lc(Be))=>e,jc={getExtendedPublicKeyAsync:zs,getExtendedPublicKey:Bc,randomSecretKey:zc},Xt=8,qc=256,No=Math.ceil(qc/Xt)+1,vs=2**(Xt-1),Gc=()=>{const e=[];let t=Fe,n=t;for(let s=0;s<No;s++){n=t,e.push(n);for(let i=1;i<vs;i++)n=n.add(t),e.push(n);t=n.double()}return e};let pa;const ha=(e,t)=>{const n=t.negate();return e?n:t},Wc=e=>{const t=pa||(pa=Gc());let n=Ze,s=Fe;const i=2**Xt,a=i,o=Jt(i-1),r=Jt(Xt);for(let l=0;l<No;l++){let p=Number(e&o);e>>=r,p>vs&&(p-=a,e+=1n);const d=l*vs,u=d,g=d+Math.abs(p)-1,v=l%2!==0,y=p<0;p===0?s=s.add(ha(v,t[u])):n=n.add(ha(y,t[g]))}return e!==0n&&H("invalid wnaf"),{p:n,f:s}},Wn="openclaw-device-identity-v1";function ms(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/g,"")}function Oo(e){const t=e.replaceAll("-","+").replaceAll("_","/"),n=t+"=".repeat((4-t.length%4)%4),s=atob(n),i=new Uint8Array(s.length);for(let a=0;a<s.length;a+=1)i[a]=s.charCodeAt(a);return i}function Vc(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Do(e){const t=await crypto.subtle.digest("SHA-256",e);return Vc(new Uint8Array(t))}async function Yc(){const e=jc.randomSecretKey(),t=await Fc(e);return{deviceId:await Do(t),publicKey:ms(t),privateKey:ms(e)}}async function js(){try{const n=localStorage.getItem(Wn);if(n){const s=JSON.parse(n);if(s?.version===1&&typeof s.deviceId=="string"&&typeof s.publicKey=="string"&&typeof s.privateKey=="string"){const i=await Do(Oo(s.publicKey));if(i!==s.deviceId){const a={...s,deviceId:i};return localStorage.setItem(Wn,JSON.stringify(a)),{deviceId:i,publicKey:s.publicKey,privateKey:s.privateKey}}return{deviceId:s.deviceId,publicKey:s.publicKey,privateKey:s.privateKey}}}}catch{}const e=await Yc(),t={version:1,deviceId:e.deviceId,publicKey:e.publicKey,privateKey:e.privateKey,createdAtMs:Date.now()};return localStorage.setItem(Wn,JSON.stringify(t)),e}async function Qc(e,t){const n=Oo(e),s=new TextEncoder().encode(t),i=await Hc(s,n);return ms(i)}const Bo="openclaw.device.auth.v1";function qs(e){return e.trim()}function Zc(e){if(!Array.isArray(e))return[];const t=new Set;for(const n of e){const s=n.trim();s&&t.add(s)}return[...t].sort()}function Gs(){try{const e=window.localStorage.getItem(Bo);if(!e)return null;const t=JSON.parse(e);return!t||t.version!==1||!t.deviceId||typeof t.deviceId!="string"||!t.tokens||typeof t.tokens!="object"?null:t}catch{return null}}function Fo(e){try{window.localStorage.setItem(Bo,JSON.stringify(e))}catch{}}function Jc(e){const t=Gs();if(!t||t.deviceId!==e.deviceId)return null;const n=qs(e.role),s=t.tokens[n];return!s||typeof s.token!="string"?null:s}function Uo(e){const t=qs(e.role),n={version:1,deviceId:e.deviceId,tokens:{}},s=Gs();s&&s.deviceId===e.deviceId&&(n.tokens={...s.tokens});const i={token:e.token,role:t,scopes:Zc(e.scopes),updatedAtMs:Date.now()};return n.tokens[t]=i,Fo(n),i}function Ko(e){const t=Gs();if(!t||t.deviceId!==e.deviceId)return;const n=qs(e.role);if(!t.tokens[n])return;const s={...t,tokens:{...t.tokens}};delete s.tokens[n],Fo(s)}async function Ce(e,t){if(!(!e.client||!e.connected)&&!e.devicesLoading){e.devicesLoading=!0,t?.quiet||(e.devicesError=null);try{const n=await e.client.request("device.pair.list",{});e.devicesList={pending:Array.isArray(n?.pending)?n.pending:[],paired:Array.isArray(n?.paired)?n.paired:[]}}catch(n){t?.quiet||(e.devicesError=String(n))}finally{e.devicesLoading=!1}}}async function Xc(e,t){if(!(!e.client||!e.connected))try{await e.client.request("device.pair.approve",{requestId:t}),await Ce(e)}catch(n){e.devicesError=String(n)}}async function ed(e,t){if(!(!e.client||!e.connected||!window.confirm("Reject this device pairing request?")))try{await e.client.request("device.pair.reject",{requestId:t}),await Ce(e)}catch(s){e.devicesError=String(s)}}async function td(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("device.token.rotate",t);if(n?.token){const s=await js(),i=n.role??t.role;(n.deviceId===s.deviceId||t.deviceId===s.deviceId)&&Uo({deviceId:s.deviceId,role:i,token:n.token,scopes:n.scopes??t.scopes??[]}),window.prompt("New device token (copy and store securely):",n.token)}await Ce(e)}catch(n){e.devicesError=String(n)}}async function nd(e,t){if(!(!e.client||!e.connected||!window.confirm(`Revoke token for ${t.deviceId} (${t.role})?`)))try{await e.client.request("device.token.revoke",t);const s=await js();t.deviceId===s.deviceId&&Ko({deviceId:s.deviceId,role:t.role}),await Ce(e)}catch(s){e.devicesError=String(s)}}async function gn(e,t){if(!(!e.client||!e.connected)&&!e.nodesLoading){e.nodesLoading=!0,t?.quiet||(e.lastError=null);try{const n=await e.client.request("node.list",{});e.nodes=Array.isArray(n.nodes)?n.nodes:[]}catch(n){t?.quiet||(e.lastError=String(n))}finally{e.nodesLoading=!1}}}function sd(e){if(!e||e.kind==="gateway")return{method:"exec.approvals.get",params:{}};const t=e.nodeId.trim();return t?{method:"exec.approvals.node.get",params:{nodeId:t}}:null}function id(e,t){if(!e||e.kind==="gateway")return{method:"exec.approvals.set",params:t};const n=e.nodeId.trim();return n?{method:"exec.approvals.node.set",params:{...t,nodeId:n}}:null}async function Ws(e,t){if(!(!e.client||!e.connected)&&!e.execApprovalsLoading){e.execApprovalsLoading=!0,e.lastError=null;try{const n=sd(t);if(!n){e.lastError="Select a node before loading exec approvals.";return}const s=await e.client.request(n.method,n.params);ad(e,s)}catch(n){e.lastError=String(n)}finally{e.execApprovalsLoading=!1}}}function ad(e,t){e.execApprovalsSnapshot=t,e.execApprovalsDirty||(e.execApprovalsForm=De(t.file??{}))}async function od(e,t){if(!(!e.client||!e.connected)){e.execApprovalsSaving=!0,e.lastError=null;try{const n=e.execApprovalsSnapshot?.hash;if(!n){e.lastError="Exec approvals hash missing; reload and retry.";return}const s=e.execApprovalsForm??e.execApprovalsSnapshot?.file??{},i=id(t,{file:s,baseHash:n});if(!i){e.lastError="Select a node before saving exec approvals.";return}await e.client.request(i.method,i.params),e.execApprovalsDirty=!1,await Ws(e,t)}catch(n){e.lastError=String(n)}finally{e.execApprovalsSaving=!1}}}function rd(e,t,n){const s=De(e.execApprovalsForm??e.execApprovalsSnapshot?.file??{});wo(s,t,n),e.execApprovalsForm=s,e.execApprovalsDirty=!0}function ld(e,t){const n=De(e.execApprovalsForm??e.execApprovalsSnapshot?.file??{});$o(n,t),e.execApprovalsForm=n,e.execApprovalsDirty=!0}async function Vs(e){if(!(!e.client||!e.connected)&&!e.presenceLoading){e.presenceLoading=!0,e.presenceError=null,e.presenceStatus=null;try{const t=await e.client.request("system-presence",{});Array.isArray(t)?(e.presenceEntries=t,e.presenceStatus=t.length===0?"No instances yet.":null):(e.presenceEntries=[],e.presenceStatus="No presence payload.")}catch(t){e.presenceError=String(t)}finally{e.presenceLoading=!1}}}function tt(e,t,n){if(!t.trim())return;const s={...e.skillMessages};n?s[t]=n:delete s[t],e.skillMessages=s}function vn(e){return e instanceof Error?e.message:String(e)}async function Et(e,t){if(t?.clearMessages&&Object.keys(e.skillMessages).length>0&&(e.skillMessages={}),!(!e.client||!e.connected)&&!e.skillsLoading){e.skillsLoading=!0,e.skillsError=null;try{const n=await e.client.request("skills.status",{});n&&(e.skillsReport=n)}catch(n){e.skillsError=vn(n)}finally{e.skillsLoading=!1}}}function cd(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function dd(e,t,n){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{await e.client.request("skills.update",{skillKey:t,enabled:n}),await Et(e),tt(e,t,{kind:"success",message:n?"Skill enabled":"Skill disabled"})}catch(s){const i=vn(s);e.skillsError=i,tt(e,t,{kind:"error",message:i})}finally{e.skillsBusyKey=null}}}async function ud(e,t){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const n=e.skillEdits[t]??"";await e.client.request("skills.update",{skillKey:t,apiKey:n}),await Et(e),tt(e,t,{kind:"success",message:"API key saved"})}catch(n){const s=vn(n);e.skillsError=s,tt(e,t,{kind:"error",message:s})}finally{e.skillsBusyKey=null}}}async function pd(e,t,n,s){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const i=await e.client.request("skills.install",{name:n,installId:s,timeoutMs:12e4});await Et(e),tt(e,t,{kind:"success",message:i?.message??"Installed"})}catch(i){const a=vn(i);e.skillsError=a,tt(e,t,{kind:"error",message:a})}finally{e.skillsBusyKey=null}}}function hd(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Ys(e){return e==="system"?hd():e}const Ut=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,fd=()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches??!1,Kt=e=>{e.classList.remove("theme-transition"),e.style.removeProperty("--theme-switch-x"),e.style.removeProperty("--theme-switch-y")},gd=({nextTheme:e,applyTheme:t,context:n,currentTheme:s})=>{if(s===e)return;const i=globalThis.document??null;if(!i){t();return}const a=i.documentElement,o=i,r=fd();if(!!o.startViewTransition&&!r){let p=.5,d=.5;if(n?.pointerClientX!==void 0&&n?.pointerClientY!==void 0&&typeof window<"u")p=Ut(n.pointerClientX/window.innerWidth),d=Ut(n.pointerClientY/window.innerHeight);else if(n?.element){const u=n.element.getBoundingClientRect();u.width>0&&u.height>0&&typeof window<"u"&&(p=Ut((u.left+u.width/2)/window.innerWidth),d=Ut((u.top+u.height/2)/window.innerHeight))}a.style.setProperty("--theme-switch-x",`${p*100}%`),a.style.setProperty("--theme-switch-y",`${d*100}%`),a.classList.add("theme-transition");try{const u=o.startViewTransition?.(()=>{t()});u?.finished?u.finished.finally(()=>Kt(a)):Kt(a)}catch{Kt(a),t()}return}t(),Kt(a)};function vd(e){e.nodesPollInterval==null&&(e.nodesPollInterval=window.setInterval(()=>{gn(e,{quiet:!0})},5e3))}function md(e){e.nodesPollInterval!=null&&(clearInterval(e.nodesPollInterval),e.nodesPollInterval=null)}function Qs(e){e.logsPollInterval==null&&(e.logsPollInterval=window.setInterval(()=>{e.tab==="logs"&&Us(e,{quiet:!0})},2e3))}function Zs(e){e.logsPollInterval!=null&&(clearInterval(e.logsPollInterval),e.logsPollInterval=null)}function Js(e){e.debugPollInterval==null&&(e.debugPollInterval=window.setInterval(()=>{e.tab==="debug"&&hn(e)},3e3))}function Xs(e){e.debugPollInterval!=null&&(clearInterval(e.debugPollInterval),e.debugPollInterval=null)}function Se(e,t){const n={...t,lastActiveSessionKey:t.lastActiveSessionKey?.trim()||t.sessionKey.trim()||"main"};e.settings=n,kl(n),t.theme!==e.theme&&(e.theme=t.theme,mn(e,Ys(t.theme))),e.applySessionKey=e.settings.lastActiveSessionKey}function Ho(e,t){const n=t.trim();n&&e.settings.lastActiveSessionKey!==n&&Se(e,{...e.settings,lastActiveSessionKey:n})}function yd(e){if(!window.location.search)return;const t=new URLSearchParams(window.location.search),n=t.get("token"),s=t.get("password"),i=t.get("session"),a=t.get("gatewayUrl");let o=!1;if(n!=null){const l=n.trim();l&&l!==e.settings.token&&Se(e,{...e.settings,token:l}),t.delete("token"),o=!0}if(s!=null){const l=s.trim();l&&(e.password=l),t.delete("password"),o=!0}if(i!=null){const l=i.trim();l&&(e.sessionKey=l,Se(e,{...e.settings,sessionKey:l,lastActiveSessionKey:l}))}if(a!=null){const l=a.trim();l&&l!==e.settings.gatewayUrl&&(e.pendingGatewayUrl=l),t.delete("gatewayUrl"),o=!0}if(!o)return;const r=new URL(window.location.href);r.search=t.toString(),window.history.replaceState({},"",r.toString())}function bd(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?Qs(e):Zs(e),t==="debug"?Js(e):Xs(e),ei(e),jo(e,t,!1)}function wd(e,t,n){gd({nextTheme:t,applyTheme:()=>{e.theme=t,Se(e,{...e.settings,theme:t}),mn(e,Ys(t))},context:n,currentTheme:e.theme})}async function ei(e){e.tab==="overview"&&await qo(e),e.tab==="channels"&&await Td(e),e.tab==="instances"&&await Vs(e),e.tab==="sessions"&&await Ke(e),e.tab==="cron"&&await ti(e),e.tab==="skills"&&await Et(e),e.tab==="nodes"&&(await gn(e),await Ce(e),await ye(e),await Ws(e)),e.tab==="chat"&&(await Zo(e),un(e,!e.chatHasAutoScrolled)),e.tab==="config"&&(await xo(e),await ye(e)),e.tab==="debug"&&(await hn(e),e.eventLog=e.eventLogBuffer),e.tab==="logs"&&(e.logsAtBottom=!0,await Us(e,{reset:!0}),bo(e,!0))}function $d(){if(typeof window>"u")return"";const e=window.__OPENCLAW_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?cn(e):_l(window.location.pathname)}function xd(e){e.theme=e.settings.theme??"system",mn(e,Ys(e.theme))}function mn(e,t){if(e.themeResolved=t,typeof document>"u")return;const n=document.documentElement;n.dataset.theme=t,n.style.colorScheme=t}function Ad(e){if(typeof window>"u"||typeof window.matchMedia!="function")return;if(e.themeMedia=window.matchMedia("(prefers-color-scheme: dark)"),e.themeMediaHandler=n=>{e.theme==="system"&&mn(e,n.matches?"dark":"light")},typeof e.themeMedia.addEventListener=="function"){e.themeMedia.addEventListener("change",e.themeMediaHandler);return}e.themeMedia.addListener(e.themeMediaHandler)}function kd(e){if(!e.themeMedia||!e.themeMediaHandler)return;if(typeof e.themeMedia.removeEventListener=="function"){e.themeMedia.removeEventListener("change",e.themeMediaHandler);return}e.themeMedia.removeListener(e.themeMediaHandler),e.themeMedia=null,e.themeMediaHandler=null}function Sd(e,t){if(typeof window>"u")return;const n=go(window.location.pathname,e.basePath)??"chat";zo(e,n),jo(e,n,t)}function _d(e){if(typeof window>"u")return;const t=go(window.location.pathname,e.basePath);if(!t)return;const s=new URL(window.location.href).searchParams.get("session")?.trim();s&&(e.sessionKey=s,Se(e,{...e.settings,sessionKey:s,lastActiveSessionKey:s})),zo(e,t)}function zo(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?Qs(e):Zs(e),t==="debug"?Js(e):Xs(e),e.connected&&ei(e)}function jo(e,t,n){if(typeof window>"u")return;const s=At(Bs(t,e.basePath)),i=At(window.location.pathname),a=new URL(window.location.href);t==="chat"&&e.sessionKey?a.searchParams.set("session",e.sessionKey):a.searchParams.delete("session"),i!==s&&(a.pathname=s),n?window.history.replaceState({},"",a.toString()):window.history.pushState({},"",a.toString())}function Cd(e,t,n){if(typeof window>"u")return;const s=new URL(window.location.href);s.searchParams.set("session",t),window.history.replaceState({},"",s.toString())}async function qo(e){await Promise.all([oe(e,!1),Vs(e),Ke(e),Tt(e),hn(e)])}async function Td(e){await Promise.all([oe(e,!0),xo(e),ye(e)])}async function ti(e){await Promise.all([oe(e,!1),Tt(e),pn(e)])}const Go=10;function Wo(e){return e.chatSending||!!e.chatRunId}function Ed(e){const t=e.trim();if(!t)return!1;const n=t.toLowerCase();return n==="/stop"?!0:n==="stop"||n==="esc"||n==="abort"||n==="wait"||n==="exit"}function Id(e){const t=e.trim();if(!t)return!1;const n=t.toLowerCase();return n==="/new"||n==="/reset"?!0:n.startsWith("/new ")||n.startsWith("/reset ")}async function Vo(e){e.connected&&(e.chatMessage="",await Hl(e))}function Md(e,t,n,s){const i=t.trim(),a=!!(n&&n.length>0);!i&&!a||(e.chatQueue=[...e.chatQueue,{id:Fs(),text:i,createdAt:Date.now(),attachments:a?n?.map(o=>({...o})):void 0,refreshSessions:s}])}async function Yo(e,t,n){dn(e);const s=await Kl(e,t,n?.attachments),i=!!s;return!i&&n?.previousDraft!=null&&(e.chatMessage=n.previousDraft),!i&&n?.previousAttachments&&(e.chatAttachments=n.previousAttachments),i&&Ho(e,e.sessionKey),i&&n?.restoreDraft&&n.previousDraft?.trim()&&(e.chatMessage=n.previousDraft),i&&n?.restoreAttachments&&n.previousAttachments?.length&&(e.chatAttachments=n.previousAttachments),un(e),i&&!e.chatRunId&&Qo(e),i&&n?.refreshSessions&&s&&e.refreshSessionsAfterChat.add(s),i}async function Qo(e){if(!e.connected||Wo(e))return;const[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n,await Yo(e,t.text,{attachments:t.attachments,refreshSessions:t.refreshSessions})||(e.chatQueue=[t,...e.chatQueue])}function Ld(e,t){e.chatQueue=e.chatQueue.filter(n=>n.id!==t)}async function Rd(e,t,n){if(!e.connected)return;const s=e.chatMessage,i=(t??e.chatMessage).trim(),a=e.chatAttachments??[],o=t==null?a:[],r=o.length>0;if(!i&&!r)return;if(Ed(i)){await Vo(e);return}const l=Id(i);if(t==null&&(e.chatMessage="",e.chatAttachments=[]),Wo(e)){Md(e,i,o,l);return}await Yo(e,i,{previousDraft:t==null?s:void 0,restoreDraft:!!(t&&n?.restoreDraft),attachments:r?o:void 0,previousAttachments:t==null?a:void 0,restoreAttachments:!!(t&&n?.restoreDraft),refreshSessions:l})}async function Zo(e){await Promise.all([St(e),Ke(e,{activeMinutes:Go}),ys(e)]),un(e,!0)}const Pd=Qo;function Nd(e){const t=po(e.sessionKey);return t?.agentId?t.agentId:e.hello?.snapshot?.sessionDefaults?.defaultAgentId?.trim()||"main"}function Od(e,t){const n=cn(e),s=encodeURIComponent(t);return n?`${n}/avatar/${s}?meta=1`:`/avatar/${s}?meta=1`}async function ys(e){if(!e.connected){e.chatAvatarUrl=null;return}const t=Nd(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;const n=Od(e.basePath,t);try{const s=await fetch(n,{method:"GET"});if(!s.ok){e.chatAvatarUrl=null;return}const i=await s.json(),a=typeof i.avatarUrl=="string"?i.avatarUrl.trim():"";e.chatAvatarUrl=a||null}catch{e.chatAvatarUrl=null}}const{I:Dd}=hl,fa=e=>e,Bd=e=>e.strings===void 0,ga=()=>document.createComment(""),rt=(e,t,n)=>{const s=e._$AA.parentNode,i=t===void 0?e._$AB:t._$AA;if(n===void 0){const a=s.insertBefore(ga(),i),o=s.insertBefore(ga(),i);n=new Dd(a,o,e,e.options)}else{const a=n._$AB.nextSibling,o=n._$AM,r=o!==e;if(r){let l;n._$AQ?.(e),n._$AM=e,n._$AP!==void 0&&(l=e._$AU)!==o._$AU&&n._$AP(l)}if(a!==i||r){let l=n._$AA;for(;l!==a;){const p=fa(l).nextSibling;fa(s).insertBefore(l,i),l=p}}}return n},Me=(e,t,n=e)=>(e._$AI(t,n),e),Fd={},Ud=(e,t=Fd)=>e._$AH=t,Kd=e=>e._$AH,Vn=e=>{e._$AR(),e._$AA.remove()};const ni={CHILD:2},si=e=>(...t)=>({_$litDirective$:e,values:t});class ii{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,n,s){this._$Ct=t,this._$AM=n,this._$Ci=s}_$AS(t,n){return this.update(t,n)}update(t,n){return this.render(...n)}}const yt=(e,t)=>{const n=e._$AN;if(n===void 0)return!1;for(const s of n)s._$AO?.(t,!1),yt(s,t);return!0},en=e=>{let t,n;do{if((t=e._$AM)===void 0)break;n=t._$AN,n.delete(e),e=t}while(n?.size===0)},Jo=e=>{for(let t;t=e._$AM;e=t){let n=t._$AN;if(n===void 0)t._$AN=n=new Set;else if(n.has(e))break;n.add(e),jd(t)}};function Hd(e){this._$AN!==void 0?(en(this),this._$AM=e,Jo(this)):this._$AM=e}function zd(e,t=!1,n=0){const s=this._$AH,i=this._$AN;if(i!==void 0&&i.size!==0)if(t)if(Array.isArray(s))for(let a=n;a<s.length;a++)yt(s[a],!1),en(s[a]);else s!=null&&(yt(s,!1),en(s));else yt(this,e)}const jd=e=>{e.type==ni.CHILD&&(e._$AP??=zd,e._$AQ??=Hd)};class qd extends ii{constructor(){super(...arguments),this._$AN=void 0}_$AT(t,n,s){super._$AT(t,n,s),Jo(this),this.isConnected=t._$AU}_$AO(t,n=!0){t!==this.isConnected&&(this.isConnected=t,t?this.reconnected?.():this.disconnected?.()),n&&(yt(this,t),en(this))}setValue(t){if(Bd(this._$Ct))this._$Ct._$AI(t,this);else{const n=[...this._$Ct._$AH];n[this._$Ci]=t,this._$Ct._$AI(n,this,0)}}disconnected(){}reconnected(){}}const Yn=new WeakMap,Gd=si(class extends qd{render(e){return f}update(e,[t]){const n=t!==this.G;return n&&this.G!==void 0&&this.rt(void 0),(n||this.lt!==this.ct)&&(this.G=t,this.ht=e.options?.host,this.rt(this.ct=e.element)),f}rt(e){if(this.isConnected||(e=void 0),typeof this.G=="function"){const t=this.ht??globalThis;let n=Yn.get(t);n===void 0&&(n=new WeakMap,Yn.set(t,n)),n.get(this.G)!==void 0&&this.G.call(this.ht,void 0),n.set(this.G,e),e!==void 0&&this.G.call(this.ht,e)}else this.G.value=e}get lt(){return typeof this.G=="function"?Yn.get(this.ht??globalThis)?.get(this.G):this.G?.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}});const va=(e,t,n)=>{const s=new Map;for(let i=t;i<=n;i++)s.set(e[i],i);return s},Xo=si(class extends ii{constructor(e){if(super(e),e.type!==ni.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,n){let s;n===void 0?n=t:t!==void 0&&(s=t);const i=[],a=[];let o=0;for(const r of e)i[o]=s?s(r,o):o,a[o]=n(r,o),o++;return{values:a,keys:i}}render(e,t,n){return this.dt(e,t,n).values}update(e,[t,n,s]){const i=Kd(e),{values:a,keys:o}=this.dt(t,n,s);if(!Array.isArray(i))return this.ut=o,a;const r=this.ut??=[],l=[];let p,d,u=0,g=i.length-1,v=0,y=a.length-1;for(;u<=g&&v<=y;)if(i[u]===null)u++;else if(i[g]===null)g--;else if(r[u]===o[v])l[v]=Me(i[u],a[v]),u++,v++;else if(r[g]===o[y])l[y]=Me(i[g],a[y]),g--,y--;else if(r[u]===o[y])l[y]=Me(i[u],a[y]),rt(e,l[y+1],i[u]),u++,y--;else if(r[g]===o[v])l[v]=Me(i[g],a[v]),rt(e,i[u],i[g]),g--,v++;else if(p===void 0&&(p=va(o,v,y),d=va(r,u,g)),p.has(r[u]))if(p.has(r[g])){const $=d.get(o[v]),A=$!==void 0?i[$]:null;if(A===null){const _=rt(e,i[u]);Me(_,a[v]),l[v]=_}else l[v]=Me(A,a[v]),rt(e,i[u],A),i[$]=null;v++}else Vn(i[g]),g--;else Vn(i[u]),u++;for(;v<=y;){const $=rt(e,l[y+1]);Me($,a[v]),l[v++]=$}for(;u<=g;){const $=i[u++];$!==null&&Vn($)}return this.ut=o,Ud(e,l),ke}});function er(e){const t=e;let n=typeof t.role=="string"?t.role:"unknown";const s=typeof t.toolCallId=="string"||typeof t.tool_call_id=="string",i=t.content,a=Array.isArray(i)?i:null,o=Array.isArray(a)&&a.some(u=>{const v=String(u.type??"").toLowerCase();return v==="toolresult"||v==="tool_result"}),r=typeof t.toolName=="string"||typeof t.tool_name=="string";(s||o||r)&&(n="toolResult");let l=[];typeof t.content=="string"?l=[{type:"text",text:t.content}]:Array.isArray(t.content)?l=t.content.map(u=>({type:u.type||"text",text:u.text,name:u.name,args:u.args||u.arguments})):typeof t.text=="string"&&(l=[{type:"text",text:t.text}]);const p=typeof t.timestamp=="number"?t.timestamp:Date.now(),d=typeof t.id=="string"?t.id:void 0;return{role:n,content:l,timestamp:p,id:d}}function ai(e){const t=e.toLowerCase();return e==="user"||e==="User"?e:e==="assistant"?"assistant":e==="system"?"system":t==="toolresult"||t==="tool_result"||t==="tool"||t==="function"?"tool":e}function tr(e){const t=e,n=typeof t.role=="string"?t.role.toLowerCase():"";return n==="toolresult"||n==="tool_result"}class bs extends ii{constructor(t){if(super(t),this.it=f,t.type!==ni.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===f||t==null)return this._t=void 0,this.it=t;if(t===ke)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const n=[t];return n.raw=n,this._t={_$litType$:this.constructor.resultType,strings:n,values:[]}}}bs.directiveName="unsafeHTML",bs.resultType=1;const ws=si(bs);const{entries:nr,setPrototypeOf:ma,isFrozen:Wd,getPrototypeOf:Vd,getOwnPropertyDescriptor:Yd}=Object;let{freeze:Z,seal:ne,create:$s}=Object,{apply:xs,construct:As}=typeof Reflect<"u"&&Reflect;Z||(Z=function(t){return t});ne||(ne=function(t){return t});xs||(xs=function(t,n){for(var s=arguments.length,i=new Array(s>2?s-2:0),a=2;a<s;a++)i[a-2]=arguments[a];return t.apply(n,i)});As||(As=function(t){for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return new t(...s)});const Ht=J(Array.prototype.forEach),Qd=J(Array.prototype.lastIndexOf),ya=J(Array.prototype.pop),lt=J(Array.prototype.push),Zd=J(Array.prototype.splice),Vt=J(String.prototype.toLowerCase),Qn=J(String.prototype.toString),Zn=J(String.prototype.match),ct=J(String.prototype.replace),Jd=J(String.prototype.indexOf),Xd=J(String.prototype.trim),se=J(Object.prototype.hasOwnProperty),Y=J(RegExp.prototype.test),dt=eu(TypeError);function J(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return xs(e,t,s)}}function eu(e){return function(){for(var t=arguments.length,n=new Array(t),s=0;s<t;s++)n[s]=arguments[s];return As(e,n)}}function L(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Vt;ma&&ma(e,null);let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){const a=n(i);a!==i&&(Wd(t)||(t[s]=a),i=a)}e[i]=!0}return e}function tu(e){for(let t=0;t<e.length;t++)se(e,t)||(e[t]=null);return e}function de(e){const t=$s(null);for(const[n,s]of nr(e))se(e,n)&&(Array.isArray(s)?t[n]=tu(s):s&&typeof s=="object"&&s.constructor===Object?t[n]=de(s):t[n]=s);return t}function ut(e,t){for(;e!==null;){const s=Yd(e,t);if(s){if(s.get)return J(s.get);if(typeof s.value=="function")return J(s.value)}e=Vd(e)}function n(){return null}return n}const ba=Z(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Jn=Z(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Xn=Z(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),nu=Z(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),es=Z(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),su=Z(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),wa=Z(["#text"]),$a=Z(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),ts=Z(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),xa=Z(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),zt=Z(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),iu=ne(/\{\{[\w\W]*|[\w\W]*\}\}/gm),au=ne(/<%[\w\W]*|[\w\W]*%>/gm),ou=ne(/\$\{[\w\W]*/gm),ru=ne(/^data-[\-\w.\u00B7-\uFFFF]+$/),lu=ne(/^aria-[\-\w]+$/),sr=ne(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),cu=ne(/^(?:\w+script|data):/i),du=ne(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),ir=ne(/^html$/i),uu=ne(/^[a-z][.\w]*(-[.\w]+)+$/i);var Aa=Object.freeze({__proto__:null,ARIA_ATTR:lu,ATTR_WHITESPACE:du,CUSTOM_ELEMENT:uu,DATA_ATTR:ru,DOCTYPE_NAME:ir,ERB_EXPR:au,IS_ALLOWED_URI:sr,IS_SCRIPT_OR_DATA:cu,MUSTACHE_EXPR:iu,TMPLIT_EXPR:ou});const pt={element:1,text:3,progressingInstruction:7,comment:8,document:9},pu=function(){return typeof window>"u"?null:window},hu=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null;const i="data-tt-policy-suffix";n&&n.hasAttribute(i)&&(s=n.getAttribute(i));const a="dompurify"+(s?"#"+s:"");try{return t.createPolicy(a,{createHTML(o){return o},createScriptURL(o){return o}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},ka=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function ar(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:pu();const t=C=>ar(C);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==pt.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const s=n,i=s.currentScript,{DocumentFragment:a,HTMLTemplateElement:o,Node:r,Element:l,NodeFilter:p,NamedNodeMap:d=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:u,DOMParser:g,trustedTypes:v}=e,y=l.prototype,$=ut(y,"cloneNode"),A=ut(y,"remove"),_=ut(y,"nextSibling"),M=ut(y,"childNodes"),P=ut(y,"parentNode");if(typeof o=="function"){const C=n.createElement("template");C.content&&C.content.ownerDocument&&(n=C.content.ownerDocument)}let I,T="";const{implementation:E,createNodeIterator:pe,createDocumentFragment:xn,getElementsByTagName:An}=n,{importNode:Pr}=s;let V=ka();t.isSupported=typeof nr=="function"&&typeof P=="function"&&E&&E.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:kn,ERB_EXPR:Sn,TMPLIT_EXPR:_n,DATA_ATTR:Nr,ARIA_ATTR:Or,IS_SCRIPT_OR_DATA:Dr,ATTR_WHITESPACE:mi,CUSTOM_ELEMENT:Br}=Aa;let{IS_ALLOWED_URI:yi}=Aa,K=null;const bi=L({},[...ba,...Jn,...Xn,...es,...wa]);let z=null;const wi=L({},[...$a,...ts,...xa,...zt]);let B=Object.seal($s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),st=null,Cn=null;const ze=Object.seal($s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let $i=!0,Tn=!0,xi=!1,Ai=!0,je=!1,Mt=!0,Te=!1,En=!1,In=!1,qe=!1,Lt=!1,Rt=!1,ki=!0,Si=!1;const Fr="user-content-";let Mn=!0,it=!1,Ge={},re=null;const Ln=L({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let _i=null;const Ci=L({},["audio","video","img","source","image","track"]);let Rn=null;const Ti=L({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Pt="http://www.w3.org/1998/Math/MathML",Nt="http://www.w3.org/2000/svg",he="http://www.w3.org/1999/xhtml";let We=he,Pn=!1,Nn=null;const Ur=L({},[Pt,Nt,he],Qn);let Ot=L({},["mi","mo","mn","ms","mtext"]),Dt=L({},["annotation-xml"]);const Kr=L({},["title","style","font","a","script"]);let at=null;const Hr=["application/xhtml+xml","text/html"],zr="text/html";let U=null,Ve=null;const jr=n.createElement("form"),Ei=function(h){return h instanceof RegExp||h instanceof Function},On=function(){let h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Ve&&Ve===h)){if((!h||typeof h!="object")&&(h={}),h=de(h),at=Hr.indexOf(h.PARSER_MEDIA_TYPE)===-1?zr:h.PARSER_MEDIA_TYPE,U=at==="application/xhtml+xml"?Qn:Vt,K=se(h,"ALLOWED_TAGS")?L({},h.ALLOWED_TAGS,U):bi,z=se(h,"ALLOWED_ATTR")?L({},h.ALLOWED_ATTR,U):wi,Nn=se(h,"ALLOWED_NAMESPACES")?L({},h.ALLOWED_NAMESPACES,Qn):Ur,Rn=se(h,"ADD_URI_SAFE_ATTR")?L(de(Ti),h.ADD_URI_SAFE_ATTR,U):Ti,_i=se(h,"ADD_DATA_URI_TAGS")?L(de(Ci),h.ADD_DATA_URI_TAGS,U):Ci,re=se(h,"FORBID_CONTENTS")?L({},h.FORBID_CONTENTS,U):Ln,st=se(h,"FORBID_TAGS")?L({},h.FORBID_TAGS,U):de({}),Cn=se(h,"FORBID_ATTR")?L({},h.FORBID_ATTR,U):de({}),Ge=se(h,"USE_PROFILES")?h.USE_PROFILES:!1,$i=h.ALLOW_ARIA_ATTR!==!1,Tn=h.ALLOW_DATA_ATTR!==!1,xi=h.ALLOW_UNKNOWN_PROTOCOLS||!1,Ai=h.ALLOW_SELF_CLOSE_IN_ATTR!==!1,je=h.SAFE_FOR_TEMPLATES||!1,Mt=h.SAFE_FOR_XML!==!1,Te=h.WHOLE_DOCUMENT||!1,qe=h.RETURN_DOM||!1,Lt=h.RETURN_DOM_FRAGMENT||!1,Rt=h.RETURN_TRUSTED_TYPE||!1,In=h.FORCE_BODY||!1,ki=h.SANITIZE_DOM!==!1,Si=h.SANITIZE_NAMED_PROPS||!1,Mn=h.KEEP_CONTENT!==!1,it=h.IN_PLACE||!1,yi=h.ALLOWED_URI_REGEXP||sr,We=h.NAMESPACE||he,Ot=h.MATHML_TEXT_INTEGRATION_POINTS||Ot,Dt=h.HTML_INTEGRATION_POINTS||Dt,B=h.CUSTOM_ELEMENT_HANDLING||{},h.CUSTOM_ELEMENT_HANDLING&&Ei(h.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(B.tagNameCheck=h.CUSTOM_ELEMENT_HANDLING.tagNameCheck),h.CUSTOM_ELEMENT_HANDLING&&Ei(h.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(B.attributeNameCheck=h.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),h.CUSTOM_ELEMENT_HANDLING&&typeof h.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(B.allowCustomizedBuiltInElements=h.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),je&&(Tn=!1),Lt&&(qe=!0),Ge&&(K=L({},wa),z=[],Ge.html===!0&&(L(K,ba),L(z,$a)),Ge.svg===!0&&(L(K,Jn),L(z,ts),L(z,zt)),Ge.svgFilters===!0&&(L(K,Xn),L(z,ts),L(z,zt)),Ge.mathMl===!0&&(L(K,es),L(z,xa),L(z,zt))),h.ADD_TAGS&&(typeof h.ADD_TAGS=="function"?ze.tagCheck=h.ADD_TAGS:(K===bi&&(K=de(K)),L(K,h.ADD_TAGS,U))),h.ADD_ATTR&&(typeof h.ADD_ATTR=="function"?ze.attributeCheck=h.ADD_ATTR:(z===wi&&(z=de(z)),L(z,h.ADD_ATTR,U))),h.ADD_URI_SAFE_ATTR&&L(Rn,h.ADD_URI_SAFE_ATTR,U),h.FORBID_CONTENTS&&(re===Ln&&(re=de(re)),L(re,h.FORBID_CONTENTS,U)),h.ADD_FORBID_CONTENTS&&(re===Ln&&(re=de(re)),L(re,h.ADD_FORBID_CONTENTS,U)),Mn&&(K["#text"]=!0),Te&&L(K,["html","head","body"]),K.table&&(L(K,["tbody"]),delete st.tbody),h.TRUSTED_TYPES_POLICY){if(typeof h.TRUSTED_TYPES_POLICY.createHTML!="function")throw dt('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof h.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw dt('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');I=h.TRUSTED_TYPES_POLICY,T=I.createHTML("")}else I===void 0&&(I=hu(v,i)),I!==null&&typeof T=="string"&&(T=I.createHTML(""));Z&&Z(h),Ve=h}},Ii=L({},[...Jn,...Xn,...nu]),Mi=L({},[...es,...su]),qr=function(h){let x=P(h);(!x||!x.tagName)&&(x={namespaceURI:We,tagName:"template"});const S=Vt(h.tagName),D=Vt(x.tagName);return Nn[h.namespaceURI]?h.namespaceURI===Nt?x.namespaceURI===he?S==="svg":x.namespaceURI===Pt?S==="svg"&&(D==="annotation-xml"||Ot[D]):!!Ii[S]:h.namespaceURI===Pt?x.namespaceURI===he?S==="math":x.namespaceURI===Nt?S==="math"&&Dt[D]:!!Mi[S]:h.namespaceURI===he?x.namespaceURI===Nt&&!Dt[D]||x.namespaceURI===Pt&&!Ot[D]?!1:!Mi[S]&&(Kr[S]||!Ii[S]):!!(at==="application/xhtml+xml"&&Nn[h.namespaceURI]):!1},le=function(h){lt(t.removed,{element:h});try{P(h).removeChild(h)}catch{A(h)}},Ee=function(h,x){try{lt(t.removed,{attribute:x.getAttributeNode(h),from:x})}catch{lt(t.removed,{attribute:null,from:x})}if(x.removeAttribute(h),h==="is")if(qe||Lt)try{le(x)}catch{}else try{x.setAttribute(h,"")}catch{}},Li=function(h){let x=null,S=null;if(In)h="<remove></remove>"+h;else{const F=Zn(h,/^[\r\n\t ]+/);S=F&&F[0]}at==="application/xhtml+xml"&&We===he&&(h='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+h+"</body></html>");const D=I?I.createHTML(h):h;if(We===he)try{x=new g().parseFromString(D,at)}catch{}if(!x||!x.documentElement){x=E.createDocument(We,"template",null);try{x.documentElement.innerHTML=Pn?T:D}catch{}}const q=x.body||x.documentElement;return h&&S&&q.insertBefore(n.createTextNode(S),q.childNodes[0]||null),We===he?An.call(x,Te?"html":"body")[0]:Te?x.documentElement:q},Ri=function(h){return pe.call(h.ownerDocument||h,h,p.SHOW_ELEMENT|p.SHOW_COMMENT|p.SHOW_TEXT|p.SHOW_PROCESSING_INSTRUCTION|p.SHOW_CDATA_SECTION,null)},Dn=function(h){return h instanceof u&&(typeof h.nodeName!="string"||typeof h.textContent!="string"||typeof h.removeChild!="function"||!(h.attributes instanceof d)||typeof h.removeAttribute!="function"||typeof h.setAttribute!="function"||typeof h.namespaceURI!="string"||typeof h.insertBefore!="function"||typeof h.hasChildNodes!="function")},Pi=function(h){return typeof r=="function"&&h instanceof r};function fe(C,h,x){Ht(C,S=>{S.call(t,h,x,Ve)})}const Ni=function(h){let x=null;if(fe(V.beforeSanitizeElements,h,null),Dn(h))return le(h),!0;const S=U(h.nodeName);if(fe(V.uponSanitizeElement,h,{tagName:S,allowedTags:K}),Mt&&h.hasChildNodes()&&!Pi(h.firstElementChild)&&Y(/<[/\w!]/g,h.innerHTML)&&Y(/<[/\w!]/g,h.textContent)||h.nodeType===pt.progressingInstruction||Mt&&h.nodeType===pt.comment&&Y(/<[/\w]/g,h.data))return le(h),!0;if(!(ze.tagCheck instanceof Function&&ze.tagCheck(S))&&(!K[S]||st[S])){if(!st[S]&&Di(S)&&(B.tagNameCheck instanceof RegExp&&Y(B.tagNameCheck,S)||B.tagNameCheck instanceof Function&&B.tagNameCheck(S)))return!1;if(Mn&&!re[S]){const D=P(h)||h.parentNode,q=M(h)||h.childNodes;if(q&&D){const F=q.length;for(let X=F-1;X>=0;--X){const ge=$(q[X],!0);ge.__removalCount=(h.__removalCount||0)+1,D.insertBefore(ge,_(h))}}}return le(h),!0}return h instanceof l&&!qr(h)||(S==="noscript"||S==="noembed"||S==="noframes")&&Y(/<\/no(script|embed|frames)/i,h.innerHTML)?(le(h),!0):(je&&h.nodeType===pt.text&&(x=h.textContent,Ht([kn,Sn,_n],D=>{x=ct(x,D," ")}),h.textContent!==x&&(lt(t.removed,{element:h.cloneNode()}),h.textContent=x)),fe(V.afterSanitizeElements,h,null),!1)},Oi=function(h,x,S){if(ki&&(x==="id"||x==="name")&&(S in n||S in jr))return!1;if(!(Tn&&!Cn[x]&&Y(Nr,x))){if(!($i&&Y(Or,x))){if(!(ze.attributeCheck instanceof Function&&ze.attributeCheck(x,h))){if(!z[x]||Cn[x]){if(!(Di(h)&&(B.tagNameCheck instanceof RegExp&&Y(B.tagNameCheck,h)||B.tagNameCheck instanceof Function&&B.tagNameCheck(h))&&(B.attributeNameCheck instanceof RegExp&&Y(B.attributeNameCheck,x)||B.attributeNameCheck instanceof Function&&B.attributeNameCheck(x,h))||x==="is"&&B.allowCustomizedBuiltInElements&&(B.tagNameCheck instanceof RegExp&&Y(B.tagNameCheck,S)||B.tagNameCheck instanceof Function&&B.tagNameCheck(S))))return!1}else if(!Rn[x]){if(!Y(yi,ct(S,mi,""))){if(!((x==="src"||x==="xlink:href"||x==="href")&&h!=="script"&&Jd(S,"data:")===0&&_i[h])){if(!(xi&&!Y(Dr,ct(S,mi,"")))){if(S)return!1}}}}}}}return!0},Di=function(h){return h!=="annotation-xml"&&Zn(h,Br)},Bi=function(h){fe(V.beforeSanitizeAttributes,h,null);const{attributes:x}=h;if(!x||Dn(h))return;const S={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:z,forceKeepAttr:void 0};let D=x.length;for(;D--;){const q=x[D],{name:F,namespaceURI:X,value:ge}=q,Ye=U(F),Bn=ge;let j=F==="value"?Bn:Xd(Bn);if(S.attrName=Ye,S.attrValue=j,S.keepAttr=!0,S.forceKeepAttr=void 0,fe(V.uponSanitizeAttribute,h,S),j=S.attrValue,Si&&(Ye==="id"||Ye==="name")&&(Ee(F,h),j=Fr+j),Mt&&Y(/((--!?|])>)|<\/(style|title|textarea)/i,j)){Ee(F,h);continue}if(Ye==="attributename"&&Zn(j,"href")){Ee(F,h);continue}if(S.forceKeepAttr)continue;if(!S.keepAttr){Ee(F,h);continue}if(!Ai&&Y(/\/>/i,j)){Ee(F,h);continue}je&&Ht([kn,Sn,_n],Ui=>{j=ct(j,Ui," ")});const Fi=U(h.nodeName);if(!Oi(Fi,Ye,j)){Ee(F,h);continue}if(I&&typeof v=="object"&&typeof v.getAttributeType=="function"&&!X)switch(v.getAttributeType(Fi,Ye)){case"TrustedHTML":{j=I.createHTML(j);break}case"TrustedScriptURL":{j=I.createScriptURL(j);break}}if(j!==Bn)try{X?h.setAttributeNS(X,F,j):h.setAttribute(F,j),Dn(h)?le(h):ya(t.removed)}catch{Ee(F,h)}}fe(V.afterSanitizeAttributes,h,null)},Gr=function C(h){let x=null;const S=Ri(h);for(fe(V.beforeSanitizeShadowDOM,h,null);x=S.nextNode();)fe(V.uponSanitizeShadowNode,x,null),Ni(x),Bi(x),x.content instanceof a&&C(x.content);fe(V.afterSanitizeShadowDOM,h,null)};return t.sanitize=function(C){let h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},x=null,S=null,D=null,q=null;if(Pn=!C,Pn&&(C="<!-->"),typeof C!="string"&&!Pi(C))if(typeof C.toString=="function"){if(C=C.toString(),typeof C!="string")throw dt("dirty is not a string, aborting")}else throw dt("toString is not a function");if(!t.isSupported)return C;if(En||On(h),t.removed=[],typeof C=="string"&&(it=!1),it){if(C.nodeName){const ge=U(C.nodeName);if(!K[ge]||st[ge])throw dt("root node is forbidden and cannot be sanitized in-place")}}else if(C instanceof r)x=Li("<!---->"),S=x.ownerDocument.importNode(C,!0),S.nodeType===pt.element&&S.nodeName==="BODY"||S.nodeName==="HTML"?x=S:x.appendChild(S);else{if(!qe&&!je&&!Te&&C.indexOf("<")===-1)return I&&Rt?I.createHTML(C):C;if(x=Li(C),!x)return qe?null:Rt?T:""}x&&In&&le(x.firstChild);const F=Ri(it?C:x);for(;D=F.nextNode();)Ni(D),Bi(D),D.content instanceof a&&Gr(D.content);if(it)return C;if(qe){if(Lt)for(q=xn.call(x.ownerDocument);x.firstChild;)q.appendChild(x.firstChild);else q=x;return(z.shadowroot||z.shadowrootmode)&&(q=Pr.call(s,q,!0)),q}let X=Te?x.outerHTML:x.innerHTML;return Te&&K["!doctype"]&&x.ownerDocument&&x.ownerDocument.doctype&&x.ownerDocument.doctype.name&&Y(ir,x.ownerDocument.doctype.name)&&(X="<!DOCTYPE "+x.ownerDocument.doctype.name+`>
200
- `+X),je&&Ht([kn,Sn,_n],ge=>{X=ct(X,ge," ")}),I&&Rt?I.createHTML(X):X},t.setConfig=function(){let C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};On(C),En=!0},t.clearConfig=function(){Ve=null,En=!1},t.isValidAttribute=function(C,h,x){Ve||On({});const S=U(C),D=U(h);return Oi(S,D,x)},t.addHook=function(C,h){typeof h=="function"&&lt(V[C],h)},t.removeHook=function(C,h){if(h!==void 0){const x=Qd(V[C],h);return x===-1?void 0:Zd(V[C],x,1)[0]}return ya(V[C])},t.removeHooks=function(C){V[C]=[]},t.removeAllHooks=function(){V=ka()},t}var ks=ar();function oi(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var He=oi();function or(e){He=e}var bt={exec:()=>null};function R(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(i,a)=>{let o=typeof a=="string"?a:a.source;return o=o.replace(Q.caret,"$1"),n=n.replace(i,o),s},getRegex:()=>new RegExp(n,t)};return s}var fu=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),Q={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},gu=/^(?:[ \t]*(?:\n|$))+/,vu=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,mu=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,It=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,yu=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ri=/(?:[*+-]|\d{1,9}[.)])/,rr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,lr=R(rr).replace(/bull/g,ri).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),bu=R(rr).replace(/bull/g,ri).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),li=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,wu=/^[^\n]+/,ci=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,$u=R(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",ci).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),xu=R(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ri).getRegex(),yn="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",di=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Au=R("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",di).replace("tag",yn).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),cr=R(li).replace("hr",It).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",yn).getRegex(),ku=R(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",cr).getRegex(),ui={blockquote:ku,code:vu,def:$u,fences:mu,heading:yu,hr:It,html:Au,lheading:lr,list:xu,newline:gu,paragraph:cr,table:bt,text:wu},Sa=R("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",It).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",yn).getRegex(),Su={...ui,lheading:bu,table:Sa,paragraph:R(li).replace("hr",It).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Sa).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",yn).getRegex()},_u={...ui,html:R(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",di).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:bt,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:R(li).replace("hr",It).replace("heading",` *#{1,6} *[^
201
- ]`).replace("lheading",lr).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Cu=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Tu=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,dr=/^( {2,}|\\)\n(?!\s*$)/,Eu=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,bn=/[\p{P}\p{S}]/u,pi=/[\s\p{P}\p{S}]/u,ur=/[^\s\p{P}\p{S}]/u,Iu=R(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,pi).getRegex(),pr=/(?!~)[\p{P}\p{S}]/u,Mu=/(?!~)[\s\p{P}\p{S}]/u,Lu=/(?:[^\s\p{P}\p{S}]|~)/u,Ru=R(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",fu?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),hr=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Pu=R(hr,"u").replace(/punct/g,bn).getRegex(),Nu=R(hr,"u").replace(/punct/g,pr).getRegex(),fr="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Ou=R(fr,"gu").replace(/notPunctSpace/g,ur).replace(/punctSpace/g,pi).replace(/punct/g,bn).getRegex(),Du=R(fr,"gu").replace(/notPunctSpace/g,Lu).replace(/punctSpace/g,Mu).replace(/punct/g,pr).getRegex(),Bu=R("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ur).replace(/punctSpace/g,pi).replace(/punct/g,bn).getRegex(),Fu=R(/\\(punct)/,"gu").replace(/punct/g,bn).getRegex(),Uu=R(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Ku=R(di).replace("(?:-->|$)","-->").getRegex(),Hu=R("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Ku).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),tn=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,zu=R(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",tn).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),gr=R(/^!?\[(label)\]\[(ref)\]/).replace("label",tn).replace("ref",ci).getRegex(),vr=R(/^!?\[(ref)\](?:\[\])?/).replace("ref",ci).getRegex(),ju=R("reflink|nolink(?!\\()","g").replace("reflink",gr).replace("nolink",vr).getRegex(),_a=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,hi={_backpedal:bt,anyPunctuation:Fu,autolink:Uu,blockSkip:Ru,br:dr,code:Tu,del:bt,emStrongLDelim:Pu,emStrongRDelimAst:Ou,emStrongRDelimUnd:Bu,escape:Cu,link:zu,nolink:vr,punctuation:Iu,reflink:gr,reflinkSearch:ju,tag:Hu,text:Eu,url:bt},qu={...hi,link:R(/^!?\[(label)\]\((.*?)\)/).replace("label",tn).getRegex(),reflink:R(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",tn).getRegex()},Ss={...hi,emStrongRDelimAst:Du,emStrongLDelim:Nu,url:R(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",_a).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:R(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",_a).getRegex()},Gu={...Ss,br:R(dr).replace("{2,}","*").getRegex(),text:R(Ss.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},jt={normal:ui,gfm:Su,pedantic:_u},ht={normal:hi,gfm:Ss,breaks:Gu,pedantic:qu},Wu={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Ca=e=>Wu[e];function me(e,t){if(t){if(Q.escapeTest.test(e))return e.replace(Q.escapeReplace,Ca)}else if(Q.escapeTestNoEncode.test(e))return e.replace(Q.escapeReplaceNoEncode,Ca);return e}function Ta(e){try{e=encodeURI(e).replace(Q.percentDecode,"%")}catch{return null}return e}function Ea(e,t){let n=e.replace(Q.findPipe,(a,o,r)=>{let l=!1,p=o;for(;--p>=0&&r[p]==="\\";)l=!l;return l?"|":" |"}),s=n.split(Q.splitPipe),i=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;i<s.length;i++)s[i]=s[i].trim().replace(Q.slashPipe,"|");return s}function ft(e,t,n){let s=e.length;if(s===0)return"";let i=0;for(;i<s&&e.charAt(s-i-1)===t;)i++;return e.slice(0,s-i)}function Vu(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])n++;else if(e[s]===t[1]&&(n--,n<0))return s;return n>0?-2:-1}function Ia(e,t,n,s,i){let a=t.href,o=t.title||null,r=e[1].replace(i.other.outputLinkReplace,"$1");s.state.inLink=!0;let l={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:o,text:r,tokens:s.inlineTokens(r)};return s.state.inLink=!1,l}function Yu(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let i=s[1];return t.split(`
202
- `).map(a=>{let o=a.match(n.other.beginningSpace);if(o===null)return a;let[r]=o;return r.length>=i.length?a.slice(i.length):a}).join(`
203
- `)}var nn=class{options;rules;lexer;constructor(e){this.options=e||He}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:ft(n,`
204
- `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Yu(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=ft(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:ft(t[0],`
205
- `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=ft(t[0],`
206
- `).split(`
207
- `),s="",i="",a=[];for(;n.length>0;){let o=!1,r=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))r.push(n[l]),o=!0;else if(!o)r.push(n[l]);else break;n=n.slice(l);let p=r.join(`
208
- `),d=p.replace(this.rules.other.blockquoteSetextReplace,`
209
- $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
210
- ${p}`:p,i=i?`${i}
211
- ${d}`:d;let u=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(d,a,!0),this.lexer.state.top=u,n.length===0)break;let g=a.at(-1);if(g?.type==="code")break;if(g?.type==="blockquote"){let v=g,y=v.raw+`
212
- `+n.join(`
213
- `),$=this.blockquote(y);a[a.length-1]=$,s=s.substring(0,s.length-v.raw.length)+$.raw,i=i.substring(0,i.length-v.text.length)+$.text;break}else if(g?.type==="list"){let v=g,y=v.raw+`
214
- `+n.join(`
215
- `),$=this.list(y);a[a.length-1]=$,s=s.substring(0,s.length-g.raw.length)+$.raw,i=i.substring(0,i.length-v.raw.length)+$.raw,n=y.substring(a.at(-1).raw.length).split(`
216
- `);continue}}return{type:"blockquote",raw:s,tokens:a,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,i={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let a=this.rules.other.listItemRegex(n),o=!1;for(;e;){let l=!1,p="",d="";if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let u=t[2].split(`
217
- `,1)[0].replace(this.rules.other.listReplaceTabs,$=>" ".repeat(3*$.length)),g=e.split(`
218
- `,1)[0],v=!u.trim(),y=0;if(this.options.pedantic?(y=2,d=u.trimStart()):v?y=t[1].length+1:(y=t[2].search(this.rules.other.nonSpaceChar),y=y>4?1:y,d=u.slice(y),y+=t[1].length),v&&this.rules.other.blankLine.test(g)&&(p+=g+`
219
- `,e=e.substring(g.length+1),l=!0),!l){let $=this.rules.other.nextBulletRegex(y),A=this.rules.other.hrRegex(y),_=this.rules.other.fencesBeginRegex(y),M=this.rules.other.headingBeginRegex(y),P=this.rules.other.htmlBeginRegex(y);for(;e;){let I=e.split(`
220
- `,1)[0],T;if(g=I,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting," "),T=g):T=g.replace(this.rules.other.tabCharGlobal," "),_.test(g)||M.test(g)||P.test(g)||$.test(g)||A.test(g))break;if(T.search(this.rules.other.nonSpaceChar)>=y||!g.trim())d+=`
221
- `+T.slice(y);else{if(v||u.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||_.test(u)||M.test(u)||A.test(u))break;d+=`
222
- `+g}!v&&!g.trim()&&(v=!0),p+=I+`
223
- `,e=e.substring(I.length+1),u=T.slice(y)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(o=!0)),i.items.push({type:"list_item",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(d),loose:!1,text:d,tokens:[]}),i.raw+=p}let r=i.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,""),l.tokens[0]?.type==="text"||l.tokens[0]?.type==="paragraph"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,"");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let d={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};l.checked=d.checked,i.loose?l.tokens[0]&&["paragraph","text"].includes(l.tokens[0].type)&&"tokens"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=d.raw+l.tokens[0].raw,l.tokens[0].text=d.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(d)):l.tokens.unshift({type:"paragraph",raw:d.raw,text:d.raw,tokens:[d]}):l.tokens.unshift(d)}}if(!i.loose){let p=l.tokens.filter(u=>u.type==="space"),d=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));i.loose=d}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type==="text"&&(p.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:s,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=Ea(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
224
- `):[],a={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(let o of s)this.rules.other.tableAlignRight.test(o)?a.align.push("right"):this.rules.other.tableAlignCenter.test(o)?a.align.push("center"):this.rules.other.tableAlignLeft.test(o)?a.align.push("left"):a.align.push(null);for(let o=0;o<n.length;o++)a.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:a.align[o]});for(let o of i)a.rows.push(Ea(o,a.header.length).map((r,l)=>({text:r,tokens:this.lexer.inline(r),header:!1,align:a.align[l]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
225
- `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let a=ft(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{let a=Vu(t[2],"()");if(a===-2)return;if(a>-1){let o=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let s=t[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(s);a&&(s=a[1],i=a[3])}else i=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),Ia(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[s.toLowerCase()];if(!i){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return Ia(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let i=[...s[0]].length-1,a,o,r=i,l=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+i);(s=p.exec(t))!=null;){if(a=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!a)continue;if(o=[...a].length,s[3]||s[4]){r+=o;continue}else if((s[5]||s[6])&&i%3&&!((i+o)%3)){l+=o;continue}if(r-=o,r>0)continue;o=Math.min(o,o+r+l);let d=[...s[0]][0].length,u=e.slice(0,i+s.index+d+o);if(Math.min(i,o)%2){let v=u.slice(1,-1);return{type:"em",raw:u,text:v,tokens:this.lexer.inlineTokens(v)}}let g=u.slice(2,-2);return{type:"strong",raw:u,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},ie=class _s{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||He,this.options.tokenizer=this.options.tokenizer||new nn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:Q,block:jt.normal,inline:ht.normal};this.options.pedantic?(n.block=jt.pedantic,n.inline=ht.pedantic):this.options.gfm&&(n.block=jt.gfm,this.options.breaks?n.inline=ht.breaks:n.inline=ht.gfm),this.tokenizer.rules=n}static get rules(){return{block:jt,inline:ht}}static lex(t,n){return new _s(n).lex(t)}static lexInline(t,n){return new _s(n).inlineTokens(t)}lex(t){t=t.replace(Q.carriageReturn,`
226
- `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],s=!1){for(this.options.pedantic&&(t=t.replace(Q.tabCharGlobal," ").replace(Q.spaceLine,""));t;){let i;if(this.options.extensions?.block?.some(o=>(i=o.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let o=n.at(-1);i.raw.length===1&&o!==void 0?o.raw+=`
227
- `:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let o=n.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(`
228
- `)?"":`
229
- `)+i.raw,o.text+=`
230
- `+i.text,this.inlineQueue.at(-1).src=o.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let o=n.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(`
231
- `)?"":`
232
- `)+i.raw,o.text+=`
233
- `+i.raw,this.inlineQueue.at(-1).src=o.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let a=t;if(this.options.extensions?.startBlock){let o=1/0,r=t.slice(1),l;this.options.extensions.startBlock.forEach(p=>{l=p.call({lexer:this},r),typeof l=="number"&&l>=0&&(o=Math.min(o,l))}),o<1/0&&o>=0&&(a=t.substring(0,o+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let o=n.at(-1);s&&o?.type==="paragraph"?(o.raw+=(o.raw.endsWith(`
234
- `)?"":`
235
- `)+i.raw,o.text+=`
236
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):n.push(i),s=a.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let o=n.at(-1);o?.type==="text"?(o.raw+=(o.raw.endsWith(`
237
- `)?"":`
238
- `)+i.raw,o.text+=`
239
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):n.push(i);continue}if(t){let o="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(o);break}else throw new Error(o)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let s=t,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,i.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a;for(;(i=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)a=i[2]?i[2].length:0,s=s.slice(0,i.index+a)+"["+"a".repeat(i[0].length-a-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let o=!1,r="";for(;t;){o||(r=""),o=!1;let l;if(this.options.extensions?.inline?.some(d=>(l=d.call({lexer:this},t,n))?(t=t.substring(l.raw.length),n.push(l),!0):!1))continue;if(l=this.tokenizer.escape(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.tag(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.link(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(l.raw.length);let d=n.at(-1);l.type==="text"&&d?.type==="text"?(d.raw+=l.raw,d.text+=l.text):n.push(l);continue}if(l=this.tokenizer.emStrong(t,s,r)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.codespan(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.br(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.del(t)){t=t.substring(l.raw.length),n.push(l);continue}if(l=this.tokenizer.autolink(t)){t=t.substring(l.raw.length),n.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(t))){t=t.substring(l.raw.length),n.push(l);continue}let p=t;if(this.options.extensions?.startInline){let d=1/0,u=t.slice(1),g;this.options.extensions.startInline.forEach(v=>{g=v.call({lexer:this},u),typeof g=="number"&&g>=0&&(d=Math.min(d,g))}),d<1/0&&d>=0&&(p=t.substring(0,d+1))}if(l=this.tokenizer.inlineText(p)){t=t.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(r=l.raw.slice(-1)),o=!0;let d=n.at(-1);d?.type==="text"?(d.raw+=l.raw,d.text+=l.text):n.push(l);continue}if(t){let d="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(d);break}else throw new Error(d)}}return n}},sn=class{options;parser;constructor(e){this.options=e||He}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(Q.notSpaceStart)?.[0],i=e.replace(Q.endingNewline,"")+`
240
- `;return s?'<pre><code class="language-'+me(s)+'">'+(n?i:me(i,!0))+`</code></pre>
241
- `:"<pre><code>"+(n?i:me(i,!0))+`</code></pre>
242
- `}blockquote({tokens:e}){return`<blockquote>
243
- ${this.parser.parse(e)}</blockquote>
244
- `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
245
- `}hr(e){return`<hr>
246
- `}list(e){let t=e.ordered,n=e.start,s="";for(let o=0;o<e.items.length;o++){let r=e.items[o];s+=this.listitem(r)}let i=t?"ol":"ul",a=t&&n!==1?' start="'+n+'"':"";return"<"+i+a+`>
247
- `+s+"</"+i+`>
248
- `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
249
- `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
250
- `}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let s="";for(let i=0;i<e.rows.length;i++){let a=e.rows[i];n="";for(let o=0;o<a.length;o++)n+=this.tablecell(a[o]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
251
- <thead>
252
- `+t+`</thead>
253
- `+s+`</table>
254
- `}tablerow({text:e}){return`<tr>
255
- ${e}</tr>
256
- `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
257
- `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${me(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),i=Ta(e);if(i===null)return s;e=i;let a='<a href="'+e+'"';return t&&(a+=' title="'+me(t)+'"'),a+=">"+s+"</a>",a}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let i=Ta(e);if(i===null)return me(n);e=i;let a=`<img src="${e}" alt="${n}"`;return t&&(a+=` title="${me(t)}"`),a+=">",a}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:me(e.text)}},fi=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},ae=class Cs{options;renderer;textRenderer;constructor(t){this.options=t||He,this.options.renderer=this.options.renderer||new sn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new fi}static parse(t,n){return new Cs(n).parse(t)}static parseInline(t,n){return new Cs(n).parseInline(t)}parse(t){let n="";for(let s=0;s<t.length;s++){let i=t[s];if(this.options.extensions?.renderers?.[i.type]){let o=i,r=this.options.extensions.renderers[o.type].call({parser:this},o);if(r!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(o.type)){n+=r||"";continue}}let a=i;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let o='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return n}parseInline(t,n=this.renderer){let s="";for(let i=0;i<t.length;i++){let a=t[i];if(this.options.extensions?.renderers?.[a.type]){let r=this.options.extensions.renderers[a.type].call({parser:this},a);if(r!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(a.type)){s+=r||"";continue}}let o=a;switch(o.type){case"escape":{s+=n.text(o);break}case"html":{s+=n.html(o);break}case"link":{s+=n.link(o);break}case"image":{s+=n.image(o);break}case"checkbox":{s+=n.checkbox(o);break}case"strong":{s+=n.strong(o);break}case"em":{s+=n.em(o);break}case"codespan":{s+=n.codespan(o);break}case"br":{s+=n.br(o);break}case"del":{s+=n.del(o);break}case"text":{s+=n.text(o);break}default:{let r='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return s}},gt=class{options;block;constructor(e){this.options=e||He}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?ie.lex:ie.lexInline}provideParser(){return this.block?ae.parse:ae.parseInline}},Qu=class{defaults=oi();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=ae;Renderer=sn;TextRenderer=fi;Lexer=ie;Tokenizer=nn;Hooks=gt;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case"table":{let i=s;for(let a of i.header)n=n.concat(this.walkTokens(a.tokens,t));for(let a of i.rows)for(let o of a)n=n.concat(this.walkTokens(o.tokens,t));break}case"list":{let i=s;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=s;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(a=>{let o=i[a].flat(1/0);n=n.concat(this.walkTokens(o,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=t.renderers[i.name];a?t.renderers[i.name]=function(...o){let r=i.renderer.apply(this,o);return r===!1&&(r=a.apply(this,o)),r}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[i.level];a?a.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),s.extensions=t),n.renderer){let i=this.defaults.renderer||new sn(this.defaults);for(let a in n.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let o=a,r=n.renderer[o],l=i[o];i[o]=(...p)=>{let d=r.apply(i,p);return d===!1&&(d=l.apply(i,p)),d||""}}s.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new nn(this.defaults);for(let a in n.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let o=a,r=n.tokenizer[o],l=i[o];i[o]=(...p)=>{let d=r.apply(i,p);return d===!1&&(d=l.apply(i,p)),d}}s.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new gt;for(let a in n.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let o=a,r=n.hooks[o],l=i[o];gt.passThroughHooks.has(a)?i[o]=p=>{if(this.defaults.async&&gt.passThroughHooksRespectAsync.has(a))return(async()=>{let u=await r.call(i,p);return l.call(i,u)})();let d=r.call(i,p);return l.call(i,d)}:i[o]=(...p)=>{if(this.defaults.async)return(async()=>{let u=await r.apply(i,p);return u===!1&&(u=await l.apply(i,p)),u})();let d=r.apply(i,p);return d===!1&&(d=l.apply(i,p)),d}}s.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,a=n.walkTokens;s.walkTokens=function(o){let r=[];return r.push(a.call(this,o)),i&&(r=r.concat(i.call(this,o))),r}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ie.lex(e,t??this.defaults)}parser(e,t){return ae.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},i={...this.defaults,...s},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&s.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let o=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer():e?ie.lex:ie.lexInline)(o,i),l=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(l,i.walkTokens));let p=await(i.hooks?await i.hooks.provideParser():e?ae.parse:ae.parseInline)(l,i);return i.hooks?await i.hooks.postprocess(p):p})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let o=(i.hooks?i.hooks.provideLexer():e?ie.lex:ie.lexInline)(t,i);i.hooks&&(o=i.hooks.processAllTokens(o)),i.walkTokens&&this.walkTokens(o,i.walkTokens);let r=(i.hooks?i.hooks.provideParser():e?ae.parse:ae.parseInline)(o,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`
258
- Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+me(n.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Ue=new Qu;function N(e,t){return Ue.parse(e,t)}N.options=N.setOptions=function(e){return Ue.setOptions(e),N.defaults=Ue.defaults,or(N.defaults),N};N.getDefaults=oi;N.defaults=He;N.use=function(...e){return Ue.use(...e),N.defaults=Ue.defaults,or(N.defaults),N};N.walkTokens=function(e,t){return Ue.walkTokens(e,t)};N.parseInline=Ue.parseInline;N.Parser=ae;N.parser=ae.parse;N.Renderer=sn;N.TextRenderer=fi;N.Lexer=ie;N.lexer=ie.lex;N.Tokenizer=nn;N.Hooks=gt;N.parse=N;N.options;N.setOptions;N.use;N.walkTokens;N.parseInline;ae.parse;ie.lex;N.setOptions({gfm:!0,breaks:!0,mangle:!1});const Ma=["a","b","blockquote","br","code","del","em","h1","h2","h3","h4","hr","i","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],La=["class","href","rel","target","title","start"];let Ra=!1;const Zu=14e4,Ju=4e4,Xu=200,ns=5e4,Ne=new Map;function ep(e){const t=Ne.get(e);return t===void 0?null:(Ne.delete(e),Ne.set(e,t),t)}function Pa(e,t){if(Ne.set(e,t),Ne.size<=Xu)return;const n=Ne.keys().next().value;n&&Ne.delete(n)}function tp(){Ra||(Ra=!0,ks.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function Ts(e){const t=e.trim();if(!t)return"";if(tp(),t.length<=ns){const o=ep(t);if(o!==null)return o}const n=mo(t,Zu),s=n.truncated?`
259
-
260
- … truncated (${n.total} chars, showing first ${n.text.length}).`:"";if(n.text.length>Ju){const r=`<pre class="code-block">${np(`${n.text}${s}`)}</pre>`,l=ks.sanitize(r,{ALLOWED_TAGS:Ma,ALLOWED_ATTR:La});return t.length<=ns&&Pa(t,l),l}const i=N.parse(`${n.text}${s}`),a=ks.sanitize(i,{ALLOWED_TAGS:Ma,ALLOWED_ATTR:La});return t.length<=ns&&Pa(t,a),a}function np(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const sp=1500,ip=2e3,mr="Copy as markdown",ap="Copied",op="Copy failed";async function rp(e){if(!e)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}function qt(e,t){e.title=t,e.setAttribute("aria-label",t)}function lp(e){const t=e.label??mr;return c`
261
- <button
262
- class="chat-copy-btn"
263
- type="button"
264
- title=${t}
265
- aria-label=${t}
266
- @click=${async n=>{const s=n.currentTarget;if(s?.querySelector(".chat-copy-btn__icon"),!s||s.dataset.copying==="1")return;s.dataset.copying="1",s.setAttribute("aria-busy","true"),s.disabled=!0;const i=await rp(e.text());if(s.isConnected){if(delete s.dataset.copying,s.removeAttribute("aria-busy"),s.disabled=!1,!i){s.dataset.error="1",qt(s,op),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.error,qt(s,t))},ip);return}s.dataset.copied="1",qt(s,ap),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.copied,qt(s,t))},sp)}}}
267
- >
268
- <span class="chat-copy-btn__icon" aria-hidden="true">
269
- <span class="chat-copy-btn__icon-copy">${W.copy}</span>
270
- <span class="chat-copy-btn__icon-check">${W.check}</span>
271
- </span>
272
- </button>
273
- `}function cp(e){return lp({text:()=>e,label:mr})}const dp={icon:"puzzle",detailKeys:["command","path","url","targetUrl","targetId","ref","element","node","nodeId","id","requestId","to","channelId","guildId","userId","name","query","pattern","messageId"]},up={bash:{icon:"wrench",title:"Bash",detailKeys:["command"]},process:{icon:"wrench",title:"Process",detailKeys:["sessionId"]},read:{icon:"fileText",title:"Read",detailKeys:["path"]},write:{icon:"edit",title:"Write",detailKeys:["path"]},edit:{icon:"penLine",title:"Edit",detailKeys:["path"]},attach:{icon:"paperclip",title:"Attach",detailKeys:["path","url","fileName"]},browser:{icon:"globe",title:"Browser",actions:{status:{label:"status"},start:{label:"start"},stop:{label:"stop"},tabs:{label:"tabs"},open:{label:"open",detailKeys:["targetUrl"]},focus:{label:"focus",detailKeys:["targetId"]},close:{label:"close",detailKeys:["targetId"]},snapshot:{label:"snapshot",detailKeys:["targetUrl","targetId","ref","element","format"]},screenshot:{label:"screenshot",detailKeys:["targetUrl","targetId","ref","element"]},navigate:{label:"navigate",detailKeys:["targetUrl","targetId"]},console:{label:"console",detailKeys:["level","targetId"]},pdf:{label:"pdf",detailKeys:["targetId"]},upload:{label:"upload",detailKeys:["paths","ref","inputRef","element","targetId"]},dialog:{label:"dialog",detailKeys:["accept","promptText","targetId"]},act:{label:"act",detailKeys:["request.kind","request.ref","request.selector","request.text","request.value"]}}},canvas:{icon:"image",title:"Canvas",actions:{present:{label:"present",detailKeys:["target","node","nodeId"]},hide:{label:"hide",detailKeys:["node","nodeId"]},navigate:{label:"navigate",detailKeys:["url","node","nodeId"]},eval:{label:"eval",detailKeys:["javaScript","node","nodeId"]},snapshot:{label:"snapshot",detailKeys:["format","node","nodeId"]},a2ui_push:{label:"A2UI push",detailKeys:["jsonlPath","node","nodeId"]},a2ui_reset:{label:"A2UI reset",detailKeys:["node","nodeId"]}}},nodes:{icon:"smartphone",title:"Nodes",actions:{status:{label:"status"},describe:{label:"describe",detailKeys:["node","nodeId"]},pending:{label:"pending"},approve:{label:"approve",detailKeys:["requestId"]},reject:{label:"reject",detailKeys:["requestId"]},notify:{label:"notify",detailKeys:["node","nodeId","title","body"]},camera_snap:{label:"camera snap",detailKeys:["node","nodeId","facing","deviceId"]},camera_list:{label:"camera list",detailKeys:["node","nodeId"]},camera_clip:{label:"camera clip",detailKeys:["node","nodeId","facing","duration","durationMs"]},screen_record:{label:"screen record",detailKeys:["node","nodeId","duration","durationMs","fps","screenIndex"]}}},cron:{icon:"loader",title:"Cron",actions:{status:{label:"status"},list:{label:"list"},add:{label:"add",detailKeys:["job.name","job.id","job.schedule","job.cron"]},update:{label:"update",detailKeys:["id"]},remove:{label:"remove",detailKeys:["id"]},run:{label:"run",detailKeys:["id"]},runs:{label:"runs",detailKeys:["id"]},wake:{label:"wake",detailKeys:["text","mode"]}}},gateway:{icon:"plug",title:"Gateway",actions:{restart:{label:"restart",detailKeys:["reason","delayMs"]},"config.get":{label:"config get"},"config.schema":{label:"config schema"},"config.apply":{label:"config apply",detailKeys:["restartDelayMs"]},"update.run":{label:"update run",detailKeys:["restartDelayMs"]}}},whatsapp_login:{icon:"circle",title:"WhatsApp Login",actions:{start:{label:"start"},wait:{label:"wait"}}},discord:{icon:"messageSquare",title:"Discord",actions:{react:{label:"react",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"reactions",detailKeys:["channelId","messageId"]},sticker:{label:"sticker",detailKeys:["to","stickerIds"]},poll:{label:"poll",detailKeys:["question","to"]},permissions:{label:"permissions",detailKeys:["channelId"]},readMessages:{label:"read messages",detailKeys:["channelId","limit"]},sendMessage:{label:"send",detailKeys:["to","content"]},editMessage:{label:"edit",detailKeys:["channelId","messageId"]},deleteMessage:{label:"delete",detailKeys:["channelId","messageId"]},threadCreate:{label:"thread create",detailKeys:["channelId","name"]},threadList:{label:"thread list",detailKeys:["guildId","channelId"]},threadReply:{label:"thread reply",detailKeys:["channelId","content"]},pinMessage:{label:"pin",detailKeys:["channelId","messageId"]},unpinMessage:{label:"unpin",detailKeys:["channelId","messageId"]},listPins:{label:"list pins",detailKeys:["channelId"]},searchMessages:{label:"search",detailKeys:["guildId","content"]},memberInfo:{label:"member",detailKeys:["guildId","userId"]},roleInfo:{label:"roles",detailKeys:["guildId"]},emojiList:{label:"emoji list",detailKeys:["guildId"]},roleAdd:{label:"role add",detailKeys:["guildId","userId","roleId"]},roleRemove:{label:"role remove",detailKeys:["guildId","userId","roleId"]},channelInfo:{label:"channel",detailKeys:["channelId"]},channelList:{label:"channels",detailKeys:["guildId"]},voiceStatus:{label:"voice",detailKeys:["guildId","userId"]},eventList:{label:"events",detailKeys:["guildId"]},eventCreate:{label:"event create",detailKeys:["guildId","name"]},timeout:{label:"timeout",detailKeys:["guildId","userId"]},kick:{label:"kick",detailKeys:["guildId","userId"]},ban:{label:"ban",detailKeys:["guildId","userId"]}}},slack:{icon:"messageSquare",title:"Slack",actions:{react:{label:"react",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"reactions",detailKeys:["channelId","messageId"]},sendMessage:{label:"send",detailKeys:["to","content"]},editMessage:{label:"edit",detailKeys:["channelId","messageId"]},deleteMessage:{label:"delete",detailKeys:["channelId","messageId"]},readMessages:{label:"read messages",detailKeys:["channelId","limit"]},pinMessage:{label:"pin",detailKeys:["channelId","messageId"]},unpinMessage:{label:"unpin",detailKeys:["channelId","messageId"]},listPins:{label:"list pins",detailKeys:["channelId"]},memberInfo:{label:"member",detailKeys:["userId"]},emojiList:{label:"emoji list"}}}},pp={fallback:dp,tools:up},yr=pp,Na=yr.fallback??{icon:"puzzle"},hp=yr.tools??{};function fp(e){return(e??"tool").trim()}function gp(e){const t=e.replace(/_/g," ").trim();return t?t.split(/\s+/).map(n=>n.length<=2&&n.toUpperCase()===n?n:`${n.at(0)?.toUpperCase()??""}${n.slice(1)}`).join(" "):"Tool"}function vp(e){const t=e?.trim();if(t)return t.replace(/_/g," ")}function br(e){if(e!=null){if(typeof e=="string"){const t=e.trim();if(!t)return;const n=t.split(/\r?\n/)[0]?.trim()??"";return n?n.length>160?`${n.slice(0,157)}…`:n:void 0}if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e)){const t=e.map(s=>br(s)).filter(s=>!!s);if(t.length===0)return;const n=t.slice(0,3).join(", ");return t.length>3?`${n}…`:n}}}function mp(e,t){if(!e||typeof e!="object")return;let n=e;for(const s of t.split(".")){if(!s||!n||typeof n!="object")return;n=n[s]}return n}function yp(e,t){for(const n of t){const s=mp(e,n),i=br(s);if(i)return i}}function bp(e){if(!e||typeof e!="object")return;const t=e,n=typeof t.path=="string"?t.path:void 0;if(!n)return;const s=typeof t.offset=="number"?t.offset:void 0,i=typeof t.limit=="number"?t.limit:void 0;return s!==void 0&&i!==void 0?`${n}:${s}-${s+i}`:n}function wp(e){if(!e||typeof e!="object")return;const t=e;return typeof t.path=="string"?t.path:void 0}function $p(e,t){if(!(!e||!t))return e.actions?.[t]??void 0}function xp(e){const t=fp(e.name),n=t.toLowerCase(),s=hp[n],i=s?.icon??Na.icon??"puzzle",a=s?.title??gp(t),o=s?.label??t,r=e.args&&typeof e.args=="object"?e.args.action:void 0,l=typeof r=="string"?r.trim():void 0,p=$p(s,l),d=vp(p?.label??l);let u;n==="read"&&(u=bp(e.args)),!u&&(n==="write"||n==="edit"||n==="attach")&&(u=wp(e.args));const g=p?.detailKeys??s?.detailKeys??Na.detailKeys??[];return!u&&g.length>0&&(u=yp(e.args,g)),!u&&e.meta&&(u=e.meta),u&&(u=kp(u)),{name:t,icon:i,title:a,label:o,verb:d,detail:u}}function Ap(e){const t=[];if(e.verb&&t.push(e.verb),e.detail&&t.push(e.detail),t.length!==0)return t.join(" · ")}function kp(e){return e&&e.replace(/\/Users\/[^/]+/g,"~").replace(/\/home\/[^/]+/g,"~")}const Sp=80,_p=2,Oa=100;function Cp(e){const t=e.trim();if(t.startsWith("{")||t.startsWith("["))try{const n=JSON.parse(t);return"```json\n"+JSON.stringify(n,null,2)+"\n```"}catch{}return e}function Tp(e){const t=e.split(`
274
- `),n=t.slice(0,_p),s=n.join(`
275
- `);return s.length>Oa?s.slice(0,Oa)+"…":n.length<t.length?s+"…":s}function Ep(e){const t=e,n=Ip(t.content),s=[];for(const i of n){const a=String(i.type??"").toLowerCase();(["toolcall","tool_call","tooluse","tool_use"].includes(a)||typeof i.name=="string"&&i.arguments!=null)&&s.push({kind:"call",name:i.name??"tool",args:Mp(i.arguments??i.args)})}for(const i of n){const a=String(i.type??"").toLowerCase();if(a!=="toolresult"&&a!=="tool_result")continue;const o=Lp(i),r=typeof i.name=="string"?i.name:"tool";s.push({kind:"result",name:r,text:o})}if(tr(e)&&!s.some(i=>i.kind==="result")){const i=typeof t.toolName=="string"&&t.toolName||typeof t.tool_name=="string"&&t.tool_name||"tool",a=yo(e)??void 0;s.push({kind:"result",name:i,text:a})}return s}function Da(e,t){const n=xp({name:e.name,args:e.args}),s=Ap(n),i=!!e.text?.trim(),a=!!t,o=a?()=>{if(i){t(Cp(e.text));return}const u=`## ${n.label}
276
-
277
- ${s?`**Command:** \`${s}\`
278
-
279
- `:""}*No output — tool completed successfully.*`;t(u)}:void 0,r=i&&(e.text?.length??0)<=Sp,l=i&&!r,p=i&&r,d=!i;return c`
280
- <div
281
- class="chat-tool-card ${a?"chat-tool-card--clickable":""}"
282
- @click=${o}
283
- role=${a?"button":f}
284
- tabindex=${a?"0":f}
285
- @keydown=${a?u=>{u.key!=="Enter"&&u.key!==" "||(u.preventDefault(),o?.())}:f}
286
- >
287
- <div class="chat-tool-card__header">
288
- <div class="chat-tool-card__title">
289
- <span class="chat-tool-card__icon">${W[n.icon]}</span>
290
- <span>${n.label}</span>
291
- </div>
292
- ${a?c`<span class="chat-tool-card__action">${i?"View":""} ${W.check}</span>`:f}
293
- ${d&&!a?c`<span class="chat-tool-card__status">${W.check}</span>`:f}
294
- </div>
295
- ${s?c`<div class="chat-tool-card__detail">${s}</div>`:f}
296
- ${d?c`
297
- <div class="chat-tool-card__status-text muted">Completed</div>
298
- `:f}
299
- ${l?c`<div class="chat-tool-card__preview mono">${Tp(e.text)}</div>`:f}
300
- ${p?c`<div class="chat-tool-card__inline mono">${e.text}</div>`:f}
301
- </div>
302
- `}function Ip(e){return Array.isArray(e)?e.filter(Boolean):[]}function Mp(e){if(typeof e!="string")return e;const t=e.trim();if(!t||!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(t)}catch{return e}}function Lp(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function Rp(e){const n=e.content,s=[];if(Array.isArray(n))for(const i of n){if(typeof i!="object"||i===null)continue;const a=i;if(a.type==="image"){const o=a.source;if(o?.type==="base64"&&typeof o.data=="string"){const r=o.data,l=o.media_type||"image/png",p=r.startsWith("data:")?r:`data:${l};base64,${r}`;s.push({url:p})}else typeof a.url=="string"&&s.push({url:a.url})}else if(a.type==="image_url"){const o=a.image_url;typeof o?.url=="string"&&s.push({url:o.url})}}return s}function Pp(e){return c`
303
- <div class="chat-group assistant">
304
- ${gi("assistant",e)}
305
- <div class="chat-group-messages">
306
- <div class="chat-bubble chat-reading-indicator" aria-hidden="true">
307
- <span class="chat-reading-indicator__dots">
308
- <span></span><span></span><span></span>
309
- </span>
310
- </div>
311
- </div>
312
- </div>
313
- `}function Np(e,t,n,s){const i=new Date(t).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),a=s?.name??"Assistant";return c`
314
- <div class="chat-group assistant">
315
- ${gi("assistant",s)}
316
- <div class="chat-group-messages">
317
- ${wr({role:"assistant",content:[{type:"text",text:e}],timestamp:t},{isStreaming:!0,showReasoning:!1},n)}
318
- <div class="chat-group-footer">
319
- <span class="chat-sender-name">${a}</span>
320
- <span class="chat-group-timestamp">${i}</span>
321
- </div>
322
- </div>
323
- </div>
324
- `}function Op(e,t){const n=ai(e.role),s=t.assistantName??"Assistant",i=n==="user"?"You":n==="assistant"?s:n,a=n==="user"?"user":n==="assistant"?"assistant":"other",o=new Date(e.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"});return c`
325
- <div class="chat-group ${a}">
326
- ${gi(e.role,{name:s,avatar:t.assistantAvatar??null})}
327
- <div class="chat-group-messages">
328
- ${e.messages.map((r,l)=>wr(r.message,{isStreaming:e.isStreaming&&l===e.messages.length-1,showReasoning:t.showReasoning},t.onOpenSidebar))}
329
- <div class="chat-group-footer">
330
- <span class="chat-sender-name">${i}</span>
331
- <span class="chat-group-timestamp">${o}</span>
332
- </div>
333
- </div>
334
- </div>
335
- `}function gi(e,t){const n=ai(e),s=t?.name?.trim()||"Assistant",i=t?.avatar?.trim()||"",a=n==="user"?"U":n==="assistant"?s.charAt(0).toUpperCase()||"A":n==="tool"?"⚙":"?",o=n==="user"?"user":n==="assistant"?"assistant":n==="tool"?"tool":"other";return i&&n==="assistant"?Dp(i)?c`<img
336
- class="chat-avatar ${o}"
337
- src="${i}"
338
- alt="${s}"
339
- />`:c`<div class="chat-avatar ${o}">${i}</div>`:c`<div class="chat-avatar ${o}">${a}</div>`}function Dp(e){return/^https?:\/\//i.test(e)||/^data:image\//i.test(e)||/^\//.test(e)}function Bp(e){return e.length===0?f:c`
340
- <div class="chat-message-images">
341
- ${e.map(t=>c`
342
- <img
343
- src=${t.url}
344
- alt=${t.alt??"Attached image"}
345
- class="chat-message-image"
346
- @click=${()=>window.open(t.url,"_blank")}
347
- />
348
- `)}
349
- </div>
350
- `}function wr(e,t,n){const s=e,i=typeof s.role=="string"?s.role:"unknown",a=tr(e)||i.toLowerCase()==="toolresult"||i.toLowerCase()==="tool_result"||typeof s.toolCallId=="string"||typeof s.tool_call_id=="string",o=Ep(e),r=o.length>0,l=Rp(e),p=l.length>0,d=yo(e),u=t.showReasoning&&i==="assistant"?Nl(e):null,g=d?.trim()?d:null,v=u?Dl(u):null,y=g,$=i==="assistant"&&!!y?.trim(),A=["chat-bubble",$?"has-copy":"",t.isStreaming?"streaming":"","fade-in"].filter(Boolean).join(" ");return!y&&r&&a?c`${o.map(_=>Da(_,n))}`:!y&&!r&&!p?f:c`
351
- <div class="${A}">
352
- ${$?cp(y):f}
353
- ${Bp(l)}
354
- ${v?c`<div class="chat-thinking">${ws(Ts(v))}</div>`:f}
355
- ${y?c`<div class="chat-text">${ws(Ts(y))}</div>`:f}
356
- ${o.map(_=>Da(_,n))}
357
- </div>
358
- `}function Fp(e){return c`
359
- <div class="sidebar-panel">
360
- <div class="sidebar-header">
361
- <div class="sidebar-title">Tool Output</div>
362
- <button @click=${e.onClose} class="btn" title="Close sidebar">
363
- ${W.x}
364
- </button>
365
- </div>
366
- <div class="sidebar-content">
367
- ${e.error?c`
368
- <div class="callout danger">${e.error}</div>
369
- <button @click=${e.onViewRawText} class="btn" style="margin-top: 12px;">
370
- View Raw Text
371
- </button>
372
- `:e.content?c`<div class="sidebar-markdown">${ws(Ts(e.content))}</div>`:c`
373
- <div class="muted">No content available</div>
374
- `}
375
- </div>
376
- </div>
377
- `}var Up=Object.defineProperty,Kp=Object.getOwnPropertyDescriptor,wn=(e,t,n,s)=>{for(var i=s>1?void 0:s?Kp(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(s?o(t,n,i):o(i))||i);return s&&i&&Up(t,n,i),i};let nt=class extends Je{constructor(){super(...arguments),this.splitRatio=.6,this.minRatio=.4,this.maxRatio=.7,this.isDragging=!1,this.startX=0,this.startRatio=0,this.handleMouseDown=e=>{this.isDragging=!0,this.startX=e.clientX,this.startRatio=this.splitRatio,this.classList.add("dragging"),document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp),e.preventDefault()},this.handleMouseMove=e=>{if(!this.isDragging)return;const t=this.parentElement;if(!t)return;const n=t.getBoundingClientRect().width,i=(e.clientX-this.startX)/n;let a=this.startRatio+i;a=Math.max(this.minRatio,Math.min(this.maxRatio,a)),this.dispatchEvent(new CustomEvent("resize",{detail:{splitRatio:a},bubbles:!0,composed:!0}))},this.handleMouseUp=()=>{this.isDragging=!1,this.classList.remove("dragging"),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}}render(){return c`
378
-
379
- `}connectedCallback(){super.connectedCallback(),this.addEventListener("mousedown",this.handleMouseDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("mousedown",this.handleMouseDown),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}};nt.styles=Vr`
380
- :host {
381
- width: 4px;
382
- cursor: col-resize;
383
- background: var(--border, #333);
384
- transition: background 150ms ease-out;
385
- flex-shrink: 0;
386
- position: relative;
387
- }
388
-
389
- :host::before {
390
- content: "";
391
- position: absolute;
392
- top: 0;
393
- left: -4px;
394
- right: -4px;
395
- bottom: 0;
396
- }
397
-
398
- :host(:hover) {
399
- background: var(--accent, #007bff);
400
- }
401
-
402
- :host(.dragging) {
403
- background: var(--accent, #007bff);
404
- }
405
- `;wn([ln({type:Number})],nt.prototype,"splitRatio",2);wn([ln({type:Number})],nt.prototype,"minRatio",2);wn([ln({type:Number})],nt.prototype,"maxRatio",2);nt=wn([co("resizable-divider")],nt);const Hp=5e3;function Ba(e){e.style.height="auto",e.style.height=`${e.scrollHeight}px`}function zp(e){return e?e.active?c`
406
- <div class="callout info compaction-indicator compaction-indicator--active">
407
- ${W.loader} Compacting context...
408
- </div>
409
- `:e.completedAt&&Date.now()-e.completedAt<Hp?c`
410
- <div class="callout success compaction-indicator compaction-indicator--complete">
411
- ${W.check} Context compacted
412
- </div>
413
- `:f:f}function jp(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function qp(e,t){const n=e.clipboardData?.items;if(!n||!t.onAttachmentsChange)return;const s=[];for(let i=0;i<n.length;i++){const a=n[i];a.type.startsWith("image/")&&s.push(a)}if(s.length!==0){e.preventDefault();for(const i of s){const a=i.getAsFile();if(!a)continue;const o=new FileReader;o.onload=()=>{const r=o.result,l={id:jp(),dataUrl:r,mimeType:a.type},p=t.attachments??[];t.onAttachmentsChange?.([...p,l])},o.readAsDataURL(a)}}}function Gp(e){const t=e.attachments??[];return t.length===0?f:c`
414
- <div class="chat-attachments">
415
- ${t.map(n=>c`
416
- <div class="chat-attachment">
417
- <img
418
- src=${n.dataUrl}
419
- alt="Attachment preview"
420
- class="chat-attachment__img"
421
- />
422
- <button
423
- class="chat-attachment__remove"
424
- type="button"
425
- aria-label="Remove attachment"
426
- @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
427
- >
428
- ${W.x}
429
- </button>
430
- </div>
431
- `)}
432
- </div>
433
- `}function Wp(e){const t=e.connected,n=e.sending||e.stream!==null,s=!!(e.canAbort&&e.onAbort),a=e.sessions?.sessions?.find(v=>v.key===e.sessionKey)?.reasoningLevel??"off",o=e.showThinking&&a!=="off",r={name:e.assistantName,avatar:e.assistantAvatar??e.assistantAvatarUrl??null},l=(e.attachments?.length??0)>0,p=e.connected?l?"Add a message or paste more images...":"Message (↩ to send, Shift+↩ for line breaks, paste images)":"Connect to the gateway to start chatting…",d=e.splitRatio??.6,u=!!(e.sidebarOpen&&e.onCloseSidebar),g=c`
434
- <div
435
- class="chat-thread"
436
- role="log"
437
- aria-live="polite"
438
- @scroll=${e.onChatScroll}
439
- >
440
- ${e.loading?c`
441
- <div class="muted">Loading chat…</div>
442
- `:f}
443
- ${Xo(Yp(e),v=>v.key,v=>v.kind==="reading-indicator"?Pp(r):v.kind==="stream"?Np(v.text,v.startedAt,e.onOpenSidebar,r):v.kind==="group"?Op(v,{onOpenSidebar:e.onOpenSidebar,showReasoning:o,assistantName:e.assistantName,assistantAvatar:r.avatar}):f)}
444
- </div>
445
- `;return c`
446
- <section class="card chat">
447
- ${e.disabledReason?c`<div class="callout">${e.disabledReason}</div>`:f}
448
-
449
- ${e.error?c`<div class="callout danger">${e.error}</div>`:f}
450
-
451
- ${zp(e.compactionStatus)}
452
-
453
- ${e.focusMode?c`
454
- <button
455
- class="chat-focus-exit"
456
- type="button"
457
- @click=${e.onToggleFocusMode}
458
- aria-label="Exit focus mode"
459
- title="Exit focus mode"
460
- >
461
- ${W.x}
462
- </button>
463
- `:f}
464
-
465
- <div
466
- class="chat-split-container ${u?"chat-split-container--open":""}"
467
- >
468
- <div
469
- class="chat-main"
470
- style="flex: ${u?`0 0 ${d*100}%`:"1 1 100%"}"
471
- >
472
- ${g}
473
- </div>
474
-
475
- ${u?c`
476
- <resizable-divider
477
- .splitRatio=${d}
478
- @resize=${v=>e.onSplitRatioChange?.(v.detail.splitRatio)}
479
- ></resizable-divider>
480
- <div class="chat-sidebar">
481
- ${Fp({content:e.sidebarContent??null,error:e.sidebarError??null,onClose:e.onCloseSidebar,onViewRawText:()=>{!e.sidebarContent||!e.onOpenSidebar||e.onOpenSidebar(`\`\`\`
482
- ${e.sidebarContent}
483
- \`\`\``)}})}
484
- </div>
485
- `:f}
486
- </div>
487
-
488
- ${e.queue.length?c`
489
- <div class="chat-queue" role="status" aria-live="polite">
490
- <div class="chat-queue__title">Queued (${e.queue.length})</div>
491
- <div class="chat-queue__list">
492
- ${e.queue.map(v=>c`
493
- <div class="chat-queue__item">
494
- <div class="chat-queue__text">
495
- ${v.text||(v.attachments?.length?`Image (${v.attachments.length})`:"")}
496
- </div>
497
- <button
498
- class="btn chat-queue__remove"
499
- type="button"
500
- aria-label="Remove queued message"
501
- @click=${()=>e.onQueueRemove(v.id)}
502
- >
503
- ${W.x}
504
- </button>
505
- </div>
506
- `)}
507
- </div>
508
- </div>
509
- `:f}
510
-
511
- <div class="chat-compose">
512
- ${Gp(e)}
513
- <div class="chat-compose__row">
514
- <label class="field chat-compose__field">
515
- <span>Message</span>
516
- <textarea
517
- ${Gd(v=>v&&Ba(v))}
518
- .value=${e.draft}
519
- ?disabled=${!e.connected}
520
- @keydown=${v=>{v.key==="Enter"&&(v.isComposing||v.keyCode===229||v.shiftKey||e.connected&&(v.preventDefault(),t&&e.onSend()))}}
521
- @input=${v=>{const y=v.target;Ba(y),e.onDraftChange(y.value)}}
522
- @paste=${v=>qp(v,e)}
523
- placeholder=${p}
524
- ></textarea>
525
- </label>
526
- <div class="chat-compose__actions">
527
- <button
528
- class="btn"
529
- ?disabled=${!e.connected||!s&&e.sending}
530
- @click=${s?e.onAbort:e.onNewSession}
531
- >
532
- ${s?"Stop":"New session"}
533
- </button>
534
- <button
535
- class="btn primary"
536
- ?disabled=${!e.connected}
537
- @click=${e.onSend}
538
- >
539
- ${n?"Queue":"Send"}<kbd class="btn-kbd">↵</kbd>
540
- </button>
541
- </div>
542
- </div>
543
- </div>
544
- </section>
545
- `}const Fa=200;function Vp(e){const t=[];let n=null;for(const s of e){if(s.kind!=="message"){n&&(t.push(n),n=null),t.push(s);continue}const i=er(s.message),a=ai(i.role),o=i.timestamp||Date.now();!n||n.role!==a?(n&&t.push(n),n={kind:"group",key:`group:${a}:${s.key}`,role:a,messages:[{message:s.message,key:s.key}],timestamp:o,isStreaming:!1}):n.messages.push({message:s.message,key:s.key})}return n&&t.push(n),t}function Yp(e){const t=[],n=Array.isArray(e.messages)?e.messages:[],s=Array.isArray(e.toolMessages)?e.toolMessages:[],i=Math.max(0,n.length-Fa);i>0&&t.push({kind:"message",key:"chat:history:notice",message:{role:"system",content:`Showing last ${Fa} messages (${i} hidden).`,timestamp:Date.now()}});for(let a=i;a<n.length;a++){const o=n[a],r=er(o);!e.showThinking&&r.role.toLowerCase()==="toolresult"||t.push({kind:"message",key:Ua(o,a),message:o})}if(e.showThinking)for(let a=0;a<s.length;a++)t.push({kind:"message",key:Ua(s[a],a+n.length),message:s[a]});if(e.stream!==null){const a=`stream:${e.sessionKey}:${e.streamStartedAt??"live"}`;e.stream.trim().length>0?t.push({kind:"stream",key:a,text:e.stream,startedAt:e.streamStartedAt??Date.now()}):t.push({kind:"reading-indicator",key:a})}return Vp(t)}function Ua(e,t){const n=e,s=typeof n.toolCallId=="string"?n.toolCallId:"";if(s)return`tool:${s}`;const i=typeof n.id=="string"?n.id:"";if(i)return`msg:${i}`;const a=typeof n.messageId=="string"?n.messageId:"";if(a)return`msg:${a}`;const o=typeof n.timestamp=="number"?n.timestamp:null,r=typeof n.role=="string"?n.role:"unknown";return o!=null?`msg:${r}:${o}:${t}`:`msg:${r}:${t}`}function ue(e){if(e)return Array.isArray(e.type)?e.type.filter(n=>n!=="null")[0]??e.type[0]:e.type}function $r(e){if(!e)return"";if(e.default!==void 0)return e.default;switch(ue(e)){case"object":return{};case"array":return[];case"boolean":return!1;case"number":case"integer":return 0;case"string":return"";default:return""}}function $n(e){return e.filter(t=>typeof t=="string").join(".")}function te(e,t){const n=$n(e),s=t[n];if(s)return s;const i=n.split(".");for(const[a,o]of Object.entries(t)){if(!a.includes("*"))continue;const r=a.split(".");if(r.length!==i.length)continue;let l=!0;for(let p=0;p<i.length;p+=1)if(r[p]!=="*"&&r[p]!==i[p]){l=!1;break}if(l)return o}}function we(e){return e.replace(/_/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/\s+/g," ").replace(/^./,t=>t.toUpperCase())}function Qp(e){const t=$n(e).toLowerCase();return t.includes("token")||t.includes("password")||t.includes("secret")||t.includes("apikey")||t.endsWith("key")}const Zp=new Set(["title","description","default","nullable"]);function Jp(e){return Object.keys(e??{}).filter(n=>!Zp.has(n)).length===0}function Xp(e){if(e===void 0)return"";try{return JSON.stringify(e,null,2)??""}catch{return""}}const Ct={chevronDown:c`
546
- <svg
547
- viewBox="0 0 24 24"
548
- fill="none"
549
- stroke="currentColor"
550
- stroke-width="2"
551
- stroke-linecap="round"
552
- stroke-linejoin="round"
553
- >
554
- <polyline points="6 9 12 15 18 9"></polyline>
555
- </svg>
556
- `,plus:c`
557
- <svg
558
- viewBox="0 0 24 24"
559
- fill="none"
560
- stroke="currentColor"
561
- stroke-width="2"
562
- stroke-linecap="round"
563
- stroke-linejoin="round"
564
- >
565
- <line x1="12" y1="5" x2="12" y2="19"></line>
566
- <line x1="5" y1="12" x2="19" y2="12"></line>
567
- </svg>
568
- `,minus:c`
569
- <svg
570
- viewBox="0 0 24 24"
571
- fill="none"
572
- stroke="currentColor"
573
- stroke-width="2"
574
- stroke-linecap="round"
575
- stroke-linejoin="round"
576
- >
577
- <line x1="5" y1="12" x2="19" y2="12"></line>
578
- </svg>
579
- `,trash:c`
580
- <svg
581
- viewBox="0 0 24 24"
582
- fill="none"
583
- stroke="currentColor"
584
- stroke-width="2"
585
- stroke-linecap="round"
586
- stroke-linejoin="round"
587
- >
588
- <polyline points="3 6 5 6 21 6"></polyline>
589
- <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>
590
- </svg>
591
- `,edit:c`
592
- <svg
593
- viewBox="0 0 24 24"
594
- fill="none"
595
- stroke="currentColor"
596
- stroke-width="2"
597
- stroke-linecap="round"
598
- stroke-linejoin="round"
599
- >
600
- <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>
601
- <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>
602
- </svg>
603
- `};function be(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:o,onPatch:r}=e,l=e.showLabel??!0,p=ue(t),d=te(s,i),u=d?.label??t.title??we(String(s.at(-1))),g=d?.help??t.description,v=$n(s);if(a.has(v))return c`<div class="cfg-field cfg-field--error">
604
- <div class="cfg-field__label">${u}</div>
605
- <div class="cfg-field__error">Unsupported schema node. Use Raw mode.</div>
606
- </div>`;if(t.anyOf||t.oneOf){const $=(t.anyOf??t.oneOf??[]).filter(T=>!(T.type==="null"||Array.isArray(T.type)&&T.type.includes("null")));if($.length===1)return be({...e,schema:$[0]});const A=T=>{if(T.const!==void 0)return T.const;if(T.enum&&T.enum.length===1)return T.enum[0]},_=$.map(A),M=_.every(T=>T!==void 0);if(M&&_.length>0&&_.length<=5){const T=n??t.default;return c`
607
- <div class="cfg-field">
608
- ${l?c`<label class="cfg-field__label">${u}</label>`:f}
609
- ${g?c`<div class="cfg-field__help">${g}</div>`:f}
610
- <div class="cfg-segmented">
611
- ${_.map((E,pe)=>c`
612
- <button
613
- type="button"
614
- class="cfg-segmented__btn ${E===T||String(E)===String(T)?"active":""}"
615
- ?disabled=${o}
616
- @click=${()=>r(s,E)}
617
- >
618
- ${String(E)}
619
- </button>
620
- `)}
621
- </div>
622
- </div>
623
- `}if(M&&_.length>5)return Ha({...e,options:_,value:n??t.default});const P=new Set($.map(T=>ue(T)).filter(Boolean)),I=new Set([...P].map(T=>T==="integer"?"number":T));if([...I].every(T=>["string","number","boolean"].includes(T))){const T=I.has("string"),E=I.has("number");if(I.has("boolean")&&I.size===1)return be({...e,schema:{...t,type:"boolean",anyOf:void 0,oneOf:void 0}});if(T||E)return Ka({...e,inputType:E&&!T?"number":"text"})}}if(t.enum){const y=t.enum;if(y.length<=5){const $=n??t.default;return c`
624
- <div class="cfg-field">
625
- ${l?c`<label class="cfg-field__label">${u}</label>`:f}
626
- ${g?c`<div class="cfg-field__help">${g}</div>`:f}
627
- <div class="cfg-segmented">
628
- ${y.map(A=>c`
629
- <button
630
- type="button"
631
- class="cfg-segmented__btn ${A===$||String(A)===String($)?"active":""}"
632
- ?disabled=${o}
633
- @click=${()=>r(s,A)}
634
- >
635
- ${String(A)}
636
- </button>
637
- `)}
638
- </div>
639
- </div>
640
- `}return Ha({...e,options:y,value:n??t.default})}if(p==="object")return th(e);if(p==="array")return nh(e);if(p==="boolean"){const y=typeof n=="boolean"?n:typeof t.default=="boolean"?t.default:!1;return c`
641
- <label class="cfg-toggle-row ${o?"disabled":""}">
642
- <div class="cfg-toggle-row__content">
643
- <span class="cfg-toggle-row__label">${u}</span>
644
- ${g?c`<span class="cfg-toggle-row__help">${g}</span>`:f}
645
- </div>
646
- <div class="cfg-toggle">
647
- <input
648
- type="checkbox"
649
- .checked=${y}
650
- ?disabled=${o}
651
- @change=${$=>r(s,$.target.checked)}
652
- />
653
- <span class="cfg-toggle__track"></span>
654
- </div>
655
- </label>
656
- `}return p==="number"||p==="integer"?eh(e):p==="string"?Ka({...e,inputType:"text"}):c`
657
- <div class="cfg-field cfg-field--error">
658
- <div class="cfg-field__label">${u}</div>
659
- <div class="cfg-field__error">Unsupported type: ${p}. Use Raw mode.</div>
660
- </div>
661
- `}function Ka(e){const{schema:t,value:n,path:s,hints:i,disabled:a,onPatch:o,inputType:r}=e,l=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??we(String(s.at(-1))),u=p?.help??t.description,g=p?.sensitive??Qp(s),v=p?.placeholder??(g?"••••":t.default!==void 0?`Default: ${t.default}`:""),y=n??"";return c`
662
- <div class="cfg-field">
663
- ${l?c`<label class="cfg-field__label">${d}</label>`:f}
664
- ${u?c`<div class="cfg-field__help">${u}</div>`:f}
665
- <div class="cfg-input-wrap">
666
- <input
667
- type=${g?"password":r}
668
- class="cfg-input"
669
- placeholder=${v}
670
- .value=${y==null?"":String(y)}
671
- ?disabled=${a}
672
- @input=${$=>{const A=$.target.value;if(r==="number"){if(A.trim()===""){o(s,void 0);return}const _=Number(A);o(s,Number.isNaN(_)?A:_);return}o(s,A)}}
673
- @change=${$=>{if(r==="number")return;const A=$.target.value;o(s,A.trim())}}
674
- />
675
- ${t.default!==void 0?c`
676
- <button
677
- type="button"
678
- class="cfg-input__reset"
679
- title="Reset to default"
680
- ?disabled=${a}
681
- @click=${()=>o(s,t.default)}
682
- >↺</button>
683
- `:f}
684
- </div>
685
- </div>
686
- `}function eh(e){const{schema:t,value:n,path:s,hints:i,disabled:a,onPatch:o}=e,r=e.showLabel??!0,l=te(s,i),p=l?.label??t.title??we(String(s.at(-1))),d=l?.help??t.description,u=n??t.default??"",g=typeof u=="number"?u:0;return c`
687
- <div class="cfg-field">
688
- ${r?c`<label class="cfg-field__label">${p}</label>`:f}
689
- ${d?c`<div class="cfg-field__help">${d}</div>`:f}
690
- <div class="cfg-number">
691
- <button
692
- type="button"
693
- class="cfg-number__btn"
694
- ?disabled=${a}
695
- @click=${()=>o(s,g-1)}
696
- >−</button>
697
- <input
698
- type="number"
699
- class="cfg-number__input"
700
- .value=${u==null?"":String(u)}
701
- ?disabled=${a}
702
- @input=${v=>{const y=v.target.value,$=y===""?void 0:Number(y);o(s,$)}}
703
- />
704
- <button
705
- type="button"
706
- class="cfg-number__btn"
707
- ?disabled=${a}
708
- @click=${()=>o(s,g+1)}
709
- >+</button>
710
- </div>
711
- </div>
712
- `}function Ha(e){const{schema:t,value:n,path:s,hints:i,disabled:a,options:o,onPatch:r}=e,l=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??we(String(s.at(-1))),u=p?.help??t.description,g=n??t.default,v=o.findIndex($=>$===g||String($)===String(g)),y="__unset__";return c`
713
- <div class="cfg-field">
714
- ${l?c`<label class="cfg-field__label">${d}</label>`:f}
715
- ${u?c`<div class="cfg-field__help">${u}</div>`:f}
716
- <select
717
- class="cfg-select"
718
- ?disabled=${a}
719
- .value=${v>=0?String(v):y}
720
- @change=${$=>{const A=$.target.value;r(s,A===y?void 0:o[Number(A)])}}
721
- >
722
- <option value=${y}>Select...</option>
723
- ${o.map(($,A)=>c`
724
- <option value=${String(A)}>${String($)}</option>
725
- `)}
726
- </select>
727
- </div>
728
- `}function th(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:o,onPatch:r}=e;e.showLabel;const l=te(s,i),p=l?.label??t.title??we(String(s.at(-1))),d=l?.help??t.description,u=n??t.default,g=u&&typeof u=="object"&&!Array.isArray(u)?u:{},v=t.properties??{},$=Object.entries(v).sort((P,I)=>{const T=te([...s,P[0]],i)?.order??0,E=te([...s,I[0]],i)?.order??0;return T!==E?T-E:P[0].localeCompare(I[0])}),A=new Set(Object.keys(v)),_=t.additionalProperties,M=!!_&&typeof _=="object";return s.length===1?c`
729
- <div class="cfg-fields">
730
- ${$.map(([P,I])=>be({schema:I,value:g[P],path:[...s,P],hints:i,unsupported:a,disabled:o,onPatch:r}))}
731
- ${M?za({schema:_,value:g,path:s,hints:i,unsupported:a,disabled:o,reservedKeys:A,onPatch:r}):f}
732
- </div>
733
- `:c`
734
- <details class="cfg-object" open>
735
- <summary class="cfg-object__header">
736
- <span class="cfg-object__title">${p}</span>
737
- <span class="cfg-object__chevron">${Ct.chevronDown}</span>
738
- </summary>
739
- ${d?c`<div class="cfg-object__help">${d}</div>`:f}
740
- <div class="cfg-object__content">
741
- ${$.map(([P,I])=>be({schema:I,value:g[P],path:[...s,P],hints:i,unsupported:a,disabled:o,onPatch:r}))}
742
- ${M?za({schema:_,value:g,path:s,hints:i,unsupported:a,disabled:o,reservedKeys:A,onPatch:r}):f}
743
- </div>
744
- </details>
745
- `}function nh(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:o,onPatch:r}=e,l=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??we(String(s.at(-1))),u=p?.help??t.description,g=Array.isArray(t.items)?t.items[0]:t.items;if(!g)return c`
746
- <div class="cfg-field cfg-field--error">
747
- <div class="cfg-field__label">${d}</div>
748
- <div class="cfg-field__error">Unsupported array schema. Use Raw mode.</div>
749
- </div>
750
- `;const v=Array.isArray(n)?n:Array.isArray(t.default)?t.default:[];return c`
751
- <div class="cfg-array">
752
- <div class="cfg-array__header">
753
- ${l?c`<span class="cfg-array__label">${d}</span>`:f}
754
- <span class="cfg-array__count">${v.length} item${v.length!==1?"s":""}</span>
755
- <button
756
- type="button"
757
- class="cfg-array__add"
758
- ?disabled=${o}
759
- @click=${()=>{const y=[...v,$r(g)];r(s,y)}}
760
- >
761
- <span class="cfg-array__add-icon">${Ct.plus}</span>
762
- Add
763
- </button>
764
- </div>
765
- ${u?c`<div class="cfg-array__help">${u}</div>`:f}
766
-
767
- ${v.length===0?c`
768
- <div class="cfg-array__empty">No items yet. Click "Add" to create one.</div>
769
- `:c`
770
- <div class="cfg-array__items">
771
- ${v.map((y,$)=>c`
772
- <div class="cfg-array__item">
773
- <div class="cfg-array__item-header">
774
- <span class="cfg-array__item-index">#${$+1}</span>
775
- <button
776
- type="button"
777
- class="cfg-array__item-remove"
778
- title="Remove item"
779
- ?disabled=${o}
780
- @click=${()=>{const A=[...v];A.splice($,1),r(s,A)}}
781
- >
782
- ${Ct.trash}
783
- </button>
784
- </div>
785
- <div class="cfg-array__item-content">
786
- ${be({schema:g,value:y,path:[...s,$],hints:i,unsupported:a,disabled:o,showLabel:!1,onPatch:r})}
787
- </div>
788
- </div>
789
- `)}
790
- </div>
791
- `}
792
- </div>
793
- `}function za(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:o,reservedKeys:r,onPatch:l}=e,p=Jp(t),d=Object.entries(n??{}).filter(([u])=>!r.has(u));return c`
794
- <div class="cfg-map">
795
- <div class="cfg-map__header">
796
- <span class="cfg-map__label">Custom entries</span>
797
- <button
798
- type="button"
799
- class="cfg-map__add"
800
- ?disabled=${o}
801
- @click=${()=>{const u={...n??{}};let g=1,v=`custom-${g}`;for(;v in u;)g+=1,v=`custom-${g}`;u[v]=p?{}:$r(t),l(s,u)}}
802
- >
803
- <span class="cfg-map__add-icon">${Ct.plus}</span>
804
- Add Entry
805
- </button>
806
- </div>
807
-
808
- ${d.length===0?c`
809
- <div class="cfg-map__empty">No custom entries.</div>
810
- `:c`
811
- <div class="cfg-map__items">
812
- ${d.map(([u,g])=>{const v=[...s,u],y=Xp(g);return c`
813
- <div class="cfg-map__item">
814
- <div class="cfg-map__item-key">
815
- <input
816
- type="text"
817
- class="cfg-input cfg-input--sm"
818
- placeholder="Key"
819
- .value=${u}
820
- ?disabled=${o}
821
- @change=${$=>{const A=$.target.value.trim();if(!A||A===u)return;const _={...n??{}};A in _||(_[A]=_[u],delete _[u],l(s,_))}}
822
- />
823
- </div>
824
- <div class="cfg-map__item-value">
825
- ${p?c`
826
- <textarea
827
- class="cfg-textarea cfg-textarea--sm"
828
- placeholder="JSON value"
829
- rows="2"
830
- .value=${y}
831
- ?disabled=${o}
832
- @change=${$=>{const A=$.target,_=A.value.trim();if(!_){l(v,void 0);return}try{l(v,JSON.parse(_))}catch{A.value=y}}}
833
- ></textarea>
834
- `:be({schema:t,value:g,path:v,hints:i,unsupported:a,disabled:o,showLabel:!1,onPatch:l})}
835
- </div>
836
- <button
837
- type="button"
838
- class="cfg-map__item-remove"
839
- title="Remove entry"
840
- ?disabled=${o}
841
- @click=${()=>{const $={...n??{}};delete $[u],l(s,$)}}
842
- >
843
- ${Ct.trash}
844
- </button>
845
- </div>
846
- `})}
847
- </div>
848
- `}
849
- </div>
850
- `}const ja={env:c`
851
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
852
- <circle cx="12" cy="12" r="3"></circle>
853
- <path
854
- d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"
855
- ></path>
856
- </svg>
857
- `,update:c`
858
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
859
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
860
- <polyline points="7 10 12 15 17 10"></polyline>
861
- <line x1="12" y1="15" x2="12" y2="3"></line>
862
- </svg>
863
- `,agents:c`
864
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
865
- <path
866
- d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2z"
867
- ></path>
868
- <circle cx="8" cy="14" r="1"></circle>
869
- <circle cx="16" cy="14" r="1"></circle>
870
- </svg>
871
- `,auth:c`
872
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
873
- <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>
874
- <path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
875
- </svg>
876
- `,channels:c`
877
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
878
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
879
- </svg>
880
- `,messages:c`
881
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
882
- <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path>
883
- <polyline points="22,6 12,13 2,6"></polyline>
884
- </svg>
885
- `,commands:c`
886
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
887
- <polyline points="4 17 10 11 4 5"></polyline>
888
- <line x1="12" y1="19" x2="20" y2="19"></line>
889
- </svg>
890
- `,hooks:c`
891
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
892
- <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>
893
- <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
894
- </svg>
895
- `,skills:c`
896
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
897
- <polygon
898
- points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
899
- ></polygon>
900
- </svg>
901
- `,tools:c`
902
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
903
- <path
904
- d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
905
- ></path>
906
- </svg>
907
- `,gateway:c`
908
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
909
- <circle cx="12" cy="12" r="10"></circle>
910
- <line x1="2" y1="12" x2="22" y2="12"></line>
911
- <path
912
- d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
913
- ></path>
914
- </svg>
915
- `,wizard:c`
916
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
917
- <path d="M15 4V2"></path>
918
- <path d="M15 16v-2"></path>
919
- <path d="M8 9h2"></path>
920
- <path d="M20 9h2"></path>
921
- <path d="M17.8 11.8 19 13"></path>
922
- <path d="M15 9h0"></path>
923
- <path d="M17.8 6.2 19 5"></path>
924
- <path d="m3 21 9-9"></path>
925
- <path d="M12.2 6.2 11 5"></path>
926
- </svg>
927
- `,meta:c`
928
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
929
- <path d="M12 20h9"></path>
930
- <path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
931
- </svg>
932
- `,logging:c`
933
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
934
- <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
935
- <polyline points="14 2 14 8 20 8"></polyline>
936
- <line x1="16" y1="13" x2="8" y2="13"></line>
937
- <line x1="16" y1="17" x2="8" y2="17"></line>
938
- <polyline points="10 9 9 9 8 9"></polyline>
939
- </svg>
940
- `,browser:c`
941
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
942
- <circle cx="12" cy="12" r="10"></circle>
943
- <circle cx="12" cy="12" r="4"></circle>
944
- <line x1="21.17" y1="8" x2="12" y2="8"></line>
945
- <line x1="3.95" y1="6.06" x2="8.54" y2="14"></line>
946
- <line x1="10.88" y1="21.94" x2="15.46" y2="14"></line>
947
- </svg>
948
- `,ui:c`
949
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
950
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
951
- <line x1="3" y1="9" x2="21" y2="9"></line>
952
- <line x1="9" y1="21" x2="9" y2="9"></line>
953
- </svg>
954
- `,models:c`
955
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
956
- <path
957
- d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"
958
- ></path>
959
- <polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
960
- <line x1="12" y1="22.08" x2="12" y2="12"></line>
961
- </svg>
962
- `,bindings:c`
963
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
964
- <rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect>
965
- <rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect>
966
- <line x1="6" y1="6" x2="6.01" y2="6"></line>
967
- <line x1="6" y1="18" x2="6.01" y2="18"></line>
968
- </svg>
969
- `,broadcast:c`
970
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
971
- <path d="M4.9 19.1C1 15.2 1 8.8 4.9 4.9"></path>
972
- <path d="M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5"></path>
973
- <circle cx="12" cy="12" r="2"></circle>
974
- <path d="M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5"></path>
975
- <path d="M19.1 4.9C23 8.8 23 15.1 19.1 19"></path>
976
- </svg>
977
- `,audio:c`
978
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
979
- <path d="M9 18V5l12-2v13"></path>
980
- <circle cx="6" cy="18" r="3"></circle>
981
- <circle cx="18" cy="16" r="3"></circle>
982
- </svg>
983
- `,session:c`
984
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
985
- <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
986
- <circle cx="9" cy="7" r="4"></circle>
987
- <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
988
- <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
989
- </svg>
990
- `,cron:c`
991
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
992
- <circle cx="12" cy="12" r="10"></circle>
993
- <polyline points="12 6 12 12 16 14"></polyline>
994
- </svg>
995
- `,web:c`
996
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
997
- <circle cx="12" cy="12" r="10"></circle>
998
- <line x1="2" y1="12" x2="22" y2="12"></line>
999
- <path
1000
- d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
1001
- ></path>
1002
- </svg>
1003
- `,discovery:c`
1004
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1005
- <circle cx="11" cy="11" r="8"></circle>
1006
- <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
1007
- </svg>
1008
- `,canvasHost:c`
1009
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1010
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1011
- <circle cx="8.5" cy="8.5" r="1.5"></circle>
1012
- <polyline points="21 15 16 10 5 21"></polyline>
1013
- </svg>
1014
- `,talk:c`
1015
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1016
- <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
1017
- <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
1018
- <line x1="12" y1="19" x2="12" y2="23"></line>
1019
- <line x1="8" y1="23" x2="16" y2="23"></line>
1020
- </svg>
1021
- `,plugins:c`
1022
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1023
- <path d="M12 2v6"></path>
1024
- <path d="m4.93 10.93 4.24 4.24"></path>
1025
- <path d="M2 12h6"></path>
1026
- <path d="m4.93 13.07 4.24-4.24"></path>
1027
- <path d="M12 22v-6"></path>
1028
- <path d="m19.07 13.07-4.24-4.24"></path>
1029
- <path d="M22 12h-6"></path>
1030
- <path d="m19.07 10.93-4.24 4.24"></path>
1031
- </svg>
1032
- `,default:c`
1033
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
1034
- <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
1035
- <polyline points="14 2 14 8 20 8"></polyline>
1036
- </svg>
1037
- `},vi={env:{label:"Environment Variables",description:"Environment variables passed to the gateway process"},update:{label:"Updates",description:"Auto-update settings and release channel"},agents:{label:"Agents",description:"Agent configurations, models, and identities"},auth:{label:"Authentication",description:"API keys and authentication profiles"},channels:{label:"Channels",description:"Messaging channels (Telegram, Discord, Slack, etc.)"},messages:{label:"Messages",description:"Message handling and routing settings"},commands:{label:"Commands",description:"Custom slash commands"},hooks:{label:"Hooks",description:"Webhooks and event hooks"},skills:{label:"Skills",description:"Skill packs and capabilities"},tools:{label:"Tools",description:"Tool configurations (browser, search, etc.)"},gateway:{label:"Gateway",description:"Gateway server settings (port, auth, binding)"},wizard:{label:"Setup Wizard",description:"Setup wizard state and history"},meta:{label:"Metadata",description:"Gateway metadata and version information"},logging:{label:"Logging",description:"Log levels and output configuration"},browser:{label:"Browser",description:"Browser automation settings"},ui:{label:"UI",description:"User interface preferences"},models:{label:"Models",description:"AI model configurations and providers"},bindings:{label:"Bindings",description:"Key bindings and shortcuts"},broadcast:{label:"Broadcast",description:"Broadcast and notification settings"},audio:{label:"Audio",description:"Audio input/output settings"},session:{label:"Session",description:"Session management and persistence"},cron:{label:"Cron",description:"Scheduled tasks and automation"},web:{label:"Web",description:"Web server and API settings"},discovery:{label:"Discovery",description:"Service discovery and networking"},canvasHost:{label:"Canvas Host",description:"Canvas rendering and display"},talk:{label:"Talk",description:"Voice and speech settings"},plugins:{label:"Plugins",description:"Plugin management and extensions"}};function qa(e){return ja[e]??ja.default}function sh(e,t,n){if(!n)return!0;const s=n.toLowerCase(),i=vi[e];return e.toLowerCase().includes(s)||i&&(i.label.toLowerCase().includes(s)||i.description.toLowerCase().includes(s))?!0:vt(t,s)}function vt(e,t){if(e.title?.toLowerCase().includes(t)||e.description?.toLowerCase().includes(t)||e.enum?.some(s=>String(s).toLowerCase().includes(t)))return!0;if(e.properties){for(const[s,i]of Object.entries(e.properties))if(s.toLowerCase().includes(t)||vt(i,t))return!0}if(e.items){const s=Array.isArray(e.items)?e.items:[e.items];for(const i of s)if(i&&vt(i,t))return!0}if(e.additionalProperties&&typeof e.additionalProperties=="object"&&vt(e.additionalProperties,t))return!0;const n=e.anyOf??e.oneOf??e.allOf;if(n){for(const s of n)if(s&&vt(s,t))return!0}return!1}function ih(e){if(!e.schema)return c`
1038
- <div class="muted">Schema unavailable.</div>
1039
- `;const t=e.schema,n=e.value??{};if(ue(t)!=="object"||!t.properties)return c`
1040
- <div class="callout danger">Unsupported schema. Use Raw.</div>
1041
- `;const s=new Set(e.unsupportedPaths??[]),i=t.properties,a=e.searchQuery??"",o=e.activeSection,r=e.activeSubsection??null,p=Object.entries(i).sort((u,g)=>{const v=te([u[0]],e.uiHints)?.order??50,y=te([g[0]],e.uiHints)?.order??50;return v!==y?v-y:u[0].localeCompare(g[0])}).filter(([u,g])=>!(o&&u!==o||a&&!sh(u,g,a)));let d=null;if(o&&r&&p.length===1){const u=p[0]?.[1];u&&ue(u)==="object"&&u.properties&&u.properties[r]&&(d={sectionKey:o,subsectionKey:r,schema:u.properties[r]})}return p.length===0?c`
1042
- <div class="config-empty">
1043
- <div class="config-empty__icon">${W.search}</div>
1044
- <div class="config-empty__text">
1045
- ${a?`No settings match "${a}"`:"No settings in this section"}
1046
- </div>
1047
- </div>
1048
- `:c`
1049
- <div class="config-form config-form--modern">
1050
- ${d?(()=>{const{sectionKey:u,subsectionKey:g,schema:v}=d,y=te([u,g],e.uiHints),$=y?.label??v.title??we(g),A=y?.help??v.description??"",_=n[u],M=_&&typeof _=="object"?_[g]:void 0,P=`config-section-${u}-${g}`;return c`
1051
- <section class="config-section-card" id=${P}>
1052
- <div class="config-section-card__header">
1053
- <span class="config-section-card__icon">${qa(u)}</span>
1054
- <div class="config-section-card__titles">
1055
- <h3 class="config-section-card__title">${$}</h3>
1056
- ${A?c`<p class="config-section-card__desc">${A}</p>`:f}
1057
- </div>
1058
- </div>
1059
- <div class="config-section-card__content">
1060
- ${be({schema:v,value:M,path:[u,g],hints:e.uiHints,unsupported:s,disabled:e.disabled??!1,showLabel:!1,onPatch:e.onPatch})}
1061
- </div>
1062
- </section>
1063
- `})():p.map(([u,g])=>{const v=vi[u]??{label:u.charAt(0).toUpperCase()+u.slice(1),description:g.description??""};return c`
1064
- <section class="config-section-card" id="config-section-${u}">
1065
- <div class="config-section-card__header">
1066
- <span class="config-section-card__icon">${qa(u)}</span>
1067
- <div class="config-section-card__titles">
1068
- <h3 class="config-section-card__title">${v.label}</h3>
1069
- ${v.description?c`<p class="config-section-card__desc">${v.description}</p>`:f}
1070
- </div>
1071
- </div>
1072
- <div class="config-section-card__content">
1073
- ${be({schema:g,value:n[u],path:[u],hints:e.uiHints,unsupported:s,disabled:e.disabled??!1,showLabel:!1,onPatch:e.onPatch})}
1074
- </div>
1075
- </section>
1076
- `})}
1077
- </div>
1078
- `}const ah=new Set(["title","description","default","nullable"]);function oh(e){return Object.keys(e??{}).filter(n=>!ah.has(n)).length===0}function xr(e){const t=e.filter(i=>i!=null),n=t.length!==e.length,s=[];for(const i of t)s.some(a=>Object.is(a,i))||s.push(i);return{enumValues:s,nullable:n}}function Ar(e){return!e||typeof e!="object"?{schema:null,unsupportedPaths:["<root>"]}:wt(e,[])}function wt(e,t){const n=new Set,s={...e},i=$n(t)||"<root>";if(e.anyOf||e.oneOf||e.allOf){const r=rh(e,t);return r||{schema:e,unsupportedPaths:[i]}}const a=Array.isArray(e.type)&&e.type.includes("null"),o=ue(e)??(e.properties||e.additionalProperties?"object":void 0);if(s.type=o??e.type,s.nullable=a||e.nullable,s.enum){const{enumValues:r,nullable:l}=xr(s.enum);s.enum=r,l&&(s.nullable=!0),r.length===0&&n.add(i)}if(o==="object"){const r=e.properties??{},l={};for(const[p,d]of Object.entries(r)){const u=wt(d,[...t,p]);u.schema&&(l[p]=u.schema);for(const g of u.unsupportedPaths)n.add(g)}if(s.properties=l,e.additionalProperties===!0)n.add(i);else if(e.additionalProperties===!1)s.additionalProperties=!1;else if(e.additionalProperties&&typeof e.additionalProperties=="object"&&!oh(e.additionalProperties)){const p=wt(e.additionalProperties,[...t,"*"]);s.additionalProperties=p.schema??e.additionalProperties,p.unsupportedPaths.length>0&&n.add(i)}}else if(o==="array"){const r=Array.isArray(e.items)?e.items[0]:e.items;if(!r)n.add(i);else{const l=wt(r,[...t,"*"]);s.items=l.schema??r,l.unsupportedPaths.length>0&&n.add(i)}}else o!=="string"&&o!=="number"&&o!=="integer"&&o!=="boolean"&&!s.enum&&n.add(i);return{schema:s,unsupportedPaths:Array.from(n)}}function rh(e,t){if(e.allOf)return null;const n=e.anyOf??e.oneOf;if(!n)return null;const s=[],i=[];let a=!1;for(const r of n){if(!r||typeof r!="object")return null;if(Array.isArray(r.enum)){const{enumValues:l,nullable:p}=xr(r.enum);s.push(...l),p&&(a=!0);continue}if("const"in r){if(r.const==null){a=!0;continue}s.push(r.const);continue}if(ue(r)==="null"){a=!0;continue}i.push(r)}if(s.length>0&&i.length===0){const r=[];for(const l of s)r.some(p=>Object.is(p,l))||r.push(l);return{schema:{...e,enum:r,nullable:a,anyOf:void 0,oneOf:void 0,allOf:void 0},unsupportedPaths:[]}}if(i.length===1){const r=wt(i[0],t);return r.schema&&(r.schema.nullable=a||r.schema.nullable),r}const o=["string","number","integer","boolean"];return i.length>0&&s.length===0&&i.every(r=>r.type&&o.includes(String(r.type)))?{schema:{...e,nullable:a},unsupportedPaths:[]}:null}const Es={all:c`
1079
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1080
- <rect x="3" y="3" width="7" height="7"></rect>
1081
- <rect x="14" y="3" width="7" height="7"></rect>
1082
- <rect x="14" y="14" width="7" height="7"></rect>
1083
- <rect x="3" y="14" width="7" height="7"></rect>
1084
- </svg>
1085
- `,env:c`
1086
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1087
- <circle cx="12" cy="12" r="3"></circle>
1088
- <path
1089
- d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"
1090
- ></path>
1091
- </svg>
1092
- `,update:c`
1093
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1094
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
1095
- <polyline points="7 10 12 15 17 10"></polyline>
1096
- <line x1="12" y1="15" x2="12" y2="3"></line>
1097
- </svg>
1098
- `,agents:c`
1099
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1100
- <path
1101
- d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2z"
1102
- ></path>
1103
- <circle cx="8" cy="14" r="1"></circle>
1104
- <circle cx="16" cy="14" r="1"></circle>
1105
- </svg>
1106
- `,auth:c`
1107
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1108
- <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect>
1109
- <path d="M7 11V7a5 5 0 0 1 10 0v4"></path>
1110
- </svg>
1111
- `,channels:c`
1112
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1113
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
1114
- </svg>
1115
- `,messages:c`
1116
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1117
- <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path>
1118
- <polyline points="22,6 12,13 2,6"></polyline>
1119
- </svg>
1120
- `,commands:c`
1121
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1122
- <polyline points="4 17 10 11 4 5"></polyline>
1123
- <line x1="12" y1="19" x2="20" y2="19"></line>
1124
- </svg>
1125
- `,hooks:c`
1126
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1127
- <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>
1128
- <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
1129
- </svg>
1130
- `,skills:c`
1131
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1132
- <polygon
1133
- points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
1134
- ></polygon>
1135
- </svg>
1136
- `,tools:c`
1137
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1138
- <path
1139
- d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
1140
- ></path>
1141
- </svg>
1142
- `,gateway:c`
1143
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1144
- <circle cx="12" cy="12" r="10"></circle>
1145
- <line x1="2" y1="12" x2="22" y2="12"></line>
1146
- <path
1147
- d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
1148
- ></path>
1149
- </svg>
1150
- `,wizard:c`
1151
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1152
- <path d="M15 4V2"></path>
1153
- <path d="M15 16v-2"></path>
1154
- <path d="M8 9h2"></path>
1155
- <path d="M20 9h2"></path>
1156
- <path d="M17.8 11.8 19 13"></path>
1157
- <path d="M15 9h0"></path>
1158
- <path d="M17.8 6.2 19 5"></path>
1159
- <path d="m3 21 9-9"></path>
1160
- <path d="M12.2 6.2 11 5"></path>
1161
- </svg>
1162
- `,meta:c`
1163
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1164
- <path d="M12 20h9"></path>
1165
- <path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"></path>
1166
- </svg>
1167
- `,logging:c`
1168
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1169
- <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
1170
- <polyline points="14 2 14 8 20 8"></polyline>
1171
- <line x1="16" y1="13" x2="8" y2="13"></line>
1172
- <line x1="16" y1="17" x2="8" y2="17"></line>
1173
- <polyline points="10 9 9 9 8 9"></polyline>
1174
- </svg>
1175
- `,browser:c`
1176
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1177
- <circle cx="12" cy="12" r="10"></circle>
1178
- <circle cx="12" cy="12" r="4"></circle>
1179
- <line x1="21.17" y1="8" x2="12" y2="8"></line>
1180
- <line x1="3.95" y1="6.06" x2="8.54" y2="14"></line>
1181
- <line x1="10.88" y1="21.94" x2="15.46" y2="14"></line>
1182
- </svg>
1183
- `,ui:c`
1184
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1185
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1186
- <line x1="3" y1="9" x2="21" y2="9"></line>
1187
- <line x1="9" y1="21" x2="9" y2="9"></line>
1188
- </svg>
1189
- `,models:c`
1190
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1191
- <path
1192
- d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"
1193
- ></path>
1194
- <polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline>
1195
- <line x1="12" y1="22.08" x2="12" y2="12"></line>
1196
- </svg>
1197
- `,bindings:c`
1198
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1199
- <rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect>
1200
- <rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect>
1201
- <line x1="6" y1="6" x2="6.01" y2="6"></line>
1202
- <line x1="6" y1="18" x2="6.01" y2="18"></line>
1203
- </svg>
1204
- `,broadcast:c`
1205
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1206
- <path d="M4.9 19.1C1 15.2 1 8.8 4.9 4.9"></path>
1207
- <path d="M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5"></path>
1208
- <circle cx="12" cy="12" r="2"></circle>
1209
- <path d="M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5"></path>
1210
- <path d="M19.1 4.9C23 8.8 23 15.1 19.1 19"></path>
1211
- </svg>
1212
- `,audio:c`
1213
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1214
- <path d="M9 18V5l12-2v13"></path>
1215
- <circle cx="6" cy="18" r="3"></circle>
1216
- <circle cx="18" cy="16" r="3"></circle>
1217
- </svg>
1218
- `,session:c`
1219
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1220
- <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
1221
- <circle cx="9" cy="7" r="4"></circle>
1222
- <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
1223
- <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
1224
- </svg>
1225
- `,cron:c`
1226
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1227
- <circle cx="12" cy="12" r="10"></circle>
1228
- <polyline points="12 6 12 12 16 14"></polyline>
1229
- </svg>
1230
- `,web:c`
1231
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1232
- <circle cx="12" cy="12" r="10"></circle>
1233
- <line x1="2" y1="12" x2="22" y2="12"></line>
1234
- <path
1235
- d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
1236
- ></path>
1237
- </svg>
1238
- `,discovery:c`
1239
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1240
- <circle cx="11" cy="11" r="8"></circle>
1241
- <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
1242
- </svg>
1243
- `,canvasHost:c`
1244
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1245
- <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
1246
- <circle cx="8.5" cy="8.5" r="1.5"></circle>
1247
- <polyline points="21 15 16 10 5 21"></polyline>
1248
- </svg>
1249
- `,talk:c`
1250
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1251
- <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
1252
- <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
1253
- <line x1="12" y1="19" x2="12" y2="23"></line>
1254
- <line x1="8" y1="23" x2="16" y2="23"></line>
1255
- </svg>
1256
- `,plugins:c`
1257
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1258
- <path d="M12 2v6"></path>
1259
- <path d="m4.93 10.93 4.24 4.24"></path>
1260
- <path d="M2 12h6"></path>
1261
- <path d="m4.93 13.07 4.24-4.24"></path>
1262
- <path d="M12 22v-6"></path>
1263
- <path d="m19.07 13.07-4.24-4.24"></path>
1264
- <path d="M22 12h-6"></path>
1265
- <path d="m19.07 10.93-4.24 4.24"></path>
1266
- </svg>
1267
- `,default:c`
1268
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1269
- <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
1270
- <polyline points="14 2 14 8 20 8"></polyline>
1271
- </svg>
1272
- `},Ga=[{key:"env",label:"Environment"},{key:"update",label:"Updates"},{key:"agents",label:"Agents"},{key:"auth",label:"Authentication"},{key:"channels",label:"Channels"},{key:"messages",label:"Messages"},{key:"commands",label:"Commands"},{key:"hooks",label:"Hooks"},{key:"skills",label:"Skills"},{key:"tools",label:"Tools"},{key:"gateway",label:"Gateway"},{key:"wizard",label:"Setup Wizard"}],Wa="__all__";function Va(e){return Es[e]??Es.default}function lh(e,t){const n=vi[e];return n||{label:t?.title??we(e),description:t?.description??""}}function ch(e){const{key:t,schema:n,uiHints:s}=e;if(!n||ue(n)!=="object"||!n.properties)return[];const i=Object.entries(n.properties).map(([a,o])=>{const r=te([t,a],s),l=r?.label??o.title??we(a),p=r?.help??o.description??"",d=r?.order??50;return{key:a,label:l,description:p,order:d}});return i.sort((a,o)=>a.order!==o.order?a.order-o.order:a.key.localeCompare(o.key)),i}function dh(e,t){if(!e||!t)return[];const n=[];function s(i,a,o){if(i===a)return;if(typeof i!=typeof a){n.push({path:o,from:i,to:a});return}if(typeof i!="object"||i===null||a===null){i!==a&&n.push({path:o,from:i,to:a});return}if(Array.isArray(i)&&Array.isArray(a)){JSON.stringify(i)!==JSON.stringify(a)&&n.push({path:o,from:i,to:a});return}const r=i,l=a,p=new Set([...Object.keys(r),...Object.keys(l)]);for(const d of p)s(r[d],l[d],o?`${o}.${d}`:d)}return s(e,t,""),n}function Ya(e,t=40){let n;try{n=JSON.stringify(e)??String(e)}catch{n=String(e)}return n.length<=t?n:n.slice(0,t-3)+"..."}function uh(e){const t=e.valid==null?"unknown":e.valid?"valid":"invalid",n=Ar(e.schema),s=n.schema?n.unsupportedPaths.length>0:!1,i=n.schema?.properties??{},a=Ga.filter(E=>E.key in i),o=new Set(Ga.map(E=>E.key)),r=Object.keys(i).filter(E=>!o.has(E)).map(E=>({key:E,label:E.charAt(0).toUpperCase()+E.slice(1)})),l=[...a,...r],p=e.activeSection&&n.schema&&ue(n.schema)==="object"?n.schema.properties?.[e.activeSection]:void 0,d=e.activeSection?lh(e.activeSection,p):null,u=e.activeSection?ch({key:e.activeSection,schema:p,uiHints:e.uiHints}):[],g=e.formMode==="form"&&!!e.activeSection&&u.length>0,v=e.activeSubsection===Wa,y=e.searchQuery||v?null:e.activeSubsection??u[0]?.key??null,$=e.formMode==="form"?dh(e.originalValue,e.formValue):[],A=e.formMode==="raw"&&e.raw!==e.originalRaw,_=e.formMode==="form"?$.length>0:A,M=!!e.formValue&&!e.loading&&!!n.schema,P=e.connected&&!e.saving&&_&&(e.formMode==="raw"?!0:M),I=e.connected&&!e.applying&&!e.updating&&_&&(e.formMode==="raw"?!0:M),T=e.connected&&!e.applying&&!e.updating;return c`
1273
- <div class="config-layout">
1274
- <!-- Sidebar -->
1275
- <aside class="config-sidebar">
1276
- <div class="config-sidebar__header">
1277
- <div class="config-sidebar__title">Settings</div>
1278
- <span class="pill pill--sm ${t==="valid"?"pill--ok":t==="invalid"?"pill--danger":""}">${t}</span>
1279
- </div>
1280
-
1281
- <!-- Search -->
1282
- <div class="config-search">
1283
- <svg class="config-search__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1284
- <circle cx="11" cy="11" r="8"></circle>
1285
- <path d="M21 21l-4.35-4.35"></path>
1286
- </svg>
1287
- <input
1288
- type="text"
1289
- class="config-search__input"
1290
- placeholder="Search settings..."
1291
- .value=${e.searchQuery}
1292
- @input=${E=>e.onSearchChange(E.target.value)}
1293
- />
1294
- ${e.searchQuery?c`
1295
- <button
1296
- class="config-search__clear"
1297
- @click=${()=>e.onSearchChange("")}
1298
- >×</button>
1299
- `:f}
1300
- </div>
1301
-
1302
- <!-- Section nav -->
1303
- <nav class="config-nav">
1304
- <button
1305
- class="config-nav__item ${e.activeSection===null?"active":""}"
1306
- @click=${()=>e.onSectionChange(null)}
1307
- >
1308
- <span class="config-nav__icon">${Es.all}</span>
1309
- <span class="config-nav__label">All Settings</span>
1310
- </button>
1311
- ${l.map(E=>c`
1312
- <button
1313
- class="config-nav__item ${e.activeSection===E.key?"active":""}"
1314
- @click=${()=>e.onSectionChange(E.key)}
1315
- >
1316
- <span class="config-nav__icon">${Va(E.key)}</span>
1317
- <span class="config-nav__label">${E.label}</span>
1318
- </button>
1319
- `)}
1320
- </nav>
1321
-
1322
- <!-- Mode toggle at bottom -->
1323
- <div class="config-sidebar__footer">
1324
- <div class="config-mode-toggle">
1325
- <button
1326
- class="config-mode-toggle__btn ${e.formMode==="form"?"active":""}"
1327
- ?disabled=${e.schemaLoading||!e.schema}
1328
- @click=${()=>e.onFormModeChange("form")}
1329
- >
1330
- Form
1331
- </button>
1332
- <button
1333
- class="config-mode-toggle__btn ${e.formMode==="raw"?"active":""}"
1334
- @click=${()=>e.onFormModeChange("raw")}
1335
- >
1336
- Raw
1337
- </button>
1338
- </div>
1339
- </div>
1340
- </aside>
1341
-
1342
- <!-- Main content -->
1343
- <main class="config-main">
1344
- <!-- Action bar -->
1345
- <div class="config-actions">
1346
- <div class="config-actions__left">
1347
- ${_?c`
1348
- <span class="config-changes-badge">${e.formMode==="raw"?"Unsaved changes":`${$.length} unsaved change${$.length!==1?"s":""}`}</span>
1349
- `:c`
1350
- <span class="config-status muted">No changes</span>
1351
- `}
1352
- </div>
1353
- <div class="config-actions__right">
1354
- <button class="btn btn--sm" ?disabled=${e.loading} @click=${e.onReload}>
1355
- ${e.loading?"Loading…":"Reload"}
1356
- </button>
1357
- <button
1358
- class="btn btn--sm primary"
1359
- ?disabled=${!P}
1360
- @click=${e.onSave}
1361
- >
1362
- ${e.saving?"Saving…":"Save"}
1363
- </button>
1364
- <button
1365
- class="btn btn--sm"
1366
- ?disabled=${!I}
1367
- @click=${e.onApply}
1368
- >
1369
- ${e.applying?"Applying…":"Apply"}
1370
- </button>
1371
- <button
1372
- class="btn btn--sm"
1373
- ?disabled=${!T}
1374
- @click=${e.onUpdate}
1375
- >
1376
- ${e.updating?"Updating…":"Update"}
1377
- </button>
1378
- </div>
1379
- </div>
1380
-
1381
- <!-- Diff panel (form mode only - raw mode doesn't have granular diff) -->
1382
- ${_&&e.formMode==="form"?c`
1383
- <details class="config-diff">
1384
- <summary class="config-diff__summary">
1385
- <span>View ${$.length} pending change${$.length!==1?"s":""}</span>
1386
- <svg class="config-diff__chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
1387
- <polyline points="6 9 12 15 18 9"></polyline>
1388
- </svg>
1389
- </summary>
1390
- <div class="config-diff__content">
1391
- ${$.map(E=>c`
1392
- <div class="config-diff__item">
1393
- <div class="config-diff__path">${E.path}</div>
1394
- <div class="config-diff__values">
1395
- <span class="config-diff__from">${Ya(E.from)}</span>
1396
- <span class="config-diff__arrow">→</span>
1397
- <span class="config-diff__to">${Ya(E.to)}</span>
1398
- </div>
1399
- </div>
1400
- `)}
1401
- </div>
1402
- </details>
1403
- `:f}
1404
-
1405
- ${d&&e.formMode==="form"?c`
1406
- <div class="config-section-hero">
1407
- <div class="config-section-hero__icon">${Va(e.activeSection??"")}</div>
1408
- <div class="config-section-hero__text">
1409
- <div class="config-section-hero__title">${d.label}</div>
1410
- ${d.description?c`<div class="config-section-hero__desc">${d.description}</div>`:f}
1411
- </div>
1412
- </div>
1413
- `:f}
1414
-
1415
- ${g?c`
1416
- <div class="config-subnav">
1417
- <button
1418
- class="config-subnav__item ${y===null?"active":""}"
1419
- @click=${()=>e.onSubsectionChange(Wa)}
1420
- >
1421
- All
1422
- </button>
1423
- ${u.map(E=>c`
1424
- <button
1425
- class="config-subnav__item ${y===E.key?"active":""}"
1426
- title=${E.description||E.label}
1427
- @click=${()=>e.onSubsectionChange(E.key)}
1428
- >
1429
- ${E.label}
1430
- </button>
1431
- `)}
1432
- </div>
1433
- `:f}
1434
-
1435
- <!-- Form content -->
1436
- <div class="config-content">
1437
- ${e.formMode==="form"?c`
1438
- ${e.schemaLoading?c`
1439
- <div class="config-loading">
1440
- <div class="config-loading__spinner"></div>
1441
- <span>Loading schema…</span>
1442
- </div>
1443
- `:ih({schema:n.schema,uiHints:e.uiHints,value:e.formValue,disabled:e.loading||!e.formValue,unsupportedPaths:n.unsupportedPaths,onPatch:e.onFormPatch,searchQuery:e.searchQuery,activeSection:e.activeSection,activeSubsection:y})}
1444
- ${s?c`
1445
- <div class="callout danger" style="margin-top: 12px">
1446
- Form view can't safely edit some fields. Use Raw to avoid losing config entries.
1447
- </div>
1448
- `:f}
1449
- `:c`
1450
- <label class="field config-raw-field">
1451
- <span>Raw JSON5</span>
1452
- <textarea
1453
- .value=${e.raw}
1454
- @input=${E=>e.onRawChange(E.target.value)}
1455
- ></textarea>
1456
- </label>
1457
- `}
1458
- </div>
1459
-
1460
- ${e.issues.length>0?c`<div class="callout danger" style="margin-top: 12px;">
1461
- <pre class="code-block">${JSON.stringify(e.issues,null,2)}</pre>
1462
- </div>`:f}
1463
- </main>
1464
- </div>
1465
- `}function ph(e){if(!e&&e!==0)return"n/a";const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);return n<60?`${n}m`:`${Math.round(n/60)}h`}function hh(e,t){const n=t.snapshot,s=n?.channels;if(!n||!s)return!1;const i=s[e],a=typeof i?.configured=="boolean"&&i.configured,o=typeof i?.running=="boolean"&&i.running,r=typeof i?.connected=="boolean"&&i.connected,p=(n.channelAccounts?.[e]??[]).some(d=>d.configured||d.running||d.connected);return a||o||r||p}function fh(e,t){return t?.[e]?.length??0}function kr(e,t){const n=fh(e,t);return n<2?f:c`<div class="account-count">Accounts (${n})</div>`}function gh(e,t){let n=e;for(const s of t){if(!n)return null;const i=ue(n);if(i==="object"){const a=n.properties??{};if(typeof s=="string"&&a[s]){n=a[s];continue}const o=n.additionalProperties;if(typeof s=="string"&&o&&typeof o=="object"){n=o;continue}return null}if(i==="array"){if(typeof s!="number")return null;n=(Array.isArray(n.items)?n.items[0]:n.items)??null;continue}return null}return n}function vh(e,t){const s=(e.channels??{})[t],i=e[t];return(s&&typeof s=="object"?s:null)??(i&&typeof i=="object"?i:null)??{}}function mh(e){const t=Ar(e.schema),n=t.schema;if(!n)return c`
1466
- <div class="callout danger">Schema unavailable. Use Raw.</div>
1467
- `;const s=gh(n,["channels",e.channelId]);if(!s)return c`
1468
- <div class="callout danger">Channel config schema unavailable.</div>
1469
- `;const i=e.configValue??{},a=vh(i,e.channelId);return c`
1470
- <div class="config-form">
1471
- ${be({schema:s,value:a,path:["channels",e.channelId],hints:e.uiHints,unsupported:new Set(t.unsupportedPaths),disabled:e.disabled,showLabel:!1,onPatch:e.onPatch})}
1472
- </div>
1473
- `}function $e(e){const{channelId:t,props:n}=e,s=n.configSaving||n.configSchemaLoading;return c`
1474
- <div style="margin-top: 16px;">
1475
- ${n.configSchemaLoading?c`
1476
- <div class="muted">Loading config schema…</div>
1477
- `:mh({channelId:t,configValue:n.configForm,schema:n.configSchema,uiHints:n.configUiHints,disabled:s,onPatch:n.onConfigPatch})}
1478
- <div class="row" style="margin-top: 12px;">
1479
- <button
1480
- class="btn primary"
1481
- ?disabled=${s||!n.configFormDirty}
1482
- @click=${()=>n.onConfigSave()}
1483
- >
1484
- ${n.configSaving?"Saving…":"Save"}
1485
- </button>
1486
- <button
1487
- class="btn"
1488
- ?disabled=${s}
1489
- @click=${()=>n.onConfigReload()}
1490
- >
1491
- Reload
1492
- </button>
1493
- </div>
1494
- </div>
1495
- `}function yh(e){const{props:t,discord:n,accountCountLabel:s}=e;return c`
1496
- <div class="card">
1497
- <div class="card-title">Discord</div>
1498
- <div class="card-sub">Bot status and channel configuration.</div>
1499
- ${s}
1500
-
1501
- <div class="status-list" style="margin-top: 16px;">
1502
- <div>
1503
- <span class="label">Configured</span>
1504
- <span>${n?.configured?"Yes":"No"}</span>
1505
- </div>
1506
- <div>
1507
- <span class="label">Running</span>
1508
- <span>${n?.running?"Yes":"No"}</span>
1509
- </div>
1510
- <div>
1511
- <span class="label">Last start</span>
1512
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
1513
- </div>
1514
- <div>
1515
- <span class="label">Last probe</span>
1516
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
1517
- </div>
1518
- </div>
1519
-
1520
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
1521
- ${n.lastError}
1522
- </div>`:f}
1523
-
1524
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
1525
- Probe ${n.probe.ok?"ok":"failed"} ·
1526
- ${n.probe.status??""} ${n.probe.error??""}
1527
- </div>`:f}
1528
-
1529
- ${$e({channelId:"discord",props:t})}
1530
-
1531
- <div class="row" style="margin-top: 12px;">
1532
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
1533
- Probe
1534
- </button>
1535
- </div>
1536
- </div>
1537
- `}function bh(e){const{props:t,googleChat:n,accountCountLabel:s}=e;return c`
1538
- <div class="card">
1539
- <div class="card-title">Google Chat</div>
1540
- <div class="card-sub">Chat API webhook status and channel configuration.</div>
1541
- ${s}
1542
-
1543
- <div class="status-list" style="margin-top: 16px;">
1544
- <div>
1545
- <span class="label">Configured</span>
1546
- <span>${n?n.configured?"Yes":"No":"n/a"}</span>
1547
- </div>
1548
- <div>
1549
- <span class="label">Running</span>
1550
- <span>${n?n.running?"Yes":"No":"n/a"}</span>
1551
- </div>
1552
- <div>
1553
- <span class="label">Credential</span>
1554
- <span>${n?.credentialSource??"n/a"}</span>
1555
- </div>
1556
- <div>
1557
- <span class="label">Audience</span>
1558
- <span>
1559
- ${n?.audienceType?`${n.audienceType}${n.audience?` · ${n.audience}`:""}`:"n/a"}
1560
- </span>
1561
- </div>
1562
- <div>
1563
- <span class="label">Last start</span>
1564
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
1565
- </div>
1566
- <div>
1567
- <span class="label">Last probe</span>
1568
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
1569
- </div>
1570
- </div>
1571
-
1572
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
1573
- ${n.lastError}
1574
- </div>`:f}
1575
-
1576
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
1577
- Probe ${n.probe.ok?"ok":"failed"} ·
1578
- ${n.probe.status??""} ${n.probe.error??""}
1579
- </div>`:f}
1580
-
1581
- ${$e({channelId:"googlechat",props:t})}
1582
-
1583
- <div class="row" style="margin-top: 12px;">
1584
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
1585
- Probe
1586
- </button>
1587
- </div>
1588
- </div>
1589
- `}function wh(e){const{props:t,imessage:n,accountCountLabel:s}=e;return c`
1590
- <div class="card">
1591
- <div class="card-title">iMessage</div>
1592
- <div class="card-sub">macOS bridge status and channel configuration.</div>
1593
- ${s}
1594
-
1595
- <div class="status-list" style="margin-top: 16px;">
1596
- <div>
1597
- <span class="label">Configured</span>
1598
- <span>${n?.configured?"Yes":"No"}</span>
1599
- </div>
1600
- <div>
1601
- <span class="label">Running</span>
1602
- <span>${n?.running?"Yes":"No"}</span>
1603
- </div>
1604
- <div>
1605
- <span class="label">Last start</span>
1606
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
1607
- </div>
1608
- <div>
1609
- <span class="label">Last probe</span>
1610
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
1611
- </div>
1612
- </div>
1613
-
1614
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
1615
- ${n.lastError}
1616
- </div>`:f}
1617
-
1618
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
1619
- Probe ${n.probe.ok?"ok":"failed"} ·
1620
- ${n.probe.error??""}
1621
- </div>`:f}
1622
-
1623
- ${$e({channelId:"imessage",props:t})}
1624
-
1625
- <div class="row" style="margin-top: 12px;">
1626
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
1627
- Probe
1628
- </button>
1629
- </div>
1630
- </div>
1631
- `}function $h(e){const{values:t,original:n}=e;return t.name!==n.name||t.displayName!==n.displayName||t.about!==n.about||t.picture!==n.picture||t.banner!==n.banner||t.website!==n.website||t.nip05!==n.nip05||t.lud16!==n.lud16}function xh(e){const{state:t,callbacks:n,accountId:s}=e,i=$h(t),a=(r,l,p={})=>{const{type:d="text",placeholder:u,maxLength:g,help:v}=p,y=t.values[r]??"",$=t.fieldErrors[r],A=`nostr-profile-${r}`;return d==="textarea"?c`
1632
- <div class="form-field" style="margin-bottom: 12px;">
1633
- <label for="${A}" style="display: block; margin-bottom: 4px; font-weight: 500;">
1634
- ${l}
1635
- </label>
1636
- <textarea
1637
- id="${A}"
1638
- .value=${y}
1639
- placeholder=${u??""}
1640
- maxlength=${g??2e3}
1641
- rows="3"
1642
- style="width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px; resize: vertical; font-family: inherit;"
1643
- @input=${_=>{const M=_.target;n.onFieldChange(r,M.value)}}
1644
- ?disabled=${t.saving}
1645
- ></textarea>
1646
- ${v?c`<div style="font-size: 12px; color: var(--text-muted); margin-top: 2px;">${v}</div>`:f}
1647
- ${$?c`<div style="font-size: 12px; color: var(--danger-color); margin-top: 2px;">${$}</div>`:f}
1648
- </div>
1649
- `:c`
1650
- <div class="form-field" style="margin-bottom: 12px;">
1651
- <label for="${A}" style="display: block; margin-bottom: 4px; font-weight: 500;">
1652
- ${l}
1653
- </label>
1654
- <input
1655
- id="${A}"
1656
- type=${d}
1657
- .value=${y}
1658
- placeholder=${u??""}
1659
- maxlength=${g??256}
1660
- style="width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px;"
1661
- @input=${_=>{const M=_.target;n.onFieldChange(r,M.value)}}
1662
- ?disabled=${t.saving}
1663
- />
1664
- ${v?c`<div style="font-size: 12px; color: var(--text-muted); margin-top: 2px;">${v}</div>`:f}
1665
- ${$?c`<div style="font-size: 12px; color: var(--danger-color); margin-top: 2px;">${$}</div>`:f}
1666
- </div>
1667
- `},o=()=>{const r=t.values.picture;return r?c`
1668
- <div style="margin-bottom: 12px;">
1669
- <img
1670
- src=${r}
1671
- alt="Profile picture preview"
1672
- style="max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
1673
- @error=${l=>{const p=l.target;p.style.display="none"}}
1674
- @load=${l=>{const p=l.target;p.style.display="block"}}
1675
- />
1676
- </div>
1677
- `:f};return c`
1678
- <div class="nostr-profile-form" style="padding: 16px; background: var(--bg-secondary); border-radius: 8px; margin-top: 12px;">
1679
- <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">
1680
- <div style="font-weight: 600; font-size: 16px;">Edit Profile</div>
1681
- <div style="font-size: 12px; color: var(--text-muted);">Account: ${s}</div>
1682
- </div>
1683
-
1684
- ${t.error?c`<div class="callout danger" style="margin-bottom: 12px;">${t.error}</div>`:f}
1685
-
1686
- ${t.success?c`<div class="callout success" style="margin-bottom: 12px;">${t.success}</div>`:f}
1687
-
1688
- ${o()}
1689
-
1690
- ${a("name","Username",{placeholder:"satoshi",maxLength:256,help:"Short username (e.g., satoshi)"})}
1691
-
1692
- ${a("displayName","Display Name",{placeholder:"Satoshi Nakamoto",maxLength:256,help:"Your full display name"})}
1693
-
1694
- ${a("about","Bio",{type:"textarea",placeholder:"Tell people about yourself...",maxLength:2e3,help:"A brief bio or description"})}
1695
-
1696
- ${a("picture","Avatar URL",{type:"url",placeholder:"https://example.com/avatar.jpg",help:"HTTPS URL to your profile picture"})}
1697
-
1698
- ${t.showAdvanced?c`
1699
- <div style="border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;">
1700
- <div style="font-weight: 500; margin-bottom: 12px; color: var(--text-muted);">Advanced</div>
1701
-
1702
- ${a("banner","Banner URL",{type:"url",placeholder:"https://example.com/banner.jpg",help:"HTTPS URL to a banner image"})}
1703
-
1704
- ${a("website","Website",{type:"url",placeholder:"https://example.com",help:"Your personal website"})}
1705
-
1706
- ${a("nip05","NIP-05 Identifier",{placeholder:"you@example.com",help:"Verifiable identifier (e.g., you@domain.com)"})}
1707
-
1708
- ${a("lud16","Lightning Address",{placeholder:"you@getalby.com",help:"Lightning address for tips (LUD-16)"})}
1709
- </div>
1710
- `:f}
1711
-
1712
- <div style="display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap;">
1713
- <button
1714
- class="btn primary"
1715
- @click=${n.onSave}
1716
- ?disabled=${t.saving||!i}
1717
- >
1718
- ${t.saving?"Saving...":"Save & Publish"}
1719
- </button>
1720
-
1721
- <button
1722
- class="btn"
1723
- @click=${n.onImport}
1724
- ?disabled=${t.importing||t.saving}
1725
- >
1726
- ${t.importing?"Importing...":"Import from Relays"}
1727
- </button>
1728
-
1729
- <button
1730
- class="btn"
1731
- @click=${n.onToggleAdvanced}
1732
- >
1733
- ${t.showAdvanced?"Hide Advanced":"Show Advanced"}
1734
- </button>
1735
-
1736
- <button
1737
- class="btn"
1738
- @click=${n.onCancel}
1739
- ?disabled=${t.saving}
1740
- >
1741
- Cancel
1742
- </button>
1743
- </div>
1744
-
1745
- ${i?c`
1746
- <div style="font-size: 12px; color: var(--warning-color); margin-top: 8px">
1747
- You have unsaved changes
1748
- </div>
1749
- `:f}
1750
- </div>
1751
- `}function Ah(e){const t={name:e?.name??"",displayName:e?.displayName??"",about:e?.about??"",picture:e?.picture??"",banner:e?.banner??"",website:e?.website??"",nip05:e?.nip05??"",lud16:e?.lud16??""};return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}function Qa(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:"n/a"}function kh(e){const{props:t,nostr:n,nostrAccounts:s,accountCountLabel:i,profileFormState:a,profileFormCallbacks:o,onEditProfile:r}=e,l=s[0],p=n?.configured??l?.configured??!1,d=n?.running??l?.running??!1,u=n?.publicKey??l?.publicKey,g=n?.lastStartAt??l?.lastStartAt??null,v=n?.lastError??l?.lastError??null,y=s.length>1,$=a!=null,A=M=>{const P=M.publicKey,I=M.profile,T=I?.displayName??I?.name??M.name??M.accountId;return c`
1752
- <div class="account-card">
1753
- <div class="account-card-header">
1754
- <div class="account-card-title">${T}</div>
1755
- <div class="account-card-id">${M.accountId}</div>
1756
- </div>
1757
- <div class="status-list account-card-status">
1758
- <div>
1759
- <span class="label">Running</span>
1760
- <span>${M.running?"Yes":"No"}</span>
1761
- </div>
1762
- <div>
1763
- <span class="label">Configured</span>
1764
- <span>${M.configured?"Yes":"No"}</span>
1765
- </div>
1766
- <div>
1767
- <span class="label">Public Key</span>
1768
- <span class="monospace" title="${P??""}">${Qa(P)}</span>
1769
- </div>
1770
- <div>
1771
- <span class="label">Last inbound</span>
1772
- <span>${M.lastInboundAt?O(M.lastInboundAt):"n/a"}</span>
1773
- </div>
1774
- ${M.lastError?c`
1775
- <div class="account-card-error">${M.lastError}</div>
1776
- `:f}
1777
- </div>
1778
- </div>
1779
- `},_=()=>{if($&&o)return xh({state:a,callbacks:o,accountId:s[0]?.accountId??"default"});const M=l?.profile??n?.profile,{name:P,displayName:I,about:T,picture:E,nip05:pe}=M??{},xn=P||I||T||E||pe;return c`
1780
- <div style="margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: 8px;">
1781
- <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
1782
- <div style="font-weight: 500;">Profile</div>
1783
- ${p?c`
1784
- <button
1785
- class="btn btn-sm"
1786
- @click=${r}
1787
- style="font-size: 12px; padding: 4px 8px;"
1788
- >
1789
- Edit Profile
1790
- </button>
1791
- `:f}
1792
- </div>
1793
- ${xn?c`
1794
- <div class="status-list">
1795
- ${E?c`
1796
- <div style="margin-bottom: 8px;">
1797
- <img
1798
- src=${E}
1799
- alt="Profile picture"
1800
- style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
1801
- @error=${An=>{An.target.style.display="none"}}
1802
- />
1803
- </div>
1804
- `:f}
1805
- ${P?c`<div><span class="label">Name</span><span>${P}</span></div>`:f}
1806
- ${I?c`<div><span class="label">Display Name</span><span>${I}</span></div>`:f}
1807
- ${T?c`<div><span class="label">About</span><span style="max-width: 300px; overflow: hidden; text-overflow: ellipsis;">${T}</span></div>`:f}
1808
- ${pe?c`<div><span class="label">NIP-05</span><span>${pe}</span></div>`:f}
1809
- </div>
1810
- `:c`
1811
- <div style="color: var(--text-muted); font-size: 13px">
1812
- No profile set. Click "Edit Profile" to add your name, bio, and avatar.
1813
- </div>
1814
- `}
1815
- </div>
1816
- `};return c`
1817
- <div class="card">
1818
- <div class="card-title">Nostr</div>
1819
- <div class="card-sub">Decentralized DMs via Nostr relays (NIP-04).</div>
1820
- ${i}
1821
-
1822
- ${y?c`
1823
- <div class="account-card-list">
1824
- ${s.map(M=>A(M))}
1825
- </div>
1826
- `:c`
1827
- <div class="status-list" style="margin-top: 16px;">
1828
- <div>
1829
- <span class="label">Configured</span>
1830
- <span>${p?"Yes":"No"}</span>
1831
- </div>
1832
- <div>
1833
- <span class="label">Running</span>
1834
- <span>${d?"Yes":"No"}</span>
1835
- </div>
1836
- <div>
1837
- <span class="label">Public Key</span>
1838
- <span class="monospace" title="${u??""}"
1839
- >${Qa(u)}</span
1840
- >
1841
- </div>
1842
- <div>
1843
- <span class="label">Last start</span>
1844
- <span>${g?O(g):"n/a"}</span>
1845
- </div>
1846
- </div>
1847
- `}
1848
-
1849
- ${v?c`<div class="callout danger" style="margin-top: 12px;">${v}</div>`:f}
1850
-
1851
- ${_()}
1852
-
1853
- ${$e({channelId:"nostr",props:t})}
1854
-
1855
- <div class="row" style="margin-top: 12px;">
1856
- <button class="btn" @click=${()=>t.onRefresh(!1)}>Refresh</button>
1857
- </div>
1858
- </div>
1859
- `}function Sh(e){const{props:t,signal:n,accountCountLabel:s}=e;return c`
1860
- <div class="card">
1861
- <div class="card-title">Signal</div>
1862
- <div class="card-sub">signal-cli status and channel configuration.</div>
1863
- ${s}
1864
-
1865
- <div class="status-list" style="margin-top: 16px;">
1866
- <div>
1867
- <span class="label">Configured</span>
1868
- <span>${n?.configured?"Yes":"No"}</span>
1869
- </div>
1870
- <div>
1871
- <span class="label">Running</span>
1872
- <span>${n?.running?"Yes":"No"}</span>
1873
- </div>
1874
- <div>
1875
- <span class="label">Base URL</span>
1876
- <span>${n?.baseUrl??"n/a"}</span>
1877
- </div>
1878
- <div>
1879
- <span class="label">Last start</span>
1880
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
1881
- </div>
1882
- <div>
1883
- <span class="label">Last probe</span>
1884
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
1885
- </div>
1886
- </div>
1887
-
1888
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
1889
- ${n.lastError}
1890
- </div>`:f}
1891
-
1892
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
1893
- Probe ${n.probe.ok?"ok":"failed"} ·
1894
- ${n.probe.status??""} ${n.probe.error??""}
1895
- </div>`:f}
1896
-
1897
- ${$e({channelId:"signal",props:t})}
1898
-
1899
- <div class="row" style="margin-top: 12px;">
1900
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
1901
- Probe
1902
- </button>
1903
- </div>
1904
- </div>
1905
- `}function _h(e){const{props:t,slack:n,accountCountLabel:s}=e;return c`
1906
- <div class="card">
1907
- <div class="card-title">Slack</div>
1908
- <div class="card-sub">Socket mode status and channel configuration.</div>
1909
- ${s}
1910
-
1911
- <div class="status-list" style="margin-top: 16px;">
1912
- <div>
1913
- <span class="label">Configured</span>
1914
- <span>${n?.configured?"Yes":"No"}</span>
1915
- </div>
1916
- <div>
1917
- <span class="label">Running</span>
1918
- <span>${n?.running?"Yes":"No"}</span>
1919
- </div>
1920
- <div>
1921
- <span class="label">Last start</span>
1922
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
1923
- </div>
1924
- <div>
1925
- <span class="label">Last probe</span>
1926
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
1927
- </div>
1928
- </div>
1929
-
1930
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
1931
- ${n.lastError}
1932
- </div>`:f}
1933
-
1934
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
1935
- Probe ${n.probe.ok?"ok":"failed"} ·
1936
- ${n.probe.status??""} ${n.probe.error??""}
1937
- </div>`:f}
1938
-
1939
- ${$e({channelId:"slack",props:t})}
1940
-
1941
- <div class="row" style="margin-top: 12px;">
1942
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
1943
- Probe
1944
- </button>
1945
- </div>
1946
- </div>
1947
- `}function Ch(e){const{props:t,telegram:n,telegramAccounts:s,accountCountLabel:i}=e,a=s.length>1,o=r=>{const p=r.probe?.bot?.username,d=r.name||r.accountId;return c`
1948
- <div class="account-card">
1949
- <div class="account-card-header">
1950
- <div class="account-card-title">
1951
- ${p?`@${p}`:d}
1952
- </div>
1953
- <div class="account-card-id">${r.accountId}</div>
1954
- </div>
1955
- <div class="status-list account-card-status">
1956
- <div>
1957
- <span class="label">Running</span>
1958
- <span>${r.running?"Yes":"No"}</span>
1959
- </div>
1960
- <div>
1961
- <span class="label">Configured</span>
1962
- <span>${r.configured?"Yes":"No"}</span>
1963
- </div>
1964
- <div>
1965
- <span class="label">Last inbound</span>
1966
- <span>${r.lastInboundAt?O(r.lastInboundAt):"n/a"}</span>
1967
- </div>
1968
- ${r.lastError?c`
1969
- <div class="account-card-error">
1970
- ${r.lastError}
1971
- </div>
1972
- `:f}
1973
- </div>
1974
- </div>
1975
- `};return c`
1976
- <div class="card">
1977
- <div class="card-title">Telegram</div>
1978
- <div class="card-sub">Bot status and channel configuration.</div>
1979
- ${i}
1980
-
1981
- ${a?c`
1982
- <div class="account-card-list">
1983
- ${s.map(r=>o(r))}
1984
- </div>
1985
- `:c`
1986
- <div class="status-list" style="margin-top: 16px;">
1987
- <div>
1988
- <span class="label">Configured</span>
1989
- <span>${n?.configured?"Yes":"No"}</span>
1990
- </div>
1991
- <div>
1992
- <span class="label">Running</span>
1993
- <span>${n?.running?"Yes":"No"}</span>
1994
- </div>
1995
- <div>
1996
- <span class="label">Mode</span>
1997
- <span>${n?.mode??"n/a"}</span>
1998
- </div>
1999
- <div>
2000
- <span class="label">Last start</span>
2001
- <span>${n?.lastStartAt?O(n.lastStartAt):"n/a"}</span>
2002
- </div>
2003
- <div>
2004
- <span class="label">Last probe</span>
2005
- <span>${n?.lastProbeAt?O(n.lastProbeAt):"n/a"}</span>
2006
- </div>
2007
- </div>
2008
- `}
2009
-
2010
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
2011
- ${n.lastError}
2012
- </div>`:f}
2013
-
2014
- ${n?.probe?c`<div class="callout" style="margin-top: 12px;">
2015
- Probe ${n.probe.ok?"ok":"failed"} ·
2016
- ${n.probe.status??""} ${n.probe.error??""}
2017
- </div>`:f}
2018
-
2019
- ${$e({channelId:"telegram",props:t})}
2020
-
2021
- <div class="row" style="margin-top: 12px;">
2022
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
2023
- Probe
2024
- </button>
2025
- </div>
2026
- </div>
2027
- `}function Th(e){const{props:t,whatsapp:n,accountCountLabel:s}=e;return c`
2028
- <div class="card">
2029
- <div class="card-title">WhatsApp</div>
2030
- <div class="card-sub">Link WhatsApp Web and monitor connection health.</div>
2031
- ${s}
2032
-
2033
- <div class="status-list" style="margin-top: 16px;">
2034
- <div>
2035
- <span class="label">Configured</span>
2036
- <span>${n?.configured?"Yes":"No"}</span>
2037
- </div>
2038
- <div>
2039
- <span class="label">Linked</span>
2040
- <span>${n?.linked?"Yes":"No"}</span>
2041
- </div>
2042
- <div>
2043
- <span class="label">Running</span>
2044
- <span>${n?.running?"Yes":"No"}</span>
2045
- </div>
2046
- <div>
2047
- <span class="label">Connected</span>
2048
- <span>${n?.connected?"Yes":"No"}</span>
2049
- </div>
2050
- <div>
2051
- <span class="label">Last connect</span>
2052
- <span>
2053
- ${n?.lastConnectedAt?O(n.lastConnectedAt):"n/a"}
2054
- </span>
2055
- </div>
2056
- <div>
2057
- <span class="label">Last message</span>
2058
- <span>
2059
- ${n?.lastMessageAt?O(n.lastMessageAt):"n/a"}
2060
- </span>
2061
- </div>
2062
- <div>
2063
- <span class="label">Auth age</span>
2064
- <span>
2065
- ${n?.authAgeMs!=null?ph(n.authAgeMs):"n/a"}
2066
- </span>
2067
- </div>
2068
- </div>
2069
-
2070
- ${n?.lastError?c`<div class="callout danger" style="margin-top: 12px;">
2071
- ${n.lastError}
2072
- </div>`:f}
2073
-
2074
- ${t.whatsappMessage?c`<div class="callout" style="margin-top: 12px;">
2075
- ${t.whatsappMessage}
2076
- </div>`:f}
2077
-
2078
- ${t.whatsappQrDataUrl?c`<div class="qr-wrap">
2079
- <img src=${t.whatsappQrDataUrl} alt="WhatsApp QR" />
2080
- </div>`:f}
2081
-
2082
- <div class="row" style="margin-top: 14px; flex-wrap: wrap;">
2083
- <button
2084
- class="btn primary"
2085
- ?disabled=${t.whatsappBusy}
2086
- @click=${()=>t.onWhatsAppStart(!1)}
2087
- >
2088
- ${t.whatsappBusy?"Working…":"Show QR"}
2089
- </button>
2090
- <button
2091
- class="btn"
2092
- ?disabled=${t.whatsappBusy}
2093
- @click=${()=>t.onWhatsAppStart(!0)}
2094
- >
2095
- Relink
2096
- </button>
2097
- <button
2098
- class="btn"
2099
- ?disabled=${t.whatsappBusy}
2100
- @click=${()=>t.onWhatsAppWait()}
2101
- >
2102
- Wait for scan
2103
- </button>
2104
- <button
2105
- class="btn danger"
2106
- ?disabled=${t.whatsappBusy}
2107
- @click=${()=>t.onWhatsAppLogout()}
2108
- >
2109
- Logout
2110
- </button>
2111
- <button class="btn" @click=${()=>t.onRefresh(!0)}>
2112
- Refresh
2113
- </button>
2114
- </div>
2115
-
2116
- ${$e({channelId:"whatsapp",props:t})}
2117
- </div>
2118
- `}function Eh(e){const t=e.snapshot?.channels,n=t?.whatsapp??void 0,s=t?.telegram??void 0,i=t?.discord??null;t?.googlechat;const a=t?.slack??null,o=t?.signal??null,r=t?.imessage??null,l=t?.nostr??null,d=Ih(e.snapshot).map((u,g)=>({key:u,enabled:hh(u,e),order:g})).sort((u,g)=>u.enabled!==g.enabled?u.enabled?-1:1:u.order-g.order);return c`
2119
- <section class="grid grid-cols-2">
2120
- ${d.map(u=>Mh(u.key,e,{whatsapp:n,telegram:s,discord:i,slack:a,signal:o,imessage:r,nostr:l,channelAccounts:e.snapshot?.channelAccounts??null}))}
2121
- </section>
2122
-
2123
- <section class="card" style="margin-top: 18px;">
2124
- <div class="row" style="justify-content: space-between;">
2125
- <div>
2126
- <div class="card-title">Channel health</div>
2127
- <div class="card-sub">Channel status snapshots from the gateway.</div>
2128
- </div>
2129
- <div class="muted">${e.lastSuccessAt?O(e.lastSuccessAt):"n/a"}</div>
2130
- </div>
2131
- ${e.lastError?c`<div class="callout danger" style="margin-top: 12px;">
2132
- ${e.lastError}
2133
- </div>`:f}
2134
- <pre class="code-block" style="margin-top: 12px;">
2135
- ${e.snapshot?JSON.stringify(e.snapshot,null,2):"No snapshot yet."}
2136
- </pre>
2137
- </section>
2138
- `}function Ih(e){return e?.channelMeta?.length?e.channelMeta.map(t=>t.id):e?.channelOrder?.length?e.channelOrder:["whatsapp","telegram","discord","googlechat","slack","signal","imessage","nostr"]}function Mh(e,t,n){const s=kr(e,n.channelAccounts);switch(e){case"whatsapp":return Th({props:t,whatsapp:n.whatsapp,accountCountLabel:s});case"telegram":return Ch({props:t,telegram:n.telegram,telegramAccounts:n.channelAccounts?.telegram??[],accountCountLabel:s});case"discord":return yh({props:t,discord:n.discord,accountCountLabel:s});case"googlechat":return bh({props:t,accountCountLabel:s});case"slack":return _h({props:t,slack:n.slack,accountCountLabel:s});case"signal":return Sh({props:t,signal:n.signal,accountCountLabel:s});case"imessage":return wh({props:t,imessage:n.imessage,accountCountLabel:s});case"nostr":{const i=n.channelAccounts?.nostr??[],a=i[0],o=a?.accountId??"default",r=a?.profile??null,l=t.nostrProfileAccountId===o?t.nostrProfileFormState:null,p=l?{onFieldChange:t.onNostrProfileFieldChange,onSave:t.onNostrProfileSave,onImport:t.onNostrProfileImport,onCancel:t.onNostrProfileCancel,onToggleAdvanced:t.onNostrProfileToggleAdvanced}:null;return kh({props:t,nostr:n.nostr,nostrAccounts:i,accountCountLabel:s,profileFormState:l,profileFormCallbacks:p,onEditProfile:()=>t.onNostrProfileEdit(o,r)})}default:return Lh(e,t,n.channelAccounts??{})}}function Lh(e,t,n){const s=Ph(t.snapshot,e),i=t.snapshot?.channels?.[e],a=typeof i?.configured=="boolean"?i.configured:void 0,o=typeof i?.running=="boolean"?i.running:void 0,r=typeof i?.connected=="boolean"?i.connected:void 0,l=typeof i?.lastError=="string"?i.lastError:void 0,p=n[e]??[],d=kr(e,n);return c`
2139
- <div class="card">
2140
- <div class="card-title">${s}</div>
2141
- <div class="card-sub">Channel status and configuration.</div>
2142
- ${d}
2143
-
2144
- ${p.length>0?c`
2145
- <div class="account-card-list">
2146
- ${p.map(u=>Bh(u))}
2147
- </div>
2148
- `:c`
2149
- <div class="status-list" style="margin-top: 16px;">
2150
- <div>
2151
- <span class="label">Configured</span>
2152
- <span>${a==null?"n/a":a?"Yes":"No"}</span>
2153
- </div>
2154
- <div>
2155
- <span class="label">Running</span>
2156
- <span>${o==null?"n/a":o?"Yes":"No"}</span>
2157
- </div>
2158
- <div>
2159
- <span class="label">Connected</span>
2160
- <span>${r==null?"n/a":r?"Yes":"No"}</span>
2161
- </div>
2162
- </div>
2163
- `}
2164
-
2165
- ${l?c`<div class="callout danger" style="margin-top: 12px;">
2166
- ${l}
2167
- </div>`:f}
2168
-
2169
- ${$e({channelId:e,props:t})}
2170
- </div>
2171
- `}function Rh(e){return e?.channelMeta?.length?Object.fromEntries(e.channelMeta.map(t=>[t.id,t])):{}}function Ph(e,t){return Rh(e)[t]?.label??e?.channelLabels?.[t]??t}const Nh=600*1e3;function Sr(e){return e.lastInboundAt?Date.now()-e.lastInboundAt<Nh:!1}function Oh(e){return e.running?"Yes":Sr(e)?"Active":"No"}function Dh(e){return e.connected===!0?"Yes":e.connected===!1?"No":Sr(e)?"Active":"n/a"}function Bh(e){const t=Oh(e),n=Dh(e);return c`
2172
- <div class="account-card">
2173
- <div class="account-card-header">
2174
- <div class="account-card-title">${e.name||e.accountId}</div>
2175
- <div class="account-card-id">${e.accountId}</div>
2176
- </div>
2177
- <div class="status-list account-card-status">
2178
- <div>
2179
- <span class="label">Running</span>
2180
- <span>${t}</span>
2181
- </div>
2182
- <div>
2183
- <span class="label">Configured</span>
2184
- <span>${e.configured?"Yes":"No"}</span>
2185
- </div>
2186
- <div>
2187
- <span class="label">Connected</span>
2188
- <span>${n}</span>
2189
- </div>
2190
- <div>
2191
- <span class="label">Last inbound</span>
2192
- <span>${e.lastInboundAt?O(e.lastInboundAt):"n/a"}</span>
2193
- </div>
2194
- ${e.lastError?c`
2195
- <div class="account-card-error">
2196
- ${e.lastError}
2197
- </div>
2198
- `:f}
2199
- </div>
2200
- </div>
2201
- `}function Fh(e){const t=e.host??"unknown",n=e.ip?`(${e.ip})`:"",s=e.mode??"",i=e.version??"";return`${t} ${n} ${s} ${i}`.trim()}function Uh(e){const t=e.ts??null;return t?O(t):"n/a"}function _r(e){return e?`${kt(e)} (${O(e)})`:"n/a"}function Kh(e){if(e.totalTokens==null)return"n/a";const t=e.totalTokens??0,n=e.contextTokens??0;return n?`${t} / ${n}`:String(t)}function Hh(e){if(e==null)return"";try{return JSON.stringify(e,null,2)}catch{return String(e)}}function zh(e){const t=e.state??{},n=t.nextRunAtMs?kt(t.nextRunAtMs):"n/a",s=t.lastRunAtMs?kt(t.lastRunAtMs):"n/a";return`${t.lastStatus??"n/a"} · next ${n} · last ${s}`}function jh(e){const t=e.schedule;return t.kind==="at"?`At ${kt(t.atMs)}`:t.kind==="every"?`Every ${vo(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:""}`}function qh(e){const t=e.payload;return t.kind==="systemEvent"?`System: ${t.text}`:`Agent: ${t.message}`}function Gh(e){const t=["last",...e.channels.filter(Boolean)],n=e.form.channel?.trim();n&&!t.includes(n)&&t.push(n);const s=new Set;return t.filter(i=>s.has(i)?!1:(s.add(i),!0))}function Wh(e,t){if(t==="last")return"last";const n=e.channelMeta?.find(s=>s.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function Vh(e){const t=Gh(e);return c`
2202
- <section class="grid grid-cols-2">
2203
- <div class="card">
2204
- <div class="card-title">Scheduler</div>
2205
- <div class="card-sub">Gateway-owned cron scheduler status.</div>
2206
- <div class="stat-grid" style="margin-top: 16px;">
2207
- <div class="stat">
2208
- <div class="stat-label">Enabled</div>
2209
- <div class="stat-value">
2210
- ${e.status?e.status.enabled?"Yes":"No":"n/a"}
2211
- </div>
2212
- </div>
2213
- <div class="stat">
2214
- <div class="stat-label">Jobs</div>
2215
- <div class="stat-value">${e.status?.jobs??"n/a"}</div>
2216
- </div>
2217
- <div class="stat">
2218
- <div class="stat-label">Next wake</div>
2219
- <div class="stat-value">${_r(e.status?.nextWakeAtMs??null)}</div>
2220
- </div>
2221
- </div>
2222
- <div class="row" style="margin-top: 12px;">
2223
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2224
- ${e.loading?"Refreshing…":"Refresh"}
2225
- </button>
2226
- ${e.error?c`<span class="muted">${e.error}</span>`:f}
2227
- </div>
2228
- </div>
2229
-
2230
- <div class="card">
2231
- <div class="card-title">New Job</div>
2232
- <div class="card-sub">Create a scheduled wakeup or agent run.</div>
2233
- <div class="form-grid" style="margin-top: 16px;">
2234
- <label class="field">
2235
- <span>Name</span>
2236
- <input
2237
- .value=${e.form.name}
2238
- @input=${n=>e.onFormChange({name:n.target.value})}
2239
- />
2240
- </label>
2241
- <label class="field">
2242
- <span>Description</span>
2243
- <input
2244
- .value=${e.form.description}
2245
- @input=${n=>e.onFormChange({description:n.target.value})}
2246
- />
2247
- </label>
2248
- <label class="field">
2249
- <span>Agent ID</span>
2250
- <input
2251
- .value=${e.form.agentId}
2252
- @input=${n=>e.onFormChange({agentId:n.target.value})}
2253
- placeholder="default"
2254
- />
2255
- </label>
2256
- <label class="field checkbox">
2257
- <span>Enabled</span>
2258
- <input
2259
- type="checkbox"
2260
- .checked=${e.form.enabled}
2261
- @change=${n=>e.onFormChange({enabled:n.target.checked})}
2262
- />
2263
- </label>
2264
- <label class="field">
2265
- <span>Schedule</span>
2266
- <select
2267
- .value=${e.form.scheduleKind}
2268
- @change=${n=>e.onFormChange({scheduleKind:n.target.value})}
2269
- >
2270
- <option value="every">Every</option>
2271
- <option value="at">At</option>
2272
- <option value="cron">Cron</option>
2273
- </select>
2274
- </label>
2275
- </div>
2276
- ${Yh(e)}
2277
- <div class="form-grid" style="margin-top: 12px;">
2278
- <label class="field">
2279
- <span>Session</span>
2280
- <select
2281
- .value=${e.form.sessionTarget}
2282
- @change=${n=>e.onFormChange({sessionTarget:n.target.value})}
2283
- >
2284
- <option value="main">Main</option>
2285
- <option value="isolated">Isolated</option>
2286
- </select>
2287
- </label>
2288
- <label class="field">
2289
- <span>Wake mode</span>
2290
- <select
2291
- .value=${e.form.wakeMode}
2292
- @change=${n=>e.onFormChange({wakeMode:n.target.value})}
2293
- >
2294
- <option value="next-heartbeat">Next heartbeat</option>
2295
- <option value="now">Now</option>
2296
- </select>
2297
- </label>
2298
- <label class="field">
2299
- <span>Payload</span>
2300
- <select
2301
- .value=${e.form.payloadKind}
2302
- @change=${n=>e.onFormChange({payloadKind:n.target.value})}
2303
- >
2304
- <option value="systemEvent">System event</option>
2305
- <option value="agentTurn">Agent turn</option>
2306
- </select>
2307
- </label>
2308
- </div>
2309
- <label class="field" style="margin-top: 12px;">
2310
- <span>${e.form.payloadKind==="systemEvent"?"System text":"Agent message"}</span>
2311
- <textarea
2312
- .value=${e.form.payloadText}
2313
- @input=${n=>e.onFormChange({payloadText:n.target.value})}
2314
- rows="4"
2315
- ></textarea>
2316
- </label>
2317
- ${e.form.payloadKind==="agentTurn"?c`
2318
- <div class="form-grid" style="margin-top: 12px;">
2319
- <label class="field checkbox">
2320
- <span>Deliver</span>
2321
- <input
2322
- type="checkbox"
2323
- .checked=${e.form.deliver}
2324
- @change=${n=>e.onFormChange({deliver:n.target.checked})}
2325
- />
2326
- </label>
2327
- <label class="field">
2328
- <span>Channel</span>
2329
- <select
2330
- .value=${e.form.channel||"last"}
2331
- @change=${n=>e.onFormChange({channel:n.target.value})}
2332
- >
2333
- ${t.map(n=>c`<option value=${n}>
2334
- ${Wh(e,n)}
2335
- </option>`)}
2336
- </select>
2337
- </label>
2338
- <label class="field">
2339
- <span>To</span>
2340
- <input
2341
- .value=${e.form.to}
2342
- @input=${n=>e.onFormChange({to:n.target.value})}
2343
- placeholder="+1555… or chat id"
2344
- />
2345
- </label>
2346
- <label class="field">
2347
- <span>Timeout (seconds)</span>
2348
- <input
2349
- .value=${e.form.timeoutSeconds}
2350
- @input=${n=>e.onFormChange({timeoutSeconds:n.target.value})}
2351
- />
2352
- </label>
2353
- ${e.form.sessionTarget==="isolated"?c`
2354
- <label class="field">
2355
- <span>Post to main prefix</span>
2356
- <input
2357
- .value=${e.form.postToMainPrefix}
2358
- @input=${n=>e.onFormChange({postToMainPrefix:n.target.value})}
2359
- />
2360
- </label>
2361
- `:f}
2362
- </div>
2363
- `:f}
2364
- <div class="row" style="margin-top: 14px;">
2365
- <button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
2366
- ${e.busy?"Saving…":"Add job"}
2367
- </button>
2368
- </div>
2369
- </div>
2370
- </section>
2371
-
2372
- <section class="card" style="margin-top: 18px;">
2373
- <div class="card-title">Jobs</div>
2374
- <div class="card-sub">All scheduled jobs stored in the gateway.</div>
2375
- ${e.jobs.length===0?c`
2376
- <div class="muted" style="margin-top: 12px">No jobs yet.</div>
2377
- `:c`
2378
- <div class="list" style="margin-top: 12px;">
2379
- ${e.jobs.map(n=>Qh(n,e))}
2380
- </div>
2381
- `}
2382
- </section>
2383
-
2384
- <section class="card" style="margin-top: 18px;">
2385
- <div class="card-title">Run history</div>
2386
- <div class="card-sub">Latest runs for ${e.runsJobId??"(select a job)"}.</div>
2387
- ${e.runsJobId==null?c`
2388
- <div class="muted" style="margin-top: 12px">Select a job to inspect run history.</div>
2389
- `:e.runs.length===0?c`
2390
- <div class="muted" style="margin-top: 12px">No runs yet.</div>
2391
- `:c`
2392
- <div class="list" style="margin-top: 12px;">
2393
- ${e.runs.map(n=>Zh(n))}
2394
- </div>
2395
- `}
2396
- </section>
2397
- `}function Yh(e){const t=e.form;return t.scheduleKind==="at"?c`
2398
- <label class="field" style="margin-top: 12px;">
2399
- <span>Run at</span>
2400
- <input
2401
- type="datetime-local"
2402
- .value=${t.scheduleAt}
2403
- @input=${n=>e.onFormChange({scheduleAt:n.target.value})}
2404
- />
2405
- </label>
2406
- `:t.scheduleKind==="every"?c`
2407
- <div class="form-grid" style="margin-top: 12px;">
2408
- <label class="field">
2409
- <span>Every</span>
2410
- <input
2411
- .value=${t.everyAmount}
2412
- @input=${n=>e.onFormChange({everyAmount:n.target.value})}
2413
- />
2414
- </label>
2415
- <label class="field">
2416
- <span>Unit</span>
2417
- <select
2418
- .value=${t.everyUnit}
2419
- @change=${n=>e.onFormChange({everyUnit:n.target.value})}
2420
- >
2421
- <option value="minutes">Minutes</option>
2422
- <option value="hours">Hours</option>
2423
- <option value="days">Days</option>
2424
- </select>
2425
- </label>
2426
- </div>
2427
- `:c`
2428
- <div class="form-grid" style="margin-top: 12px;">
2429
- <label class="field">
2430
- <span>Expression</span>
2431
- <input
2432
- .value=${t.cronExpr}
2433
- @input=${n=>e.onFormChange({cronExpr:n.target.value})}
2434
- />
2435
- </label>
2436
- <label class="field">
2437
- <span>Timezone (optional)</span>
2438
- <input
2439
- .value=${t.cronTz}
2440
- @input=${n=>e.onFormChange({cronTz:n.target.value})}
2441
- />
2442
- </label>
2443
- </div>
2444
- `}function Qh(e,t){const s=`list-item list-item-clickable${t.runsJobId===e.id?" list-item-selected":""}`;return c`
2445
- <div class=${s} @click=${()=>t.onLoadRuns(e.id)}>
2446
- <div class="list-main">
2447
- <div class="list-title">${e.name}</div>
2448
- <div class="list-sub">${jh(e)}</div>
2449
- <div class="muted">${qh(e)}</div>
2450
- ${e.agentId?c`<div class="muted">Agent: ${e.agentId}</div>`:f}
2451
- <div class="chip-row" style="margin-top: 6px;">
2452
- <span class="chip">${e.enabled?"enabled":"disabled"}</span>
2453
- <span class="chip">${e.sessionTarget}</span>
2454
- <span class="chip">${e.wakeMode}</span>
2455
- </div>
2456
- </div>
2457
- <div class="list-meta">
2458
- <div>${zh(e)}</div>
2459
- <div class="row" style="justify-content: flex-end; margin-top: 8px;">
2460
- <button
2461
- class="btn"
2462
- ?disabled=${t.busy}
2463
- @click=${i=>{i.stopPropagation(),t.onToggle(e,!e.enabled)}}
2464
- >
2465
- ${e.enabled?"Disable":"Enable"}
2466
- </button>
2467
- <button
2468
- class="btn"
2469
- ?disabled=${t.busy}
2470
- @click=${i=>{i.stopPropagation(),t.onRun(e)}}
2471
- >
2472
- Run
2473
- </button>
2474
- <button
2475
- class="btn"
2476
- ?disabled=${t.busy}
2477
- @click=${i=>{i.stopPropagation(),t.onLoadRuns(e.id)}}
2478
- >
2479
- Runs
2480
- </button>
2481
- <button
2482
- class="btn danger"
2483
- ?disabled=${t.busy}
2484
- @click=${i=>{i.stopPropagation(),t.onRemove(e)}}
2485
- >
2486
- Remove
2487
- </button>
2488
- </div>
2489
- </div>
2490
- </div>
2491
- `}function Zh(e){return c`
2492
- <div class="list-item">
2493
- <div class="list-main">
2494
- <div class="list-title">${e.status}</div>
2495
- <div class="list-sub">${e.summary??""}</div>
2496
- </div>
2497
- <div class="list-meta">
2498
- <div>${kt(e.ts)}</div>
2499
- <div class="muted">${e.durationMs??0}ms</div>
2500
- ${e.error?c`<div class="muted">${e.error}</div>`:f}
2501
- </div>
2502
- </div>
2503
- `}function Jh(e){const n=(e.status&&typeof e.status=="object"?e.status.securityAudit:null)?.summary??null,s=n?.critical??0,i=n?.warn??0,a=n?.info??0,o=s>0?"danger":i>0?"warn":"success",r=s>0?`${s} critical`:i>0?`${i} warnings`:"No critical issues";return c`
2504
- <section class="grid grid-cols-2">
2505
- <div class="card">
2506
- <div class="row" style="justify-content: space-between;">
2507
- <div>
2508
- <div class="card-title">Snapshots</div>
2509
- <div class="card-sub">Status, health, and heartbeat data.</div>
2510
- </div>
2511
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2512
- ${e.loading?"Refreshing…":"Refresh"}
2513
- </button>
2514
- </div>
2515
- <div class="stack" style="margin-top: 12px;">
2516
- <div>
2517
- <div class="muted">Status</div>
2518
- ${n?c`<div class="callout ${o}" style="margin-top: 8px;">
2519
- Security audit: ${r}${a>0?` · ${a} info`:""}. Run
2520
- <span class="mono">openclaw security audit --deep</span> for details.
2521
- </div>`:f}
2522
- <pre class="code-block">${JSON.stringify(e.status??{},null,2)}</pre>
2523
- </div>
2524
- <div>
2525
- <div class="muted">Health</div>
2526
- <pre class="code-block">${JSON.stringify(e.health??{},null,2)}</pre>
2527
- </div>
2528
- <div>
2529
- <div class="muted">Last heartbeat</div>
2530
- <pre class="code-block">${JSON.stringify(e.heartbeat??{},null,2)}</pre>
2531
- </div>
2532
- </div>
2533
- </div>
2534
-
2535
- <div class="card">
2536
- <div class="card-title">Manual RPC</div>
2537
- <div class="card-sub">Send a raw gateway method with JSON params.</div>
2538
- <div class="form-grid" style="margin-top: 16px;">
2539
- <label class="field">
2540
- <span>Method</span>
2541
- <input
2542
- .value=${e.callMethod}
2543
- @input=${l=>e.onCallMethodChange(l.target.value)}
2544
- placeholder="system-presence"
2545
- />
2546
- </label>
2547
- <label class="field">
2548
- <span>Params (JSON)</span>
2549
- <textarea
2550
- .value=${e.callParams}
2551
- @input=${l=>e.onCallParamsChange(l.target.value)}
2552
- rows="6"
2553
- ></textarea>
2554
- </label>
2555
- </div>
2556
- <div class="row" style="margin-top: 12px;">
2557
- <button class="btn primary" @click=${e.onCall}>Call</button>
2558
- </div>
2559
- ${e.callError?c`<div class="callout danger" style="margin-top: 12px;">
2560
- ${e.callError}
2561
- </div>`:f}
2562
- ${e.callResult?c`<pre class="code-block" style="margin-top: 12px;">${e.callResult}</pre>`:f}
2563
- </div>
2564
- </section>
2565
-
2566
- <section class="card" style="margin-top: 18px;">
2567
- <div class="card-title">Models</div>
2568
- <div class="card-sub">Catalog from models.list.</div>
2569
- <pre class="code-block" style="margin-top: 12px;">${JSON.stringify(e.models??[],null,2)}</pre>
2570
- </section>
2571
-
2572
- <section class="card" style="margin-top: 18px;">
2573
- <div class="card-title">Event Log</div>
2574
- <div class="card-sub">Latest gateway events.</div>
2575
- ${e.eventLog.length===0?c`
2576
- <div class="muted" style="margin-top: 12px">No events yet.</div>
2577
- `:c`
2578
- <div class="list" style="margin-top: 12px;">
2579
- ${e.eventLog.map(l=>c`
2580
- <div class="list-item">
2581
- <div class="list-main">
2582
- <div class="list-title">${l.event}</div>
2583
- <div class="list-sub">${new Date(l.ts).toLocaleTimeString()}</div>
2584
- </div>
2585
- <div class="list-meta">
2586
- <pre class="code-block">${Hh(l.payload)}</pre>
2587
- </div>
2588
- </div>
2589
- `)}
2590
- </div>
2591
- `}
2592
- </section>
2593
- `}function Xh(e){return c`
2594
- <section class="card">
2595
- <div class="row" style="justify-content: space-between;">
2596
- <div>
2597
- <div class="card-title">Connected Instances</div>
2598
- <div class="card-sub">Presence beacons from the gateway and clients.</div>
2599
- </div>
2600
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2601
- ${e.loading?"Loading…":"Refresh"}
2602
- </button>
2603
- </div>
2604
- ${e.lastError?c`<div class="callout danger" style="margin-top: 12px;">
2605
- ${e.lastError}
2606
- </div>`:f}
2607
- ${e.statusMessage?c`<div class="callout" style="margin-top: 12px;">
2608
- ${e.statusMessage}
2609
- </div>`:f}
2610
- <div class="list" style="margin-top: 16px;">
2611
- ${e.entries.length===0?c`
2612
- <div class="muted">No instances reported yet.</div>
2613
- `:e.entries.map(t=>ef(t))}
2614
- </div>
2615
- </section>
2616
- `}function ef(e){const t=e.lastInputSeconds!=null?`${e.lastInputSeconds}s ago`:"n/a",n=e.mode??"unknown",s=Array.isArray(e.roles)?e.roles.filter(Boolean):[],i=Array.isArray(e.scopes)?e.scopes.filter(Boolean):[],a=i.length>0?i.length>3?`${i.length} scopes`:`scopes: ${i.join(", ")}`:null;return c`
2617
- <div class="list-item">
2618
- <div class="list-main">
2619
- <div class="list-title">${e.host??"unknown host"}</div>
2620
- <div class="list-sub">${Fh(e)}</div>
2621
- <div class="chip-row">
2622
- <span class="chip">${n}</span>
2623
- ${s.map(o=>c`<span class="chip">${o}</span>`)}
2624
- ${a?c`<span class="chip">${a}</span>`:f}
2625
- ${e.platform?c`<span class="chip">${e.platform}</span>`:f}
2626
- ${e.deviceFamily?c`<span class="chip">${e.deviceFamily}</span>`:f}
2627
- ${e.modelIdentifier?c`<span class="chip">${e.modelIdentifier}</span>`:f}
2628
- ${e.version?c`<span class="chip">${e.version}</span>`:f}
2629
- </div>
2630
- </div>
2631
- <div class="list-meta">
2632
- <div>${Uh(e)}</div>
2633
- <div class="muted">Last input ${t}</div>
2634
- <div class="muted">Reason ${e.reason??""}</div>
2635
- </div>
2636
- </div>
2637
- `}const Za=["trace","debug","info","warn","error","fatal"];function tf(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function nf(e,t){return t?[e.message,e.subsystem,e.raw].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function sf(e){const t=e.filterText.trim().toLowerCase(),n=Za.some(a=>!e.levelFilters[a]),s=e.entries.filter(a=>a.level&&!e.levelFilters[a.level]?!1:nf(a,t)),i=t||n?"filtered":"visible";return c`
2638
- <section class="card">
2639
- <div class="row" style="justify-content: space-between;">
2640
- <div>
2641
- <div class="card-title">Logs</div>
2642
- <div class="card-sub">Gateway file logs (JSONL).</div>
2643
- </div>
2644
- <div class="row" style="gap: 8px;">
2645
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2646
- ${e.loading?"Loading…":"Refresh"}
2647
- </button>
2648
- <button
2649
- class="btn"
2650
- ?disabled=${s.length===0}
2651
- @click=${()=>e.onExport(s.map(a=>a.raw),i)}
2652
- >
2653
- Export ${i}
2654
- </button>
2655
- </div>
2656
- </div>
2657
-
2658
- <div class="filters" style="margin-top: 14px;">
2659
- <label class="field" style="min-width: 220px;">
2660
- <span>Filter</span>
2661
- <input
2662
- .value=${e.filterText}
2663
- @input=${a=>e.onFilterTextChange(a.target.value)}
2664
- placeholder="Search logs"
2665
- />
2666
- </label>
2667
- <label class="field checkbox">
2668
- <span>Auto-follow</span>
2669
- <input
2670
- type="checkbox"
2671
- .checked=${e.autoFollow}
2672
- @change=${a=>e.onToggleAutoFollow(a.target.checked)}
2673
- />
2674
- </label>
2675
- </div>
2676
-
2677
- <div class="chip-row" style="margin-top: 12px;">
2678
- ${Za.map(a=>c`
2679
- <label class="chip log-chip ${a}">
2680
- <input
2681
- type="checkbox"
2682
- .checked=${e.levelFilters[a]}
2683
- @change=${o=>e.onLevelToggle(a,o.target.checked)}
2684
- />
2685
- <span>${a}</span>
2686
- </label>
2687
- `)}
2688
- </div>
2689
-
2690
- ${e.file?c`<div class="muted" style="margin-top: 10px;">File: ${e.file}</div>`:f}
2691
- ${e.truncated?c`
2692
- <div class="callout" style="margin-top: 10px">Log output truncated; showing latest chunk.</div>
2693
- `:f}
2694
- ${e.error?c`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:f}
2695
-
2696
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2697
- ${s.length===0?c`
2698
- <div class="muted" style="padding: 12px">No log entries.</div>
2699
- `:s.map(a=>c`
2700
- <div class="log-row">
2701
- <div class="log-time mono">${tf(a.time)}</div>
2702
- <div class="log-level ${a.level??""}">${a.level??""}</div>
2703
- <div class="log-subsystem mono">${a.subsystem??""}</div>
2704
- <div class="log-message mono">${a.message??a.raw}</div>
2705
- </div>
2706
- `)}
2707
- </div>
2708
- </section>
2709
- `}function af(e){const t=uf(e),n=mf(e);return c`
2710
- ${bf(n)}
2711
- ${yf(t)}
2712
- ${of(e)}
2713
- <section class="card">
2714
- <div class="row" style="justify-content: space-between;">
2715
- <div>
2716
- <div class="card-title">Nodes</div>
2717
- <div class="card-sub">Paired devices and live links.</div>
2718
- </div>
2719
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2720
- ${e.loading?"Loading…":"Refresh"}
2721
- </button>
2722
- </div>
2723
- <div class="list" style="margin-top: 16px;">
2724
- ${e.nodes.length===0?c`
2725
- <div class="muted">No nodes found.</div>
2726
- `:e.nodes.map(s=>Ef(s))}
2727
- </div>
2728
- </section>
2729
- `}function of(e){const t=e.devicesList??{pending:[],paired:[]},n=Array.isArray(t.pending)?t.pending:[],s=Array.isArray(t.paired)?t.paired:[];return c`
2730
- <section class="card">
2731
- <div class="row" style="justify-content: space-between;">
2732
- <div>
2733
- <div class="card-title">Devices</div>
2734
- <div class="card-sub">Pairing requests + role tokens.</div>
2735
- </div>
2736
- <button class="btn" ?disabled=${e.devicesLoading} @click=${e.onDevicesRefresh}>
2737
- ${e.devicesLoading?"Loading…":"Refresh"}
2738
- </button>
2739
- </div>
2740
- ${e.devicesError?c`<div class="callout danger" style="margin-top: 12px;">${e.devicesError}</div>`:f}
2741
- <div class="list" style="margin-top: 16px;">
2742
- ${n.length>0?c`
2743
- <div class="muted" style="margin-bottom: 8px;">Pending</div>
2744
- ${n.map(i=>rf(i,e))}
2745
- `:f}
2746
- ${s.length>0?c`
2747
- <div class="muted" style="margin-top: 12px; margin-bottom: 8px;">Paired</div>
2748
- ${s.map(i=>lf(i,e))}
2749
- `:f}
2750
- ${n.length===0&&s.length===0?c`
2751
- <div class="muted">No paired devices.</div>
2752
- `:f}
2753
- </div>
2754
- </section>
2755
- `}function rf(e,t){const n=e.displayName?.trim()||e.deviceId,s=typeof e.ts=="number"?O(e.ts):"n/a",i=e.role?.trim()?`role: ${e.role}`:"role: -",a=e.isRepair?" · repair":"",o=e.remoteIp?` · ${e.remoteIp}`:"";return c`
2756
- <div class="list-item">
2757
- <div class="list-main">
2758
- <div class="list-title">${n}</div>
2759
- <div class="list-sub">${e.deviceId}${o}</div>
2760
- <div class="muted" style="margin-top: 6px;">
2761
- ${i} · requested ${s}${a}
2762
- </div>
2763
- </div>
2764
- <div class="list-meta">
2765
- <div class="row" style="justify-content: flex-end; gap: 8px; flex-wrap: wrap;">
2766
- <button class="btn btn--sm primary" @click=${()=>t.onDeviceApprove(e.requestId)}>
2767
- Approve
2768
- </button>
2769
- <button class="btn btn--sm" @click=${()=>t.onDeviceReject(e.requestId)}>
2770
- Reject
2771
- </button>
2772
- </div>
2773
- </div>
2774
- </div>
2775
- `}function lf(e,t){const n=e.displayName?.trim()||e.deviceId,s=e.remoteIp?` · ${e.remoteIp}`:"",i=`roles: ${cs(e.roles)}`,a=`scopes: ${cs(e.scopes)}`,o=Array.isArray(e.tokens)?e.tokens:[];return c`
2776
- <div class="list-item">
2777
- <div class="list-main">
2778
- <div class="list-title">${n}</div>
2779
- <div class="list-sub">${e.deviceId}${s}</div>
2780
- <div class="muted" style="margin-top: 6px;">${i} · ${a}</div>
2781
- ${o.length===0?c`
2782
- <div class="muted" style="margin-top: 6px">Tokens: none</div>
2783
- `:c`
2784
- <div class="muted" style="margin-top: 10px;">Tokens</div>
2785
- <div style="display: flex; flex-direction: column; gap: 8px; margin-top: 6px;">
2786
- ${o.map(r=>cf(e.deviceId,r,t))}
2787
- </div>
2788
- `}
2789
- </div>
2790
- </div>
2791
- `}function cf(e,t,n){const s=t.revokedAtMs?"revoked":"active",i=`scopes: ${cs(t.scopes)}`,a=O(t.rotatedAtMs??t.createdAtMs??t.lastUsedAtMs??null);return c`
2792
- <div class="row" style="justify-content: space-between; gap: 8px;">
2793
- <div class="list-sub">${t.role} · ${s} · ${i} · ${a}</div>
2794
- <div class="row" style="justify-content: flex-end; gap: 6px; flex-wrap: wrap;">
2795
- <button
2796
- class="btn btn--sm"
2797
- @click=${()=>n.onDeviceRotate(e,t.role,t.scopes)}
2798
- >
2799
- Rotate
2800
- </button>
2801
- ${t.revokedAtMs?f:c`
2802
- <button
2803
- class="btn btn--sm danger"
2804
- @click=${()=>n.onDeviceRevoke(e,t.role)}
2805
- >
2806
- Revoke
2807
- </button>
2808
- `}
2809
- </div>
2810
- </div>
2811
- `}const Ae="__defaults__",Ja=[{value:"deny",label:"Deny"},{value:"allowlist",label:"Allowlist"},{value:"full",label:"Full"}],df=[{value:"off",label:"Off"},{value:"on-miss",label:"On miss"},{value:"always",label:"Always"}];function uf(e){const t=e.configForm,n=_f(e.nodes),{defaultBinding:s,agents:i}=Tf(t),a=!!t,o=e.configSaving||e.configFormMode==="raw";return{ready:a,disabled:o,configDirty:e.configDirty,configLoading:e.configLoading,configSaving:e.configSaving,defaultBinding:s,agents:i,nodes:n,onBindDefault:e.onBindDefault,onBindAgent:e.onBindAgent,onSave:e.onSaveBindings,onLoadConfig:e.onLoadConfig,formMode:e.configFormMode}}function Xa(e){return e==="allowlist"||e==="full"||e==="deny"?e:"deny"}function pf(e){return e==="always"||e==="off"||e==="on-miss"?e:"on-miss"}function hf(e){const t=e?.defaults??{};return{security:Xa(t.security),ask:pf(t.ask),askFallback:Xa(t.askFallback??"deny"),autoAllowSkills:!!(t.autoAllowSkills??!1)}}function ff(e){const t=e?.agents??{},n=Array.isArray(t.list)?t.list:[],s=[];return n.forEach(i=>{if(!i||typeof i!="object")return;const a=i,o=typeof a.id=="string"?a.id.trim():"";if(!o)return;const r=typeof a.name=="string"?a.name.trim():void 0,l=a.default===!0;s.push({id:o,name:r||void 0,isDefault:l})}),s}function gf(e,t){const n=ff(e),s=Object.keys(t?.agents??{}),i=new Map;n.forEach(o=>i.set(o.id,o)),s.forEach(o=>{i.has(o)||i.set(o,{id:o})});const a=Array.from(i.values());return a.length===0&&a.push({id:"main",isDefault:!0}),a.sort((o,r)=>{if(o.isDefault&&!r.isDefault)return-1;if(!o.isDefault&&r.isDefault)return 1;const l=o.name?.trim()?o.name:o.id,p=r.name?.trim()?r.name:r.id;return l.localeCompare(p)}),a}function vf(e,t){return e===Ae?Ae:e&&t.some(n=>n.id===e)?e:Ae}function mf(e){const t=e.execApprovalsForm??e.execApprovalsSnapshot?.file??null,n=!!t,s=hf(t),i=gf(e.configForm,t),a=Cf(e.nodes),o=e.execApprovalsTarget;let r=o==="node"&&e.execApprovalsTargetNodeId?e.execApprovalsTargetNodeId:null;o==="node"&&r&&!a.some(u=>u.id===r)&&(r=null);const l=vf(e.execApprovalsSelectedAgent,i),p=l!==Ae?(t?.agents??{})[l]??null:null,d=Array.isArray(p?.allowlist)?p.allowlist??[]:[];return{ready:n,disabled:e.execApprovalsSaving||e.execApprovalsLoading,dirty:e.execApprovalsDirty,loading:e.execApprovalsLoading,saving:e.execApprovalsSaving,form:t,defaults:s,selectedScope:l,selectedAgent:p,agents:i,allowlist:d,target:o,targetNodeId:r,targetNodes:a,onSelectScope:e.onExecApprovalsSelectAgent,onSelectTarget:e.onExecApprovalsTargetChange,onPatch:e.onExecApprovalsPatch,onRemove:e.onExecApprovalsRemove,onLoad:e.onLoadExecApprovals,onSave:e.onSaveExecApprovals}}function yf(e){const t=e.nodes.length>0,n=e.defaultBinding??"";return c`
2812
- <section class="card">
2813
- <div class="row" style="justify-content: space-between; align-items: center;">
2814
- <div>
2815
- <div class="card-title">Exec node binding</div>
2816
- <div class="card-sub">
2817
- Pin agents to a specific node when using <span class="mono">exec host=node</span>.
2818
- </div>
2819
- </div>
2820
- <button
2821
- class="btn"
2822
- ?disabled=${e.disabled||!e.configDirty}
2823
- @click=${e.onSave}
2824
- >
2825
- ${e.configSaving?"Saving…":"Save"}
2826
- </button>
2827
- </div>
2828
-
2829
- ${e.formMode==="raw"?c`
2830
- <div class="callout warn" style="margin-top: 12px">
2831
- Switch the Config tab to <strong>Form</strong> mode to edit bindings here.
2832
- </div>
2833
- `:f}
2834
-
2835
- ${e.ready?c`
2836
- <div class="list" style="margin-top: 16px;">
2837
- <div class="list-item">
2838
- <div class="list-main">
2839
- <div class="list-title">Default binding</div>
2840
- <div class="list-sub">Used when agents do not override a node binding.</div>
2841
- </div>
2842
- <div class="list-meta">
2843
- <label class="field">
2844
- <span>Node</span>
2845
- <select
2846
- ?disabled=${e.disabled||!t}
2847
- @change=${s=>{const a=s.target.value.trim();e.onBindDefault(a||null)}}
2848
- >
2849
- <option value="" ?selected=${n===""}>Any node</option>
2850
- ${e.nodes.map(s=>c`<option
2851
- value=${s.id}
2852
- ?selected=${n===s.id}
2853
- >
2854
- ${s.label}
2855
- </option>`)}
2856
- </select>
2857
- </label>
2858
- ${t?f:c`
2859
- <div class="muted">No nodes with system.run available.</div>
2860
- `}
2861
- </div>
2862
- </div>
2863
-
2864
- ${e.agents.length===0?c`
2865
- <div class="muted">No agents found.</div>
2866
- `:e.agents.map(s=>Sf(s,e))}
2867
- </div>
2868
- `:c`<div class="row" style="margin-top: 12px; gap: 12px;">
2869
- <div class="muted">Load config to edit bindings.</div>
2870
- <button class="btn" ?disabled=${e.configLoading} @click=${e.onLoadConfig}>
2871
- ${e.configLoading?"Loading…":"Load config"}
2872
- </button>
2873
- </div>`}
2874
- </section>
2875
- `}function bf(e){const t=e.ready,n=e.target!=="node"||!!e.targetNodeId;return c`
2876
- <section class="card">
2877
- <div class="row" style="justify-content: space-between; align-items: center;">
2878
- <div>
2879
- <div class="card-title">Exec approvals</div>
2880
- <div class="card-sub">
2881
- Allowlist and approval policy for <span class="mono">exec host=gateway/node</span>.
2882
- </div>
2883
- </div>
2884
- <button
2885
- class="btn"
2886
- ?disabled=${e.disabled||!e.dirty||!n}
2887
- @click=${e.onSave}
2888
- >
2889
- ${e.saving?"Saving…":"Save"}
2890
- </button>
2891
- </div>
2892
-
2893
- ${wf(e)}
2894
-
2895
- ${t?c`
2896
- ${$f(e)}
2897
- ${xf(e)}
2898
- ${e.selectedScope===Ae?f:Af(e)}
2899
- `:c`<div class="row" style="margin-top: 12px; gap: 12px;">
2900
- <div class="muted">Load exec approvals to edit allowlists.</div>
2901
- <button class="btn" ?disabled=${e.loading||!n} @click=${e.onLoad}>
2902
- ${e.loading?"Loading…":"Load approvals"}
2903
- </button>
2904
- </div>`}
2905
- </section>
2906
- `}function wf(e){const t=e.targetNodes.length>0,n=e.targetNodeId??"";return c`
2907
- <div class="list" style="margin-top: 12px;">
2908
- <div class="list-item">
2909
- <div class="list-main">
2910
- <div class="list-title">Target</div>
2911
- <div class="list-sub">
2912
- Gateway edits local approvals; node edits the selected node.
2913
- </div>
2914
- </div>
2915
- <div class="list-meta">
2916
- <label class="field">
2917
- <span>Host</span>
2918
- <select
2919
- ?disabled=${e.disabled}
2920
- @change=${s=>{if(s.target.value==="node"){const o=e.targetNodes[0]?.id??null;e.onSelectTarget("node",n||o)}else e.onSelectTarget("gateway",null)}}
2921
- >
2922
- <option value="gateway" ?selected=${e.target==="gateway"}>Gateway</option>
2923
- <option value="node" ?selected=${e.target==="node"}>Node</option>
2924
- </select>
2925
- </label>
2926
- ${e.target==="node"?c`
2927
- <label class="field">
2928
- <span>Node</span>
2929
- <select
2930
- ?disabled=${e.disabled||!t}
2931
- @change=${s=>{const a=s.target.value.trim();e.onSelectTarget("node",a||null)}}
2932
- >
2933
- <option value="" ?selected=${n===""}>Select node</option>
2934
- ${e.targetNodes.map(s=>c`<option
2935
- value=${s.id}
2936
- ?selected=${n===s.id}
2937
- >
2938
- ${s.label}
2939
- </option>`)}
2940
- </select>
2941
- </label>
2942
- `:f}
2943
- </div>
2944
- </div>
2945
- ${e.target==="node"&&!t?c`
2946
- <div class="muted">No nodes advertise exec approvals yet.</div>
2947
- `:f}
2948
- </div>
2949
- `}function $f(e){return c`
2950
- <div class="row" style="margin-top: 12px; gap: 8px; flex-wrap: wrap;">
2951
- <span class="label">Scope</span>
2952
- <div class="row" style="gap: 8px; flex-wrap: wrap;">
2953
- <button
2954
- class="btn btn--sm ${e.selectedScope===Ae?"active":""}"
2955
- @click=${()=>e.onSelectScope(Ae)}
2956
- >
2957
- Defaults
2958
- </button>
2959
- ${e.agents.map(t=>{const n=t.name?.trim()?`${t.name} (${t.id})`:t.id;return c`
2960
- <button
2961
- class="btn btn--sm ${e.selectedScope===t.id?"active":""}"
2962
- @click=${()=>e.onSelectScope(t.id)}
2963
- >
2964
- ${n}
2965
- </button>
2966
- `})}
2967
- </div>
2968
- </div>
2969
- `}function xf(e){const t=e.selectedScope===Ae,n=e.defaults,s=e.selectedAgent??{},i=t?["defaults"]:["agents",e.selectedScope],a=typeof s.security=="string"?s.security:void 0,o=typeof s.ask=="string"?s.ask:void 0,r=typeof s.askFallback=="string"?s.askFallback:void 0,l=t?n.security:a??"__default__",p=t?n.ask:o??"__default__",d=t?n.askFallback:r??"__default__",u=typeof s.autoAllowSkills=="boolean"?s.autoAllowSkills:void 0,g=u??n.autoAllowSkills,v=u==null;return c`
2970
- <div class="list" style="margin-top: 16px;">
2971
- <div class="list-item">
2972
- <div class="list-main">
2973
- <div class="list-title">Security</div>
2974
- <div class="list-sub">
2975
- ${t?"Default security mode.":`Default: ${n.security}.`}
2976
- </div>
2977
- </div>
2978
- <div class="list-meta">
2979
- <label class="field">
2980
- <span>Mode</span>
2981
- <select
2982
- ?disabled=${e.disabled}
2983
- @change=${y=>{const A=y.target.value;!t&&A==="__default__"?e.onRemove([...i,"security"]):e.onPatch([...i,"security"],A)}}
2984
- >
2985
- ${t?f:c`<option value="__default__" ?selected=${l==="__default__"}>
2986
- Use default (${n.security})
2987
- </option>`}
2988
- ${Ja.map(y=>c`<option
2989
- value=${y.value}
2990
- ?selected=${l===y.value}
2991
- >
2992
- ${y.label}
2993
- </option>`)}
2994
- </select>
2995
- </label>
2996
- </div>
2997
- </div>
2998
-
2999
- <div class="list-item">
3000
- <div class="list-main">
3001
- <div class="list-title">Ask</div>
3002
- <div class="list-sub">
3003
- ${t?"Default prompt policy.":`Default: ${n.ask}.`}
3004
- </div>
3005
- </div>
3006
- <div class="list-meta">
3007
- <label class="field">
3008
- <span>Mode</span>
3009
- <select
3010
- ?disabled=${e.disabled}
3011
- @change=${y=>{const A=y.target.value;!t&&A==="__default__"?e.onRemove([...i,"ask"]):e.onPatch([...i,"ask"],A)}}
3012
- >
3013
- ${t?f:c`<option value="__default__" ?selected=${p==="__default__"}>
3014
- Use default (${n.ask})
3015
- </option>`}
3016
- ${df.map(y=>c`<option
3017
- value=${y.value}
3018
- ?selected=${p===y.value}
3019
- >
3020
- ${y.label}
3021
- </option>`)}
3022
- </select>
3023
- </label>
3024
- </div>
3025
- </div>
3026
-
3027
- <div class="list-item">
3028
- <div class="list-main">
3029
- <div class="list-title">Ask fallback</div>
3030
- <div class="list-sub">
3031
- ${t?"Applied when the UI prompt is unavailable.":`Default: ${n.askFallback}.`}
3032
- </div>
3033
- </div>
3034
- <div class="list-meta">
3035
- <label class="field">
3036
- <span>Fallback</span>
3037
- <select
3038
- ?disabled=${e.disabled}
3039
- @change=${y=>{const A=y.target.value;!t&&A==="__default__"?e.onRemove([...i,"askFallback"]):e.onPatch([...i,"askFallback"],A)}}
3040
- >
3041
- ${t?f:c`<option value="__default__" ?selected=${d==="__default__"}>
3042
- Use default (${n.askFallback})
3043
- </option>`}
3044
- ${Ja.map(y=>c`<option
3045
- value=${y.value}
3046
- ?selected=${d===y.value}
3047
- >
3048
- ${y.label}
3049
- </option>`)}
3050
- </select>
3051
- </label>
3052
- </div>
3053
- </div>
3054
-
3055
- <div class="list-item">
3056
- <div class="list-main">
3057
- <div class="list-title">Auto-allow skill CLIs</div>
3058
- <div class="list-sub">
3059
- ${t?"Allow skill executables listed by the Gateway.":v?`Using default (${n.autoAllowSkills?"on":"off"}).`:`Override (${g?"on":"off"}).`}
3060
- </div>
3061
- </div>
3062
- <div class="list-meta">
3063
- <label class="field">
3064
- <span>Enabled</span>
3065
- <input
3066
- type="checkbox"
3067
- ?disabled=${e.disabled}
3068
- .checked=${g}
3069
- @change=${y=>{const $=y.target;e.onPatch([...i,"autoAllowSkills"],$.checked)}}
3070
- />
3071
- </label>
3072
- ${!t&&!v?c`<button
3073
- class="btn btn--sm"
3074
- ?disabled=${e.disabled}
3075
- @click=${()=>e.onRemove([...i,"autoAllowSkills"])}
3076
- >
3077
- Use default
3078
- </button>`:f}
3079
- </div>
3080
- </div>
3081
- </div>
3082
- `}function Af(e){const t=["agents",e.selectedScope,"allowlist"],n=e.allowlist;return c`
3083
- <div class="row" style="margin-top: 18px; justify-content: space-between;">
3084
- <div>
3085
- <div class="card-title">Allowlist</div>
3086
- <div class="card-sub">Case-insensitive glob patterns.</div>
3087
- </div>
3088
- <button
3089
- class="btn btn--sm"
3090
- ?disabled=${e.disabled}
3091
- @click=${()=>{const s=[...n,{pattern:""}];e.onPatch(t,s)}}
3092
- >
3093
- Add pattern
3094
- </button>
3095
- </div>
3096
- <div class="list" style="margin-top: 12px;">
3097
- ${n.length===0?c`
3098
- <div class="muted">No allowlist entries yet.</div>
3099
- `:n.map((s,i)=>kf(e,s,i))}
3100
- </div>
3101
- `}function kf(e,t,n){const s=t.lastUsedAt?O(t.lastUsedAt):"never",i=t.lastUsedCommand?ds(t.lastUsedCommand,120):null,a=t.lastResolvedPath?ds(t.lastResolvedPath,120):null;return c`
3102
- <div class="list-item">
3103
- <div class="list-main">
3104
- <div class="list-title">${t.pattern?.trim()?t.pattern:"New pattern"}</div>
3105
- <div class="list-sub">Last used: ${s}</div>
3106
- ${i?c`<div class="list-sub mono">${i}</div>`:f}
3107
- ${a?c`<div class="list-sub mono">${a}</div>`:f}
3108
- </div>
3109
- <div class="list-meta">
3110
- <label class="field">
3111
- <span>Pattern</span>
3112
- <input
3113
- type="text"
3114
- .value=${t.pattern??""}
3115
- ?disabled=${e.disabled}
3116
- @input=${o=>{const r=o.target;e.onPatch(["agents",e.selectedScope,"allowlist",n,"pattern"],r.value)}}
3117
- />
3118
- </label>
3119
- <button
3120
- class="btn btn--sm danger"
3121
- ?disabled=${e.disabled}
3122
- @click=${()=>{if(e.allowlist.length<=1){e.onRemove(["agents",e.selectedScope,"allowlist"]);return}e.onRemove(["agents",e.selectedScope,"allowlist",n])}}
3123
- >
3124
- Remove
3125
- </button>
3126
- </div>
3127
- </div>
3128
- `}function Sf(e,t){const n=e.binding??"__default__",s=e.name?.trim()?`${e.name} (${e.id})`:e.id,i=t.nodes.length>0;return c`
3129
- <div class="list-item">
3130
- <div class="list-main">
3131
- <div class="list-title">${s}</div>
3132
- <div class="list-sub">
3133
- ${e.isDefault?"default agent":"agent"} ·
3134
- ${n==="__default__"?`uses default (${t.defaultBinding??"any"})`:`override: ${e.binding}`}
3135
- </div>
3136
- </div>
3137
- <div class="list-meta">
3138
- <label class="field">
3139
- <span>Binding</span>
3140
- <select
3141
- ?disabled=${t.disabled||!i}
3142
- @change=${a=>{const r=a.target.value.trim();t.onBindAgent(e.index,r==="__default__"?null:r)}}
3143
- >
3144
- <option value="__default__" ?selected=${n==="__default__"}>
3145
- Use default
3146
- </option>
3147
- ${t.nodes.map(a=>c`<option
3148
- value=${a.id}
3149
- ?selected=${n===a.id}
3150
- >
3151
- ${a.label}
3152
- </option>`)}
3153
- </select>
3154
- </label>
3155
- </div>
3156
- </div>
3157
- `}function _f(e){const t=[];for(const n of e){if(!(Array.isArray(n.commands)?n.commands:[]).some(r=>String(r)==="system.run"))continue;const a=typeof n.nodeId=="string"?n.nodeId.trim():"";if(!a)continue;const o=typeof n.displayName=="string"&&n.displayName.trim()?n.displayName.trim():a;t.push({id:a,label:o===a?a:`${o} · ${a}`})}return t.sort((n,s)=>n.label.localeCompare(s.label)),t}function Cf(e){const t=[];for(const n of e){if(!(Array.isArray(n.commands)?n.commands:[]).some(r=>String(r)==="system.execApprovals.get"||String(r)==="system.execApprovals.set"))continue;const a=typeof n.nodeId=="string"?n.nodeId.trim():"";if(!a)continue;const o=typeof n.displayName=="string"&&n.displayName.trim()?n.displayName.trim():a;t.push({id:a,label:o===a?a:`${o} · ${a}`})}return t.sort((n,s)=>n.label.localeCompare(s.label)),t}function Tf(e){const t={id:"main",name:void 0,index:0,isDefault:!0,binding:null};if(!e||typeof e!="object")return{defaultBinding:null,agents:[t]};const s=(e.tools??{}).exec??{},i=typeof s.node=="string"&&s.node.trim()?s.node.trim():null,a=e.agents??{},o=Array.isArray(a.list)?a.list:[];if(o.length===0)return{defaultBinding:i,agents:[t]};const r=[];return o.forEach((l,p)=>{if(!l||typeof l!="object")return;const d=l,u=typeof d.id=="string"?d.id.trim():"";if(!u)return;const g=typeof d.name=="string"?d.name.trim():void 0,v=d.default===!0,$=(d.tools??{}).exec??{},A=typeof $.node=="string"&&$.node.trim()?$.node.trim():null;r.push({id:u,name:g||void 0,index:p,isDefault:v,binding:A})}),r.length===0&&r.push(t),{defaultBinding:i,agents:r}}function Ef(e){const t=!!e.connected,n=!!e.paired,s=typeof e.displayName=="string"&&e.displayName.trim()||(typeof e.nodeId=="string"?e.nodeId:"unknown"),i=Array.isArray(e.caps)?e.caps:[],a=Array.isArray(e.commands)?e.commands:[];return c`
3158
- <div class="list-item">
3159
- <div class="list-main">
3160
- <div class="list-title">${s}</div>
3161
- <div class="list-sub">
3162
- ${typeof e.nodeId=="string"?e.nodeId:""}
3163
- ${typeof e.remoteIp=="string"?` · ${e.remoteIp}`:""}
3164
- ${typeof e.version=="string"?` · ${e.version}`:""}
3165
- </div>
3166
- <div class="chip-row" style="margin-top: 6px;">
3167
- <span class="chip">${n?"paired":"unpaired"}</span>
3168
- <span class="chip ${t?"chip-ok":"chip-warn"}">
3169
- ${t?"connected":"offline"}
3170
- </span>
3171
- ${i.slice(0,12).map(o=>c`<span class="chip">${String(o)}</span>`)}
3172
- ${a.slice(0,8).map(o=>c`<span class="chip">${String(o)}</span>`)}
3173
- </div>
3174
- </div>
3175
- </div>
3176
- `}function If(e){const t=e.hello?.snapshot,n=t?.uptimeMs?vo(t.uptimeMs):"n/a",s=t?.policy?.tickIntervalMs?`${t.policy.tickIntervalMs}ms`:"n/a",i=(()=>{if(e.connected||!e.lastError)return null;const o=e.lastError.toLowerCase();if(!(o.includes("unauthorized")||o.includes("connect failed")))return null;const l=!!e.settings.token.trim(),p=!!e.password.trim();return!l&&!p?c`
3177
- <div class="muted" style="margin-top: 8px">
3178
- This gateway requires auth. Add a token or password, then click Connect.
3179
- <div style="margin-top: 6px">
3180
- <span class="mono">openclaw dashboard --no-open</span> → tokenized URL<br />
3181
- <span class="mono">openclaw doctor --generate-gateway-token</span> → set token
3182
- </div>
3183
- <div style="margin-top: 6px">
3184
- <a
3185
- class="session-link"
3186
- href="https://docs.openclaw.ai/web/dashboard"
3187
- target="_blank"
3188
- rel="noreferrer"
3189
- title="Control UI auth docs (opens in new tab)"
3190
- >Docs: Control UI auth</a
3191
- >
3192
- </div>
3193
- </div>
3194
- `:c`
3195
- <div class="muted" style="margin-top: 8px">
3196
- Auth failed. Re-copy a tokenized URL with
3197
- <span class="mono">openclaw dashboard --no-open</span>, or update the token, then click Connect.
3198
- <div style="margin-top: 6px">
3199
- <a
3200
- class="session-link"
3201
- href="https://docs.openclaw.ai/web/dashboard"
3202
- target="_blank"
3203
- rel="noreferrer"
3204
- title="Control UI auth docs (opens in new tab)"
3205
- >Docs: Control UI auth</a
3206
- >
3207
- </div>
3208
- </div>
3209
- `})(),a=(()=>{if(e.connected||!e.lastError||(typeof window<"u"?window.isSecureContext:!0)!==!1)return null;const r=e.lastError.toLowerCase();return!r.includes("secure context")&&!r.includes("device identity required")?null:c`
3210
- <div class="muted" style="margin-top: 8px">
3211
- This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or open
3212
- <span class="mono">http://127.0.0.1:18789</span> on the gateway host.
3213
- <div style="margin-top: 6px">
3214
- If you must stay on HTTP, set
3215
- <span class="mono">gateway.controlUi.allowInsecureAuth: true</span> (token-only).
3216
- </div>
3217
- <div style="margin-top: 6px">
3218
- <a
3219
- class="session-link"
3220
- href="https://docs.openclaw.ai/gateway/tailscale"
3221
- target="_blank"
3222
- rel="noreferrer"
3223
- title="Tailscale Serve docs (opens in new tab)"
3224
- >Docs: Tailscale Serve</a
3225
- >
3226
- <span class="muted"> · </span>
3227
- <a
3228
- class="session-link"
3229
- href="https://docs.openclaw.ai/web/control-ui#insecure-http"
3230
- target="_blank"
3231
- rel="noreferrer"
3232
- title="Insecure HTTP docs (opens in new tab)"
3233
- >Docs: Insecure HTTP</a
3234
- >
3235
- </div>
3236
- </div>
3237
- `})();return c`
3238
- <section class="grid grid-cols-2">
3239
- <div class="card">
3240
- <div class="card-title">Gateway Access</div>
3241
- <div class="card-sub">Where the dashboard connects and how it authenticates.</div>
3242
- <div class="form-grid" style="margin-top: 16px;">
3243
- <label class="field">
3244
- <span>WebSocket URL</span>
3245
- <input
3246
- .value=${e.settings.gatewayUrl}
3247
- @input=${o=>{const r=o.target.value;e.onSettingsChange({...e.settings,gatewayUrl:r})}}
3248
- placeholder="ws://100.x.y.z:18789"
3249
- />
3250
- </label>
3251
- <label class="field">
3252
- <span>Gateway Token</span>
3253
- <input
3254
- .value=${e.settings.token}
3255
- @input=${o=>{const r=o.target.value;e.onSettingsChange({...e.settings,token:r})}}
3256
- placeholder="OPENCLAW_GATEWAY_TOKEN"
3257
- />
3258
- </label>
3259
- <label class="field">
3260
- <span>Password (not stored)</span>
3261
- <input
3262
- type="password"
3263
- .value=${e.password}
3264
- @input=${o=>{const r=o.target.value;e.onPasswordChange(r)}}
3265
- placeholder="system or shared password"
3266
- />
3267
- </label>
3268
- <label class="field">
3269
- <span>Default Session Key</span>
3270
- <input
3271
- .value=${e.settings.sessionKey}
3272
- @input=${o=>{const r=o.target.value;e.onSessionKeyChange(r)}}
3273
- />
3274
- </label>
3275
- </div>
3276
- <div class="row" style="margin-top: 14px;">
3277
- <button class="btn" @click=${()=>e.onConnect()}>Connect</button>
3278
- <button class="btn" @click=${()=>e.onRefresh()}>Refresh</button>
3279
- <span class="muted">Click Connect to apply connection changes.</span>
3280
- </div>
3281
- </div>
3282
-
3283
- <div class="card">
3284
- <div class="card-title">Snapshot</div>
3285
- <div class="card-sub">Latest gateway handshake information.</div>
3286
- <div class="stat-grid" style="margin-top: 16px;">
3287
- <div class="stat">
3288
- <div class="stat-label">Status</div>
3289
- <div class="stat-value ${e.connected?"ok":"warn"}">
3290
- ${e.connected?"Connected":"Disconnected"}
3291
- </div>
3292
- </div>
3293
- <div class="stat">
3294
- <div class="stat-label">Uptime</div>
3295
- <div class="stat-value">${n}</div>
3296
- </div>
3297
- <div class="stat">
3298
- <div class="stat-label">Tick Interval</div>
3299
- <div class="stat-value">${s}</div>
3300
- </div>
3301
- <div class="stat">
3302
- <div class="stat-label">Last Channels Refresh</div>
3303
- <div class="stat-value">
3304
- ${e.lastChannelsRefresh?O(e.lastChannelsRefresh):"n/a"}
3305
- </div>
3306
- </div>
3307
- </div>
3308
- ${e.lastError?c`<div class="callout danger" style="margin-top: 14px;">
3309
- <div>${e.lastError}</div>
3310
- ${i??""}
3311
- ${a??""}
3312
- </div>`:c`
3313
- <div class="callout" style="margin-top: 14px">
3314
- Use Channels to link WhatsApp, Telegram, Discord, Signal, or iMessage.
3315
- </div>
3316
- `}
3317
- </div>
3318
- </section>
3319
-
3320
- <section class="grid grid-cols-3" style="margin-top: 18px;">
3321
- <div class="card stat-card">
3322
- <div class="stat-label">Instances</div>
3323
- <div class="stat-value">${e.presenceCount}</div>
3324
- <div class="muted">Presence beacons in the last 5 minutes.</div>
3325
- </div>
3326
- <div class="card stat-card">
3327
- <div class="stat-label">Sessions</div>
3328
- <div class="stat-value">${e.sessionsCount??"n/a"}</div>
3329
- <div class="muted">Recent session keys tracked by the gateway.</div>
3330
- </div>
3331
- <div class="card stat-card">
3332
- <div class="stat-label">Cron</div>
3333
- <div class="stat-value">
3334
- ${e.cronEnabled==null?"n/a":e.cronEnabled?"Enabled":"Disabled"}
3335
- </div>
3336
- <div class="muted">Next wake ${_r(e.cronNext)}</div>
3337
- </div>
3338
- </section>
3339
-
3340
- <section class="card" style="margin-top: 18px;">
3341
- <div class="card-title">Notes</div>
3342
- <div class="card-sub">Quick reminders for remote control setups.</div>
3343
- <div class="note-grid" style="margin-top: 14px;">
3344
- <div>
3345
- <div class="note-title">Tailscale serve</div>
3346
- <div class="muted">
3347
- Prefer serve mode to keep the gateway on loopback with tailnet auth.
3348
- </div>
3349
- </div>
3350
- <div>
3351
- <div class="note-title">Session hygiene</div>
3352
- <div class="muted">Use /new or sessions.patch to reset context.</div>
3353
- </div>
3354
- <div>
3355
- <div class="note-title">Cron reminders</div>
3356
- <div class="muted">Use isolated sessions for recurring runs.</div>
3357
- </div>
3358
- </div>
3359
- </section>
3360
- `}const Mf=["","off","minimal","low","medium","high"],Lf=["","off","on"],Rf=[{value:"",label:"inherit"},{value:"off",label:"off (explicit)"},{value:"on",label:"on"}],Pf=["","off","on","stream"];function Nf(e){if(!e)return"";const t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t}function Cr(e){return Nf(e)==="zai"}function Of(e){return Cr(e)?Lf:Mf}function Df(e,t){return!t||!e||e==="off"?e:"on"}function Bf(e,t){return e?t&&e==="on"?"low":e:null}function Ff(e){const t=e.result?.sessions??[];return c`
3361
- <section class="card">
3362
- <div class="row" style="justify-content: space-between;">
3363
- <div>
3364
- <div class="card-title">Sessions</div>
3365
- <div class="card-sub">Active session keys and per-session overrides.</div>
3366
- </div>
3367
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
3368
- ${e.loading?"Loading…":"Refresh"}
3369
- </button>
3370
- </div>
3371
-
3372
- <div class="filters" style="margin-top: 14px;">
3373
- <label class="field">
3374
- <span>Active within (minutes)</span>
3375
- <input
3376
- .value=${e.activeMinutes}
3377
- @input=${n=>e.onFiltersChange({activeMinutes:n.target.value,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
3378
- />
3379
- </label>
3380
- <label class="field">
3381
- <span>Limit</span>
3382
- <input
3383
- .value=${e.limit}
3384
- @input=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:n.target.value,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
3385
- />
3386
- </label>
3387
- <label class="field checkbox">
3388
- <span>Include global</span>
3389
- <input
3390
- type="checkbox"
3391
- .checked=${e.includeGlobal}
3392
- @change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:n.target.checked,includeUnknown:e.includeUnknown})}
3393
- />
3394
- </label>
3395
- <label class="field checkbox">
3396
- <span>Include unknown</span>
3397
- <input
3398
- type="checkbox"
3399
- .checked=${e.includeUnknown}
3400
- @change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:n.target.checked})}
3401
- />
3402
- </label>
3403
- </div>
3404
-
3405
- ${e.error?c`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:f}
3406
-
3407
- <div class="muted" style="margin-top: 12px;">
3408
- ${e.result?`Store: ${e.result.path}`:""}
3409
- </div>
3410
-
3411
- <div class="table" style="margin-top: 16px;">
3412
- <div class="table-head">
3413
- <div>Key</div>
3414
- <div>Label</div>
3415
- <div>Kind</div>
3416
- <div>Updated</div>
3417
- <div>Tokens</div>
3418
- <div>Thinking</div>
3419
- <div>Verbose</div>
3420
- <div>Reasoning</div>
3421
- <div>Actions</div>
3422
- </div>
3423
- ${t.length===0?c`
3424
- <div class="muted">No sessions found.</div>
3425
- `:t.map(n=>Uf(n,e.basePath,e.onPatch,e.onDelete,e.loading))}
3426
- </div>
3427
- </section>
3428
- `}function Uf(e,t,n,s,i){const a=e.updatedAt?O(e.updatedAt):"n/a",o=e.thinkingLevel??"",r=Cr(e.modelProvider),l=Df(o,r),p=Of(e.modelProvider),d=e.verboseLevel??"",u=e.reasoningLevel??"",g=e.displayName??e.key,v=e.kind!=="global",y=v?`${Bs("chat",t)}?session=${encodeURIComponent(e.key)}`:null;return c`
3429
- <div class="table-row">
3430
- <div class="mono">${v?c`<a href=${y} class="session-link">${g}</a>`:g}</div>
3431
- <div>
3432
- <input
3433
- .value=${e.label??""}
3434
- ?disabled=${i}
3435
- placeholder="(optional)"
3436
- @change=${$=>{const A=$.target.value.trim();n(e.key,{label:A||null})}}
3437
- />
3438
- </div>
3439
- <div>${e.kind}</div>
3440
- <div>${a}</div>
3441
- <div>${Kh(e)}</div>
3442
- <div>
3443
- <select
3444
- .value=${l}
3445
- ?disabled=${i}
3446
- @change=${$=>{const A=$.target.value;n(e.key,{thinkingLevel:Bf(A,r)})}}
3447
- >
3448
- ${p.map($=>c`<option value=${$}>${$||"inherit"}</option>`)}
3449
- </select>
3450
- </div>
3451
- <div>
3452
- <select
3453
- .value=${d}
3454
- ?disabled=${i}
3455
- @change=${$=>{const A=$.target.value;n(e.key,{verboseLevel:A||null})}}
3456
- >
3457
- ${Rf.map($=>c`<option value=${$.value}>${$.label}</option>`)}
3458
- </select>
3459
- </div>
3460
- <div>
3461
- <select
3462
- .value=${u}
3463
- ?disabled=${i}
3464
- @change=${$=>{const A=$.target.value;n(e.key,{reasoningLevel:A||null})}}
3465
- >
3466
- ${Pf.map($=>c`<option value=${$}>${$||"inherit"}</option>`)}
3467
- </select>
3468
- </div>
3469
- <div>
3470
- <button class="btn danger" ?disabled=${i} @click=${()=>s(e.key)}>
3471
- Delete
3472
- </button>
3473
- </div>
3474
- </div>
3475
- `}function Kf(e){const t=Math.max(0,e),n=Math.floor(t/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60);return s<60?`${s}m`:`${Math.floor(s/60)}h`}function Le(e,t){return t?c`<div class="exec-approval-meta-row"><span>${e}</span><span>${t}</span></div>`:f}function Hf(e){const t=e.execApprovalQueue[0];if(!t)return f;const n=t.request,s=t.expiresAtMs-Date.now(),i=s>0?`expires in ${Kf(s)}`:"expired",a=e.execApprovalQueue.length;return c`
3476
- <div class="exec-approval-overlay" role="dialog" aria-live="polite">
3477
- <div class="exec-approval-card">
3478
- <div class="exec-approval-header">
3479
- <div>
3480
- <div class="exec-approval-title">Exec approval needed</div>
3481
- <div class="exec-approval-sub">${i}</div>
3482
- </div>
3483
- ${a>1?c`<div class="exec-approval-queue">${a} pending</div>`:f}
3484
- </div>
3485
- <div class="exec-approval-command mono">${n.command}</div>
3486
- <div class="exec-approval-meta">
3487
- ${Le("Host",n.host)}
3488
- ${Le("Agent",n.agentId)}
3489
- ${Le("Session",n.sessionKey)}
3490
- ${Le("CWD",n.cwd)}
3491
- ${Le("Resolved",n.resolvedPath)}
3492
- ${Le("Security",n.security)}
3493
- ${Le("Ask",n.ask)}
3494
- </div>
3495
- ${e.execApprovalError?c`<div class="exec-approval-error">${e.execApprovalError}</div>`:f}
3496
- <div class="exec-approval-actions">
3497
- <button
3498
- class="btn primary"
3499
- ?disabled=${e.execApprovalBusy}
3500
- @click=${()=>e.handleExecApprovalDecision("allow-once")}
3501
- >
3502
- Allow once
3503
- </button>
3504
- <button
3505
- class="btn"
3506
- ?disabled=${e.execApprovalBusy}
3507
- @click=${()=>e.handleExecApprovalDecision("allow-always")}
3508
- >
3509
- Always allow
3510
- </button>
3511
- <button
3512
- class="btn danger"
3513
- ?disabled=${e.execApprovalBusy}
3514
- @click=${()=>e.handleExecApprovalDecision("deny")}
3515
- >
3516
- Deny
3517
- </button>
3518
- </div>
3519
- </div>
3520
- </div>
3521
- `}function zf(e){const{pendingGatewayUrl:t}=e;return t?c`
3522
- <div class="exec-approval-overlay" role="dialog" aria-modal="true" aria-live="polite">
3523
- <div class="exec-approval-card">
3524
- <div class="exec-approval-header">
3525
- <div>
3526
- <div class="exec-approval-title">Change Gateway URL</div>
3527
- <div class="exec-approval-sub">This will reconnect to a different gateway server</div>
3528
- </div>
3529
- </div>
3530
- <div class="exec-approval-command mono">${t}</div>
3531
- <div class="callout danger" style="margin-top: 12px;">
3532
- Only confirm if you trust this URL. Malicious URLs can compromise your system.
3533
- </div>
3534
- <div class="exec-approval-actions">
3535
- <button
3536
- class="btn primary"
3537
- @click=${()=>e.handleGatewayUrlConfirm()}
3538
- >
3539
- Confirm
3540
- </button>
3541
- <button
3542
- class="btn"
3543
- @click=${()=>e.handleGatewayUrlCancel()}
3544
- >
3545
- Cancel
3546
- </button>
3547
- </div>
3548
- </div>
3549
- </div>
3550
- `:f}function jf(e){const t=e.report?.skills??[],n=e.filter.trim().toLowerCase(),s=n?t.filter(i=>[i.name,i.description,i.source].join(" ").toLowerCase().includes(n)):t;return c`
3551
- <section class="card">
3552
- <div class="row" style="justify-content: space-between;">
3553
- <div>
3554
- <div class="card-title">Skills</div>
3555
- <div class="card-sub">Bundled, managed, and workspace skills.</div>
3556
- </div>
3557
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
3558
- ${e.loading?"Loading…":"Refresh"}
3559
- </button>
3560
- </div>
3561
-
3562
- <div class="filters" style="margin-top: 14px;">
3563
- <label class="field" style="flex: 1;">
3564
- <span>Filter</span>
3565
- <input
3566
- .value=${e.filter}
3567
- @input=${i=>e.onFilterChange(i.target.value)}
3568
- placeholder="Search skills"
3569
- />
3570
- </label>
3571
- <div class="muted">${s.length} shown</div>
3572
- </div>
3573
-
3574
- ${e.error?c`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:f}
3575
-
3576
- ${s.length===0?c`
3577
- <div class="muted" style="margin-top: 16px">No skills found.</div>
3578
- `:c`
3579
- <div class="list" style="margin-top: 16px;">
3580
- ${s.map(i=>qf(i,e))}
3581
- </div>
3582
- `}
3583
- </section>
3584
- `}function qf(e,t){const n=t.busyKey===e.skillKey,s=t.edits[e.skillKey]??"",i=t.messages[e.skillKey]??null,a=e.install.length>0&&e.missing.bins.length>0,o=[...e.missing.bins.map(l=>`bin:${l}`),...e.missing.env.map(l=>`env:${l}`),...e.missing.config.map(l=>`config:${l}`),...e.missing.os.map(l=>`os:${l}`)],r=[];return e.disabled&&r.push("disabled"),e.blockedByAllowlist&&r.push("blocked by allowlist"),c`
3585
- <div class="list-item">
3586
- <div class="list-main">
3587
- <div class="list-title">
3588
- ${e.emoji?`${e.emoji} `:""}${e.name}
3589
- </div>
3590
- <div class="list-sub">${ds(e.description,140)}</div>
3591
- <div class="chip-row" style="margin-top: 6px;">
3592
- <span class="chip">${e.source}</span>
3593
- <span class="chip ${e.eligible?"chip-ok":"chip-warn"}">
3594
- ${e.eligible?"eligible":"blocked"}
3595
- </span>
3596
- ${e.disabled?c`
3597
- <span class="chip chip-warn">disabled</span>
3598
- `:f}
3599
- </div>
3600
- ${o.length>0?c`
3601
- <div class="muted" style="margin-top: 6px;">
3602
- Missing: ${o.join(", ")}
3603
- </div>
3604
- `:f}
3605
- ${r.length>0?c`
3606
- <div class="muted" style="margin-top: 6px;">
3607
- Reason: ${r.join(", ")}
3608
- </div>
3609
- `:f}
3610
- </div>
3611
- <div class="list-meta">
3612
- <div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
3613
- <button
3614
- class="btn"
3615
- ?disabled=${n}
3616
- @click=${()=>t.onToggle(e.skillKey,e.disabled)}
3617
- >
3618
- ${e.disabled?"Enable":"Disable"}
3619
- </button>
3620
- ${a?c`<button
3621
- class="btn"
3622
- ?disabled=${n}
3623
- @click=${()=>t.onInstall(e.skillKey,e.name,e.install[0].id)}
3624
- >
3625
- ${n?"Installing…":e.install[0].label}
3626
- </button>`:f}
3627
- </div>
3628
- ${i?c`<div
3629
- class="muted"
3630
- style="margin-top: 8px; color: ${i.kind==="error"?"var(--danger-color, #d14343)":"var(--success-color, #0a7f5a)"};"
3631
- >
3632
- ${i.message}
3633
- </div>`:f}
3634
- ${e.primaryEnv?c`
3635
- <div class="field" style="margin-top: 10px;">
3636
- <span>API key</span>
3637
- <input
3638
- type="password"
3639
- .value=${s}
3640
- @input=${l=>t.onEdit(e.skillKey,l.target.value)}
3641
- />
3642
- </div>
3643
- <button
3644
- class="btn primary"
3645
- style="margin-top: 8px;"
3646
- ?disabled=${n}
3647
- @click=${()=>t.onSaveKey(e.skillKey)}
3648
- >
3649
- Save key
3650
- </button>
3651
- `:f}
3652
- </div>
3653
- </div>
3654
- `}function Gf(e,t){const n=Bs(t,e.basePath);return c`
3655
- <a
3656
- href=${n}
3657
- class="nav-item ${e.tab===t?"active":""}"
3658
- @click=${s=>{s.defaultPrevented||s.button!==0||s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||(s.preventDefault(),e.setTab(t))}}
3659
- title=${ls(t)}
3660
- >
3661
- <span class="nav-item__icon" aria-hidden="true">${W[Cl(t)]}</span>
3662
- <span class="nav-item__text">${ls(t)}</span>
3663
- </a>
3664
- `}function Wf(e){const t=Vf(e.hello,e.sessionsResult),n=Yf(e.sessionKey,e.sessionsResult,t),s=e.onboarding,i=e.onboarding,a=e.onboarding?!1:e.settings.chatShowThinking,o=e.onboarding?!0:e.settings.chatFocusMode,r=c`
3665
- <svg
3666
- width="18"
3667
- height="18"
3668
- viewBox="0 0 24 24"
3669
- fill="none"
3670
- stroke="currentColor"
3671
- stroke-width="2"
3672
- stroke-linecap="round"
3673
- stroke-linejoin="round"
3674
- >
3675
- <path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path>
3676
- <path d="M21 3v5h-5"></path>
3677
- </svg>
3678
- `,l=c`
3679
- <svg
3680
- width="18"
3681
- height="18"
3682
- viewBox="0 0 24 24"
3683
- fill="none"
3684
- stroke="currentColor"
3685
- stroke-width="2"
3686
- stroke-linecap="round"
3687
- stroke-linejoin="round"
3688
- >
3689
- <path d="M4 7V4h3"></path>
3690
- <path d="M20 7V4h-3"></path>
3691
- <path d="M4 17v3h3"></path>
3692
- <path d="M20 17v3h-3"></path>
3693
- <circle cx="12" cy="12" r="3"></circle>
3694
- </svg>
3695
- `;return c`
3696
- <div class="chat-controls">
3697
- <label class="field chat-controls__session">
3698
- <select
3699
- .value=${e.sessionKey}
3700
- ?disabled=${!e.connected}
3701
- @change=${p=>{const d=p.target.value;e.sessionKey=d,e.chatMessage="",e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:d,lastActiveSessionKey:d}),e.loadAssistantIdentity(),Cd(e,d),St(e)}}
3702
- >
3703
- ${Xo(n,p=>p.key,p=>c`<option value=${p.key}>
3704
- ${p.displayName??p.key}
3705
- </option>`)}
3706
- </select>
3707
- </label>
3708
- <button
3709
- class="btn btn--sm btn--icon"
3710
- ?disabled=${e.chatLoading||!e.connected}
3711
- @click=${()=>{e.resetToolStream(),Zo(e)}}
3712
- title="Refresh chat data"
3713
- >
3714
- ${r}
3715
- </button>
3716
- <span class="chat-controls__separator">|</span>
3717
- <button
3718
- class="btn btn--sm btn--icon ${a?"active":""}"
3719
- ?disabled=${s}
3720
- @click=${()=>{s||e.applySettings({...e.settings,chatShowThinking:!e.settings.chatShowThinking})}}
3721
- aria-pressed=${a}
3722
- title=${s?"Disabled during onboarding":"Toggle assistant thinking/working output"}
3723
- >
3724
- ${W.brain}
3725
- </button>
3726
- <button
3727
- class="btn btn--sm btn--icon ${o?"active":""}"
3728
- ?disabled=${i}
3729
- @click=${()=>{i||e.applySettings({...e.settings,chatFocusMode:!e.settings.chatFocusMode})}}
3730
- aria-pressed=${o}
3731
- title=${i?"Disabled during onboarding":"Toggle focus mode (hide sidebar + page header)"}
3732
- >
3733
- ${l}
3734
- </button>
3735
- </div>
3736
- `}function Vf(e,t){const n=e?.snapshot,s=n?.sessionDefaults?.mainSessionKey?.trim();if(s)return s;const i=n?.sessionDefaults?.mainKey?.trim();return i||(t?.sessions?.some(a=>a.key==="main")?"main":null)}function ss(e,t){const n=t?.label?.trim();if(n)return`${n} (${e})`;const s=t?.displayName?.trim();return s||e}function Yf(e,t,n){const s=new Set,i=[],a=n&&t?.sessions?.find(r=>r.key===n),o=t?.sessions?.find(r=>r.key===e);if(n&&(s.add(n),i.push({key:n,displayName:ss(n,a)})),s.has(e)||(s.add(e),i.push({key:e,displayName:ss(e,o)})),t?.sessions)for(const r of t.sessions)s.has(r.key)||(s.add(r.key),i.push({key:r.key,displayName:ss(r.key,r)}));return i}const Qf=["system","light","dark"];function Zf(e){const t=Math.max(0,Qf.indexOf(e.theme)),n=s=>i=>{const o={element:i.currentTarget};(i.clientX||i.clientY)&&(o.pointerClientX=i.clientX,o.pointerClientY=i.clientY),e.setTheme(s,o)};return c`
3737
- <div class="theme-toggle" style="--theme-index: ${t};">
3738
- <div class="theme-toggle__track" role="group" aria-label="Theme">
3739
- <span class="theme-toggle__indicator"></span>
3740
- <button
3741
- class="theme-toggle__button ${e.theme==="system"?"active":""}"
3742
- @click=${n("system")}
3743
- aria-pressed=${e.theme==="system"}
3744
- aria-label="System theme"
3745
- title="System"
3746
- >
3747
- ${eg()}
3748
- </button>
3749
- <button
3750
- class="theme-toggle__button ${e.theme==="light"?"active":""}"
3751
- @click=${n("light")}
3752
- aria-pressed=${e.theme==="light"}
3753
- aria-label="Light theme"
3754
- title="Light"
3755
- >
3756
- ${Jf()}
3757
- </button>
3758
- <button
3759
- class="theme-toggle__button ${e.theme==="dark"?"active":""}"
3760
- @click=${n("dark")}
3761
- aria-pressed=${e.theme==="dark"}
3762
- aria-label="Dark theme"
3763
- title="Dark"
3764
- >
3765
- ${Xf()}
3766
- </button>
3767
- </div>
3768
- </div>
3769
- `}function Jf(){return c`
3770
- <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3771
- <circle cx="12" cy="12" r="4"></circle>
3772
- <path d="M12 2v2"></path>
3773
- <path d="M12 20v2"></path>
3774
- <path d="m4.93 4.93 1.41 1.41"></path>
3775
- <path d="m17.66 17.66 1.41 1.41"></path>
3776
- <path d="M2 12h2"></path>
3777
- <path d="M20 12h2"></path>
3778
- <path d="m6.34 17.66-1.41 1.41"></path>
3779
- <path d="m19.07 4.93-1.41 1.41"></path>
3780
- </svg>
3781
- `}function Xf(){return c`
3782
- <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3783
- <path
3784
- d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"
3785
- ></path>
3786
- </svg>
3787
- `}function eg(){return c`
3788
- <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3789
- <rect width="20" height="14" x="2" y="3" rx="2"></rect>
3790
- <line x1="8" x2="16" y1="21" y2="21"></line>
3791
- <line x1="12" x2="12" y1="17" y2="21"></line>
3792
- </svg>
3793
- `}const tg=/^data:/i,ng=/^https?:\/\//i;function sg(e){const t=e.agentsList?.agents??[],s=po(e.sessionKey)?.agentId??e.agentsList?.defaultId??"main",a=t.find(r=>r.id===s)?.identity,o=a?.avatarUrl??a?.avatar;if(o)return tg.test(o)||ng.test(o)?o:a?.avatarUrl}function ig(e){const t=e.presenceEntries.length,n=e.sessionsResult?.count??null,s=e.cronStatus?.nextWakeAtMs??null,i=e.connected?null:"Disconnected from gateway.",a=e.tab==="chat",o=a&&(e.settings.chatFocusMode||e.onboarding),r=e.onboarding?!1:e.settings.chatShowThinking,l=sg(e),p=e.chatAvatarUrl??l??null;return c`
3794
- <div class="shell ${a?"shell--chat":""} ${o?"shell--chat-focus":""} ${e.settings.navCollapsed?"shell--nav-collapsed":""} ${e.onboarding?"shell--onboarding":""}">
3795
- <header class="topbar">
3796
- <div class="topbar-left">
3797
- <button
3798
- class="nav-collapse-toggle"
3799
- @click=${()=>e.applySettings({...e.settings,navCollapsed:!e.settings.navCollapsed})}
3800
- title="${e.settings.navCollapsed?"Expand sidebar":"Collapse sidebar"}"
3801
- aria-label="${e.settings.navCollapsed?"Expand sidebar":"Collapse sidebar"}"
3802
- >
3803
- <span class="nav-collapse-toggle__icon">${W.menu}</span>
3804
- </button>
3805
- <div class="brand">
3806
- <div class="brand-logo">
3807
- <img src="/favicon.svg" alt="OpenClaw" />
3808
- </div>
3809
- <div class="brand-text">
3810
- <div class="brand-title">OPENCLAW</div>
3811
- <div class="brand-sub">Gateway Dashboard</div>
3812
- </div>
3813
- </div>
3814
- </div>
3815
- <div class="topbar-status">
3816
- <div class="pill">
3817
- <span class="statusDot ${e.connected?"ok":""}"></span>
3818
- <span>Health</span>
3819
- <span class="mono">${e.connected?"OK":"Offline"}</span>
3820
- </div>
3821
- ${Zf(e)}
3822
- </div>
3823
- </header>
3824
- <aside class="nav ${e.settings.navCollapsed?"nav--collapsed":""}">
3825
- ${Sl.map(d=>{const u=e.settings.navGroupsCollapsed[d.label]??!1,g=d.tabs.some(v=>v===e.tab);return c`
3826
- <div class="nav-group ${u&&!g?"nav-group--collapsed":""}">
3827
- <button
3828
- class="nav-label"
3829
- @click=${()=>{const v={...e.settings.navGroupsCollapsed};v[d.label]=!u,e.applySettings({...e.settings,navGroupsCollapsed:v})}}
3830
- aria-expanded=${!u}
3831
- >
3832
- <span class="nav-label__text">${d.label}</span>
3833
- <span class="nav-label__chevron">${u?"+":"−"}</span>
3834
- </button>
3835
- <div class="nav-group__items">
3836
- ${d.tabs.map(v=>Gf(e,v))}
3837
- </div>
3838
- </div>
3839
- `})}
3840
- <div class="nav-group nav-group--links">
3841
- <div class="nav-label nav-label--static">
3842
- <span class="nav-label__text">Resources</span>
3843
- </div>
3844
- <div class="nav-group__items">
3845
- <a
3846
- class="nav-item nav-item--external"
3847
- href="https://docs.openclaw.ai"
3848
- target="_blank"
3849
- rel="noreferrer"
3850
- title="Docs (opens in new tab)"
3851
- >
3852
- <span class="nav-item__icon" aria-hidden="true">${W.book}</span>
3853
- <span class="nav-item__text">Docs</span>
3854
- </a>
3855
- </div>
3856
- </div>
3857
- </aside>
3858
- <main class="content ${a?"content--chat":""}">
3859
- <section class="content-header">
3860
- <div>
3861
- <div class="page-title">${ls(e.tab)}</div>
3862
- <div class="page-sub">${Tl(e.tab)}</div>
3863
- </div>
3864
- <div class="page-meta">
3865
- ${e.lastError?c`<div class="pill danger">${e.lastError}</div>`:f}
3866
- ${a?Wf(e):f}
3867
- </div>
3868
- </section>
3869
-
3870
- ${e.tab==="overview"?If({connected:e.connected,hello:e.hello,settings:e.settings,password:e.password,lastError:e.lastError,presenceCount:t,sessionsCount:n,cronEnabled:e.cronStatus?.enabled??null,cronNext:s,lastChannelsRefresh:e.channelsLastSuccess,onSettingsChange:d=>e.applySettings(d),onPasswordChange:d=>e.password=d,onSessionKeyChange:d=>{e.sessionKey=d,e.chatMessage="",e.resetToolStream(),e.applySettings({...e.settings,sessionKey:d,lastActiveSessionKey:d}),e.loadAssistantIdentity()},onConnect:()=>e.connect(),onRefresh:()=>e.loadOverview()}):f}
3871
-
3872
- ${e.tab==="channels"?Eh({connected:e.connected,loading:e.channelsLoading,snapshot:e.channelsSnapshot,lastError:e.channelsError,lastSuccessAt:e.channelsLastSuccess,whatsappMessage:e.whatsappLoginMessage,whatsappQrDataUrl:e.whatsappLoginQrDataUrl,whatsappConnected:e.whatsappLoginConnected,whatsappBusy:e.whatsappBusy,configSchema:e.configSchema,configSchemaLoading:e.configSchemaLoading,configForm:e.configForm,configUiHints:e.configUiHints,configSaving:e.configSaving,configFormDirty:e.configFormDirty,nostrProfileFormState:e.nostrProfileFormState,nostrProfileAccountId:e.nostrProfileAccountId,onRefresh:d=>oe(e,d),onWhatsAppStart:d=>e.handleWhatsAppStart(d),onWhatsAppWait:()=>e.handleWhatsAppWait(),onWhatsAppLogout:()=>e.handleWhatsAppLogout(),onConfigPatch:(d,u)=>Ft(e,d,u),onConfigSave:()=>e.handleChannelConfigSave(),onConfigReload:()=>e.handleChannelConfigReload(),onNostrProfileEdit:(d,u)=>e.handleNostrProfileEdit(d,u),onNostrProfileCancel:()=>e.handleNostrProfileCancel(),onNostrProfileFieldChange:(d,u)=>e.handleNostrProfileFieldChange(d,u),onNostrProfileSave:()=>e.handleNostrProfileSave(),onNostrProfileImport:()=>e.handleNostrProfileImport(),onNostrProfileToggleAdvanced:()=>e.handleNostrProfileToggleAdvanced()}):f}
3873
-
3874
- ${e.tab==="instances"?Xh({loading:e.presenceLoading,entries:e.presenceEntries,lastError:e.presenceError,statusMessage:e.presenceStatus,onRefresh:()=>Vs(e)}):f}
3875
-
3876
- ${e.tab==="sessions"?Ff({loading:e.sessionsLoading,result:e.sessionsResult,error:e.sessionsError,activeMinutes:e.sessionsFilterActive,limit:e.sessionsFilterLimit,includeGlobal:e.sessionsIncludeGlobal,includeUnknown:e.sessionsIncludeUnknown,basePath:e.basePath,onFiltersChange:d=>{e.sessionsFilterActive=d.activeMinutes,e.sessionsFilterLimit=d.limit,e.sessionsIncludeGlobal=d.includeGlobal,e.sessionsIncludeUnknown=d.includeUnknown},onRefresh:()=>Ke(e),onPatch:(d,u)=>jl(e,d,u),onDelete:d=>ql(e,d)}):f}
3877
-
3878
- ${e.tab==="cron"?Vh({loading:e.cronLoading,status:e.cronStatus,jobs:e.cronJobs,error:e.cronError,busy:e.cronBusy,form:e.cronForm,channels:e.channelsSnapshot?.channelMeta?.length?e.channelsSnapshot.channelMeta.map(d=>d.id):e.channelsSnapshot?.channelOrder??[],channelLabels:e.channelsSnapshot?.channelLabels??{},channelMeta:e.channelsSnapshot?.channelMeta??[],runsJobId:e.cronRunsJobId,runs:e.cronRuns,onFormChange:d=>e.cronForm={...e.cronForm,...d},onRefresh:()=>e.loadCron(),onAdd:()=>hc(e),onToggle:(d,u)=>fc(e,d,u),onRun:d=>gc(e,d),onRemove:d=>vc(e,d),onLoadRuns:d=>Ao(e,d)}):f}
3879
-
3880
- ${e.tab==="skills"?jf({loading:e.skillsLoading,report:e.skillsReport,error:e.skillsError,filter:e.skillsFilter,edits:e.skillEdits,messages:e.skillMessages,busyKey:e.skillsBusyKey,onFilterChange:d=>e.skillsFilter=d,onRefresh:()=>Et(e,{clearMessages:!0}),onToggle:(d,u)=>dd(e,d,u),onEdit:(d,u)=>cd(e,d,u),onSaveKey:d=>ud(e,d),onInstall:(d,u,g)=>pd(e,d,u,g)}):f}
3881
-
3882
- ${e.tab==="nodes"?af({loading:e.nodesLoading,nodes:e.nodes,devicesLoading:e.devicesLoading,devicesError:e.devicesError,devicesList:e.devicesList,configForm:e.configForm??e.configSnapshot?.config,configLoading:e.configLoading,configSaving:e.configSaving,configDirty:e.configFormDirty,configFormMode:e.configFormMode,execApprovalsLoading:e.execApprovalsLoading,execApprovalsSaving:e.execApprovalsSaving,execApprovalsDirty:e.execApprovalsDirty,execApprovalsSnapshot:e.execApprovalsSnapshot,execApprovalsForm:e.execApprovalsForm,execApprovalsSelectedAgent:e.execApprovalsSelectedAgent,execApprovalsTarget:e.execApprovalsTarget,execApprovalsTargetNodeId:e.execApprovalsTargetNodeId,onRefresh:()=>gn(e),onDevicesRefresh:()=>Ce(e),onDeviceApprove:d=>Xc(e,d),onDeviceReject:d=>ed(e,d),onDeviceRotate:(d,u,g)=>td(e,{deviceId:d,role:u,scopes:g}),onDeviceRevoke:(d,u)=>nd(e,{deviceId:d,role:u}),onLoadConfig:()=>ye(e),onLoadExecApprovals:()=>{const d=e.execApprovalsTarget==="node"&&e.execApprovalsTargetNodeId?{kind:"node",nodeId:e.execApprovalsTargetNodeId}:{kind:"gateway"};return Ws(e,d)},onBindDefault:d=>{d?Ft(e,["tools","exec","node"],d):ra(e,["tools","exec","node"])},onBindAgent:(d,u)=>{const g=["agents","list",d,"tools","exec","node"];u?Ft(e,g,u):ra(e,g)},onSaveBindings:()=>hs(e),onExecApprovalsTargetChange:(d,u)=>{e.execApprovalsTarget=d,e.execApprovalsTargetNodeId=u,e.execApprovalsSnapshot=null,e.execApprovalsForm=null,e.execApprovalsDirty=!1,e.execApprovalsSelectedAgent=null},onExecApprovalsSelectAgent:d=>{e.execApprovalsSelectedAgent=d},onExecApprovalsPatch:(d,u)=>rd(e,d,u),onExecApprovalsRemove:d=>ld(e,d),onSaveExecApprovals:()=>{const d=e.execApprovalsTarget==="node"&&e.execApprovalsTargetNodeId?{kind:"node",nodeId:e.execApprovalsTargetNodeId}:{kind:"gateway"};return od(e,d)}}):f}
3883
-
3884
- ${e.tab==="chat"?Wp({sessionKey:e.sessionKey,onSessionKeyChange:d=>{e.sessionKey=d,e.chatMessage="",e.chatAttachments=[],e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.chatQueue=[],e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:d,lastActiveSessionKey:d}),e.loadAssistantIdentity(),St(e),ys(e)},thinkingLevel:e.chatThinkingLevel,showThinking:r,loading:e.chatLoading,sending:e.chatSending,compactionStatus:e.compactionStatus,assistantAvatarUrl:p,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,draft:e.chatMessage,queue:e.chatQueue,connected:e.connected,canSend:e.connected,disabledReason:i,error:e.lastError,sessions:e.sessionsResult,focusMode:o,onRefresh:()=>(e.resetToolStream(),Promise.all([St(e),ys(e)])),onToggleFocusMode:()=>{e.onboarding||e.applySettings({...e.settings,chatFocusMode:!e.settings.chatFocusMode})},onChatScroll:d=>e.handleChatScroll(d),onDraftChange:d=>e.chatMessage=d,attachments:e.chatAttachments,onAttachmentsChange:d=>e.chatAttachments=d,onSend:()=>e.handleSendChat(),canAbort:!!e.chatRunId,onAbort:()=>{e.handleAbortChat()},onQueueRemove:d=>e.removeQueuedMessage(d),onNewSession:()=>e.handleSendChat("/new",{restoreDraft:!0}),sidebarOpen:e.sidebarOpen,sidebarContent:e.sidebarContent,sidebarError:e.sidebarError,splitRatio:e.splitRatio,onOpenSidebar:d=>e.handleOpenSidebar(d),onCloseSidebar:()=>e.handleCloseSidebar(),onSplitRatioChange:d=>e.handleSplitRatioChange(d),assistantName:e.assistantName,assistantAvatar:e.assistantAvatar}):f}
3885
-
3886
- ${e.tab==="config"?uh({raw:e.configRaw,originalRaw:e.configRawOriginal,valid:e.configValid,issues:e.configIssues,loading:e.configLoading,saving:e.configSaving,applying:e.configApplying,updating:e.updateRunning,connected:e.connected,schema:e.configSchema,schemaLoading:e.configSchemaLoading,uiHints:e.configUiHints,formMode:e.configFormMode,formValue:e.configForm,originalValue:e.configFormOriginal,searchQuery:e.configSearchQuery,activeSection:e.configActiveSection,activeSubsection:e.configActiveSubsection,onRawChange:d=>{e.configRaw=d},onFormModeChange:d=>e.configFormMode=d,onFormPatch:(d,u)=>Ft(e,d,u),onSearchChange:d=>e.configSearchQuery=d,onSectionChange:d=>{e.configActiveSection=d,e.configActiveSubsection=null},onSubsectionChange:d=>e.configActiveSubsection=d,onReload:()=>ye(e),onSave:()=>hs(e),onApply:()=>cc(e),onUpdate:()=>dc(e)}):f}
3887
-
3888
- ${e.tab==="debug"?Jh({loading:e.debugLoading,status:e.debugStatus,health:e.debugHealth,models:e.debugModels,heartbeat:e.debugHeartbeat,eventLog:e.eventLog,callMethod:e.debugCallMethod,callParams:e.debugCallParams,callResult:e.debugCallResult,callError:e.debugCallError,onCallMethodChange:d=>e.debugCallMethod=d,onCallParamsChange:d=>e.debugCallParams=d,onRefresh:()=>hn(e),onCall:()=>wc(e)}):f}
3889
-
3890
- ${e.tab==="logs"?sf({loading:e.logsLoading,error:e.logsError,file:e.logsFile,entries:e.logsEntries,filterText:e.logsFilterText,levelFilters:e.logsLevelFilters,autoFollow:e.logsAutoFollow,truncated:e.logsTruncated,onFilterTextChange:d=>e.logsFilterText=d,onLevelToggle:(d,u)=>{e.logsLevelFilters={...e.logsLevelFilters,[d]:u}},onToggleAutoFollow:d=>e.logsAutoFollow=d,onRefresh:()=>Us(e,{reset:!0}),onExport:(d,u)=>e.exportLogs(d,u),onScroll:d=>e.handleLogsScroll(d)}):f}
3891
- </main>
3892
- ${Hf(e)}
3893
- ${zf(e)}
3894
- </div>
3895
- `}const ag={trace:!0,debug:!0,info:!0,warn:!0,error:!0,fatal:!0},og={name:"",description:"",agentId:"",enabled:!0,scheduleKind:"every",scheduleAt:"",everyAmount:"30",everyUnit:"minutes",cronExpr:"0 7 * * *",cronTz:"",sessionTarget:"main",wakeMode:"next-heartbeat",payloadKind:"systemEvent",payloadText:"",deliver:!1,channel:"last",to:"",timeoutSeconds:"",postToMainPrefix:""};async function rg(e){if(!(!e.client||!e.connected)&&!e.agentsLoading){e.agentsLoading=!0,e.agentsError=null;try{const t=await e.client.request("agents.list",{});t&&(e.agentsList=t)}catch(t){e.agentsError=String(t)}finally{e.agentsLoading=!1}}}const Tr={WEBCHAT_UI:"webchat-ui",CONTROL_UI:"openclaw-control-ui",WEBCHAT:"webchat",CLI:"cli",GATEWAY_CLIENT:"gateway-client",MACOS_APP:"openclaw-macos",IOS_APP:"openclaw-ios",ANDROID_APP:"openclaw-android",NODE_HOST:"node-host",TEST:"test",FINGERPRINT:"fingerprint",PROBE:"openclaw-probe"},eo=Tr,Is={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",NODE:"node",PROBE:"probe",TEST:"test"};new Set(Object.values(Tr));new Set(Object.values(Is));function lg(e){const t=e.version??(e.nonce?"v2":"v1"),n=e.scopes.join(","),s=e.token??"",i=[t,e.deviceId,e.clientId,e.clientMode,e.role,n,String(e.signedAtMs),s];return t==="v2"&&i.push(e.nonce??""),i.join("|")}const cg=4008;class dg{constructor(t){this.opts=t,this.ws=null,this.pending=new Map,this.closed=!1,this.lastSeq=null,this.connectNonce=null,this.connectSent=!1,this.connectTimer=null,this.backoffMs=800}start(){this.closed=!1,this.connect()}stop(){this.closed=!0,this.ws?.close(),this.ws=null,this.flushPending(new Error("gateway client stopped"))}get connected(){return this.ws?.readyState===WebSocket.OPEN}connect(){this.closed||(this.ws=new WebSocket(this.opts.url),this.ws.onopen=()=>this.queueConnect(),this.ws.onmessage=t=>this.handleMessage(String(t.data??"")),this.ws.onclose=t=>{const n=String(t.reason??"");this.ws=null,this.flushPending(new Error(`gateway closed (${t.code}): ${n}`)),this.opts.onClose?.({code:t.code,reason:n}),this.scheduleReconnect()},this.ws.onerror=()=>{})}scheduleReconnect(){if(this.closed)return;const t=this.backoffMs;this.backoffMs=Math.min(this.backoffMs*1.7,15e3),window.setTimeout(()=>this.connect(),t)}flushPending(t){for(const[,n]of this.pending)n.reject(t);this.pending.clear()}async sendConnect(){if(this.connectSent)return;this.connectSent=!0,this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null);const t=typeof crypto<"u"&&!!crypto.subtle,n=["operator.admin","operator.approvals","operator.pairing"],s="operator";let i=null,a=!1,o=this.opts.token;if(t){i=await js();const d=Jc({deviceId:i.deviceId,role:s})?.token;o=d??this.opts.token,a=!!(d&&this.opts.token)}const r=o||this.opts.password?{token:o,password:this.opts.password}:void 0;let l;if(t&&i){const d=Date.now(),u=this.connectNonce??void 0,g=lg({deviceId:i.deviceId,clientId:this.opts.clientName??eo.CONTROL_UI,clientMode:this.opts.mode??Is.WEBCHAT,role:s,scopes:n,signedAtMs:d,token:o??null,nonce:u}),v=await Qc(i.privateKey,g);l={id:i.deviceId,publicKey:i.publicKey,signature:v,signedAt:d,nonce:u}}const p={minProtocol:3,maxProtocol:3,client:{id:this.opts.clientName??eo.CONTROL_UI,version:this.opts.clientVersion??"dev",platform:this.opts.platform??navigator.platform??"web",mode:this.opts.mode??Is.WEBCHAT,instanceId:this.opts.instanceId},role:s,scopes:n,device:l,caps:[],auth:r,userAgent:navigator.userAgent,locale:navigator.language};this.request("connect",p).then(d=>{d?.auth?.deviceToken&&i&&Uo({deviceId:i.deviceId,role:d.auth.role??s,token:d.auth.deviceToken,scopes:d.auth.scopes??[]}),this.backoffMs=800,this.opts.onHello?.(d)}).catch(()=>{a&&i&&Ko({deviceId:i.deviceId,role:s}),this.ws?.close(cg,"connect failed")})}handleMessage(t){let n;try{n=JSON.parse(t)}catch{return}const s=n;if(s.type==="event"){const i=n;if(i.event==="connect.challenge"){const o=i.payload,r=o&&typeof o.nonce=="string"?o.nonce:null;r&&(this.connectNonce=r,this.sendConnect());return}const a=typeof i.seq=="number"?i.seq:null;a!==null&&(this.lastSeq!==null&&a>this.lastSeq+1&&this.opts.onGap?.({expected:this.lastSeq+1,received:a}),this.lastSeq=a);try{this.opts.onEvent?.(i)}catch(o){console.error("[gateway] event handler error:",o)}return}if(s.type==="res"){const i=n,a=this.pending.get(i.id);if(!a)return;this.pending.delete(i.id),i.ok?a.resolve(i.payload):a.reject(new Error(i.error?.message??"request failed"));return}}request(t,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(new Error("gateway not connected"));const s=Fs(),i={type:"req",id:s,method:t,params:n},a=new Promise((o,r)=>{this.pending.set(s,{resolve:l=>o(l),reject:r})});return this.ws.send(JSON.stringify(i)),a}queueConnect(){this.connectNonce=null,this.connectSent=!1,this.connectTimer!==null&&window.clearTimeout(this.connectTimer),this.connectTimer=window.setTimeout(()=>{this.sendConnect()},750)}}function Ms(e){return typeof e=="object"&&e!==null}function ug(e){if(!Ms(e))return null;const t=typeof e.id=="string"?e.id.trim():"",n=e.request;if(!t||!Ms(n))return null;const s=typeof n.command=="string"?n.command.trim():"";if(!s)return null;const i=typeof e.createdAtMs=="number"?e.createdAtMs:0,a=typeof e.expiresAtMs=="number"?e.expiresAtMs:0;return!i||!a?null:{id:t,request:{command:s,cwd:typeof n.cwd=="string"?n.cwd:null,host:typeof n.host=="string"?n.host:null,security:typeof n.security=="string"?n.security:null,ask:typeof n.ask=="string"?n.ask:null,agentId:typeof n.agentId=="string"?n.agentId:null,resolvedPath:typeof n.resolvedPath=="string"?n.resolvedPath:null,sessionKey:typeof n.sessionKey=="string"?n.sessionKey:null},createdAtMs:i,expiresAtMs:a}}function pg(e){if(!Ms(e))return null;const t=typeof e.id=="string"?e.id.trim():"";return t?{id:t,decision:typeof e.decision=="string"?e.decision:null,resolvedBy:typeof e.resolvedBy=="string"?e.resolvedBy:null,ts:typeof e.ts=="number"?e.ts:null}:null}function Er(e){const t=Date.now();return e.filter(n=>n.expiresAtMs>t)}function hg(e,t){const n=Er(e).filter(s=>s.id!==t.id);return n.push(t),n}function to(e,t){return Er(e).filter(n=>n.id!==t)}async function Ir(e,t){if(!e.client||!e.connected)return;const n=e.sessionKey.trim(),s=n?{sessionKey:n}:{};try{const i=await e.client.request("agent.identity.get",s);if(!i)return;const a=rs(i);e.assistantName=a.name,e.assistantAvatar=a.avatar,e.assistantAgentId=a.agentId??null}catch{}}function is(e,t){const n=(e??"").trim(),s=t.mainSessionKey?.trim();if(!s)return n;if(!n)return s;const i=t.mainKey?.trim()||"main",a=t.defaultAgentId?.trim();return n==="main"||n===i||a&&(n===`agent:${a}:main`||n===`agent:${a}:${i}`)?s:n}function fg(e,t){if(!t?.mainSessionKey)return;const n=is(e.sessionKey,t),s=is(e.settings.sessionKey,t),i=is(e.settings.lastActiveSessionKey,t),a=n||s||e.sessionKey,o={...e.settings,sessionKey:s||a,lastActiveSessionKey:i||a},r=o.sessionKey!==e.settings.sessionKey||o.lastActiveSessionKey!==e.settings.lastActiveSessionKey;a!==e.sessionKey&&(e.sessionKey=a),r&&Se(e,o)}function Mr(e){e.lastError=null,e.hello=null,e.connected=!1,e.execApprovalQueue=[],e.execApprovalError=null,e.client?.stop(),e.client=new dg({url:e.settings.gatewayUrl,token:e.settings.token.trim()?e.settings.token:void 0,password:e.password.trim()?e.password:void 0,clientName:"openclaw-control-ui",mode:"webchat",onHello:t=>{e.connected=!0,e.lastError=null,e.hello=t,mg(e,t),e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,dn(e),Ir(e),rg(e),gn(e,{quiet:!0}),Ce(e,{quiet:!0}),ei(e)},onClose:({code:t,reason:n})=>{e.connected=!1,t!==1012&&(e.lastError=`disconnected (${t}): ${n||"no reason"}`)},onEvent:t=>gg(e,t),onGap:({expected:t,received:n})=>{e.lastError=`event gap detected (expected seq ${t}, got ${n}); refresh recommended`}}),e.client.start()}function gg(e,t){try{vg(e,t)}catch(n){console.error("[gateway] handleGatewayEvent error:",t.event,n)}}function vg(e,t){if(e.eventLogBuffer=[{ts:Date.now(),event:t.event,payload:t.payload},...e.eventLogBuffer].slice(0,250),e.tab==="debug"&&(e.eventLog=e.eventLogBuffer),t.event==="agent"){if(e.onboarding)return;tc(e,t.payload);return}if(t.event==="chat"){const n=t.payload;n?.sessionKey&&Ho(e,n.sessionKey);const s=zl(e,n);if(s==="final"||s==="error"||s==="aborted"){dn(e),Pd(e);const i=n?.runId;i&&e.refreshSessionsAfterChat.has(i)&&(e.refreshSessionsAfterChat.delete(i),s==="final"&&Ke(e,{activeMinutes:Go}))}s==="final"&&St(e);return}if(t.event==="presence"){const n=t.payload;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence,e.presenceError=null,e.presenceStatus=null);return}if(t.event==="cron"&&e.tab==="cron"&&ti(e),(t.event==="device.pair.requested"||t.event==="device.pair.resolved")&&Ce(e,{quiet:!0}),t.event==="exec.approval.requested"){const n=ug(t.payload);if(n){e.execApprovalQueue=hg(e.execApprovalQueue,n),e.execApprovalError=null;const s=Math.max(0,n.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=to(e.execApprovalQueue,n.id)},s)}return}if(t.event==="exec.approval.resolved"){const n=pg(t.payload);n&&(e.execApprovalQueue=to(e.execApprovalQueue,n.id))}}function mg(e,t){const n=t.snapshot;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n?.health&&(e.debugHealth=n.health),n?.sessionDefaults&&fg(e,n.sessionDefaults)}function yg(e){e.basePath=$d(),yd(e),Sd(e,!0),xd(e),Ad(e),window.addEventListener("popstate",e.popStateHandler),Mr(e),vd(e),e.tab==="logs"&&Qs(e),e.tab==="debug"&&Js(e)}function bg(e){oc(e)}function wg(e){window.removeEventListener("popstate",e.popStateHandler),md(e),Zs(e),Xs(e),kd(e),e.topbarObserver?.disconnect(),e.topbarObserver=null}function $g(e,t){if(e.tab==="chat"&&(t.has("chatMessages")||t.has("chatToolMessages")||t.has("chatStream")||t.has("chatLoading")||t.has("tab"))){const n=t.has("tab"),s=t.has("chatLoading")&&t.get("chatLoading")===!0&&e.chatLoading===!1;un(e,n||s||!e.chatHasAutoScrolled)}e.tab==="logs"&&(t.has("logsEntries")||t.has("logsAutoFollow")||t.has("tab"))&&e.logsAutoFollow&&e.logsAtBottom&&bo(e,t.has("tab")||t.has("logsAutoFollow"))}async function xg(e,t){await mc(e,t),await oe(e,!0)}async function Ag(e){await yc(e),await oe(e,!0)}async function kg(e){await bc(e),await oe(e,!0)}async function Sg(e){await hs(e),await ye(e),await oe(e,!0)}async function _g(e){await ye(e),await oe(e,!0)}function Cg(e){if(!Array.isArray(e))return{};const t={};for(const n of e){if(typeof n!="string")continue;const[s,...i]=n.split(":");if(!s||i.length===0)continue;const a=s.trim(),o=i.join(":").trim();a&&o&&(t[a]=o)}return t}function Lr(e){return(e.channelsSnapshot?.channelAccounts?.nostr??[])[0]?.accountId??e.nostrProfileAccountId??"default"}function Rr(e,t=""){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}function Tg(e,t,n){e.nostrProfileAccountId=t,e.nostrProfileFormState=Ah(n??void 0)}function Eg(e){e.nostrProfileFormState=null,e.nostrProfileAccountId=null}function Ig(e,t,n){const s=e.nostrProfileFormState;s&&(e.nostrProfileFormState={...s,values:{...s.values,[t]:n},fieldErrors:{...s.fieldErrors,[t]:""}})}function Mg(e){const t=e.nostrProfileFormState;t&&(e.nostrProfileFormState={...t,showAdvanced:!t.showAdvanced})}async function Lg(e){const t=e.nostrProfileFormState;if(!t||t.saving)return;const n=Lr(e);e.nostrProfileFormState={...t,saving:!0,error:null,success:null,fieldErrors:{}};try{const s=await fetch(Rr(n),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.values)}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const a=i?.error??`Profile update failed (${s.status})`;e.nostrProfileFormState={...t,saving:!1,error:a,success:null,fieldErrors:Cg(i?.details)};return}if(!i.persisted){e.nostrProfileFormState={...t,saving:!1,error:"Profile publish failed on all relays.",success:null};return}e.nostrProfileFormState={...t,saving:!1,error:null,success:"Profile published to relays.",fieldErrors:{},original:{...t.values}},await oe(e,!0)}catch(s){e.nostrProfileFormState={...t,saving:!1,error:`Profile update failed: ${String(s)}`,success:null}}}async function Rg(e){const t=e.nostrProfileFormState;if(!t||t.importing)return;const n=Lr(e);e.nostrProfileFormState={...t,importing:!0,error:null,success:null};try{const s=await fetch(Rr(n,"/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoMerge:!0})}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const l=i?.error??`Profile import failed (${s.status})`;e.nostrProfileFormState={...t,importing:!1,error:l,success:null};return}const a=i.merged??i.imported??null,o=a?{...t.values,...a}:t.values,r=!!(o.banner||o.website||o.nip05||o.lud16);e.nostrProfileFormState={...t,importing:!1,values:o,error:null,success:i.saved?"Profile imported from relays. Review and publish.":"Profile imported. Review and publish.",showAdvanced:r},i.saved&&await oe(e,!0)}catch(s){e.nostrProfileFormState={...t,importing:!1,error:`Profile import failed: ${String(s)}`,success:null}}}var Pg=Object.defineProperty,Ng=Object.getOwnPropertyDescriptor,b=(e,t,n,s)=>{for(var i=s>1?void 0:s?Ng(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(s?o(t,n,i):o(i))||i);return s&&i&&Pg(t,n,i),i};const as=xl();function Og(){if(!window.location.search)return!1;const t=new URLSearchParams(window.location.search).get("onboarding");if(!t)return!1;const n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}let m=class extends Je{constructor(){super(...arguments),this.settings=Al(),this.password="",this.tab="chat",this.onboarding=Og(),this.connected=!1,this.theme=this.settings.theme??"system",this.themeResolved="dark",this.hello=null,this.lastError=null,this.eventLog=[],this.eventLogBuffer=[],this.toolStreamSyncTimer=null,this.sidebarCloseTimer=null,this.assistantName=as.name,this.assistantAvatar=as.avatar,this.assistantAgentId=as.agentId??null,this.sessionKey=this.settings.sessionKey,this.chatLoading=!1,this.chatSending=!1,this.chatMessage="",this.chatMessages=[],this.chatToolMessages=[],this.chatStream=null,this.chatStreamStartedAt=null,this.chatRunId=null,this.compactionStatus=null,this.chatAvatarUrl=null,this.chatThinkingLevel=null,this.chatQueue=[],this.chatAttachments=[],this.sidebarOpen=!1,this.sidebarContent=null,this.sidebarError=null,this.splitRatio=this.settings.splitRatio,this.nodesLoading=!1,this.nodes=[],this.devicesLoading=!1,this.devicesError=null,this.devicesList=null,this.execApprovalsLoading=!1,this.execApprovalsSaving=!1,this.execApprovalsDirty=!1,this.execApprovalsSnapshot=null,this.execApprovalsForm=null,this.execApprovalsSelectedAgent=null,this.execApprovalsTarget="gateway",this.execApprovalsTargetNodeId=null,this.execApprovalQueue=[],this.execApprovalBusy=!1,this.execApprovalError=null,this.pendingGatewayUrl=null,this.configLoading=!1,this.configRaw=`{
3896
- }
3897
- `,this.configRawOriginal="",this.configValid=null,this.configIssues=[],this.configSaving=!1,this.configApplying=!1,this.updateRunning=!1,this.applySessionKey=this.settings.lastActiveSessionKey,this.configSnapshot=null,this.configSchema=null,this.configSchemaVersion=null,this.configSchemaLoading=!1,this.configUiHints={},this.configForm=null,this.configFormOriginal=null,this.configFormDirty=!1,this.configFormMode="form",this.configSearchQuery="",this.configActiveSection=null,this.configActiveSubsection=null,this.channelsLoading=!1,this.channelsSnapshot=null,this.channelsError=null,this.channelsLastSuccess=null,this.whatsappLoginMessage=null,this.whatsappLoginQrDataUrl=null,this.whatsappLoginConnected=null,this.whatsappBusy=!1,this.nostrProfileFormState=null,this.nostrProfileAccountId=null,this.presenceLoading=!1,this.presenceEntries=[],this.presenceError=null,this.presenceStatus=null,this.agentsLoading=!1,this.agentsList=null,this.agentsError=null,this.sessionsLoading=!1,this.sessionsResult=null,this.sessionsError=null,this.sessionsFilterActive="",this.sessionsFilterLimit="120",this.sessionsIncludeGlobal=!0,this.sessionsIncludeUnknown=!1,this.cronLoading=!1,this.cronJobs=[],this.cronStatus=null,this.cronError=null,this.cronForm={...og},this.cronRunsJobId=null,this.cronRuns=[],this.cronBusy=!1,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillsFilter="",this.skillEdits={},this.skillsBusyKey=null,this.skillMessages={},this.debugLoading=!1,this.debugStatus=null,this.debugHealth=null,this.debugModels=[],this.debugHeartbeat=null,this.debugCallMethod="",this.debugCallParams="{}",this.debugCallResult=null,this.debugCallError=null,this.logsLoading=!1,this.logsError=null,this.logsFile=null,this.logsEntries=[],this.logsFilterText="",this.logsLevelFilters={...ag},this.logsAutoFollow=!0,this.logsTruncated=!1,this.logsCursor=null,this.logsLastFetchAt=null,this.logsLimit=500,this.logsMaxBytes=25e4,this.logsAtBottom=!0,this.client=null,this.chatScrollFrame=null,this.chatScrollTimeout=null,this.chatHasAutoScrolled=!1,this.chatUserNearBottom=!0,this.nodesPollInterval=null,this.logsPollInterval=null,this.debugPollInterval=null,this.logsScrollFrame=null,this.toolStreamById=new Map,this.toolStreamOrder=[],this.refreshSessionsAfterChat=new Set,this.basePath="",this.popStateHandler=()=>_d(this),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),yg(this)}firstUpdated(){bg(this)}disconnectedCallback(){wg(this),super.disconnectedCallback()}updated(e){$g(this,e)}connect(){Mr(this)}handleChatScroll(e){nc(this,e)}handleLogsScroll(e){sc(this,e)}exportLogs(e,t){ac(e,t)}resetToolStream(){dn(this)}resetChatScroll(){ic(this)}async loadAssistantIdentity(){await Ir(this)}applySettings(e){Se(this,e)}setTab(e){bd(this,e)}setTheme(e,t){wd(this,e,t)}async loadOverview(){await qo(this)}async loadCron(){await ti(this)}async handleAbortChat(){await Vo(this)}removeQueuedMessage(e){Ld(this,e)}async handleSendChat(e,t){await Rd(this,e,t)}async handleWhatsAppStart(e){await xg(this,e)}async handleWhatsAppWait(){await Ag(this)}async handleWhatsAppLogout(){await kg(this)}async handleChannelConfigSave(){await Sg(this)}async handleChannelConfigReload(){await _g(this)}handleNostrProfileEdit(e,t){Tg(this,e,t)}handleNostrProfileCancel(){Eg(this)}handleNostrProfileFieldChange(e,t){Ig(this,e,t)}async handleNostrProfileSave(){await Lg(this)}async handleNostrProfileImport(){await Rg(this)}handleNostrProfileToggleAdvanced(){Mg(this)}async handleExecApprovalDecision(e){const t=this.execApprovalQueue[0];if(!(!t||!this.client||this.execApprovalBusy)){this.execApprovalBusy=!0,this.execApprovalError=null;try{await this.client.request("exec.approval.resolve",{id:t.id,decision:e}),this.execApprovalQueue=this.execApprovalQueue.filter(n=>n.id!==t.id)}catch(n){this.execApprovalError=`Exec approval failed: ${String(n)}`}finally{this.execApprovalBusy=!1}}}handleGatewayUrlConfirm(){const e=this.pendingGatewayUrl;e&&(this.pendingGatewayUrl=null,Se(this,{...this.settings,gatewayUrl:e}),this.connect())}handleGatewayUrlCancel(){this.pendingGatewayUrl=null}handleOpenSidebar(e){this.sidebarCloseTimer!=null&&(window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=null),this.sidebarContent=e,this.sidebarError=null,this.sidebarOpen=!0}handleCloseSidebar(){this.sidebarOpen=!1,this.sidebarCloseTimer!=null&&window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=window.setTimeout(()=>{this.sidebarOpen||(this.sidebarContent=null,this.sidebarError=null,this.sidebarCloseTimer=null)},200)}handleSplitRatioChange(e){const t=Math.max(.4,Math.min(.7,e));this.splitRatio=t,this.applySettings({...this.settings,splitRatio:t})}render(){return ig(this)}};b([w()],m.prototype,"settings",2);b([w()],m.prototype,"password",2);b([w()],m.prototype,"tab",2);b([w()],m.prototype,"onboarding",2);b([w()],m.prototype,"connected",2);b([w()],m.prototype,"theme",2);b([w()],m.prototype,"themeResolved",2);b([w()],m.prototype,"hello",2);b([w()],m.prototype,"lastError",2);b([w()],m.prototype,"eventLog",2);b([w()],m.prototype,"assistantName",2);b([w()],m.prototype,"assistantAvatar",2);b([w()],m.prototype,"assistantAgentId",2);b([w()],m.prototype,"sessionKey",2);b([w()],m.prototype,"chatLoading",2);b([w()],m.prototype,"chatSending",2);b([w()],m.prototype,"chatMessage",2);b([w()],m.prototype,"chatMessages",2);b([w()],m.prototype,"chatToolMessages",2);b([w()],m.prototype,"chatStream",2);b([w()],m.prototype,"chatStreamStartedAt",2);b([w()],m.prototype,"chatRunId",2);b([w()],m.prototype,"compactionStatus",2);b([w()],m.prototype,"chatAvatarUrl",2);b([w()],m.prototype,"chatThinkingLevel",2);b([w()],m.prototype,"chatQueue",2);b([w()],m.prototype,"chatAttachments",2);b([w()],m.prototype,"sidebarOpen",2);b([w()],m.prototype,"sidebarContent",2);b([w()],m.prototype,"sidebarError",2);b([w()],m.prototype,"splitRatio",2);b([w()],m.prototype,"nodesLoading",2);b([w()],m.prototype,"nodes",2);b([w()],m.prototype,"devicesLoading",2);b([w()],m.prototype,"devicesError",2);b([w()],m.prototype,"devicesList",2);b([w()],m.prototype,"execApprovalsLoading",2);b([w()],m.prototype,"execApprovalsSaving",2);b([w()],m.prototype,"execApprovalsDirty",2);b([w()],m.prototype,"execApprovalsSnapshot",2);b([w()],m.prototype,"execApprovalsForm",2);b([w()],m.prototype,"execApprovalsSelectedAgent",2);b([w()],m.prototype,"execApprovalsTarget",2);b([w()],m.prototype,"execApprovalsTargetNodeId",2);b([w()],m.prototype,"execApprovalQueue",2);b([w()],m.prototype,"execApprovalBusy",2);b([w()],m.prototype,"execApprovalError",2);b([w()],m.prototype,"pendingGatewayUrl",2);b([w()],m.prototype,"configLoading",2);b([w()],m.prototype,"configRaw",2);b([w()],m.prototype,"configRawOriginal",2);b([w()],m.prototype,"configValid",2);b([w()],m.prototype,"configIssues",2);b([w()],m.prototype,"configSaving",2);b([w()],m.prototype,"configApplying",2);b([w()],m.prototype,"updateRunning",2);b([w()],m.prototype,"applySessionKey",2);b([w()],m.prototype,"configSnapshot",2);b([w()],m.prototype,"configSchema",2);b([w()],m.prototype,"configSchemaVersion",2);b([w()],m.prototype,"configSchemaLoading",2);b([w()],m.prototype,"configUiHints",2);b([w()],m.prototype,"configForm",2);b([w()],m.prototype,"configFormOriginal",2);b([w()],m.prototype,"configFormDirty",2);b([w()],m.prototype,"configFormMode",2);b([w()],m.prototype,"configSearchQuery",2);b([w()],m.prototype,"configActiveSection",2);b([w()],m.prototype,"configActiveSubsection",2);b([w()],m.prototype,"channelsLoading",2);b([w()],m.prototype,"channelsSnapshot",2);b([w()],m.prototype,"channelsError",2);b([w()],m.prototype,"channelsLastSuccess",2);b([w()],m.prototype,"whatsappLoginMessage",2);b([w()],m.prototype,"whatsappLoginQrDataUrl",2);b([w()],m.prototype,"whatsappLoginConnected",2);b([w()],m.prototype,"whatsappBusy",2);b([w()],m.prototype,"nostrProfileFormState",2);b([w()],m.prototype,"nostrProfileAccountId",2);b([w()],m.prototype,"presenceLoading",2);b([w()],m.prototype,"presenceEntries",2);b([w()],m.prototype,"presenceError",2);b([w()],m.prototype,"presenceStatus",2);b([w()],m.prototype,"agentsLoading",2);b([w()],m.prototype,"agentsList",2);b([w()],m.prototype,"agentsError",2);b([w()],m.prototype,"sessionsLoading",2);b([w()],m.prototype,"sessionsResult",2);b([w()],m.prototype,"sessionsError",2);b([w()],m.prototype,"sessionsFilterActive",2);b([w()],m.prototype,"sessionsFilterLimit",2);b([w()],m.prototype,"sessionsIncludeGlobal",2);b([w()],m.prototype,"sessionsIncludeUnknown",2);b([w()],m.prototype,"cronLoading",2);b([w()],m.prototype,"cronJobs",2);b([w()],m.prototype,"cronStatus",2);b([w()],m.prototype,"cronError",2);b([w()],m.prototype,"cronForm",2);b([w()],m.prototype,"cronRunsJobId",2);b([w()],m.prototype,"cronRuns",2);b([w()],m.prototype,"cronBusy",2);b([w()],m.prototype,"skillsLoading",2);b([w()],m.prototype,"skillsReport",2);b([w()],m.prototype,"skillsError",2);b([w()],m.prototype,"skillsFilter",2);b([w()],m.prototype,"skillEdits",2);b([w()],m.prototype,"skillsBusyKey",2);b([w()],m.prototype,"skillMessages",2);b([w()],m.prototype,"debugLoading",2);b([w()],m.prototype,"debugStatus",2);b([w()],m.prototype,"debugHealth",2);b([w()],m.prototype,"debugModels",2);b([w()],m.prototype,"debugHeartbeat",2);b([w()],m.prototype,"debugCallMethod",2);b([w()],m.prototype,"debugCallParams",2);b([w()],m.prototype,"debugCallResult",2);b([w()],m.prototype,"debugCallError",2);b([w()],m.prototype,"logsLoading",2);b([w()],m.prototype,"logsError",2);b([w()],m.prototype,"logsFile",2);b([w()],m.prototype,"logsEntries",2);b([w()],m.prototype,"logsFilterText",2);b([w()],m.prototype,"logsLevelFilters",2);b([w()],m.prototype,"logsAutoFollow",2);b([w()],m.prototype,"logsTruncated",2);b([w()],m.prototype,"logsCursor",2);b([w()],m.prototype,"logsLastFetchAt",2);b([w()],m.prototype,"logsLimit",2);b([w()],m.prototype,"logsMaxBytes",2);b([w()],m.prototype,"logsAtBottom",2);m=b([co("openclaw-app")],m);
3898
- //# sourceMappingURL=index-CknqRMzC.js.map